linux/arch/s390/kvm
David Hildenbrand 5b199733b9 KVM: s390: vsie: fix some corner-cases when grabbing vsie pages
commit 5f230f41fd upstream.

We try to reuse the same vsie page when re-executing the vsie with a
given SCB address. The result is that we use the same shadow SCB --
residing in the vsie page -- and can avoid flushing the TLB when
re-running the vsie on a CPU.

So, when we allocate a fresh vsie page, or when we reuse a vsie page for
a different SCB address -- reusing the shadow SCB in different context --
we set ihcpu=0xffff to trigger the flush.

However, after we looked up the SCB address in the radix tree, but before
we grabbed the vsie page by raising the refcount to 2, someone could reuse
the vsie page for a different SCB address, adjusting page->index and the
radix tree. In that case, we would be reusing the vsie page with a
wrong page->index.

Another corner case is that we might set the SCB address for a vsie
page, but fail the insertion into the radix tree. Whoever would reuse
that page would remove the corresponding radix tree entry -- which might
now be a valid entry pointing at another page, resulting in the wrong
vsie page getting removed from the radix tree.

Let's handle such races better, by validating that the SCB address of a
vsie page didn't change after we grabbed it (not reuse for a different
SCB; the alternative would be performing another tree lookup), and by
setting the SCB address to invalid until the insertion in the tree
succeeded (SCB addresses are aligned to 512, so ULONG_MAX is invalid).

These scenarios are rare, the effects a bit unclear, and these issues were
only found by code inspection. Let's CC stable to be safe.

Fixes: a3508fbe9d ("KVM: s390: vsie: initial support for nested virtualization")
Cc: stable@vger.kernel.org
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Tested-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Message-ID: <20250107154344.1003072-2-david@redhat.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-02-17 10:05:06 +01:00
..
diag.c KVM: s390: Change virtual to physical address access in diag 0x258 handler 2024-10-10 15:31:55 +02:00
gaccess.c KVM: s390: gaccess: Check if guest address is in memslot 2024-10-10 15:31:55 +02:00
gaccess.h KVM: s390: gaccess: Check if guest address is in memslot 2024-10-10 15:31:55 +02:00
guestdbg.c KVM: s390: Harden copying of userspace-array against overflow 2023-12-01 08:00:42 -08:00
intercept.c - PV crypto passthrough enablement (Tony, Steffen, Viktor, Janosch) 2023-08-31 13:21:27 -04:00
interrupt.c S390: 2024-03-15 13:03:13 -07:00
Kconfig treewide: remove CONFIG_HAVE_KVM 2024-02-08 08:45:36 -05:00
kvm-s390.c KVM: s390: Fix SORTL and DFLTCC instruction format error in __insn32_query 2024-08-19 07:51:14 +00:00
kvm-s390.h KVM: s390: fix validity interception issue when gisa is switched off 2024-08-06 06:33:18 +00:00
Makefile KVM: s390: pci: add basic kvm_zdev structure 2022-07-11 09:54:27 +02:00
pci.c s390: fix various typos 2023-07-03 11:19:42 +02:00
pci.h KVM: s390: Mark __kvm_s390_init() and its descendants as __init 2022-12-29 15:41:22 -05:00
priv.c KVM: s390: fix LPSWEY handling 2024-07-01 14:31:15 +02:00
pv.c - PV crypto passthrough enablement (Tony, Steffen, Viktor, Janosch) 2023-08-31 13:21:27 -04:00
sigp.c KVM: s390: Refactor kvm_is_error_gpa() into kvm_is_gpa_in_memslot() 2024-02-20 07:37:45 -08:00
trace-s390.h KVM: s390: add tracepoint in gmap notifier 2023-10-16 14:54:29 +02:00
trace.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
vsie.c KVM: s390: vsie: fix some corner-cases when grabbing vsie pages 2025-02-17 10:05:06 +01:00