]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/vmwgfx: Unreserve BO on error
authorIan Forbes <ian.forbes@broadcom.com>
Tue, 10 Dec 2024 19:55:35 +0000 (13:55 -0600)
committerZack Rusin <zack.rusin@broadcom.com>
Tue, 14 Jan 2025 18:00:43 +0000 (13:00 -0500)
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.forbes@broadcom.com>
Signed-off-by: Zack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241210195535.2074918-1-ian.forbes@broadcom.com
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

index 8db38927729bb4e973b192ce39b7250969e4935a..800a79e035ed69d49bbd621fe840c0eebffde949 100644 (file)
@@ -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;