From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B635013C918 for ; Sun, 5 Jul 2026 07:26:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783236391; cv=none; b=rDRu6f2mnnJaIkBK1GZXkV3V4Q0hP4Y/NWTOgzP128Ow+HA4L1yJMeau6UWh7k9g5d9CCUoYcfQsLS0fWe8JfygLTIt3C0YaoVIVbxEcfnNnsqHdFDkDiFxeRNFQa/YJR4pBuB1a8bEfvK9g1I1w4BBYS72XeCPX3jQkQHTkTEY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783236391; c=relaxed/simple; bh=uoQYF/CtdE+ISqHoovtUFzlR89TVaPCeC+gTf8M9hq4=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition; b=h2neGEv4+ysYYeyBOlf0LQItvuDTtAssp7iip8LTcTIs16ei75zlL0sJ9NwvLijs9yyXVEPwpBcIha5mc/Qb3D1FcJj5PpDrn6OVQBwFY/qKuBbRNUEGEqMIwfKKFLW59zu1SrBqsurIhQQHVrXgc8wALA9vY0HVO/EbalTzdj8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YV2+cRlA; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YV2+cRlA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 33ACE1F000E9; Sun, 5 Jul 2026 07:26:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783236390; bh=j4s8uWFCUl5Pcv9N69TI5gqODzyV6WYpjFTPDWTfVig=; h=Date:From:To:Cc:Subject; b=YV2+cRlAmt7XjPJxFCLYi5nXUZV1r5J/76MmFw5J54xVxKFjOJZNwPA2XZL9oPb3N 7BtmCaEh+Gyv9a3q1SJhm8H/deU33Ld0/sEO4s9T6HQtiHfRo8fO0fo+jQrAC/tYLv 3AwKsC9TB/g6Vaqv8/b1v37Z50+G1Ot9OfHowhVa0YNv4e4Fp9zee5jhskHgE43POB yYQ58GS0o4tupjuNs34A8PUdg7PSHD1k8eTMWawvtHU8Ad69nSSh/1/xJ8OMMoqXSY hUNeXUQVwBs9SCHyyDwlqaDs5U9L6bXlGYdl06YDU/HCuIQ+SI5WCo8adbB2lKkxRP rxpSysvbHFg/Q== Date: Sun, 5 Jul 2026 09:26:26 +0200 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Thomas Gleixner , Peter Zijlstra Subject: [GIT PULL] IRQ fixes Message-ID: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index b57d81ad33a0..6f5811aae59c 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -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; } diff --git a/drivers/irqchip/irq-riscv-imsic-early.c b/drivers/irqchip/irq-riscv-imsic-early.c index a7a1852b548c..12efd241ce88 100644 --- a/drivers/irqchip/irq-riscv-imsic-early.c +++ b/drivers/irqchip/irq-riscv-imsic-early.c @@ -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 diff --git a/drivers/irqchip/irq-ts4800.c b/drivers/irqchip/irq-ts4800.c index 2e4013c6834d..c7c0b155e353 100644 --- a/drivers/irqchip/irq-ts4800.c +++ b/drivers/irqchip/irq-ts4800.c @@ -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); }