Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
On 4 August 2017 at 09:22, Chris Wilson wrote: > Quoting Dave Airlie (2017-08-04 00:01:10) >> On 4 August 2017 at 02:25, Chris Wilson wrote: >> > Quoting Dave Airlie (2017-05-12 01:34:55) >> >> @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device >> >> *dev, void *data, >> >> if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) >> >> return -ENODEV; >> >> >> >> + 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); >> >> + else if (args->flags) >> >> + return -EINVAL; >> > >> > Argh, what I missed before was that importing from a sync_file reuses >> > the handle, but importing from a syncobj fd creates a new handle. >> > >> > Just venting my ocd. It would be nice if the interface was consistent, >> > and I can see arguments for both approaches (just not a good argument as >> > to why they should differ). A compromise would be a flag to create/reuse >> > handle (or if handle=0, create, if handle!=0 resuse). >> >> The interface is consistent for the objects. >> >> With a sync_fd import you import the state into an existing syncobj. >> >> With a syncobj import you import the object into the current process state >> (so get a new handle). > > You can say the same for either path though, e.g. > > With a sync fd import you import the fence into the current process state > (so get a new handle). You import the fence, not the sync_fd. There is a difference here. A syncobj has a fence underlying it, it makes sense to import a new fence state into an existing object. It doesn't make sense to import a new syncobj into an existing object. It would be like importing a GEM object into a GEM object. I expect document it and be done is the best answer unless we can come up with a userspace use case that really expects the other behaviour. Dave. ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
Quoting Dave Airlie (2017-08-04 00:01:10) > On 4 August 2017 at 02:25, Chris Wilson wrote: > > Quoting Dave Airlie (2017-05-12 01:34:55) > >> @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device > >> *dev, void *data, > >> if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > >> return -ENODEV; > >> > >> + 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); > >> + else if (args->flags) > >> + return -EINVAL; > > > > Argh, what I missed before was that importing from a sync_file reuses > > the handle, but importing from a syncobj fd creates a new handle. > > > > Just venting my ocd. It would be nice if the interface was consistent, > > and I can see arguments for both approaches (just not a good argument as > > to why they should differ). A compromise would be a flag to create/reuse > > handle (or if handle=0, create, if handle!=0 resuse). > > The interface is consistent for the objects. > > With a sync_fd import you import the state into an existing syncobj. > > With a syncobj import you import the object into the current process state > (so get a new handle). You can say the same for either path though, e.g. With a sync fd import you import the fence into the current process state (so get a new handle). One process is using explict sync file fencing, presumably passing it to kms and other consumers,and passes it to a second process that prefers to use syncobj and so encapsulates it. > I can't think of a use case for anything else, maybe having a sync_fd state > imported into a new syncobj? but not sure it really helps. Yes, I expect taking a sync_file fd and generating a new syncobj is just as desired as taking a syncobj fd and generating a new synbocj. Conversely, importing a syncobj fd into a preallocated syncobj makes just as much sense as for a sync_file fd. > Userspace should be using different paths to get to these interfaces. Still the interfaces are different for no good reason, which certainly makes for a surprising API. -Chris ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
On 4 August 2017 at 02:25, Chris Wilson wrote: > Quoting Dave Airlie (2017-05-12 01:34:55) >> @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, >> void *data, >> if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) >> return -ENODEV; >> >> + 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); >> + else if (args->flags) >> + return -EINVAL; > > Argh, what I missed before was that importing from a sync_file reuses > the handle, but importing from a syncobj fd creates a new handle. > > Just venting my ocd. It would be nice if the interface was consistent, > and I can see arguments for both approaches (just not a good argument as > to why they should differ). A compromise would be a flag to create/reuse > handle (or if handle=0, create, if handle!=0 resuse). The interface is consistent for the objects. With a sync_fd import you import the state into an existing syncobj. With a syncobj import you import the object into the current process state (so get a new handle). I can't think of a use case for anything else, maybe having a sync_fd state imported into a new syncobj? but not sure it really helps. Userspace should be using different paths to get to these interfaces. Dave. ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
Quoting Dave Airlie (2017-05-12 01:34:55) > @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, > void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > + 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); > + else if (args->flags) > + return -EINVAL; Argh, what I missed before was that importing from a sync_file reuses the handle, but importing from a syncobj fd creates a new handle. Just venting my ocd. It would be nice if the interface was consistent, and I can see arguments for both approaches (just not a good argument as to why they should differ). A compromise would be a flag to create/reuse handle (or if handle=0, create, if handle!=0 resuse). -Chris ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction. (v1.2)
On Thu, Jun 01, 2017 at 11:06:41AM +1000, Dave Airlie wrote: > From: Dave Airlie > > 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. > > v1.1: fence put fixes (Chris), drop fence from ioctl names (Chris) > fixup for new fence replace API. > > Reviewed-by: Sean Paul > Signed-off-by: Dave Airlie Reviewed-by: Chris Wilson -Chris -- Chris Wilson, Intel Open Source Technology Centre ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH 3/5] drm/syncobj: add sync_file interaction. (v1.2)
From: Dave Airlie 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. v1.1: fence put fixes (Chris), drop fence from ioctl names (Chris) fixup for new fence replace API. Reviewed-by: Sean Paul Signed-off-by: Dave Airlie --- drivers/gpu/drm/drm_syncobj.c | 75 +-- include/uapi/drm/drm.h| 2 ++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index ec462bd..5814495 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "drm_internal.h" #include @@ -281,6 +282,59 @@ 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); + struct drm_syncobj *syncobj; + + if (!fence) + return -EINVAL; + + syncobj = drm_syncobj_find(file_private, handle); + if (!syncobj) { + dma_fence_put(fence); + return -ENOENT; + } + + drm_syncobj_replace_fence(file_private, syncobj, fence); + dma_fence_put(fence); + drm_syncobj_put(syncobj); + return 0; +} + +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); + + dma_fence_put(fence); + + if (!sync_file) { + ret = -EINVAL; + goto err_put_fd; + } + + fd_install(fd, sync_file->file); + + *p_fd = fd; + return 0; +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 @@ -363,9 +417,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_SYNC_FILE) + return -EINVAL; + + if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_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); } @@ -379,9 +441,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) return -EINVAL; + if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) + 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..49c4e69 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 (1 << 0) +#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0) struct drm_syncobj_handle { __u32 handle; __u32 flags; -- 2.9.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH 3/5] drm/syncobj: add sync_file interaction. (v1.1)
From: Dave Airlie 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. v1.1: fence put fixes (Chris), drop fence from ioctl names (Chris) Reviewed-by: Sean Paul Signed-off-by: Dave Airlie --- drivers/gpu/drm/drm_syncobj.c | 67 +-- include/uapi/drm/drm.h| 2 ++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 5177b36..4694021 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "drm_internal.h" #include @@ -276,6 +277,51 @@ 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); + int ret; + if (!fence) + return -EINVAL; + + ret = drm_syncobj_replace_fence(file_private, handle, fence); + dma_fence_put(fence); + return ret; +} + +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); + + dma_fence_put(fence); + + if (!sync_file) { + ret = -EINVAL; + goto err_put_fd; + } + + fd_install(fd, sync_file->file); + + *p_fd = fd; + return 0; +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 +404,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_SYNC_FILE) return -EINVAL; + if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_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 +428,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) return -EINVAL; + if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) + 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..49c4e69 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 (1 << 0) +#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0) struct drm_syncobj_handle { __u32 handle; __u32 flags; -- 2.9.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
On Wed, May 24, 2017 at 05:06:13PM +1000, Dave Airlie wrote: > From: Dave Airlie > > 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 > Signed-off-by: Dave Airlie > --- > 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 > #include > #include > +#include > > #include "drm_internal.h" > #include > @@ -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); Didn't replace_fence() acquire its own reference to fence, and so we need to drop our reference afterwards? > +} > + > +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); Could move dma_fence_put() here and so drop the err_fence_put. > + 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; DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_AS_SYNC_FILE ? I'm sure if the addition of FENCE makes it any clearer in the import/export names. The conversion of import is syncobj -> sync_file and vice versa. -Chris -- Chris Wilson, Intel Open Source Technology Centre ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
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 On Wed, May 24, 2017 at 12:06 AM, Dave Airlie wrote: > From: Dave Airlie > > 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 > Signed-off-by: Dave Airlie > --- > 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 > #include > #include > +#include > > #include "drm_internal.h" > #include > @@ -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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel > ___
[PATCH 3/5] drm/syncobj: add sync_file interaction.
From: Dave Airlie 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 Signed-off-by: Dave Airlie --- 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 #include #include +#include #include "drm_internal.h" #include @@ -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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
On Fri, May 12, 2017 at 10:34:55AM +1000, Dave Airlie wrote: > From: Dave Airlie > > 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. > > Signed-off-by: Dave Airlie With Daniel's comments taken into account, Reviewed-by: Sean Paul > --- > drivers/gpu/drm/drm_syncobj.c | 56 > +++ > include/uapi/drm/drm.h| 6 +++-- > 2 files changed, 60 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index 9a8c690..69ef20a 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -52,6 +52,7 @@ > #include > #include > #include > +#include > > #include "drm_internal.h" > #include > @@ -290,6 +291,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 > @@ -372,6 +415,12 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, > void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > + 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); > + else if (args->flags) > + return -EINVAL; > + > return drm_syncobj_handle_to_fd(file_private, args->handle, > &args->fd); > } > @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, > void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > + 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); > + else if (args->flags) > + return -EINVAL; > + > 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 db9e35e..d0e05f4 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -707,13 +707,15 @@ 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; > /** Flags.. only applicable for handle->fd */ > - __u32 flags; > + __u32 fd_flags; > > __s32 fd; > - __u32 pad; > + __u32 flags; > }; > > /* timeout_ns is relative timeout in nanoseconds */ > -- > 2.9.3 > > ___ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Sean Paul, Software Engineer, Google / Chromium OS ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH 3/5] drm/syncobj: add sync_file interaction.
On Fri, May 12, 2017 at 10:34:55AM +1000, Dave Airlie wrote: > From: Dave Airlie > > 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. > > Signed-off-by: Dave Airlie A bunch of nits around ioctl validation and stuff. lgtm otherwise, ack with those addressed. -Daniel > --- > drivers/gpu/drm/drm_syncobj.c | 56 > +++ > include/uapi/drm/drm.h| 6 +++-- > 2 files changed, 60 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index 9a8c690..69ef20a 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -52,6 +52,7 @@ > #include > #include > #include > +#include > > #include "drm_internal.h" > #include > @@ -290,6 +291,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); I guess the idea was to use args->fd_flags here? > + > + 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 > @@ -372,6 +415,12 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, > void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > + 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); Checks like in the wait ioctl that no other flags are set is missing in both callbacks. > + else if (args->flags) > + return -EINVAL; > + > return drm_syncobj_handle_to_fd(file_private, args->handle, > &args->fd); > } > @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, > void *data, > if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) > return -ENODEV; > > + 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); > + else if (args->flags) > + return -EINVAL; > + > 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 db9e35e..d0e05f4 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -707,13 +707,15 @@ 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; > /** Flags.. only applicable for handle->fd */ > - __u32 flags; > + __u32 fd_flags; > > __s32 fd; > - __u32 pad; > + __u32 flags; s/pad/fd_flags/ instead of the shuffle you've done here I presume? Also I didn't spot any fd_flags validation anywhere. > }; > > /* timeout_ns is relative timeout in nanoseconds */ > -- > 2.9.3 > > ___ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freed
[PATCH 3/5] drm/syncobj: add sync_file interaction.
From: Dave Airlie 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. Signed-off-by: Dave Airlie --- drivers/gpu/drm/drm_syncobj.c | 56 +++ include/uapi/drm/drm.h| 6 +++-- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index 9a8c690..69ef20a 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -52,6 +52,7 @@ #include #include #include +#include #include "drm_internal.h" #include @@ -290,6 +291,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 @@ -372,6 +415,12 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data, if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) return -ENODEV; + 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); + else if (args->flags) + return -EINVAL; + return drm_syncobj_handle_to_fd(file_private, args->handle, &args->fd); } @@ -385,6 +434,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) return -ENODEV; + 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); + else if (args->flags) + return -EINVAL; + 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 db9e35e..d0e05f4 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -707,13 +707,15 @@ 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; /** Flags.. only applicable for handle->fd */ - __u32 flags; + __u32 fd_flags; __s32 fd; - __u32 pad; + __u32 flags; }; /* timeout_ns is relative timeout in nanoseconds */ -- 2.9.3 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH 3/5] drm/syncobj: add sync_file interaction.
From: Dave Airlie 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. Signed-off-by: Dave Airlie --- drivers/gpu/drm/drm_syncobj.c | 56 +++ include/uapi/drm/drm.h| 6 +++-- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index c24fea0..89bf120 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -52,6 +52,7 @@ #include #include #include +#include #include "drm_internal.h" #include @@ -279,6 +280,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 @@ -361,6 +404,12 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data, if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) return -ENODEV; + 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); + else if (args->flags) + return -EINVAL; + return drm_syncobj_handle_to_fd(file_private, args->handle, &args->fd); } @@ -374,6 +423,13 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data, if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ)) return -ENODEV; + 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); + else if (args->flags) + return -EINVAL; + 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 7c508d0..a06d370 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -707,13 +707,15 @@ 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; /** Flags.. only applicable for handle->fd */ - __u32 flags; + __u32 fd_flags; __s32 fd; - __u32 pad; + __u32 flags; }; #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0) -- 2.9.3 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel