diff options
| author | Christian König <christian.koenig@amd.com> | 2018-11-13 08:14:00 -0500 |
|---|---|---|
| committer | Christian König <christian.koenig@amd.com> | 2018-12-03 11:40:25 -0500 |
| commit | 86bbd89d5da66fe760049ad3f04adc407ec0c4d6 (patch) | |
| tree | 1edbe3482c3b995847e3417fc23d76196d3c5a19 | |
| parent | 078dec3326e2244c62e8a8d970ba24359e3464be (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.c | 58 |
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 | ||
| 59 | struct drm_syncobj_stub_fence { | ||
| 60 | struct dma_fence base; | ||
| 61 | spinlock_t lock; | ||
| 62 | }; | ||
| 63 | |||
| 64 | static const char *drm_syncobj_stub_fence_get_name(struct dma_fence *fence) | ||
| 65 | { | ||
| 66 | return "syncobjstub"; | ||
| 67 | } | ||
| 68 | |||
| 69 | static 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 | } |
| 191 | EXPORT_SYMBOL(drm_syncobj_replace_fence); | 175 | EXPORT_SYMBOL(drm_syncobj_replace_fence); |
| 192 | 176 | ||
| 193 | static 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 | */ | ||
| 183 | static 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); | |||
| 274 | int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags, | 253 | int 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 | ||
