aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-11-13 08:14:00 -0500
committerChristian König <christian.koenig@amd.com>2018-12-03 11:40:25 -0500
commit86bbd89d5da66fe760049ad3f04adc407ec0c4d6 (patch)
tree1edbe3482c3b995847e3417fc23d76196d3c5a19
parent078dec3326e2244c62e8a8d970ba24359e3464be (diff)
drm/syncobj: use dma_fence_get_stub
Extract of useful code from the timeline work. Let's use just a single stub fence instance instead of allocating a new one all the time. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Link: https://patchwork.freedesktop.org/patch/265248/
-rw-r--r--drivers/gpu/drm/drm_syncobj.c58
1 files changed, 14 insertions, 44 deletions
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index e2c5b3ca4824..5c5ba1f14307 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -56,22 +56,6 @@
56#include "drm_internal.h" 56#include "drm_internal.h"
57#include <drm/drm_syncobj.h> 57#include <drm/drm_syncobj.h>
58 58
59struct drm_syncobj_stub_fence {
60 struct dma_fence base;
61 spinlock_t lock;
62};
63
64static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence)
65{
66 return "syncobjstub";
67}
68
69static const struct dma_fence_ops drm_syncobj_stub_fence_ops = {
70 .get_driver_name = drm_syncobj_stub_fence_get_name,
71 .get_timeline_name = drm_syncobj_stub_fence_get_name,
72};
73
74
75/** 59/**
76 * drm_syncobj_find - lookup and reference a sync object. 60 * drm_syncobj_find - lookup and reference a sync object.
77 * @file_private: drm file private pointer 61 * @file_private: drm file private pointer
@@ -190,23 +174,18 @@ void drm_syncobj_replace_fence(struct drm_syncobj *syncobj,
190} 174}
191EXPORT_SYMBOL(drm_syncobj_replace_fence); 175EXPORT_SYMBOL(drm_syncobj_replace_fence);
192 176
193static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) 177/**
178 * drm_syncobj_assign_null_handle - assign a stub fence to the sync object
179 * @syncobj: sync object to assign the fence on
180 *
181 * Assign a already signaled stub fence to the sync object.
182 */
183static void drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
194{ 184{
195 struct drm_syncobj_stub_fence *fence; 185 struct dma_fence *fence = dma_fence_get_stub();
196 fence = kzalloc(sizeof(*fence), GFP_KERNEL);
197 if (fence == NULL)
198 return -ENOMEM;
199 186
200 spin_lock_init(&fence->lock); 187 drm_syncobj_replace_fence(syncobj, 0, fence);
201 dma_fence_init(&fence->base, &drm_syncobj_stub_fence_ops, 188 dma_fence_put(fence);
202 &fence->lock, 0, 0);
203 dma_fence_signal(&fence->base);
204
205 drm_syncobj_replace_fence(syncobj, 0, &fence->base);
206
207 dma_fence_put(&fence->base);
208
209 return 0;
210} 189}
211 190
212/** 191/**
@@ -274,7 +253,6 @@ EXPORT_SYMBOL(drm_syncobj_free);
274int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, 253int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
275 struct dma_fence *fence) 254 struct dma_fence *fence)
276{ 255{
277 int ret;
278 struct drm_syncobj *syncobj; 256 struct drm_syncobj *syncobj;
279 257
280 syncobj = kzalloc(sizeof(struct drm_syncobj), GFP_KERNEL); 258 syncobj = kzalloc(sizeof(struct drm_syncobj), GFP_KERNEL);
@@ -285,13 +263,8 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
285 INIT_LIST_HEAD(&syncobj->cb_list); 263 INIT_LIST_HEAD(&syncobj->cb_list);
286 spin_lock_init(&syncobj->lock); 264 spin_lock_init(&syncobj->lock);
287 265
288 if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) { 266 if (flags & DRM_SYNCOBJ_CREATE_SIGNALED)
289 ret = drm_syncobj_assign_null_handle(syncobj); 267 drm_syncobj_assign_null_handle(syncobj);
290 if (ret < 0) {
291 drm_syncobj_put(syncobj);
292 return ret;
293 }
294 }
295 268
296 if (fence) 269 if (fence)
297 drm_syncobj_replace_fence(syncobj, 0, fence); 270 drm_syncobj_replace_fence(syncobj, 0, fence);
@@ -982,11 +955,8 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
982 if (ret < 0) 955 if (ret < 0)
983 return ret; 956 return ret;
984 957
985 for (i = 0; i < args->count_handles; i++) { 958 for (i = 0; i < args->count_handles; i++)
986 ret = drm_syncobj_assign_null_handle(syncobjs[i]); 959 drm_syncobj_assign_null_handle(syncobjs[i]);
987 if (ret < 0)
988 break;
989 }
990 960
991 drm_syncobj_array_free(syncobjs, args->count_handles); 961 drm_syncobj_array_free(syncobjs, args->count_handles);
992 962