On Thu, Oct 08 2020 at 14:06, Marc Zyngier wrote: > On 2020-10-08 12:22, Thomas Gleixner wrote: > Here's what I have now, with the pmc driver calling > irq_domain_disconnect_hierarchy() at the right spots. > > static int irq_domain_alloc_irq_data(struct irq_domain *domain, > @@ -1362,11 +1442,16 @@ int __irq_domain_alloc_irqs(struct irq_domain > *domain, int irq_base, > mutex_unlock(&irq_domain_mutex); > goto out_free_irq_data; > } > - for (i = 0; i < nr_irqs; i++) > + for (i = 0; i < nr_irqs; i++) { > + ret = irq_domain_trim_hierarchy(virq + i); > + if (ret) > + break; > irq_domain_insert_irq(virq + i);
You can't do that in one go because in case of an error you leak the already inserted irqs. You need two loops. for (i = 0; i < nr_irqs; i++) { ret = irq_domain_trim_hierarchy(virq + i); if (ret) { mutex_unlock(&irq_domain_mutex); goto out_free_irq_data; } for (i = 0; i < nr_irqs; i++) irq_domain_insert_irq(virq + i); mutex_unlock(&irq_domain_mutex); return virq; > out_free_irq_data: > irq_domain_free_irq_data(virq, nr_irqs); Thanks, tglx