This makes the logic from drm_syncobj_find_fence available to callers that have a drm_syncobj instead of a drm_file/handle pair.
Signed-off-by: Julian Orth ju.orth@gmail.com --- drivers/gpu/drm/drm_syncobj.c | 34 ++++++++++++++++++++++++++++------ include/drm/drm_syncobj.h | 2 ++ 2 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index d992aa082ace..8df438fe0807 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -427,7 +427,7 @@ static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj) * @fence: out parameter for the fence * * This is just a convenience function that combines drm_syncobj_find() and - * drm_syncobj_fence_get(). + * drm_syncobj_fence_lookup(). * * Returns 0 on success or a negative error value on failure. On success @fence * contains a reference to the fence, which must be released by calling @@ -438,8 +438,6 @@ int drm_syncobj_find_fence(struct drm_file *file_private, struct dma_fence **fence) { struct drm_syncobj *syncobj = drm_syncobj_find(file_private, handle); - struct syncobj_wait_entry wait; - u64 timeout = nsecs_to_jiffies64(DRM_SYNCOBJ_WAIT_FOR_SUBMIT_TIMEOUT); int ret;
if (flags & ~DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) @@ -448,6 +446,32 @@ int drm_syncobj_find_fence(struct drm_file *file_private, if (!syncobj) return -ENOENT;
+ ret = drm_syncobj_fence_lookup(syncobj, point, flags, fence); + + drm_syncobj_put(syncobj); + + return ret; +} +EXPORT_SYMBOL(drm_syncobj_find_fence); + +/** + * drm_syncobj_fence_lookup - lookup and reference the fence in a sync object + * @syncobj: sync object to lookup. + * @point: timeline point + * @flags: DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT or not + * @fence: out parameter for the fence + * + * Returns 0 on success or a negative error value on failure. On success @fence + * contains a reference to the fence, which must be released by calling + * dma_fence_put(). + */ +int drm_syncobj_fence_lookup(struct drm_syncobj *syncobj, u64 point, + u64 flags, struct dma_fence **fence) +{ + struct syncobj_wait_entry wait; + u64 timeout = nsecs_to_jiffies64(DRM_SYNCOBJ_WAIT_FOR_SUBMIT_TIMEOUT); + int ret; + /* Waiting for userspace with locks help is illegal cause that can * trivial deadlock with page faults for example. Make lockdep complain * about it early on. @@ -511,11 +535,9 @@ int drm_syncobj_find_fence(struct drm_file *file_private, drm_syncobj_remove_wait(syncobj, &wait);
out: - drm_syncobj_put(syncobj); - return ret; } -EXPORT_SYMBOL(drm_syncobj_find_fence); +EXPORT_SYMBOL(drm_syncobj_fence_lookup);
/** * drm_syncobj_free - free a sync object. diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h index 5da9988834b5..580a967ae364 100644 --- a/include/drm/drm_syncobj.h +++ b/include/drm/drm_syncobj.h @@ -124,6 +124,8 @@ void drm_syncobj_add_point(struct drm_syncobj *syncobj, uint64_t point); void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, struct dma_fence *fence); +int drm_syncobj_fence_lookup(struct drm_syncobj *syncobj, u64 point, + u64 flags, struct dma_fence **fence); int drm_syncobj_find_fence(struct drm_file *file_private, u32 handle, u64 point, u64 flags, struct dma_fence **fence);