Skip to contentSkip to conversation

IRQ fixes

GIT PULL Merged Ingo Molnar 2 participants 2 messages Jul 5

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

Linus,

Please pull the latest irq/urgent Git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq-urgent-2026-07-05

for you to fetch changes up to 98bf7e54cec07d514b3575c11896a8b12d50ecc4:

Misc irqchip driver fixes:

- Fix a resource leak in the RISC-V imsic-early driver (Haoxiang Li)

- Fix an OF node reference leak in the ARM gic-v3-its driver (Yuho Choi)

- Fix a dangling handler function on module removal bug in the TS-4800 ARM board irqchip driver (Qingshuang Fu)

Thanks,

Ingo

------------------>
Haoxiang Li (1):
irqchip/irq-riscv-imsic-early: Fix fwnode leak on state setup failure

Qingshuang Fu (1):
irqchip/ts4800: Fix missing chained handler cleanup on remove

Yuho Choi (1):
irqchip/gic-v3-its: Fix OF node reference leak

 drivers/irqchip/irq-gic-v3-its.c        |  6 ++----
 drivers/irqchip/irq-riscv-imsic-early.c | 15 ++++++++-------
 drivers/irqchip/irq-ts4800.c            | 10 ++++++++++
 3 files changed, 20 insertions(+), 11 deletions(-)
drivers/irqchip/irq-gic-v3-its.c +2 -4
index b57d81ad33a0..6f5811aae59c 100644
@@ -3290,11 +3290,9 @@ static void its_cpu_init_collection(struct its_node *its)
 
 	/* avoid cross node collections and its mapping */
 	if (its->flags & ITS_FLAGS_WORKAROUND_CAVIUM_23144) {
-		struct device_node *cpu_node;
+		struct device_node *cpu_node __free(device_node) = of_get_cpu_node(cpu, NULL);
 
-		cpu_node = of_get_cpu_node(cpu, NULL);
-		if (its->numa_node != NUMA_NO_NODE &&
-			its->numa_node != of_node_to_nid(cpu_node))
+		if (its->numa_node != NUMA_NO_NODE && its->numa_node != of_node_to_nid(cpu_node))
 			return;
 	}
 
drivers/irqchip/irq-riscv-imsic-early.c +8 -7
index a7a1852b548c..12efd241ce88 100644
@@ -272,16 +272,13 @@ static int __init imsic_early_acpi_init(union acpi_subtable_headers *header,
 	rc = imsic_setup_state(imsic_acpi_fwnode, imsic);
 	if (rc) {
 		pr_err("%pfwP: failed to setup state (error %d)\n", imsic_acpi_fwnode, rc);
-		return rc;
+		goto cleanup;
 	}
 
 	/* Do early setup of IMSIC state and IPIs */
 	rc = imsic_early_probe(imsic_acpi_fwnode);
-	if (rc) {
-		irq_domain_free_fwnode(imsic_acpi_fwnode);
-		imsic_acpi_fwnode = NULL;
-		return rc;
-	}
+	if (rc)
+		goto cleanup;
 
 	rc = imsic_platform_acpi_probe(imsic_acpi_fwnode);
 
@@ -300,8 +297,12 @@ static int __init imsic_early_acpi_init(union acpi_subtable_headers *header,
 	 * DT where IPI works but MSI probe fails for some reason.
 	 */
 	return 0;
-}
 
+cleanup:
+	irq_domain_free_fwnode(imsic_acpi_fwnode);
+	imsic_acpi_fwnode = NULL;
+	return rc;
+}
 IRQCHIP_ACPI_DECLARE(riscv_imsic, ACPI_MADT_TYPE_IMSIC, NULL,
 		     1, imsic_early_acpi_init);
 #endif
drivers/irqchip/irq-ts4800.c +10 -0
index 2e4013c6834d..c7c0b155e353 100644
@@ -28,6 +28,7 @@ struct ts4800_irq_data {
 	void __iomem            *base;
 	struct platform_device	*pdev;
 	struct irq_domain       *domain;
+	unsigned int            parent_irq;
 };
 
 static void ts4800_irq_mask(struct irq_data *d)
@@ -134,6 +135,7 @@ static int ts4800_ic_probe(struct platform_device *pdev)
 	irq_set_chained_handler_and_data(parent_irq,
 					 ts4800_ic_chained_handle_irq, data);
 
+	data->parent_irq = parent_irq;
 	platform_set_drvdata(pdev, data);
 
 	return 0;
@@ -142,6 +144,14 @@ static int ts4800_ic_probe(struct platform_device *pdev)
 static void ts4800_ic_remove(struct platform_device *pdev)
 {
 	struct ts4800_irq_data *data = platform_get_drvdata(pdev);
+	unsigned int hwirq;
+
+	irq_set_chained_handler_and_data(data->parent_irq, NULL, NULL);
+
+	for (hwirq = 0; hwirq < 8; hwirq++)
+		irq_dispose_mapping(irq_find_mapping(data->domain, hwirq));
+
+	irq_dispose_mapping(data->parent_irq);
 
 	irq_domain_remove(data->domain);
 }