Is there anything else needed for this fix to be merged? I have shared an accompanying patch for the IGT test suite here https://lists.freedesktop.org/archives/igt-dev/2023-August/060154.html On 8/16/23 09:26, Erik Kurzinger wrote: > If DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT is invoked with the > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE flag set but no fence has yet been > submitted for the given timeline point the call will fail immediately > with EINVAL. This does not match the intended behavior where the call > should wait until the fence has been submitted (or the timeout expires). > > The following small example program illustrates the issue. It should > wait for 5 seconds and then print ETIME, but instead it terminates right > away after printing EINVAL. > > #include <stdio.h> > #include <fcntl.h> > #include <time.h> > #include <errno.h> > #include <xf86drm.h> > int main(void) > { > int fd = open("/dev/dri/card0", O_RDWR); > uint32_t syncobj; > drmSyncobjCreate(fd, 0, &syncobj); > struct timespec ts; > clock_gettime(CLOCK_MONOTONIC, &ts); > uint64_t point = 1; > if (drmSyncobjTimelineWait(fd, &syncobj, &point, 1, > ts.tv_sec * 1000000000 + ts.tv_nsec + 5000000000, // 5s > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE, NULL)) { > printf("drmSyncobjTimelineWait failed %d\n", errno); > } > } > > Fixes: 01d6c3578379 ("drm/syncobj: add support for timeline point wait v8") > Signed-off-by: Erik Kurzinger <ekurzinger@xxxxxxxxxx> > Reviewed by: Simon Ser <contact@xxxxxxxxxxx> > --- > drivers/gpu/drm/drm_syncobj.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index add45001e939..a8e6b61a188c 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -1087,7 +1087,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, > fence = drm_syncobj_fence_get(syncobjs[i]); > if (!fence || dma_fence_chain_find_seqno(&fence, points[i])) { > dma_fence_put(fence); > - if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) { > + if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT | > + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)) { > continue; > } else { > timeout = -EINVAL;