genirq/msi: Check for invalid MSI parent domain usage
authorThomas Gleixner <tglx@linutronix.de>
Thu, 24 Nov 2022 23:24:19 +0000 (00:24 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 5 Dec 2022 18:20:59 +0000 (19:20 +0100)
In the upcoming per device MSI domain concept the MSI parent domains are
not allowed to be used as regular MSI domains where the MSI allocation/free
operations are applicable.

Add appropriate checks.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221124230313.806128070@linutronix.de
kernel/irq/msi.c

index c37c0be..5939dc6 100644 (file)
@@ -937,13 +937,21 @@ int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device
 
        lockdep_assert_held(&dev->msi.data->mutex);
 
+       if (WARN_ON_ONCE(irq_domain_is_msi_parent(domain))) {
+               ret = -EINVAL;
+               goto free;
+       }
+
+       /* Frees allocated descriptors in case of failure. */
        ret = msi_domain_add_simple_msi_descs(info, dev, nvec);
        if (ret)
-               return ret;
+               goto free;
 
        ret = ops->domain_alloc_irqs(domain, dev, nvec);
-       if (ret)
-               msi_domain_free_irqs_descs_locked(domain, dev);
+       if (!ret)
+               return 0;
+free:
+       msi_domain_free_irqs_descs_locked(domain, dev);
        return ret;
 }
 
@@ -1013,6 +1021,9 @@ void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device
 
        lockdep_assert_held(&dev->msi.data->mutex);
 
+       if (WARN_ON_ONCE(irq_domain_is_msi_parent(domain)))
+               return;
+
        ops->domain_free_irqs(domain, dev);
        if (ops->msi_post_free)
                ops->msi_post_free(domain, dev);