diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_object.c')
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_object.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index eca765537470..77eac4eb06b1 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c | |||
@@ -25,6 +25,18 @@ | |||
25 | 25 | ||
26 | #include "virtgpu_drv.h" | 26 | #include "virtgpu_drv.h" |
27 | 27 | ||
28 | static void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev, | ||
29 | uint32_t *resid) | ||
30 | { | ||
31 | int handle = ida_alloc_min(&vgdev->resource_ida, 1, GFP_KERNEL); | ||
32 | *resid = handle; | ||
33 | } | ||
34 | |||
35 | static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id) | ||
36 | { | ||
37 | ida_free(&vgdev->resource_ida, id); | ||
38 | } | ||
39 | |||
28 | static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) | 40 | static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) |
29 | { | 41 | { |
30 | struct virtio_gpu_object *bo; | 42 | struct virtio_gpu_object *bo; |
@@ -33,13 +45,14 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) | |||
33 | bo = container_of(tbo, struct virtio_gpu_object, tbo); | 45 | bo = container_of(tbo, struct virtio_gpu_object, tbo); |
34 | vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private; | 46 | vgdev = (struct virtio_gpu_device *)bo->gem_base.dev->dev_private; |
35 | 47 | ||
36 | if (bo->hw_res_handle) | 48 | if (bo->created) |
37 | virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle); | 49 | virtio_gpu_cmd_unref_resource(vgdev, bo->hw_res_handle); |
38 | if (bo->pages) | 50 | if (bo->pages) |
39 | virtio_gpu_object_free_sg_table(bo); | 51 | virtio_gpu_object_free_sg_table(bo); |
40 | if (bo->vmap) | 52 | if (bo->vmap) |
41 | virtio_gpu_object_kunmap(bo); | 53 | virtio_gpu_object_kunmap(bo); |
42 | drm_gem_object_release(&bo->gem_base); | 54 | drm_gem_object_release(&bo->gem_base); |
55 | virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle); | ||
43 | kfree(bo); | 56 | kfree(bo); |
44 | } | 57 | } |
45 | 58 | ||
@@ -81,9 +94,11 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, | |||
81 | bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); | 94 | bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); |
82 | if (bo == NULL) | 95 | if (bo == NULL) |
83 | return -ENOMEM; | 96 | return -ENOMEM; |
97 | virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle); | ||
84 | size = roundup(size, PAGE_SIZE); | 98 | size = roundup(size, PAGE_SIZE); |
85 | ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); | 99 | ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); |
86 | if (ret != 0) { | 100 | if (ret != 0) { |
101 | virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle); | ||
87 | kfree(bo); | 102 | kfree(bo); |
88 | return ret; | 103 | return ret; |
89 | } | 104 | } |