This makes the logic from drm_syncobj_import_sync_file_fence available
to callers that have a drm_syncobj instead of a drm_file/handle pair.

Signed-off-by: Julian Orth <[email protected]>
---
 drivers/gpu/drm/drm_syncobj.c | 35 ++++++++++++++++++++++++++---------
 include/drm/drm_syncobj.h     |  2 ++
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 1da96e23dfc0..4c1667c67cb7 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -765,19 +765,37 @@ static int drm_syncobj_fd_to_handle(struct drm_file 
*file_private,
 static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
                                              int fd, int handle, u64 point)
 {
-       struct dma_fence *fence = sync_file_get_fence(fd);
        struct drm_syncobj *syncobj;
        int ret = 0;
 
+       syncobj = drm_syncobj_find(file_private, handle);
+       if (!syncobj)
+               return -ENOENT;
+
+       ret = drm_syncobj_import_sync_file(syncobj, fd, point);
+
+       drm_syncobj_put(syncobj);
+
+       return ret;
+}
+
+/**
+ * drm_syncobj_import_sync_file - import a sync_file fd into a syncobj
+ * @syncobj: syncobj to import into
+ * @fd: sync_file file descriptor
+ * @point: timeline point or 0
+ *
+ * Returns 0 on success or a negative error value on failure.
+ */
+int drm_syncobj_import_sync_file(struct drm_syncobj *syncobj,
+                                int fd, u64 point)
+{
+       struct dma_fence *fence = sync_file_get_fence(fd);
+       int ret = 0;
+
        if (!fence)
                return -EINVAL;
 
-       syncobj = drm_syncobj_find(file_private, handle);
-       if (!syncobj) {
-               ret = -ENOENT;
-               goto err_syncobj;
-       }
-
        if (point) {
                struct dma_fence_chain *chain = dma_fence_chain_alloc();
 
@@ -792,11 +810,10 @@ static int drm_syncobj_import_sync_file_fence(struct 
drm_file *file_private,
        }
 
 err:
-       drm_syncobj_put(syncobj);
-err_syncobj:
        dma_fence_put(fence);
        return ret;
 }
+EXPORT_SYMBOL(drm_syncobj_import_sync_file);
 
 static int drm_syncobj_export_sync_file(struct drm_file *file_private,
                                        int handle, u64 point, int *p_fd)
diff --git a/include/drm/drm_syncobj.h b/include/drm/drm_syncobj.h
index da237ca3e61f..1571ffa12a5c 100644
--- a/include/drm/drm_syncobj.h
+++ b/include/drm/drm_syncobj.h
@@ -143,6 +143,8 @@ int drm_syncobj_timeline_signal(struct drm_syncobj 
**syncobjs,
                                u64 user_points, u32 count);
 int drm_syncobj_query(struct drm_syncobj **syncobjs, u64 user_points,
                      u32 count, u32 flags);
+int drm_syncobj_import_sync_file(struct drm_syncobj *syncobj,
+                                int sync_file_fd, u64 point);
 void drm_syncobj_free(struct kref *kref);
 int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
                       struct dma_fence *fence);

-- 
2.54.0

Reply via email to