]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
genirq/irqdomain: Remove auto-recursive hierarchy support
authorMarc Zyngier <marc.zyngier@arm.com>
Tue, 20 Jun 2017 21:17:44 +0000 (22:17 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 22 Jun 2017 16:29:34 +0000 (18:29 +0200)
It did seem like a good idea at the time, but it never really
caught on, and auto-recursive domains remain unused 3 years after
having been introduced.

Oh well, time for a late spring cleanup.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/irqdomain.h
kernel/irq/irqdomain.c
kernel/irq/msi.c

index 222f47af12f4d7ee79a5b51a8ca3ce8e1540f533..cac77a5c555544af38d206c7f5b9eecd525394e2 100644 (file)
@@ -180,8 +180,8 @@ enum {
        /* Irq domain is hierarchical */
        IRQ_DOMAIN_FLAG_HIERARCHY       = (1 << 0),
 
-       /* Core calls alloc/free recursive through the domain hierarchy. */
-       IRQ_DOMAIN_FLAG_AUTO_RECURSIVE  = (1 << 1),
+       /* Irq domain name was allocated in __irq_domain_add() */
+       IRQ_DOMAIN_NAME_ALLOCATED       = (1 << 6),
 
        /* Irq domain is an IPI domain with virq per cpu */
        IRQ_DOMAIN_FLAG_IPI_PER_CPU     = (1 << 2),
@@ -195,9 +195,6 @@ enum {
        /* Irq domain implements MSI remapping */
        IRQ_DOMAIN_FLAG_MSI_REMAP       = (1 << 5),
 
-       /* Irq domain name was allocated in __irq_domain_add() */
-       IRQ_DOMAIN_NAME_ALLOCATED       = (1 << 6),
-
        /*
         * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved
         * for implementation specific purposes and ignored by the
@@ -448,7 +445,7 @@ static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
                                       NULL);
 }
 
-extern int irq_domain_alloc_irqs_recursive(struct irq_domain *domain,
+extern int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
                                           unsigned int irq_base,
                                           unsigned int nr_irqs, void *arg);
 extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain,
index f6adeaeb4c163a79deec1e5cdf70d04293a950ac..14fe862aa2e36a26d8b97ee5b411bbca87921016 100644 (file)
@@ -1342,43 +1342,18 @@ void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq,
        irq_domain_free_irqs_common(domain, virq, nr_irqs);
 }
 
-static bool irq_domain_is_auto_recursive(struct irq_domain *domain)
-{
-       return domain->flags & IRQ_DOMAIN_FLAG_AUTO_RECURSIVE;
-}
-
-static void irq_domain_free_irqs_recursive(struct irq_domain *domain,
+static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain,
                                           unsigned int irq_base,
                                           unsigned int nr_irqs)
 {
        domain->ops->free(domain, irq_base, nr_irqs);
-       if (irq_domain_is_auto_recursive(domain)) {
-               BUG_ON(!domain->parent);
-               irq_domain_free_irqs_recursive(domain->parent, irq_base,
-                                              nr_irqs);
-       }
 }
 
-int irq_domain_alloc_irqs_recursive(struct irq_domain *domain,
+int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
                                    unsigned int irq_base,
                                    unsigned int nr_irqs, void *arg)
 {
-       int ret = 0;
-       struct irq_domain *parent = domain->parent;
-       bool recursive = irq_domain_is_auto_recursive(domain);
-
-       BUG_ON(recursive && !parent);
-       if (recursive)
-               ret = irq_domain_alloc_irqs_recursive(parent, irq_base,
-                                                     nr_irqs, arg);
-       if (ret < 0)
-               return ret;
-
-       ret = domain->ops->alloc(domain, irq_base, nr_irqs, arg);
-       if (ret < 0 && recursive)
-               irq_domain_free_irqs_recursive(parent, irq_base, nr_irqs);
-
-       return ret;
+       return domain->ops->alloc(domain, irq_base, nr_irqs, arg);
 }
 
 /**
@@ -1439,7 +1414,7 @@ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
        }
 
        mutex_lock(&irq_domain_mutex);
-       ret = irq_domain_alloc_irqs_recursive(domain, virq, nr_irqs, arg);
+       ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg);
        if (ret < 0) {
                mutex_unlock(&irq_domain_mutex);
                goto out_free_irq_data;
@@ -1474,7 +1449,7 @@ void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs)
        mutex_lock(&irq_domain_mutex);
        for (i = 0; i < nr_irqs; i++)
                irq_domain_remove_irq(virq + i);
-       irq_domain_free_irqs_recursive(data->domain, virq, nr_irqs);
+       irq_domain_free_irqs_hierarchy(data->domain, virq, nr_irqs);
        mutex_unlock(&irq_domain_mutex);
 
        irq_domain_free_irq_data(virq, nr_irqs);
@@ -1494,15 +1469,11 @@ int irq_domain_alloc_irqs_parent(struct irq_domain *domain,
                                 unsigned int irq_base, unsigned int nr_irqs,
                                 void *arg)
 {
-       /* irq_domain_alloc_irqs_recursive() has called parent's alloc() */
-       if (irq_domain_is_auto_recursive(domain))
-               return 0;
+       if (!domain->parent)
+               return -ENOSYS;
 
-       domain = domain->parent;
-       if (domain)
-               return irq_domain_alloc_irqs_recursive(domain, irq_base,
-                                                      nr_irqs, arg);
-       return -ENOSYS;
+       return irq_domain_alloc_irqs_hierarchy(domain->parent, irq_base,
+                                              nr_irqs, arg);
 }
 EXPORT_SYMBOL_GPL(irq_domain_alloc_irqs_parent);
 
@@ -1517,10 +1488,10 @@ EXPORT_SYMBOL_GPL(irq_domain_alloc_irqs_parent);
 void irq_domain_free_irqs_parent(struct irq_domain *domain,
                                 unsigned int irq_base, unsigned int nr_irqs)
 {
-       /* irq_domain_free_irqs_recursive() will call parent's free */
-       if (!irq_domain_is_auto_recursive(domain) && domain->parent)
-               irq_domain_free_irqs_recursive(domain->parent, irq_base,
-                                              nr_irqs);
+       if (!domain->parent)
+               return;
+
+       irq_domain_free_irqs_hierarchy(domain->parent, irq_base, nr_irqs);
 }
 EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent);
 
index 9e3f1857c6bdb381ae74c6963c259501eaa8df43..48eadf416c24b3c86f540ab94c6e519557b9b036 100644 (file)
@@ -315,7 +315,7 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
 
                ops->set_desc(arg, desc);
                /* Assumes the domain mutex is held! */
-               ret = irq_domain_alloc_irqs_recursive(domain, virq, 1, arg);
+               ret = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg);
                if (ret)
                        break;