Message ID | 20220221072353.2219034-4-npiggin@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | KVM: PPC: Book3S PR: Fixes for AIL and SCV | expand |
Nicholas Piggin <npiggin@gmail.com> writes: > Add KVM_CAP_PPC_AIL_MODE_3 to advertise the capability to set the AIL > resource mode to 3 with the H_SET_MODE hypercall. This capability > differs between processor types and KVM types (PR, HV, Nested HV), and > affects guest-visible behaviour. > > QEMU will implement a cap-ail-mode-3 to control this behaviour[1], and > use the KVM CAP if available to determine KVM support[2]. > > [1] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00437.html > [2] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00439.html > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> > --- > Documentation/virt/kvm/api.rst | 14 ++++++++++++++ > arch/powerpc/include/asm/setup.h | 2 ++ > arch/powerpc/kvm/powerpc.c | 20 ++++++++++++++++++++ > arch/powerpc/platforms/pseries/setup.c | 12 +++++++++++- > include/uapi/linux/kvm.h | 1 + > tools/include/uapi/linux/kvm.h | 1 + > 6 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst > index bb8cfddbb22d..404056a9a35a 100644 > --- a/Documentation/virt/kvm/api.rst > +++ b/Documentation/virt/kvm/api.rst > @@ -6995,6 +6995,20 @@ indicated by the fd to the VM this is called on. > This is intended to support intra-host migration of VMs between userspace VMMs, > upgrading the VMM process without interrupting the guest. > > +7.30 KVM_CAP_PPC_AIL_MODE_3 > +------------------------------- > + > +:Capability: KVM_CAP_PPC_AIL_MODE_3 > +:Architectures: ppc > +:Type: vm > + > +This capability indicates that the kernel supports the mode 3 setting for the > +"Address Translation Mode on Interrupt" aka "Alternate Interrupt Location" > +resource that is controlled with the H_SET_MODE hypercall. > + > +This capability allows a guest kernel to use a better-performance mode for > +handling interrupts and system calls. > + > 8. Other capabilities. > ====================== > > diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h > index d0d3dd531c7f..a555fb77258a 100644 > --- a/arch/powerpc/include/asm/setup.h > +++ b/arch/powerpc/include/asm/setup.h > @@ -28,11 +28,13 @@ void setup_panic(void); > #define ARCH_PANIC_TIMEOUT 180 > > #ifdef CONFIG_PPC_PSERIES > +extern bool pseries_reloc_on_exception(void); > extern bool pseries_enable_reloc_on_exc(void); > extern void pseries_disable_reloc_on_exc(void); > extern void pseries_big_endian_exceptions(void); > void __init pseries_little_endian_exceptions(void); > #else > +static inline bool pseries_reloc_on_exception(void) { return false; } > static inline bool pseries_enable_reloc_on_exc(void) { return false; } > static inline void pseries_disable_reloc_on_exc(void) {} > static inline void pseries_big_endian_exceptions(void) {} > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c > index 2ad0ccd202d5..7dc101ea778c 100644 > --- a/arch/powerpc/kvm/powerpc.c > +++ b/arch/powerpc/kvm/powerpc.c > @@ -678,6 +678,26 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > r = 1; > break; > #endif > + case KVM_CAP_PPC_AIL_MODE_3: > + /* > + * KVM PR, POWER7, and some POWER9s don't support AIL=3 mode. > + * The POWER9s can support it if the guest runs in hash mode, > + * but QEMU doesn't necessarily query the capability in time. > + */ > + if (hv_enabled) { > + if (kvmhv_on_pseries()) { > + if (pseries_reloc_on_exception()) > + r = 1; > + } else if (cpu_has_feature(CPU_FTR_ARCH_207S) && > + !cpu_has_feature(CPU_FTR_P9_RADIX_PREFETCH_BUG)) { > + r = 1; > + } else { > + r = 0; > + } > + } else { > + r = 0; > + } > + break; > default: > r = 0; > break; > diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c > index 83a04d967a59..182525c2abd5 100644 > --- a/arch/powerpc/platforms/pseries/setup.c > +++ b/arch/powerpc/platforms/pseries/setup.c > @@ -353,6 +353,13 @@ static void pseries_lpar_idle(void) > pseries_idle_epilog(); > } > > +static bool pseries_reloc_on_exception_enabled; > + > +bool pseries_reloc_on_exception(void) > +{ > + return pseries_reloc_on_exception_enabled; > +} > + > /* > * Enable relocation on during exceptions. This has partition wide scope and > * may take a while to complete, if it takes longer than one second we will > @@ -377,6 +384,7 @@ bool pseries_enable_reloc_on_exc(void) > " on exceptions: %ld\n", rc); > return false; > } > + pseries_reloc_on_exception_enabled = true; > return true; > } > > @@ -404,7 +412,9 @@ void pseries_disable_reloc_on_exc(void) > break; > mdelay(get_longbusy_msecs(rc)); > } > - if (rc != H_SUCCESS) > + if (rc == H_SUCCESS) > + pseries_reloc_on_exception_enabled = false; > + else > pr_warn("Warning: Failed to disable relocation on exceptions: %ld\n", > rc); > } > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h > index 9563d294f181..65f231d048a8 100644 > --- a/include/uapi/linux/kvm.h > +++ b/include/uapi/linux/kvm.h > @@ -1133,6 +1133,7 @@ struct kvm_ppc_resize_hpt { > #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206 > #define KVM_CAP_VM_GPA_BITS 207 > #define KVM_CAP_XSAVE2 208 > +#define KVM_CAP_PPC_AIL_MODE_3 209 > > #ifdef KVM_CAP_IRQ_ROUTING > > diff --git a/tools/include/uapi/linux/kvm.h b/tools/include/uapi/linux/kvm.h > index 9563d294f181..65f231d048a8 100644 > --- a/tools/include/uapi/linux/kvm.h > +++ b/tools/include/uapi/linux/kvm.h > @@ -1133,6 +1133,7 @@ struct kvm_ppc_resize_hpt { > #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206 > #define KVM_CAP_VM_GPA_BITS 207 > #define KVM_CAP_XSAVE2 208 > +#define KVM_CAP_PPC_AIL_MODE_3 209 > > #ifdef KVM_CAP_IRQ_ROUTING
Nicholas Piggin <npiggin@gmail.com> writes: > Add KVM_CAP_PPC_AIL_MODE_3 to advertise the capability to set the AIL > resource mode to 3 with the H_SET_MODE hypercall. This capability > differs between processor types and KVM types (PR, HV, Nested HV), and > affects guest-visible behaviour. > > QEMU will implement a cap-ail-mode-3 to control this behaviour[1], and > use the KVM CAP if available to determine KVM support[2]. > > [1] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00437.html > [2] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00439.html > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > --- > Documentation/virt/kvm/api.rst | 14 ++++++++++++++ > arch/powerpc/include/asm/setup.h | 2 ++ > arch/powerpc/kvm/powerpc.c | 20 ++++++++++++++++++++ > arch/powerpc/platforms/pseries/setup.c | 12 +++++++++++- > include/uapi/linux/kvm.h | 1 + > tools/include/uapi/linux/kvm.h | 1 + > 6 files changed, 49 insertions(+), 1 deletion(-) This one especially, but may as well be the whole series, needs to be Cc'ed to kvm@vger.kernel.org, so that the generic KVM folks are aware of it. Can you do a resend Cc'ing them please. cheers
diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index bb8cfddbb22d..404056a9a35a 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6995,6 +6995,20 @@ indicated by the fd to the VM this is called on. This is intended to support intra-host migration of VMs between userspace VMMs, upgrading the VMM process without interrupting the guest. +7.30 KVM_CAP_PPC_AIL_MODE_3 +------------------------------- + +:Capability: KVM_CAP_PPC_AIL_MODE_3 +:Architectures: ppc +:Type: vm + +This capability indicates that the kernel supports the mode 3 setting for the +"Address Translation Mode on Interrupt" aka "Alternate Interrupt Location" +resource that is controlled with the H_SET_MODE hypercall. + +This capability allows a guest kernel to use a better-performance mode for +handling interrupts and system calls. + 8. Other capabilities. ====================== diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index d0d3dd531c7f..a555fb77258a 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h @@ -28,11 +28,13 @@ void setup_panic(void); #define ARCH_PANIC_TIMEOUT 180 #ifdef CONFIG_PPC_PSERIES +extern bool pseries_reloc_on_exception(void); extern bool pseries_enable_reloc_on_exc(void); extern void pseries_disable_reloc_on_exc(void); extern void pseries_big_endian_exceptions(void); void __init pseries_little_endian_exceptions(void); #else +static inline bool pseries_reloc_on_exception(void) { return false; } static inline bool pseries_enable_reloc_on_exc(void) { return false; } static inline void pseries_disable_reloc_on_exc(void) {} static inline void pseries_big_endian_exceptions(void) {} diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 2ad0ccd202d5..7dc101ea778c 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -678,6 +678,26 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) r = 1; break; #endif + case KVM_CAP_PPC_AIL_MODE_3: + /* + * KVM PR, POWER7, and some POWER9s don't support AIL=3 mode. + * The POWER9s can support it if the guest runs in hash mode, + * but QEMU doesn't necessarily query the capability in time. + */ + if (hv_enabled) { + if (kvmhv_on_pseries()) { + if (pseries_reloc_on_exception()) + r = 1; + } else if (cpu_has_feature(CPU_FTR_ARCH_207S) && + !cpu_has_feature(CPU_FTR_P9_RADIX_PREFETCH_BUG)) { + r = 1; + } else { + r = 0; + } + } else { + r = 0; + } + break; default: r = 0; break; diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 83a04d967a59..182525c2abd5 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -353,6 +353,13 @@ static void pseries_lpar_idle(void) pseries_idle_epilog(); } +static bool pseries_reloc_on_exception_enabled; + +bool pseries_reloc_on_exception(void) +{ + return pseries_reloc_on_exception_enabled; +} + /* * Enable relocation on during exceptions. This has partition wide scope and * may take a while to complete, if it takes longer than one second we will @@ -377,6 +384,7 @@ bool pseries_enable_reloc_on_exc(void) " on exceptions: %ld\n", rc); return false; } + pseries_reloc_on_exception_enabled = true; return true; } @@ -404,7 +412,9 @@ void pseries_disable_reloc_on_exc(void) break; mdelay(get_longbusy_msecs(rc)); } - if (rc != H_SUCCESS) + if (rc == H_SUCCESS) + pseries_reloc_on_exception_enabled = false; + else pr_warn("Warning: Failed to disable relocation on exceptions: %ld\n", rc); } diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 9563d294f181..65f231d048a8 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1133,6 +1133,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206 #define KVM_CAP_VM_GPA_BITS 207 #define KVM_CAP_XSAVE2 208 +#define KVM_CAP_PPC_AIL_MODE_3 209 #ifdef KVM_CAP_IRQ_ROUTING diff --git a/tools/include/uapi/linux/kvm.h b/tools/include/uapi/linux/kvm.h index 9563d294f181..65f231d048a8 100644 --- a/tools/include/uapi/linux/kvm.h +++ b/tools/include/uapi/linux/kvm.h @@ -1133,6 +1133,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM 206 #define KVM_CAP_VM_GPA_BITS 207 #define KVM_CAP_XSAVE2 208 +#define KVM_CAP_PPC_AIL_MODE_3 209 #ifdef KVM_CAP_IRQ_ROUTING
Add KVM_CAP_PPC_AIL_MODE_3 to advertise the capability to set the AIL resource mode to 3 with the H_SET_MODE hypercall. This capability differs between processor types and KVM types (PR, HV, Nested HV), and affects guest-visible behaviour. QEMU will implement a cap-ail-mode-3 to control this behaviour[1], and use the KVM CAP if available to determine KVM support[2]. [1] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00437.html [2] https://lists.nongnu.org/archive/html/qemu-ppc/2022-02/msg00439.html Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- Documentation/virt/kvm/api.rst | 14 ++++++++++++++ arch/powerpc/include/asm/setup.h | 2 ++ arch/powerpc/kvm/powerpc.c | 20 ++++++++++++++++++++ arch/powerpc/platforms/pseries/setup.c | 12 +++++++++++- include/uapi/linux/kvm.h | 1 + tools/include/uapi/linux/kvm.h | 1 + 6 files changed, 49 insertions(+), 1 deletion(-)