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 <ekurzin...@nvidia.com>
> Reviewed by: Simon Ser <cont...@emersion.fd>
> ---
>  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;

Reply via email to