| Message ID | 20250425185641.1611857-1-amachhiw@linux.ibm.com |
|---|---|
| State | New |
| Headers | show |
| Series | KVM: PPC: Book3S HV: Fix IRQ map warnings with XICS on pSeries KVM Guest | expand |
Thanks Amit for the patch. Amit Machhiwal <amachhiw@linux.ibm.com> writes: > The commit 9576730d0e6e ("KVM: PPC: select IRQ_BYPASS_MANAGER") enabled > IRQ_BYPASS_MANAGER when CONFIG_KVM was set. Subsequently, commit > c57875f5f9be ("KVM: PPC: Book3S HV: Enable IRQ bypass") enabled IRQ > bypass and added the necessary callbacks to create/remove the mappings > between host real IRQ and the guest GSI. > > The availability of IRQ bypass is determined by the arch-specific > function kvm_arch_has_irq_bypass(), which invokes > kvmppc_irq_bypass_add_producer_hv(). This function, in turn, calls > kvmppc_set_passthru_irq_hv() to create a mapping in the passthrough IRQ > map, associating a host IRQ to a guest GSI. > > However, when a pSeries KVM guest (L2) is booted within an LPAR (L1) > with the kernel boot parameter `xive=off`, it defaults to using emulated > XICS controller. As an attempt to establish host IRQ to guest GSI > mappings via kvmppc_set_passthru_irq() on a PCI device hotplug > (passhthrough) operation fail, returning -ENOENT. This failure occurs > because only interrupts with EOI operations handled through OPAL calls > (verified via is_pnv_opal_msi()) are currently supported. > > These mapping failures lead to below repeated warnings in the L1 host: > > [ 509.220349] kvmppc_set_passthru_irq_hv: Could not assign IRQ map for (58,4970) > [ 509.220368] kvmppc_set_passthru_irq (irq 58, gsi 4970) fails: -2 > [ 509.220376] vfio-pci 0015:01:00.0: irq bypass producer (token 0000000090bc635b) registration fails: -2 > ... > [ 509.291781] vfio-pci 0015:01:00.0: irq bypass producer (token 000000003822eed8) registration fails: -2 > > Fix this by restricting IRQ bypass enablement on pSeries systems by > making the IRQ bypass callbacks unavailable when running on pSeries > platform. > > Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com> Reviewed-by: Vaibhav Jain <vaibhav@linux.ibm.com> > --- > arch/powerpc/kvm/book3s_hv.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index 19f4d298dd17..7667563fb9ff 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -6541,10 +6541,6 @@ static struct kvmppc_ops kvm_ops_hv = { > .fast_vcpu_kick = kvmppc_fast_vcpu_kick_hv, > .arch_vm_ioctl = kvm_arch_vm_ioctl_hv, > .hcall_implemented = kvmppc_hcall_impl_hv, > -#ifdef CONFIG_KVM_XICS > - .irq_bypass_add_producer = kvmppc_irq_bypass_add_producer_hv, > - .irq_bypass_del_producer = kvmppc_irq_bypass_del_producer_hv, > -#endif > .configure_mmu = kvmhv_configure_mmu, > .get_rmmu_info = kvmhv_get_rmmu_info, > .set_smt_mode = kvmhv_set_smt_mode, > @@ -6662,6 +6658,22 @@ static int kvmppc_book3s_init_hv(void) > return r; > } > > +#if defined(CONFIG_KVM_XICS) > + /* > + * IRQ bypass is supported only for interrupts whose EOI operations are > + * handled via OPAL calls. Therefore, register IRQ bypass handlers > + * exclusively for PowerNV KVM when booted with 'xive=off', indicating > + * the use of the emulated XICS interrupt controller. > + */ > + if (!kvmhv_on_pseries()) { > + pr_info("KVM-HV: Enabling IRQ bypass\n"); > + kvm_ops_hv.irq_bypass_add_producer = > + kvmppc_irq_bypass_add_producer_hv; > + kvm_ops_hv.irq_bypass_del_producer = > + kvmppc_irq_bypass_del_producer_hv; > + } > +#endif > + > kvm_ops_hv.owner = THIS_MODULE; > kvmppc_hv_ops = &kvm_ops_hv; > > > base-commit: 6e3597f12dce7d5041e604fec3602493e38c330a > -- > 2.49.0 >
I tested this on both KOP and PowerNV, LGTM
Tested-by: Gautam Menghani <gautam@linux.ibm.com>
On Sat, 26 Apr 2025 00:26:41 +0530, Amit Machhiwal wrote: > The commit 9576730d0e6e ("KVM: PPC: select IRQ_BYPASS_MANAGER") enabled > IRQ_BYPASS_MANAGER when CONFIG_KVM was set. Subsequently, commit > c57875f5f9be ("KVM: PPC: Book3S HV: Enable IRQ bypass") enabled IRQ > bypass and added the necessary callbacks to create/remove the mappings > between host real IRQ and the guest GSI. > > The availability of IRQ bypass is determined by the arch-specific > function kvm_arch_has_irq_bypass(), which invokes > kvmppc_irq_bypass_add_producer_hv(). This function, in turn, calls > kvmppc_set_passthru_irq_hv() to create a mapping in the passthrough IRQ > map, associating a host IRQ to a guest GSI. > > [...] Applied to powerpc/next. [1/1] KVM: PPC: Book3S HV: Fix IRQ map warnings with XICS on pSeries KVM Guest https://git.kernel.org/powerpc/c/ccdb36cbe65fe05fd5349c7ee5a59e53be7fe195 Thanks
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 19f4d298dd17..7667563fb9ff 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -6541,10 +6541,6 @@ static struct kvmppc_ops kvm_ops_hv = { .fast_vcpu_kick = kvmppc_fast_vcpu_kick_hv, .arch_vm_ioctl = kvm_arch_vm_ioctl_hv, .hcall_implemented = kvmppc_hcall_impl_hv, -#ifdef CONFIG_KVM_XICS - .irq_bypass_add_producer = kvmppc_irq_bypass_add_producer_hv, - .irq_bypass_del_producer = kvmppc_irq_bypass_del_producer_hv, -#endif .configure_mmu = kvmhv_configure_mmu, .get_rmmu_info = kvmhv_get_rmmu_info, .set_smt_mode = kvmhv_set_smt_mode, @@ -6662,6 +6658,22 @@ static int kvmppc_book3s_init_hv(void) return r; } +#if defined(CONFIG_KVM_XICS) + /* + * IRQ bypass is supported only for interrupts whose EOI operations are + * handled via OPAL calls. Therefore, register IRQ bypass handlers + * exclusively for PowerNV KVM when booted with 'xive=off', indicating + * the use of the emulated XICS interrupt controller. + */ + if (!kvmhv_on_pseries()) { + pr_info("KVM-HV: Enabling IRQ bypass\n"); + kvm_ops_hv.irq_bypass_add_producer = + kvmppc_irq_bypass_add_producer_hv; + kvm_ops_hv.irq_bypass_del_producer = + kvmppc_irq_bypass_del_producer_hv; + } +#endif + kvm_ops_hv.owner = THIS_MODULE; kvmppc_hv_ops = &kvm_ops_hv;
The commit 9576730d0e6e ("KVM: PPC: select IRQ_BYPASS_MANAGER") enabled IRQ_BYPASS_MANAGER when CONFIG_KVM was set. Subsequently, commit c57875f5f9be ("KVM: PPC: Book3S HV: Enable IRQ bypass") enabled IRQ bypass and added the necessary callbacks to create/remove the mappings between host real IRQ and the guest GSI. The availability of IRQ bypass is determined by the arch-specific function kvm_arch_has_irq_bypass(), which invokes kvmppc_irq_bypass_add_producer_hv(). This function, in turn, calls kvmppc_set_passthru_irq_hv() to create a mapping in the passthrough IRQ map, associating a host IRQ to a guest GSI. However, when a pSeries KVM guest (L2) is booted within an LPAR (L1) with the kernel boot parameter `xive=off`, it defaults to using emulated XICS controller. As an attempt to establish host IRQ to guest GSI mappings via kvmppc_set_passthru_irq() on a PCI device hotplug (passhthrough) operation fail, returning -ENOENT. This failure occurs because only interrupts with EOI operations handled through OPAL calls (verified via is_pnv_opal_msi()) are currently supported. These mapping failures lead to below repeated warnings in the L1 host: [ 509.220349] kvmppc_set_passthru_irq_hv: Could not assign IRQ map for (58,4970) [ 509.220368] kvmppc_set_passthru_irq (irq 58, gsi 4970) fails: -2 [ 509.220376] vfio-pci 0015:01:00.0: irq bypass producer (token 0000000090bc635b) registration fails: -2 ... [ 509.291781] vfio-pci 0015:01:00.0: irq bypass producer (token 000000003822eed8) registration fails: -2 Fix this by restricting IRQ bypass enablement on pSeries systems by making the IRQ bypass callbacks unavailable when running on pSeries platform. Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com> --- arch/powerpc/kvm/book3s_hv.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) base-commit: 6e3597f12dce7d5041e604fec3602493e38c330a