diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2026-08-18 15:19:50 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2026-08-18 15:19:50 -0700 |
| commit | 762fffa407d8d24288513538cf5d17c2c5425258 (patch) | |
| tree | 563dba12f6fe1caeea545dfa23c847c7d25723e1 | |
| parent | 6138016752322261e26ac88eaeb64c0c890f98a2 (diff) | |
| parent | 1ad6d4a722f509128038f9c85c6a122a382179fe (diff) | |
Merge tag 'irq-core-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull generic interrupt subsystem updates from Thomas Gleixner:
- Remove pointless NULL checks of the kstats_irqs field. That's a
historical left over and not longer required.
- Add Radu Rendec as reviewer. Radu thankfully stepped up to help
reviewing the interrupt core and the related drivers code.
- The usual small improvements and fixes
* tag 'irq-core-2026-08-17' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
MAINTAINERS: Add Radu Rendec as reviewer for the interrupt subsystem
genirq/msi: Move misplaced EXPORT_SYMBOL_GPL for msi_domain_free_irqs_all()
parisc: Remove unnecessary NULL check of the kstat_irqs field
genirq: Remove unnecessary NULL check of the kstat_irqs field
irqdomain: Remove unnedded NULL check in __irq_domain_[de]activate_irq()
genirq/manage: Use irqd_get_parent_data() helper in __irq_get_irqchip_state()
irqdomain: Plug leak in irq_domain_alloc_irqs_locked() error path
| -rw-r--r-- | MAINTAINERS | 3 | ||||
| -rw-r--r-- | arch/parisc/kernel/smp.c | 2 | ||||
| -rw-r--r-- | include/linux/irqdesc.h | 2 | ||||
| -rw-r--r-- | kernel/irq/irqdesc.c | 11 | ||||
| -rw-r--r-- | kernel/irq/irqdomain.c | 8 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 6 | ||||
| -rw-r--r-- | kernel/irq/msi.c | 2 |
7 files changed, 16 insertions, 18 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 8f4f9f117130..7c62af987a23 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -13701,6 +13701,7 @@ F: sound/soc/codecs/sma* IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY) M: Thomas Gleixner <tglx@kernel.org> +R: Radu Rendec <radu@rendec.net> S: Maintained P: Documentation/process/maintainer-tip.rst T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core @@ -13712,6 +13713,7 @@ F: kernel/irq/msi.c IRQ SUBSYSTEM M: Thomas Gleixner <tglx@kernel.org> +R: Radu Rendec <radu@rendec.net> L: linux-kernel@vger.kernel.org S: Maintained P: Documentation/process/maintainer-tip.rst @@ -13726,6 +13728,7 @@ F: lib/group_cpus.c IRQCHIP DRIVERS M: Thomas Gleixner <tglx@kernel.org> +R: Radu Rendec <radu@rendec.net> L: linux-kernel@vger.kernel.org S: Maintained P: Documentation/process/maintainer-tip.rst diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index b2d12ab728b1..36be17e32948 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -343,7 +343,7 @@ static int smp_boot_one_cpu(int cpuid, struct task_struct *idle) for (i = 0; i < NR_IRQS; i++) { struct irq_desc *desc = irq_to_desc(i); - if (desc && desc->kstat_irqs) + if (desc) *per_cpu_ptr(desc->kstat_irqs, cpuid) = (struct irqstat) { }; } #endif diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index 8080db17c1b1..779d6023c5c2 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -146,7 +146,7 @@ extern struct irq_desc irq_desc[NR_IRQS]; static inline unsigned int irq_desc_kstat_cpu(struct irq_desc *desc, unsigned int cpu) { - return desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0; + return per_cpu(desc->kstat_irqs->cnt, cpu); } static inline struct irq_desc *irq_data_to_desc(struct irq_data *data) diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 80ef4e27dcf4..3a818f07a101 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -1004,7 +1004,7 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) { struct irq_desc *desc = irq_to_desc(irq); - return desc && desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0; + return desc ? irq_desc_kstat_cpu(desc, cpu) : 0; } static unsigned int kstat_irqs_desc(struct irq_desc *desc, const struct cpumask *cpumask) @@ -1026,7 +1026,7 @@ static unsigned int kstat_irqs(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); - if (!desc || !desc->kstat_irqs) + if (!desc) return 0; return kstat_irqs_desc(desc, cpu_possible_mask); } @@ -1038,18 +1038,15 @@ void kstat_snapshot_irqs(void) struct irq_desc *desc; unsigned int irq; - for_each_irq_desc(irq, desc) { - if (!desc->kstat_irqs) - continue; + for_each_irq_desc(irq, desc) this_cpu_write(desc->kstat_irqs->ref, this_cpu_read(desc->kstat_irqs->cnt)); - } } unsigned int kstat_get_irq_since_snapshot(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq); - if (!desc || !desc->kstat_irqs) + if (!desc) return 0; return this_cpu_read(desc->kstat_irqs->cnt) - this_cpu_read(desc->kstat_irqs->ref); } diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index f15c9f1223bb..57c819da30c2 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -1658,7 +1658,7 @@ static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, for (i = 0; i < nr_irqs; i++) { ret = irq_domain_trim_hierarchy(virq + i); if (ret) - goto out_free_irq_data; + goto out_free_irqs; } for (i = 0; i < nr_irqs; i++) @@ -1666,6 +1666,8 @@ static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, return virq; +out_free_irqs: + irq_domain_free_irqs_hierarchy(domain, virq, nr_irqs); out_free_irq_data: irq_domain_free_irq_data(virq, nr_irqs); out_free_desc: @@ -1963,7 +1965,7 @@ EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); static void __irq_domain_deactivate_irq(struct irq_data *irq_data) { - if (irq_data && irq_data->domain) { + if (irq_data->domain) { struct irq_domain *domain = irq_data->domain; if (domain->ops->deactivate) @@ -1977,7 +1979,7 @@ static int __irq_domain_activate_irq(struct irq_data *irqd, bool reserve) { int ret = 0; - if (irqd && irqd->domain) { + if (irqd->domain) { struct irq_domain *domain = irqd->domain; if (irqd->parent_data) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 7eb07e3bdb4c..4fa569db8ec7 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -2703,11 +2703,7 @@ static int __irq_get_irqchip_state(struct irq_data *data, enum irqchip_irq_state return -ENODEV; if (chip->irq_get_irqchip_state) break; -#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY - data = data->parent_data; -#else - data = NULL; -#endif + data = irqd_get_parent_data(data); } while (data); if (data) diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 903be7289c53..fb5f372215bf 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -1683,7 +1683,6 @@ void msi_domain_free_irqs_range(struct device *dev, unsigned int domid, guard(msi_descs_lock)(dev); msi_domain_free_irqs_range_locked(dev, domid, first, last); } -EXPORT_SYMBOL_GPL(msi_domain_free_irqs_all); /** * msi_domain_free_irqs_all_locked - Free all interrupts from a MSI interrupt domain @@ -1714,6 +1713,7 @@ void msi_domain_free_irqs_all(struct device *dev, unsigned int domid) guard(msi_descs_lock)(dev); msi_domain_free_irqs_all_locked(dev, domid); } +EXPORT_SYMBOL_GPL(msi_domain_free_irqs_all); /** * msi_device_domain_free_wired - Free a wired interrupt in @domain |
