Re: [PATCH] media: mediatek: vpu: free IRQ before destroying watchdog workqueue
From: Nicolas Dufresne
Date: Tue Sep 29 2026 - 16:00:47 EST
Le mercredi 23 septembre 2026 à 08:59 +0000, Fan Wu a écrit :
> mtk_vpu_remove() destroys the watchdog workqueue while the interrupt
> handler requested with devm_request_irq() is still registered: the
> devres core frees the interrupt only after remove() has returned. If
> the VPU watchdog fires in that window, vpu_irq_handler() queues
> vpu->wdt.ws on the already destroyed vpu->wdt.wq.
>
> Fix this by calling devm_free_irq() before destroy_workqueue(), which
> releases the interrupt and waits for a running handler, so no new work
> can be queued while the workqueue is drained and freed.
>
> This issue was found by an in-house static analysis tool.
>
> Fixes: 3003a180ef6b ("[media] VPU: mediatek: support Mediatek VPU")
> Cc: stable@xxxxxxxxxxxxxxx
> Co-developed-by: Song Li <songl@xxxxxxxxxx>
> Signed-off-by: Song Li <songl@xxxxxxxxxx>
> Signed-off-by: Fan Wu <fanwu01@xxxxxxxxxx>
Reviewed-by: Nicolas Dufresne <nicolas.dufres@xxxxxxxxxxxxx>
> ---
> drivers/media/platform/mediatek/vpu/mtk_vpu.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/media/platform/mediatek/vpu/mtk_vpu.c b/drivers/media/platform/mediatek/vpu/mtk_vpu.c
> index 8d8319f..b6bd80b 100644
> --- a/drivers/media/platform/mediatek/vpu/mtk_vpu.c
> +++ b/drivers/media/platform/mediatek/vpu/mtk_vpu.c
> @@ -962,6 +962,7 @@ static void mtk_vpu_remove(struct platform_device *pdev)
> #ifdef CONFIG_DEBUG_FS
> debugfs_remove(vpu_debugfs);
> #endif
> + devm_free_irq(&pdev->dev, vpu->reg.irq, vpu);
On the clean factor, it reduce the use of devm API here, but the error path in
probe relies on it still.
> if (vpu->wdt.wq)
> destroy_workqueue(vpu->wdt.wq);
> vpu_free_ext_mem(vpu, P_FW);
>
Attachment:
signature.asc
Description: This is a digitally signed message part