summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMikko Perttunen <mperttunen@nvidia.com>2026-06-09 17:09:17 +0900
committerThierry Reding <treding@nvidia.com>2026-07-16 20:28:50 +0200
commit7a39b9856acccc8e9b05845ca2bf62494fcd3dfa (patch)
tree696a0fe938f9738b66eff602a603e25e2a03c3dd /drivers/gpu
parente5320be8a585a9286f231305d0d443d59c24e46c (diff)
downloadlinux-7a39b9856acccc8e9b05845ca2bf62494fcd3dfa.tar.gz
linux-7a39b9856acccc8e9b05845ca2bf62494fcd3dfa.zip
gpu: host1x: Wait for timeout worker completion on channel free
cdma_timeout_destroy() used cancel_delayed_work() to cancel pending timeout work when destroying the CDMA. Usually this is fine, but there is a narrow race condition where the timeout handler has started execution but has not taken cdma->lock; the channel is freed causing cdma_stop to take cdma->lock and flush the channel; host1x_cdma_deinit then proceeds with deinitializing cdma while the handler is waiting to take cdma->lock. Therefore change cdma_timeout_destroy to use cancel_delayed_work_sync instead to ensure any pending timeout work completes before proceeding. Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Link: https://patch.msgid.link/20260609-b4-host1x-small-fixes-a-v1-1-7c1131c0b3ad@nvidia.com
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/host1x/hw/cdma_hw.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/gpu/host1x/hw/cdma_hw.c b/drivers/gpu/host1x/hw/cdma_hw.c
index 3f3f0018eee0..ab714d221120 100644
--- a/drivers/gpu/host1x/hw/cdma_hw.c
+++ b/drivers/gpu/host1x/hw/cdma_hw.c
@@ -355,7 +355,7 @@ static int cdma_timeout_init(struct host1x_cdma *cdma)
static void cdma_timeout_destroy(struct host1x_cdma *cdma)
{
if (cdma->timeout.initialized)
- cancel_delayed_work(&cdma->timeout.wq);
+ cancel_delayed_work_sync(&cdma->timeout.wq);
cdma->timeout.initialized = false;
}