dma-buf: add dma_fence_chain_contained helper
authorChristian König <christian.koenig@amd.com>
Thu, 20 Jan 2022 10:42:40 +0000 (11:42 +0100)
committerChristian König <christian.koenig@amd.com>
Tue, 8 Feb 2022 08:25:16 +0000 (09:25 +0100)
It's a reoccurring pattern that we need to extract the fence
from a dma_fence_chain object. Add a helper for this.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220204100429.2049-6-christian.koenig@amd.com
drivers/dma-buf/dma-fence-chain.c
include/linux/dma-fence-chain.h

index 084c6927b7351effc168256b3725ffd5d4c493f1..06f8ef97c6e8c91c8f24f0753c1dd849ef79fcf7 100644 (file)
@@ -148,8 +148,7 @@ static bool dma_fence_chain_enable_signaling(struct dma_fence *fence)
 
        dma_fence_get(&head->base);
        dma_fence_chain_for_each(fence, &head->base) {
-               struct dma_fence_chain *chain = to_dma_fence_chain(fence);
-               struct dma_fence *f = chain ? chain->fence : fence;
+               struct dma_fence *f = dma_fence_chain_contained(fence);
 
                dma_fence_get(f);
                if (!dma_fence_add_callback(f, &head->cb, dma_fence_chain_cb)) {
@@ -165,8 +164,7 @@ static bool dma_fence_chain_enable_signaling(struct dma_fence *fence)
 static bool dma_fence_chain_signaled(struct dma_fence *fence)
 {
        dma_fence_chain_for_each(fence, fence) {
-               struct dma_fence_chain *chain = to_dma_fence_chain(fence);
-               struct dma_fence *f = chain ? chain->fence : fence;
+               struct dma_fence *f = dma_fence_chain_contained(fence);
 
                if (!dma_fence_is_signaled(f)) {
                        dma_fence_put(fence);
index ee906b6596941f7f279d9ca4db2e385b044de314..10d51bcdf7b7946a675203d0e37110454e9256c4 100644 (file)
@@ -66,6 +66,21 @@ to_dma_fence_chain(struct dma_fence *fence)
        return container_of(fence, struct dma_fence_chain, base);
 }
 
+/**
+ * dma_fence_chain_contained - return the contained fence
+ * @fence: the fence to test
+ *
+ * If the fence is a dma_fence_chain the function returns the fence contained
+ * inside the chain object, otherwise it returns the fence itself.
+ */
+static inline struct dma_fence *
+dma_fence_chain_contained(struct dma_fence *fence)
+{
+       struct dma_fence_chain *chain = to_dma_fence_chain(fence);
+
+       return chain ? chain->fence : fence;
+}
+
 /**
  * dma_fence_chain_alloc
  *