[PATCH v2] drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE

Erik Kurzinger ekurzinger at nvidia.com
Thu Oct 26 17:55:39 UTC 2023


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 at nvidia.com>
> Reviewed by: Simon Ser <contact at 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;



More information about the dri-devel mailing list