[PATCH AUTOSEL 5.14 38/99] KVM: PPC: Book3S HV: XICS: Fix mapping of passthrough interrupts

Cédric Le Goater clg at kaod.org
Fri Sep 10 15:48:18 AEST 2021


On 9/10/21 2:14 AM, Sasha Levin wrote:
> From: Cédric Le Goater <clg at kaod.org>
> 
> [ 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 at kaod.org>
> Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
> Link: https://lore.kernel.org/r/20210701132750.1475580-31-clg@kaod.org
> Signed-off-by: Sasha Levin <sashal at kernel.org>


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;
>  
> 



More information about the Linuxppc-dev mailing list