On Wed, 12 Oct 2022 12:32:53 +0000 Simon Ser <contact@xxxxxxxxxxx> wrote: > Introduce a new DRM_IOCTL_SYNCOBJ_EVENTFD IOCTL which signals an > eventfd from a syncobj. > > This is useful for Wayland compositors to handle wait-before-submit. > Wayland clients can send a timeline point to the compositor > before the point has materialized yet, then compositors can wait > for the point to materialize via this new IOCTL. > > The existing DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT IOCTL is not suitable > because it blocks. Compositors want to integrate the wait with > their poll(2)-based event loop. > > v2: > - Wait for fence when flags is zero > - Improve documentation (Pekka) > - Rename IOCTL (Christian) > - Fix typo in drm_syncobj_add_eventfd() (Christian) > > Signed-off-by: Simon Ser <contact@xxxxxxxxxxx> > Cc: Jason Ekstrand <jason@xxxxxxxxxxxxxx> > Cc: Daniel Vetter <daniel@xxxxxxxx> > Cc: Christian König <christian.koenig@xxxxxxx> > Cc: Bas Nieuwenhuizen <bas@xxxxxxxxxxxxxxxxxxx> > Cc: Daniel Stone <daniel@xxxxxxxxxxxxx> > Cc: Pekka Paalanen <ppaalanen@xxxxxxxxx> > Cc: James Jones <jajones@xxxxxxxxxx> > --- > > Toy user-space available at: > https://paste.sr.ht/~emersion/674bd4fc614570f262b5bb2213be5c77d68944ac > > drivers/gpu/drm/drm_internal.h | 2 + > drivers/gpu/drm/drm_ioctl.c | 2 + > drivers/gpu/drm/drm_syncobj.c | 143 +++++++++++++++++++++++++++++++-- > include/drm/drm_syncobj.h | 6 +- > include/uapi/drm/drm.h | 22 +++++ > 5 files changed, 168 insertions(+), 7 deletions(-) > ... > diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h > index 642808520d92..5ac0a48b0169 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -909,6 +909,27 @@ struct drm_syncobj_timeline_wait { > __u32 pad; > }; > > +/** > + * struct drm_syncobj_eventfd > + * @handle: syncobj handle. > + * @flags: Zero to wait for the point to be signalled, or > + * &DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE to wait for a fence to be > + * available for the point. > + * @point: syncobj timeline point (set to zero for binary syncobjs). > + * @fd: Existing eventfd to sent events to. > + * @pad: Must be zero. > + * > + * Register an eventfd to be signalled by a syncobj. The eventfd counter will > + * be incremented by one. > + */ > +struct drm_syncobj_eventfd { > + __u32 handle; > + __u32 flags; > + __u64 point; > + __s32 fd; > + __u32 pad; > +}; > + > > struct drm_syncobj_array { > __u64 handles; > @@ -1095,6 +1116,7 @@ extern "C" { > #define DRM_IOCTL_SYNCOBJ_QUERY DRM_IOWR(0xCB, struct drm_syncobj_timeline_array) > #define DRM_IOCTL_SYNCOBJ_TRANSFER DRM_IOWR(0xCC, struct drm_syncobj_transfer) > #define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL DRM_IOWR(0xCD, struct drm_syncobj_timeline_array) > +#define DRM_IOCTL_SYNCOBJ_EVENTFD DRM_IOWR(0xCE, struct drm_syncobj_eventfd) > > /** > * DRM_IOCTL_MODE_GETFB2 - Get framebuffer metadata. Hi, UAPI Acked-by: Pekka Paalanen <pekka.paalanen@xxxxxxxxxxxxx> with the disclaimer that I know nothing about syncobjs. The doc sounds good though, and I read through eventfd man page to see that the increment makes sense. I think there is also a way initialize eventfd with 0xffffffffffffffff - N where N is the number of syncobjs you want to wait, and then poll for readable. Once the Nth syncobj fires, the eventfd overflows and polls readable (and produces POLLERR). Maybe that's abuse, and maybe you usually have no need to poll for all of a set of syncobjs, so fine. I suspect the Wayland compositor use case wants to know about each syncobj individually, so either you have one eventfd per syncobj or poll for "any" in an eventfd with multiple syncobjs and check them all each time it polls readable. Seems fine to me. Thanks, pq
Attachment:
pgpEAxyMb8tUj.pgp
Description: OpenPGP digital signature