]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu: Fix fence signaling race condition in userqueue
authorJesse.Zhang <Jesse.Zhang@amd.com>
Wed, 24 Sep 2025 08:00:06 +0000 (16:00 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:32 +0000 (15:37 -0500)
[ Upstream commit b8ae2640f9acd4f411c9227d2493755d03fe440a ]

This commit fixes a potential race condition in the userqueue fence
signaling mechanism by replacing dma_fence_is_signaled_locked() with
dma_fence_is_signaled().

The issue occurred because:
1. dma_fence_is_signaled_locked() should only be used when holding
   the fence's individual lock, not just the fence list lock
2. Using the locked variant without the proper fence lock could lead
   to double-signaling scenarios:
   - Hardware completion signals the fence
   - Software path also tries to signal the same fence

By using dma_fence_is_signaled() instead, we properly handle the
locking hierarchy and avoid the race condition while still maintaining
the necessary synchronization through the fence_list_lock.

v2: drop the comment (Christian)

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c

index c2a983ff23c95d0c59709e19f48fed6f5072706d..b372baae39797a42a8e7712f0da0a2267c83a5b0 100644 (file)
@@ -276,7 +276,7 @@ static int amdgpu_userq_fence_create(struct amdgpu_usermode_queue *userq,
 
        /* Check if hardware has already processed the job */
        spin_lock_irqsave(&fence_drv->fence_list_lock, flags);
-       if (!dma_fence_is_signaled_locked(fence))
+       if (!dma_fence_is_signaled(fence))
                list_add_tail(&userq_fence->link, &fence_drv->fences);
        else
                dma_fence_put(fence);