summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2022-02-25 08:32:20 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2024-01-08 14:01:50 +0100
commit8136fd6b763ea20cbee782d85363f27c64fb3139 (patch)
treec03595af8f4caf993ec2bd97581c4d96c847ecb2
parent3945ba38103872a8c8072122d666c21c6079806b (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.c19
-rw-r--r--include/linux/dma-fence.h2
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