]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc/xive: Change IRQ domain to a tree domain
authorCédric Le Goater <clg@kaod.org>
Tue, 16 Nov 2021 13:40:22 +0000 (14:40 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 17 Nov 2021 10:55:42 +0000 (21:55 +1100)
Commit fe31bdc8d1fa ("irqdomain: Make normal and nomap irqdomains
exclusive") introduced an IRQ_DOMAIN_FLAG_NO_MAP flag to isolate the
'nomap' domains still in use under the powerpc arch. With this new
flag, the revmap_tree of the IRQ domain is not used anymore. This
change broke the support of shared LSIs [1] in the XIVE driver because
it was relying on a lookup in the revmap_tree to query previously
mapped interrupts. Linux now creates two distinct IRQ mappings on the
same HW IRQ which can lead to unexpected behavior in the drivers.

The XIVE IRQ domain is not a direct mapping domain and its HW IRQ
interrupt number space is rather large : 1M/socket on POWER9 and
POWER10, change the XIVE driver to use a 'tree' domain type instead.

[1] For instance, a linux KVM guest with virtio-rng and virtio-balloon
    devices.

Fixes: fe31bdc8d1fa ("irqdomain: Make normal and nomap irqdomains exclusive")
Cc: stable@vger.kernel.org # v5.14+
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Tested-by: Greg Kurz <groug@kaod.org>
Acked-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211116134022.420412-1-clg@kaod.org
arch/powerpc/sysdev/xive/Kconfig
arch/powerpc/sysdev/xive/common.c

index 97796c6b63f04e706faa80a99b52bcb432465891..785c292d104b7508b50da247910863383696556e 100644 (file)
@@ -3,7 +3,6 @@ config PPC_XIVE
        bool
        select PPC_SMP_MUXED_IPI
        select HARDIRQS_SW_RESEND
-       select IRQ_DOMAIN_NOMAP
 
 config PPC_XIVE_NATIVE
        bool
index c5d75c02ad8b512d51b13eb0c4a7baf7bec3524e..7b69299c29123564050604d64d81431962dc7c32 100644 (file)
@@ -1443,8 +1443,7 @@ static const struct irq_domain_ops xive_irq_domain_ops = {
 
 static void __init xive_init_host(struct device_node *np)
 {
-       xive_irq_domain = irq_domain_add_nomap(np, XIVE_MAX_IRQ,
-                                              &xive_irq_domain_ops, NULL);
+       xive_irq_domain = irq_domain_add_tree(np, &xive_irq_domain_ops, NULL);
        if (WARN_ON(xive_irq_domain == NULL))
                return;
        irq_set_default_host(xive_irq_domain);