dma-buf: consolidate dma_fence subclass checking
authorChristian König <christian.koenig@amd.com>
Wed, 19 Jan 2022 10:17:32 +0000 (11:17 +0100)
committerChristian König <christian.koenig@amd.com>
Tue, 8 Feb 2022 08:19:45 +0000 (09:19 +0100)
Consolidate the wrapper functions to check for dma_fence
subclasses in the dma_fence header.

This makes it easier to document and also check the different
requirements for fence containers in the subclasses.

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-2-christian.koenig@amd.com
include/linux/dma-fence-array.h
include/linux/dma-fence-chain.h
include/linux/dma-fence.h

index 303dd712220fdf4fe55b4b3a1c9a5e38c36b9e52..fec374f69e125506a507e92ec9486e53c79c0de2 100644 (file)
@@ -45,19 +45,6 @@ struct dma_fence_array {
        struct irq_work work;
 };
 
-extern const struct dma_fence_ops dma_fence_array_ops;
-
-/**
- * dma_fence_is_array - check if a fence is from the array subsclass
- * @fence: fence to test
- *
- * Return true if it is a dma_fence_array and false otherwise.
- */
-static inline bool dma_fence_is_array(struct dma_fence *fence)
-{
-       return fence->ops == &dma_fence_array_ops;
-}
-
 /**
  * to_dma_fence_array - cast a fence to a dma_fence_array
  * @fence: fence to cast to a dma_fence_array
@@ -68,7 +55,7 @@ static inline bool dma_fence_is_array(struct dma_fence *fence)
 static inline struct dma_fence_array *
 to_dma_fence_array(struct dma_fence *fence)
 {
-       if (fence->ops != &dma_fence_array_ops)
+       if (!fence || !dma_fence_is_array(fence))
                return NULL;
 
        return container_of(fence, struct dma_fence_array, base);
index 54fe3443fd2ceb38397bdba5d7f3585e33852bda..ee906b6596941f7f279d9ca4db2e385b044de314 100644 (file)
@@ -49,7 +49,6 @@ struct dma_fence_chain {
        spinlock_t lock;
 };
 
-extern const struct dma_fence_ops dma_fence_chain_ops;
 
 /**
  * to_dma_fence_chain - cast a fence to a dma_fence_chain
@@ -61,7 +60,7 @@ extern const struct dma_fence_ops dma_fence_chain_ops;
 static inline struct dma_fence_chain *
 to_dma_fence_chain(struct dma_fence *fence)
 {
-       if (!fence || fence->ops != &dma_fence_chain_ops)
+       if (!fence || !dma_fence_is_chain(fence))
                return NULL;
 
        return container_of(fence, struct dma_fence_chain, base);
index 1ea691753bd311c1e6bdf5369cc35e409b77c924..775cdc0b4f249d6635055242e1d42f4c2c557373 100644 (file)
@@ -587,4 +587,42 @@ struct dma_fence *dma_fence_get_stub(void);
 struct dma_fence *dma_fence_allocate_private_stub(void);
 u64 dma_fence_context_alloc(unsigned num);
 
+extern const struct dma_fence_ops dma_fence_array_ops;
+extern const struct dma_fence_ops dma_fence_chain_ops;
+
+/**
+ * dma_fence_is_array - check if a fence is from the array subclass
+ * @fence: the fence to test
+ *
+ * Return true if it is a dma_fence_array and false otherwise.
+ */
+static inline bool dma_fence_is_array(struct dma_fence *fence)
+{
+       return fence->ops == &dma_fence_array_ops;
+}
+
+/**
+ * dma_fence_is_chain - check if a fence is from the chain subclass
+ * @fence: the fence to test
+ *
+ * Return true if it is a dma_fence_chain and false otherwise.
+ */
+static inline bool dma_fence_is_chain(struct dma_fence *fence)
+{
+       return fence->ops == &dma_fence_chain_ops;
+}
+
+/**
+ * dma_fence_is_container - check if a fence is a container for other fences
+ * @fence: the fence to test
+ *
+ * Return true if this fence is a container for other fences, false otherwise.
+ * This is important since we can't build up large fence structure or otherwise
+ * we run into recursion during operation on those fences.
+ */
+static inline bool dma_fence_is_container(struct dma_fence *fence)
+{
+       return dma_fence_is_array(fence) || dma_fence_is_chain(fence);
+}
+
 #endif /* __LINUX_DMA_FENCE_H */