diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2022-02-25 08:32:20 +0100 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2024-01-08 14:01:50 +0100 |
commit | 8136fd6b763ea20cbee782d85363f27c64fb3139 (patch) | |
tree | c03595af8f4caf993ec2bd97581c4d96c847ecb2 | |
parent | 3945ba38103872a8c8072122d666c21c6079806b (diff) |
dma-fance: Add dma_fence_assert_in_signalling_section
Useful for checking for dma-fence signalling annotations since they
don't quite nest as freely as we'd like to.
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: linux-media@vger.kernel.org
Cc: linaro-mm-sig@lists.linaro.org
-rw-r--r-- | drivers/dma-buf/dma-fence.c | 19 | ||||
-rw-r--r-- | include/linux/dma-fence.h | 2 |
2 files changed, 21 insertions, 0 deletions
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index e0fd99e61a2d..62378cdebe97 100644 --- a/drivers/dma-buf/dma-fence.c +++ b/drivers/dma-buf/dma-fence.c @@ -317,6 +317,25 @@ bool dma_fence_begin_signalling(void) EXPORT_SYMBOL(dma_fence_begin_signalling); /** + * dma_fence_assert_in_signalling_section - check fence signalling annotations + * + * Since dma_fence_begin_signalling() and dma_fence_end_signalling() are built + * using lockdep annotations they have limitations on how freely they can be + * nested. Specifically, they cannot be on both inside and outside of locked + * sections, which in practice means the annotations often have to be pushed out + * to the top level callers. + * + * To ensure low-level functions are only called with the correction + * annotations, this function can be used to check for that. + */ +void dma_fence_assert_in_signalling_section(void) +{ + if (!in_atomic()) + lockdep_assert(lock_is_held(&dma_fence_lockdep_map)); +} +EXPORT_SYMBOL(dma_fence_assert_in_signalling_section); + +/** * dma_fence_end_signalling - end a critical DMA fence signalling section * @cookie: opaque cookie from dma_fence_begin_signalling() * diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h index b3772edca2e6..0c32186dcfc9 100644 --- a/include/linux/dma-fence.h +++ b/include/linux/dma-fence.h @@ -376,6 +376,7 @@ dma_fence_get_rcu_safe(struct dma_fence __rcu **fencep) #ifdef CONFIG_LOCKDEP bool dma_fence_begin_signalling(void); +void dma_fence_assert_in_signalling_section(void); void dma_fence_end_signalling(bool cookie); void __dma_fence_might_wait(void); #else @@ -383,6 +384,7 @@ static inline bool dma_fence_begin_signalling(void) { return true; } +static inline void dma_fence_assert_in_signalling_section(void) {} static inline void dma_fence_end_signalling(bool cookie) {} static inline void __dma_fence_might_wait(void) {} #endif |