Thanks Amit for the patch.
Amit Machhiwal <amach...@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 <amach...@linux.ibm.com> Reviewed-by: Vaibhav Jain <vaib...@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 > -- Cheers ~ Vaibhav