Re: [PATCH v3 2/4] irqchip/imx-irqsteer: Dispose of IRQ mappings in remove()
Frank Li <[email protected]>
| Newsgroups | dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <anYtxoIxO9tuMUTz@SMW015318> |
On Fri, Aug 07, 2026 at 04:23:44PM +0900, [email protected] wrote: > From: Zhipeng Wang <[email protected]> > > remove() tears down the chained handlers and the IRQ domain but never > disposes of the IRQ mappings it created. The parent mappings from > irq_of_parse_and_map() and the child mappings handed out by the domain > are leaked, and the child irq_descs are left pointing at the driver's > irq_chip past irq_domain_remove(). > > Dispose of the parent mappings alongside the chained handler teardown, > and dispose of the child mappings before removing the domain. > > Fixes: 0136afa08967 ("irqchip: Add driver for imx-irqsteer controller") > Signed-off-by: Zhipeng Wang <[email protected]> > --- > Changes in v3: > - Split out of the single v2 patch. In v2 this was folded into the > module-conversion patch; no functional change. > > drivers/irqchip/irq-imx-irqsteer.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c > index a2f0629b22a3..4a2fe8ba97f5 100644 > --- a/drivers/irqchip/irq-imx-irqsteer.c > +++ b/drivers/irqchip/irq-imx-irqsteer.c > @@ -277,7 +277,7 @@ static int imx_irqsteer_probe(struct platform_device *pdev) > static void imx_irqsteer_remove(struct platform_device *pdev) > { > struct irqsteer_data *irqsteer_data = platform_get_drvdata(pdev); > - int i; > + int hwirq, i; > > for (i = 0; i < irqsteer_data->irq_count; i++) { > if (!irqsteer_data->irq[i]) > @@ -285,8 +285,13 @@ static void imx_irqsteer_remove(struct platform_device *pdev) > > irq_set_chained_handler_and_data(irqsteer_data->irq[i], > NULL, NULL); > + irq_dispose_mapping(irqsteer_data->irq[i]); > } > > + for (hwirq = 0; hwirq < irqsteer_data->reg_num * 32; hwirq++) > + irq_dispose_mapping(irq_find_mapping(irqsteer_data->domain, > + hwirq)); > + only call once irq_of_parse_and_map(), why need irq_dispose_mapping() twice? Frank > irq_domain_remove(irqsteer_data->domain); > > clk_disable_unprepare(irqsteer_data->ipg_clk); > -- > 2.34.1 > >