Yes, I believe this is the proper way for sync_file and syncobj to interact. Again, I can't really review for all of the kernel details (though the seem ok to me) so this mostly applies to the API: Reviewed-by: Jason Ekstrand <jason at jlekstrand.net> On Wed, May 24, 2017 at 12:06 AM, Dave Airlie <airlied at gmail.com> wrote: > From: Dave Airlie <airlied at redhat.com> > > This interface allows importing the fence from a sync_file into > an existing drm sync object, or exporting the fence attached to > an existing drm sync object into a new sync file object. > > This should only be used to interact with sync files where necessary. > > Reviewed-by: Sean Paul <seanpaul at chromium.org> > Signed-off-by: Dave Airlie <airlied at redhat.com> > --- > drivers/gpu/drm/drm_syncobj.c | 64 ++++++++++++++++++++++++++++++ > +++++++++++-- > include/uapi/drm/drm.h | 2 ++ > 2 files changed, 64 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index 8b87594..54d751e 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -50,6 +50,7 @@ > #include <linux/file.h> > #include <linux/fs.h> > #include <linux/anon_inodes.h> > +#include <linux/sync_file.h> > > #include "drm_internal.h" > #include <drm/drm_syncobj.h> > @@ -276,6 +277,48 @@ static int drm_syncobj_fd_to_handle(struct drm_file > *file_private, > return 0; > } > > +int drm_syncobj_import_sync_file_fence(struct drm_file *file_private, > + int fd, int handle) > +{ > + struct dma_fence *fence = sync_file_get_fence(fd); > + if (!fence) > + return -EINVAL; > + > + return drm_syncobj_replace_fence(file_private, handle, fence); > +} > + > +int drm_syncobj_export_sync_file(struct drm_file *file_private, > + int handle, int *p_fd) > +{ > + int ret; > + struct dma_fence *fence; > + struct sync_file *sync_file; > + int fd = get_unused_fd_flags(O_CLOEXEC); > + > + if (fd < 0) > + return fd; > + > + ret = drm_syncobj_fence_get(file_private, handle, &fence); > + if (ret) > + goto err_put_fd; > + > + sync_file = sync_file_create(fence); > + if (!sync_file) { > + ret = -EINVAL; > + goto err_fence_put; > + } > + > + fd_install(fd, sync_file->file); > + > + dma_fence_put(fence); > + *p_fd = fd; > + return 0; > +err_fence_put: > + dma_fence_put(fence); > +err_put_fd: > + put_unused_fd(fd); > + return ret; > +} > /** > * drm_syncobj_open - initalizes syncobj file-private structures at > devnode open time > * @dev: drm_device which is being opened by userspace > @@ -358,9 +401,17 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device > *dev, void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > - if (args->pad || args->flags) > + if (args->pad) > + return -EINVAL; > + > + if (args->flags != 0 && > + args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_ > FLAGS_EXPORT_FENCE_SYNC_FILE) > return -EINVAL; > > + if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_ > FLAGS_EXPORT_FENCE_SYNC_FILE) > + return drm_syncobj_export_sync_file(file_private, > args->handle, > + &args->fd); > + > return drm_syncobj_handle_to_fd(file_private, args->handle, > &args->fd); > } > @@ -374,9 +425,18 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device > *dev, void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > - if (args->pad || args->flags) > + if (args->pad) > return -EINVAL; > > + if (args->flags != 0 && > + args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_ > FLAGS_IMPORT_SYNC_FILE_FENCE) > + return -EINVAL; > + > + if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_ > FLAGS_IMPORT_SYNC_FILE_FENCE) > + return drm_syncobj_import_sync_file_fence(file_private, > + args->fd, > + args->handle); > + > return drm_syncobj_fd_to_handle(file_private, args->fd, > &args->handle); > } > diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h > index d6e2f62..94c75be 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -708,6 +708,8 @@ struct drm_syncobj_destroy { > __u32 pad; > }; > > +#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE_FENCE (1 << 0) > +#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_FENCE_SYNC_FILE (1 << 0) > struct drm_syncobj_handle { > __u32 handle; > __u32 flags; > -- > 2.9.4 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel > -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20170524/293ec6b9/attachment.html>