Unlock BOs in reverse order.
Add an acquire context so that lockdep doesn't complain.

Fixes: d6667f0ddf46 ("drm/vmwgfx: Fix handling of dumb buffers")
Signed-off-by: Ian Forbes <ian.for...@broadcom.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 8db38927729b..800a79e035ed 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -750,6 +750,7 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
        struct vmw_plane_state *old_vps = vmw_plane_state_to_vps(old_state);
        struct vmw_bo *old_bo = NULL;
        struct vmw_bo *new_bo = NULL;
+       struct ww_acquire_ctx ctx;
        s32 hotspot_x, hotspot_y;
        int ret;
 
@@ -769,9 +770,11 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
        if (du->cursor_surface)
                du->cursor_age = du->cursor_surface->snooper.age;
 
+       ww_acquire_init(&ctx, &reservation_ww_class);
+
        if (!vmw_user_object_is_null(&old_vps->uo)) {
                old_bo = vmw_user_object_buffer(&old_vps->uo);
-               ret = ttm_bo_reserve(&old_bo->tbo, false, false, NULL);
+               ret = ttm_bo_reserve(&old_bo->tbo, false, false, &ctx);
                if (ret != 0)
                        return;
        }
@@ -779,9 +782,14 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
        if (!vmw_user_object_is_null(&vps->uo)) {
                new_bo = vmw_user_object_buffer(&vps->uo);
                if (old_bo != new_bo) {
-                       ret = ttm_bo_reserve(&new_bo->tbo, false, false, NULL);
-                       if (ret != 0)
+                       ret = ttm_bo_reserve(&new_bo->tbo, false, false, &ctx);
+                       if (ret != 0) {
+                               if (old_bo) {
+                                       ttm_bo_unreserve(&old_bo->tbo);
+                                       ww_acquire_fini(&ctx);
+                               }
                                return;
+                       }
                } else {
                        new_bo = NULL;
                }
@@ -803,10 +811,12 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
                                                hotspot_x, hotspot_y);
        }
 
-       if (old_bo)
-               ttm_bo_unreserve(&old_bo->tbo);
        if (new_bo)
                ttm_bo_unreserve(&new_bo->tbo);
+       if (old_bo)
+               ttm_bo_unreserve(&old_bo->tbo);
+
+       ww_acquire_fini(&ctx);
 
        du->cursor_x = new_state->crtc_x + du->set_gui_x;
        du->cursor_y = new_state->crtc_y + du->set_gui_y;
-- 
2.34.1

Reply via email to