From 9cadf45ddf190b684d2dddfe398e7a0d76de045d Mon Sep 17 00:00:00 2001 From: Maaz Mombasawala Date: Tue, 7 May 2024 17:40:20 -0700 Subject: [PATCH] svga: Retry DRM_VMW_SYNCCPU ioctl on failure. The ioctl DRM_VMW_SYNCCPU may sometimes fail with ERESTART or EBUSY, which in turn bubbles up to the application as a GL_OUT_OF_MEMORY error. We are seeing this in glamor, while this does not cause any real issues, it does pollute the system log. Retrying DRM_VMW_SYNCCPU fixes this issue. Reviewed-by: Neha Bhende Reviewed-by: Zack Rusin Reviewed-by: Martin Krastev Part-of: --- src/gallium/winsys/svga/drm/vmw_screen_ioctl.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c index 0bf17264183..895bfdc0559 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_ioctl.c @@ -719,6 +719,7 @@ vmw_ioctl_syncforcpu(struct vmw_region *region, bool allow_cs) { struct drm_vmw_synccpu_arg arg; + int ret; memset(&arg, 0, sizeof(arg)); arg.op = drm_vmw_synccpu_grab; @@ -731,7 +732,16 @@ vmw_ioctl_syncforcpu(struct vmw_region *region, if (allow_cs) arg.flags |= drm_vmw_synccpu_allow_cs; - return drmCommandWrite(region->drm_fd, DRM_VMW_SYNCCPU, &arg, sizeof(arg)); + do { + ret = drmCommandWrite(region->drm_fd, DRM_VMW_SYNCCPU, &arg, sizeof(arg)); + if (ret == -EBUSY) + usleep(1000); + } while (ret == -ERESTART || ret == -EBUSY); + + if (ret) + vmw_error("%s Failed synccpu with error %s.\n", __func__, strerror(-ret)); + + return ret; } /**