drm/vmwgfx: Unreserve BO on error
BugLink: https://bugs.launchpad.net/bugs/2107449 [ Upstream commit cb343ded122e0bf41e4b2a9f89386296451be109 ] 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 Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Koichiro Den <koichiro.den@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
@@ -742,6 +742,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;
|
||||
|
||||
@@ -761,9 +762,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;
|
||||
}
|
||||
@@ -771,9 +774,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;
|
||||
}
|
||||
@@ -795,10 +803,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;
|
||||
|
||||
Reference in New Issue
Block a user