]> Git Repo - J-linux.git/commitdiff
dma-buf/dma-fence: Use a successful read_trylock() annotation for dma_fence_begin_sig...
authorThomas Hellström <[email protected]>
Fri, 28 Apr 2023 12:52:32 +0000 (14:52 +0200)
committerThomas Hellström <[email protected]>
Fri, 20 Sep 2024 07:27:00 +0000 (09:27 +0200)
Condsider the following call sequence:

/* Upper layer */
dma_fence_begin_signalling();
lock(tainted_shared_lock);
/* Driver callback */
dma_fence_begin_signalling();
...

The driver might here use a utility that is annotated as intended for the
dma-fence signalling critical path. Now if the upper layer isn't correctly
annotated yet for whatever reason, resulting in

/* Upper layer */
lock(tainted_shared_lock);
/* Driver callback */
dma_fence_begin_signalling();

We will receive a false lockdep locking order violation notification from
dma_fence_begin_signalling(). However entering a dma-fence signalling
critical section itself doesn't block and could not cause a deadlock.

So use a successful read_trylock() annotation instead for
dma_fence_begin_signalling(). That will make sure that the locking order
is correctly registered in the first case, and doesn't register any
locking order in the second case.

The alternative is of course to make sure that the "Upper layer" is always
correctly annotated. But experience shows that's not easily achievable
in all cases.

Signed-off-by: Thomas Hellström <[email protected]>
Reviewed-by: Daniel Vetter <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
drivers/dma-buf/dma-fence.c

index 0393a9bba3a8a9b9977b6f7e00e0d20c6d890a33..f8303ae99acfd0726ec00bba911e9a188ac66234 100644 (file)
@@ -309,8 +309,8 @@ bool dma_fence_begin_signalling(void)
        if (in_atomic())
                return true;
 
-       /* ... and non-recursive readlock */
-       lock_acquire(&dma_fence_lockdep_map, 0, 0, 1, 1, NULL, _RET_IP_);
+       /* ... and non-recursive successful read_trylock */
+       lock_acquire(&dma_fence_lockdep_map, 0, 1, 1, 1, NULL, _RET_IP_);
 
        return false;
 }
@@ -341,7 +341,7 @@ void __dma_fence_might_wait(void)
        lock_map_acquire(&dma_fence_lockdep_map);
        lock_map_release(&dma_fence_lockdep_map);
        if (tmp)
-               lock_acquire(&dma_fence_lockdep_map, 0, 0, 1, 1, NULL, _THIS_IP_);
+               lock_acquire(&dma_fence_lockdep_map, 0, 1, 1, 1, NULL, _THIS_IP_);
 }
 #endif
 
This page took 0.054882 seconds and 4 git commands to generate.