mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
Merge tag 'irq-urgent-2026-07-05' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Ingo Molnar:
"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)"
* tag 'irq-urgent-2026-07-05' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
irqchip/ts4800: Fix missing chained handler cleanup on remove
irqchip/gic-v3-its: Fix OF node reference leak
irqchip/irq-riscv-imsic-early: Fix fwnode leak on state setup failure
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user