Nicholas Piggin <npig...@gmail.com> writes: > PR KVM does not support running with AIL enabled, and SCV does is not > supported with AIL disabled. Fix this by ensuring the SCV facility is > disabled with FSCR while a CPU could be running with AIL=0. > > The PowerNV host supports disabling AIL on a per-CPU basis, so SCV just > needs to be disabled when a vCPU is being run. > > The pSeries machine can only switch AIL on a system-wide basis, so it > must disable SCV support at boot if the configuration can potentially > run a PR KVM guest. > > Also ensure a the FSCR[SCV] bit can not be enabled when emulating > mtFSCR for the guest. > > SCV is not emulated for the PR guest at the moment, this just fixes the > host crashes. > > Alternatives considered and rejected: > - SCV support can not be disabled by PR KVM after boot, because it is > advertised to userspace with HWCAP. > - AIL can not be disabled on a per-CPU basis. At least when running on > pseries it is a per-LPAR setting. > - Support for real-mode SCV vectors will not be added because they are > at 0x17000 so making such a large fixed head space causes immediate > value limits to be exceeded, requiring a lot rework and more code. > - Disabling SCV for any PR KVM possible kernel will cause a slowdown > when not using PR KVM. > - A boot time option to disable SCV to use PR KVM is user-hostile. > - System call instruction emulation for SCV facility unavailable > instructions is too complex and old emulation code was subtly broken > and removed. > > Signed-off-by: Nicholas Piggin <npig...@gmail.com> > --- > arch/powerpc/kernel/exceptions-64s.S | 4 ++++ > arch/powerpc/kernel/setup_64.c | 28 ++++++++++++++++++++++++++++ > arch/powerpc/kvm/Kconfig | 9 +++++++++ > arch/powerpc/kvm/book3s_pr.c | 20 ++++++++++++++------ > 4 files changed, 55 insertions(+), 6 deletions(-) > > diff --git a/arch/powerpc/kernel/exceptions-64s.S > b/arch/powerpc/kernel/exceptions-64s.S > index 55caeee37c08..b66dd6f775a4 100644 > --- a/arch/powerpc/kernel/exceptions-64s.S > +++ b/arch/powerpc/kernel/exceptions-64s.S > @@ -809,6 +809,10 @@ __start_interrupts: > * - MSR_EE|MSR_RI is clear (no reentrant exceptions) > * - Standard kernel environment is set up (stack, paca, etc) > * > + * KVM: > + * These interrupts do not elevate HV 0->1, so HV is not involved. PR KVM > + * ensures that FSCR[SCV] is disabled whenever it has to force AIL off. > + * > * Call convention: > * > * syscall register convention is in Documentation/powerpc/syscall64-abi.rst > diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c > index be8577ac9397..7f7da641e551 100644 > --- a/arch/powerpc/kernel/setup_64.c > +++ b/arch/powerpc/kernel/setup_64.c > @@ -197,6 +197,34 @@ static void __init configure_exceptions(void) > > /* Under a PAPR hypervisor, we need hypercalls */ > if (firmware_has_feature(FW_FEATURE_SET_MODE)) { > + /* > + * - PR KVM does not support AIL mode interrupts in the host > + * while a PR guest is running. > + * > + * - SCV system call interrupt vectors are only implemented for > + * AIL mode interrupts. > + * > + * - On pseries, AIL mode can only be enabled and disabled > + * system-wide so when a PR VM is created on a pseries host, > + * all CPUs of the host are set to AIL=0 mode. > + * > + * - Therefore host CPUs must not execute scv while a PR VM > + * exists. > + * > + * - SCV support can not be disabled dynamically because the > + * feature is advertised to host userspace. Disabling the > + * facility and emulating it would be possible but is not > + * implemented. > + * > + * - So SCV support is blanket diabled if PR KVM could possibly
disabled Reviewed-by: Fabiano Rosas <faro...@linux.ibm.com>