mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
soc: fsl: dpio: Free the IRQ before releasing the I/O object
The DPIO interrupt handler accesses priv->io, but dpaa2_dpio_remove()
releases that object before tearing down the interrupts. The IRQ was
requested with devm_request_irq(), and unregister_dpio_irq_handlers()
only clears its affinity hint. fsl_mc_free_irqs() returns IRQ resources
to the MC resource pool without freeing the handler. An interrupt can
therefore access the freed I/O object before devres releases the IRQ.
Explicitly free the managed IRQ in unregister_dpio_irq_handlers() before
returning its resource to the pool, and perform IRQ teardown before
releasing the I/O object. This also waits for an in-flight handler while
the object is still valid.
This issue was identified during our ongoing static-analysis research
while reviewing kernel code.
Fixes: 993fec7e11 ("bus: fsl-mc: dpio: add the DPAA2 DPIO object driver")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Co-developed-by: Ijae Kim <ae878000@gmail.com>
Signed-off-by: Ijae Kim <ae878000@gmail.com>
Signed-off-by: Myeonghun Pak <mhun512@gmail.com>
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Link: https://lore.kernel.org/r/20261002194802.375497-3-mhun512@gmail.com
Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
This commit is contained in:
parent
45ecea8c55
commit
a7831c657c
|
|
@ -88,6 +88,7 @@ static void unregister_dpio_irq_handlers(struct fsl_mc_device *dpio_dev)
|
|||
|
||||
/* clear the affinity hint */
|
||||
irq_set_affinity_hint(irq->virq, NULL);
|
||||
devm_free_irq(&dpio_dev->dev, irq->virq, &dpio_dev->dev);
|
||||
}
|
||||
|
||||
static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int cpu)
|
||||
|
|
@ -276,10 +277,10 @@ static void dpaa2_dpio_remove(struct fsl_mc_device *dpio_dev)
|
|||
priv = dev_get_drvdata(dev);
|
||||
cpu = dpaa2_io_get_cpu(priv->io);
|
||||
|
||||
dpaa2_io_down(priv->io);
|
||||
|
||||
dpio_teardown_irqs(dpio_dev);
|
||||
|
||||
dpaa2_io_down(priv->io);
|
||||
|
||||
cpumask_set_cpu(cpu, cpus_unused_mask);
|
||||
|
||||
err = dpio_open(dpio_dev->mc_io, 0, dpio_dev->obj_desc.id,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user