diff mbox series

[v6,06/10] drm/qxl: properly pin/unpin shadow

Message ID 20210204145712.1531203-7-kraxel@redhat.com (mailing list archive)
State New, archived
Headers show
Series drm/qxl: fix driver shutdown issues. | expand

Commit Message

Gerd Hoffmann Feb. 4, 2021, 2:57 p.m. UTC
Suggested-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 drivers/gpu/drm/qxl/qxl_display.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Thomas Zimmermann Feb. 4, 2021, 6:18 p.m. UTC | #1
Am 04.02.21 um 15:57 schrieb Gerd Hoffmann:
> Suggested-by: Thomas Zimmermann <tzimmermann@suse.de>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Thanks for this.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>


> ---
>   drivers/gpu/drm/qxl/qxl_display.c | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
> index 60331e31861a..d25fd3acc891 100644
> --- a/drivers/gpu/drm/qxl/qxl_display.c
> +++ b/drivers/gpu/drm/qxl/qxl_display.c
> @@ -802,12 +802,14 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane,
>   		}
>   		if (user_bo->shadow != qdev->dumb_shadow_bo) {
>   			if (user_bo->shadow) {
> +				qxl_bo_unpin(user_bo->shadow);
>   				drm_gem_object_put
>   					(&user_bo->shadow->tbo.base);
>   				user_bo->shadow = NULL;
>   			}
>   			drm_gem_object_get(&qdev->dumb_shadow_bo->tbo.base);
>   			user_bo->shadow = qdev->dumb_shadow_bo;
> +			qxl_bo_pin(user_bo->shadow);
>   		}
>   	}
>   
> @@ -833,6 +835,7 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane,
>   	qxl_bo_unpin(user_bo);
>   
>   	if (old_state->fb != plane->state->fb && user_bo->shadow) {
> +		qxl_bo_unpin(user_bo->shadow);
>   		drm_gem_object_put(&user_bo->shadow->tbo.base);
>   		user_bo->shadow = NULL;
>   	}
> @@ -1230,6 +1233,7 @@ int qxl_modeset_init(struct qxl_device *qdev)
>   void qxl_modeset_fini(struct qxl_device *qdev)
>   {
>   	if (qdev->dumb_shadow_bo) {
> +		qxl_bo_unpin(qdev->dumb_shadow_bo);
>   		drm_gem_object_put(&qdev->dumb_shadow_bo->tbo.base);
>   		qdev->dumb_shadow_bo = NULL;
>   	}
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 60331e31861a..d25fd3acc891 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -802,12 +802,14 @@  static int qxl_plane_prepare_fb(struct drm_plane *plane,
 		}
 		if (user_bo->shadow != qdev->dumb_shadow_bo) {
 			if (user_bo->shadow) {
+				qxl_bo_unpin(user_bo->shadow);
 				drm_gem_object_put
 					(&user_bo->shadow->tbo.base);
 				user_bo->shadow = NULL;
 			}
 			drm_gem_object_get(&qdev->dumb_shadow_bo->tbo.base);
 			user_bo->shadow = qdev->dumb_shadow_bo;
+			qxl_bo_pin(user_bo->shadow);
 		}
 	}
 
@@ -833,6 +835,7 @@  static void qxl_plane_cleanup_fb(struct drm_plane *plane,
 	qxl_bo_unpin(user_bo);
 
 	if (old_state->fb != plane->state->fb && user_bo->shadow) {
+		qxl_bo_unpin(user_bo->shadow);
 		drm_gem_object_put(&user_bo->shadow->tbo.base);
 		user_bo->shadow = NULL;
 	}
@@ -1230,6 +1233,7 @@  int qxl_modeset_init(struct qxl_device *qdev)
 void qxl_modeset_fini(struct qxl_device *qdev)
 {
 	if (qdev->dumb_shadow_bo) {
+		qxl_bo_unpin(qdev->dumb_shadow_bo);
 		drm_gem_object_put(&qdev->dumb_shadow_bo->tbo.base);
 		qdev->dumb_shadow_bo = NULL;
 	}