[PATCH 10/12] drm/syncobj: add drm_syncobj_import_sync_file

From: Julian Orth

Date: Sat May 16 2026 - 07:12:11 EST


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 <ju.orth@xxxxxxxxx>
---
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