diff options
author | Matthew Wilcox <willy@infradead.org> | 2018-10-30 12:53:51 -0400 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-11-14 06:50:34 -0500 |
commit | 556c62e85f9b97139c1b3f6f1585fcee0bc3eb6a (patch) | |
tree | 7e954dcef435d0b5b8a1128b81f92cd03f35b597 | |
parent | 7db647aa8b134059c3b8f26b1dd2e1aa5b91e2ca (diff) |
drm/virtio: Handle error from virtio_gpu_resource_id_get
ida_alloc() can return -ENOMEM in the highly unlikely case we run out
of memory. The current code creates an object with an invalid ID.
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20181030165352.13065-1-willy@infradead.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_object.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 77eac4eb06b1..5ac42dded217 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c | |||
@@ -25,11 +25,16 @@ | |||
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, | 28 | static int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev, |
29 | uint32_t *resid) | 29 | uint32_t *resid) |
30 | { | 30 | { |
31 | int handle = ida_alloc_min(&vgdev->resource_ida, 1, GFP_KERNEL); | 31 | int handle = ida_alloc_min(&vgdev->resource_ida, 1, GFP_KERNEL); |
32 | |||
33 | if (handle < 0) | ||
34 | return handle; | ||
35 | |||
32 | *resid = handle; | 36 | *resid = handle; |
37 | return 0; | ||
33 | } | 38 | } |
34 | 39 | ||
35 | static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id) | 40 | static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id) |
@@ -94,7 +99,11 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev, | |||
94 | bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); | 99 | bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL); |
95 | if (bo == NULL) | 100 | if (bo == NULL) |
96 | return -ENOMEM; | 101 | return -ENOMEM; |
97 | virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle); | 102 | ret = virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle); |
103 | if (ret < 0) { | ||
104 | kfree(bo); | ||
105 | return ret; | ||
106 | } | ||
98 | size = roundup(size, PAGE_SIZE); | 107 | size = roundup(size, PAGE_SIZE); |
99 | ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); | 108 | ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size); |
100 | if (ret != 0) { | 109 | if (ret != 0) { |