Skip to content

Commit cc8071b

Browse files
Xulin SunSasha Levin
authored andcommitted
media: chips-media: wave5: Fix kthread worker destruction in polling mode
[ Upstream commit 5a0c122 ] Fix the cleanup order in polling mode (irq < 0) to prevent kernel warnings during module removal. Cancel the hrtimer before destroying the kthread worker to ensure work queues are empty. In polling mode, the driver uses hrtimer to periodically trigger wave5_vpu_timer_callback() which queues work via kthread_queue_work(). The kthread_destroy_worker() function validates that both work queues are empty with WARN_ON(!list_empty(&worker->work_list)) and WARN_ON(!list_empty(&worker->delayed_work_list)). The original code called kthread_destroy_worker() before hrtimer_cancel(), creating a race condition where the timer could fire during worker destruction and queue new work, triggering the WARN_ON. This causes the following warning on every module unload in polling mode: ------------[ cut here ]------------ WARNING: CPU: 2 PID: 1034 at kernel/kthread.c:1430 kthread_destroy_worker+0x84/0x98 Modules linked in: wave5(-) rpmsg_ctrl rpmsg_char ... Call trace: kthread_destroy_worker+0x84/0x98 wave5_vpu_remove+0xc8/0xe0 [wave5] platform_remove+0x30/0x58 ... ---[ end trace 0000000000000000 ]--- Fixes: ed7276e ("media: chips-media: wave5: Add hrtimer based polling support") Cc: stable@vger.kernel.org Signed-off-by: Xulin Sun <xulin.sun@windriver.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 3a278a5 commit cc8071b

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

drivers/media/platform/chips-media/wave5/wave5-vpu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,9 @@ static void wave5_vpu_remove(struct platform_device *pdev)
352352
struct vpu_device *dev = dev_get_drvdata(&pdev->dev);
353353

354354
if (dev->irq < 0) {
355-
kthread_destroy_worker(dev->worker);
356355
hrtimer_cancel(&dev->hrtimer);
356+
kthread_cancel_work_sync(&dev->work);
357+
kthread_destroy_worker(dev->worker);
357358
}
358359

359360
pm_runtime_dont_use_autosuspend(&pdev->dev);

0 commit comments

Comments
 (0)