linux/arch/s390/kvm
Claudio Imbrenda 80aea01c48 KVM: s390: vsie: fix wrong VIR 37 when MSO is used
When the host invalidates a guest page, it will also check if the page
was used to map the prefix of any guest CPUs, in which case they are
stopped and marked as needing a prefix refresh. Upon starting the
affected CPUs again, their prefix pages are explicitly faulted in and
revalidated if they had been invalidated. A bit in the PGSTEs indicates
whether or not a page might contain a prefix. The bit is allowed to
overindicate. Pages above 2G are skipped, because they cannot be
prefixes, since KVM runs all guests with MSO = 0.

The same applies for nested guests (VSIE). When the host invalidates a
guest page that maps the prefix of the nested guest, it has to stop the
affected nested guest CPUs and mark them as needing a prefix refresh.
The same PGSTE bit used for the guest prefix is also used for the
nested guest. Pages above 2G are skipped like for normal guests, which
is the source of the bug.

The nested guest runs is the guest primary address space. The guest
could be running the nested guest using MSO != 0. If the MSO + prefix
for the nested guest is above 2G, the check for nested prefix will skip
it. This will cause the invalidation notifier to not stop the CPUs of
the nested guest and not mark them as needing refresh. When the nested
guest is run again, its prefix will not be refreshed, since it has not
been marked for refresh. This will cause a fatal validity intercept
with VIR code 37.

Fix this by removing the check for 2G for nested guests. Now all
invalidations of pages with the notify bit set will always scan the
existing VSIE shadow state descriptors.

This allows to catch invalidations of nested guest prefix mappings even
when the prefix is above 2G in the guest virtual address space.

Fixes: a3508fbe9d ("KVM: s390: vsie: initial support for nested virtualization")
Tested-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Message-ID: <20231102153549.53984-1-imbrenda@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
2023-11-14 18:56:36 +01:00
..
diag.c KVM: s390/diag: fix racy access of physical cpu number in diag 9c handler 2023-06-16 11:08:09 +02:00
gaccess.c s390 updates for the 6.7 merge window 2023-11-03 10:17:22 -10:00
gaccess.h KVM: s390: Extend MEM_OP ioctl by storage key checked cmpxchg 2023-02-07 18:06:00 +01:00
guestdbg.c KVM: s390: Add memcg accounting to KVM allocations 2020-12-10 13:36:05 +01:00
intercept.c - PV crypto passthrough enablement (Tony, Steffen, Viktor, Janosch) 2023-08-31 13:21:27 -04:00
interrupt.c KVM: s390: fix gisa destroy operation might lead to cpu stalls 2023-09-25 08:31:47 +02:00
Kconfig kvm: Remove "select SRCU" 2023-04-05 13:47:42 +00:00
kvm-s390.c s390 updates for the 6.7 merge window 2023-11-03 10:17:22 -10:00
kvm-s390.h KVM: s390: export kvm_s390_pv*_is_protected functions 2023-08-18 15:24:35 +02: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 s390: use control register bit defines 2023-09-19 13:26:57 +02:00
pv.c - PV crypto passthrough enablement (Tony, Steffen, Viktor, Janosch) 2023-08-31 13:21:27 -04:00
sigp.c s390: fix various typos 2023-07-03 11:19:42 +02: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 wrong VIR 37 when MSO is used 2023-11-14 18:56:36 +01:00