[PATCH 2/2] dma-buf: add dma_fence_chain_(alloc|free)

Christian König ckoenig.leichtzumerken at gmail.com
Tue Jul 30 12:15:54 UTC 2019


Wrap kmalloc/kfree to allow switching to a slab allocator later on.

Signed-off-by: Christian König <christian.koenig at amd.com>
---
 drivers/dma-buf/dma-fence-chain.c      |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |  6 +++---
 drivers/gpu/drm/drm_syncobj.c          |  2 +-
 include/linux/dma-fence-chain.h        | 24 ++++++++++++++++++++++++
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/drivers/dma-buf/dma-fence-chain.c b/drivers/dma-buf/dma-fence-chain.c
index 6c3a615731b4..56183dc9f787 100644
--- a/drivers/dma-buf/dma-fence-chain.c
+++ b/drivers/dma-buf/dma-fence-chain.c
@@ -186,7 +186,7 @@ static void dma_fence_chain_release(struct dma_fence *fence)
 
 	dma_fence_put(rcu_dereference_protected(chain->prev, true));
 	dma_fence_put(chain->fence);
-	dma_fence_free(fence);
+	dma_fence_chain_free(chain);
 }
 
 const struct dma_fence_ops dma_fence_chain_ops = {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index def029ab5657..4b1e4b321999 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -758,7 +758,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
 
 	for (i = 0; i < parser->num_post_deps; i++) {
 		drm_syncobj_put(parser->post_deps[i].syncobj);
-		kfree(parser->post_deps[i].chain);
+		dma_fence_chain_free(parser->post_deps[i].chain);
 	}
 	kfree(parser->post_deps);
 
@@ -1187,7 +1187,7 @@ static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p
 
 		dep->chain = NULL;
 		if (syncobj_deps[i].point) {
-			dep->chain = kmalloc(sizeof(*dep->chain), GFP_KERNEL);
+			dep->chain = dma_fence_chain_alloc();
 			if (!dep->chain)
 				return -ENOMEM;
 		}
@@ -1195,7 +1195,7 @@ static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p
 		dep->syncobj = drm_syncobj_find(p->filp,
 						syncobj_deps[i].handle);
 		if (!dep->syncobj) {
-			kfree(dep->chain);
+			dma_fence_chain_free(dep->chain);
 			return -EINVAL;
 		}
 		dep->point = syncobj_deps[i].point;
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index cecff2e447b1..fc73f398e738 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -696,7 +696,7 @@ static int drm_syncobj_transfer_to_timeline(struct drm_file *file_private,
 				     &fence);
 	if (ret)
 		goto err;
-	chain = kzalloc(sizeof(struct dma_fence_chain), GFP_KERNEL);
+	chain = dma_fence_chain_alloc();
 	if (!chain) {
 		ret = -ENOMEM;
 		goto err1;
diff --git a/include/linux/dma-fence-chain.h b/include/linux/dma-fence-chain.h
index 7466d7b8837e..b84e28661d48 100644
--- a/include/linux/dma-fence-chain.h
+++ b/include/linux/dma-fence-chain.h
@@ -18,6 +18,7 @@
 #ifndef __LINUX_DMA_FENCE_CHAIN_H
 #define __LINUX_DMA_FENCE_CHAIN_H
 
+#include <linux/slab.h>
 #include <linux/dma-fence.h>
 #include <linux/irq_work.h>
 
@@ -43,6 +44,29 @@ struct dma_fence_chain {
 
 extern const struct dma_fence_ops dma_fence_chain_ops;
 
+/**
+ * dma_fence_chain_alloc - wrapper to allocate a dma_fence_chain
+ *
+ * Wrap the kmalloc for now to easier switch to a slub allocator.
+ *
+ * Returns an allocated dma_fence_chain or NULL.
+ */
+static inline struct dma_fence_chain *dma_fence_chain_alloc(void)
+{
+	return kmalloc(sizeof(struct dma_fence_chain), GFP_KERNEL);
+}
+
+/**
+ * dma_fence_chain_free - wrapper to free a dma_fence_chain
+ * @chain: the chain we need to free.
+ *
+ * Wrap the dma_fence_free for now to easier switch to a slub allocator.
+ */
+static inline void dma_fence_chain_free(struct dma_fence_chain *chain)
+{
+	dma_fence_free(&chain->base);
+}
+
 /**
  * to_dma_fence_chain - cast a fence to a dma_fence_chain
  * @fence: fence to cast to a dma_fence_array
-- 
2.17.1



More information about the dri-devel mailing list