drm/vmwgfx: Fix mob cursor allocation race
authorZack Rusin <zackr@vmware.com>
Fri, 18 Mar 2022 17:43:29 +0000 (13:43 -0400)
committerZack Rusin <zackr@vmware.com>
Mon, 21 Mar 2022 14:10:34 +0000 (10:10 -0400)
Writes to SVGA_REG_CURSOR_MOBID did not wait for the buffers to be fully
populated. This sometimes results in the device not being aware of
the buffer when the cursor mob register was written.
Properly wait for the buffer to be fully populated before setting it
as a cursor mob.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Fixes: 485d98d472d5 ("drm/vmwgfx: Add support for CursorMob and CursorBypass 4")
Reviewed-by: Martin Krastev <krastevm@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220318174332.440068-3-zack@kde.org
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

index af25221..7a23f25 100644 (file)
@@ -602,6 +602,14 @@ vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane,
 
                        ret = ttm_bo_kmap(cm_bo, 0, PFN_UP(size), &vps->cm_map);
 
+                       /*
+                        * We just want to try to get mob bind to finish
+                        * so that the first write to SVGA_REG_CURSOR_MOBID
+                        * is done with a buffer that the device has already
+                        * seen
+                        */
+                       (void) ttm_bo_wait(cm_bo, false, false);
+
                        ttm_bo_unreserve(cm_bo);
 
                        if (unlikely(ret != 0)) {