android_kernel_xiaomi_sm8450/arch/s390
Claudio Imbrenda a60cc64db7 KVM: s390x: fix SCK locking
[ Upstream commit c0573ba5c5a2244dc02060b1f374d4593c1d20b7 ]

When handling the SCK instruction, the kvm lock is taken, even though
the vcpu lock is already being held. The normal locking order is kvm
lock first and then vcpu lock. This is can (and in some circumstances
does) lead to deadlocks.

The function kvm_s390_set_tod_clock is called both by the SCK handler
and by some IOCTLs to set the clock. The IOCTLs will not hold the vcpu
lock, so they can safely take the kvm lock. The SCK handler holds the
vcpu lock, but will also somehow need to acquire the kvm lock without
relinquishing the vcpu lock.

The solution is to factor out the code to set the clock, and provide
two wrappers. One is called like the original function and does the
locking, the other is called kvm_s390_try_set_tod_clock and uses
trylock to try to acquire the kvm lock. This new wrapper is then used
in the SCK handler. If locking fails, -EAGAIN is returned, which is
eventually propagated to userspace, thus also freeing the vcpu lock and
allowing for forward progress.

This is not the most efficient or elegant way to solve this issue, but
the SCK instruction is deprecated and its performance is not critical.

The goal of this patch is just to provide a simple but correct way to
fix the bug.

Fixes: 6a3f95a6b0 ("KVM: s390: Intercept SCK instruction")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Link: https://lore.kernel.org/r/20220301143340.111129-1-imbrenda@linux.ibm.com
Cc: stable@vger.kernel.org
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Stable-dep-of: 6973091d1b50 ("KVM: s390: pv: don't allow userspace to set the clock under PV")
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-16 09:57:10 +01:00
..
appldata s390/appldata: use struct_size() helper 2020-06-29 16:32:34 +02:00
boot s390/boot: add secure boot trailer 2022-11-10 18:14:21 +01:00
configs s390: update defconfigs 2020-11-12 12:10:36 +01:00
crypto s390/archrandom: simplify back to earlier design and initialize earlier 2022-07-07 17:52:16 +02:00
hypfs s390/hypfs: avoid error message under KVM 2022-09-05 10:28:57 +02:00
include s390/futex: add missing EX_TABLE entry to __futex_atomic_op() 2022-11-03 23:57:50 +09:00
kernel s390: fix nospec table alignments 2022-09-08 11:11:40 +02:00
kvm KVM: s390x: fix SCK locking 2022-11-16 09:57:10 +01:00
lib s390/test_unwind: use raw opcode instead of invalid instruction 2021-12-17 10:14:39 +01:00
mm s390/mm: do not trigger write fault when vma does not allow VM_WRITE 2022-09-05 10:28:55 +02:00
net bpf, s390: Fix potential memory leak about jit_data 2021-10-13 10:04:29 +02:00
oprofile s390/unwind: introduce stack unwind API 2019-05-02 13:54:11 +02:00
pci s390/pci: add missing EX_TABLE entries to __pcistg_mio_inuser()/__pcilg_mio_inuser() 2022-11-03 23:57:50 +09:00
purgatory s390: disable SSP when needed 2021-07-20 16:05:42 +02:00
tools .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
Kbuild s390/numa: move code to arch/s390/kernel 2020-08-11 18:16:55 +02:00
Kconfig s390: remove unneeded 'select BUILD_BIN2C' 2022-07-07 17:52:18 +02:00
Kconfig.debug s390/mm,ptdump: convert to generic page table dumper 2020-09-14 11:38:34 +02:00
Makefile s390: disable -Warray-bounds 2022-05-18 10:23:45 +02:00