Commit cb343ded authored by Ian Forbes's avatar Ian Forbes Committed by Zack Rusin
Browse files

drm/vmwgfx: Unreserve BO on error



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

Fixes: d6667f0d ("drm/vmwgfx: Fix handling of dumb buffers")
Signed-off-by: default avatarIan Forbes <ian.forbes@broadcom.com>
Signed-off-by: default avatarZack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241210195535.2074918-1-ian.forbes@broadcom.com
parent 1f9910b4
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -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;