On 9/10/21 2:14 AM, Sasha Levin wrote: > From: Cédric Le Goater <clg@xxxxxxxx> > > [ Upstream commit 1753081f2d445f9157550692fcc4221cd3ff0958 ] > > PCI MSIs now live in an MSI domain but the underlying calls, which > will EOI the interrupt in real mode, need an HW IRQ number mapped in > the XICS IRQ domain. Grab it there. > > Signed-off-by: Cédric Le Goater <clg@xxxxxxxx> > Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx> > Link: https://lore.kernel.org/r/20210701132750.1475580-31-clg@xxxxxxxx > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> Why are we backporting this patch in stable trees ? It should be fine but to compile, we need a partial backport of commit 51be9e51a800 ("KVM: PPC: Book3S HV: XIVE: Fix mapping of passthrough interrupts") which exports irq_get_default_host(). Thanks, C. > --- > arch/powerpc/kvm/book3s_hv.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index 085fb8ecbf68..1ca0a4f760bc 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -5328,6 +5328,7 @@ static int kvmppc_set_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi) > struct kvmppc_passthru_irqmap *pimap; > struct irq_chip *chip; > int i, rc = 0; > + struct irq_data *host_data; > > if (!kvm_irq_bypass) > return 1; > @@ -5392,7 +5393,14 @@ static int kvmppc_set_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi) > * the KVM real mode handler. > */ > smp_wmb(); > - irq_map->r_hwirq = desc->irq_data.hwirq; > + > + /* > + * The 'host_irq' number is mapped in the PCI-MSI domain but > + * the underlying calls, which will EOI the interrupt in real > + * mode, need an HW IRQ number mapped in the XICS IRQ domain. > + */ > + host_data = irq_domain_get_irq_data(irq_get_default_host(), host_irq); > + irq_map->r_hwirq = (unsigned int)irqd_to_hwirq(host_data); > > if (i == pimap->n_mapped) > pimap->n_mapped++; > @@ -5400,7 +5408,7 @@ static int kvmppc_set_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi) > if (xics_on_xive()) > rc = kvmppc_xive_set_mapped(kvm, guest_gsi, desc); > else > - kvmppc_xics_set_mapped(kvm, guest_gsi, desc->irq_data.hwirq); > + kvmppc_xics_set_mapped(kvm, guest_gsi, irq_map->r_hwirq); > if (rc) > irq_map->r_hwirq = 0; > >