diff mbox series

[2/2] drm/virtio: make sure virtio_gpu_cleanup_object(..) only happens on shmem objects

Message ID 20200303014010.418-2-gurchetansingh@chromium.org (mailing list archive)
State New, archived
Headers show
Series [1/2] drm/virtio: factor out the sg_table from virtio_gpu_object | expand

Commit Message

Gurchetan Singh March 3, 2020, 1:40 a.m. UTC
This function won't be useable for hostmem objects.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
---
 drivers/gpu/drm/virtio/virtgpu_drv.h    | 2 +-
 drivers/gpu/drm/virtio/virtgpu_object.c | 4 ++--
 drivers/gpu/drm/virtio/virtgpu_vq.c     | 3 ++-
 3 files changed, 5 insertions(+), 4 deletions(-)

Comments

Gerd Hoffmann March 3, 2020, 10:01 a.m. UTC | #1
> This function won't be useable for hostmem objects.

> @@ -526,7 +526,8 @@ static void virtio_gpu_cmd_unref_cb(struct virtio_gpu_device *vgdev,
>  	bo = vbuf->resp_cb_data;
>  	vbuf->resp_cb_data = NULL;
>  
> -	virtio_gpu_cleanup_object(bo);
> +	if (bo && virtio_gpu_is_shmem(bo))
> +		virtio_gpu_cleanup_object(bo);

Its not that simple, the virtio_gpu_resource_id_put() call in
virtio_gpu_cleanup_object() is needed for all objects.  We also
must free all objects.

I'd suggest to move the virtio_gpu_is_shmem() check to
virtio_gpu_cleanup_object().

cheers,
  Gerd
diff mbox series

Patch

diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 595b5f3dc105..014a0c1f21b1 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -371,7 +371,7 @@  int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
 			     struct virtio_gpu_object **bo_ptr,
 			     struct virtio_gpu_fence *fence);
 
-bool virtio_gpu_is_shmem(struct drm_gem_object *obj);
+bool virtio_gpu_is_shmem(struct virtio_gpu_object *bo);
 
 /* virtgpu_prime.c */
 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c
index a7d4d871431e..11f0d4548613 100644
--- a/drivers/gpu/drm/virtio/virtgpu_object.c
+++ b/drivers/gpu/drm/virtio/virtgpu_object.c
@@ -110,9 +110,9 @@  static const struct drm_gem_object_funcs virtio_gpu_shmem_funcs = {
 	.mmap = drm_gem_shmem_mmap,
 };
 
-bool virtio_gpu_is_shmem(struct drm_gem_object *obj)
+bool virtio_gpu_is_shmem(struct virtio_gpu_object *bo)
 {
-	return obj->funcs == &virtio_gpu_shmem_funcs;
+	return bo->base.base.funcs == &virtio_gpu_shmem_funcs;
 }
 
 struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev,
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c
index 73854915ec34..a44261ba1c5d 100644
--- a/drivers/gpu/drm/virtio/virtgpu_vq.c
+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c
@@ -526,7 +526,8 @@  static void virtio_gpu_cmd_unref_cb(struct virtio_gpu_device *vgdev,
 	bo = vbuf->resp_cb_data;
 	vbuf->resp_cb_data = NULL;
 
-	virtio_gpu_cleanup_object(bo);
+	if (bo && virtio_gpu_is_shmem(bo))
+		virtio_gpu_cleanup_object(bo);
 }
 
 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,