[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