| From 9ea69a55b3b9a71cded9726af591949c1138f235 Mon Sep 17 00:00:00 2001 |
| From: Laurent Vivier <lvivier@redhat.com> |
| Date: Thu, 26 Nov 2020 09:28:52 +0100 |
| Subject: powerpc/pseries: Pass MSI affinity to irq_create_mapping() |
| |
| From: Laurent Vivier <lvivier@redhat.com> |
| |
| commit 9ea69a55b3b9a71cded9726af591949c1138f235 upstream. |
| |
| With virtio multiqueue, normally each queue IRQ is mapped to a CPU. |
| |
| Commit 0d9f0a52c8b9f ("virtio_scsi: use virtio IRQ affinity") exposed |
| an existing shortcoming of the arch code by moving virtio_scsi to |
| the automatic IRQ affinity assignment. |
| |
| The affinity is correctly computed in msi_desc but this is not applied |
| to the system IRQs. |
| |
| It appears the affinity is correctly passed to rtas_setup_msi_irqs() but |
| lost at this point and never passed to irq_domain_alloc_descs() |
| (see commit 06ee6d571f0e ("genirq: Add affinity hint to irq allocation")) |
| because irq_create_mapping() doesn't take an affinity parameter. |
| |
| Use the new irq_create_mapping_affinity() function, which allows to forward |
| the affinity setting from rtas_setup_msi_irqs() to irq_domain_alloc_descs(). |
| |
| With this change, the virtqueues are correctly dispatched between the CPUs |
| on pseries. |
| |
| Fixes: e75eafb9b039 ("genirq/msi: Switch to new irq spreading infrastructure") |
| Signed-off-by: Laurent Vivier <lvivier@redhat.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Greg Kurz <groug@kaod.org> |
| Acked-by: Michael Ellerman <mpe@ellerman.id.au> |
| Cc: stable@vger.kernel.org |
| Link: https://lore.kernel.org/r/20201126082852.1178497-3-lvivier@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/platforms/pseries/msi.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/platforms/pseries/msi.c |
| +++ b/arch/powerpc/platforms/pseries/msi.c |
| @@ -458,7 +458,8 @@ again: |
| return hwirq; |
| } |
| |
| - virq = irq_create_mapping(NULL, hwirq); |
| + virq = irq_create_mapping_affinity(NULL, hwirq, |
| + entry->affinity); |
| |
| if (!virq) { |
| pr_debug("rtas_msi: Failed mapping hwirq %d\n", hwirq); |