drm/virtio: fix resource id handling
Move virtio_gpu_resource_id_{get,put} to virtgpu_object.c and make them static. Allocate and free the id on creation and destroy, drop all other calls. That way objects have a valid handle for the whole lifetime of the object. Also fixes ids leaking. Worst offender are dumb buffers, and I think some error paths too. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Link: http://patchwork.freedesktop.org/patch/msgid/20181019061847.18958-7-kraxel@redhat.com
This commit is contained in:
parent
724cfdfd66
commit
6c1cd97bda
@ -260,9 +260,6 @@ int virtio_gpu_surface_dirty(struct virtio_gpu_framebuffer *qfb,
|
||||
/* virtio vg */
|
||||
int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev);
|
||||
void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev);
|
||||
void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
|
||||
uint32_t *resid);
|
||||
void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id);
|
||||
void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
|
||||
struct virtio_gpu_object *bo,
|
||||
uint32_t format,
|
||||
|
@ -231,7 +231,6 @@ static int virtio_gpufb_create(struct drm_fb_helper *helper,
|
||||
if (IS_ERR(obj))
|
||||
return PTR_ERR(obj);
|
||||
|
||||
virtio_gpu_resource_id_get(vgdev, &obj->hw_res_handle);
|
||||
virtio_gpu_cmd_create_resource(vgdev, obj, format,
|
||||
mode_cmd.width, mode_cmd.height);
|
||||
|
||||
|
@ -103,7 +103,6 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
|
||||
|
||||
format = virtio_gpu_translate_format(DRM_FORMAT_HOST_XRGB8888);
|
||||
obj = gem_to_virtio_gpu_obj(gobj);
|
||||
virtio_gpu_resource_id_get(vgdev, &obj->hw_res_handle);
|
||||
virtio_gpu_cmd_create_resource(vgdev, obj, format,
|
||||
args->width, args->height);
|
||||
|
||||
|
@ -253,7 +253,6 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
|
||||
if (IS_ERR(qobj))
|
||||
return PTR_ERR(qobj);
|
||||
obj = &qobj->gem_base;
|
||||
virtio_gpu_resource_id_get(vgdev, &qobj->hw_res_handle);
|
||||
|
||||
if (!vgdev->has_virgl_3d) {
|
||||
virtio_gpu_cmd_create_resource(vgdev, qobj, rc->format,
|
||||
|
@ -25,6 +25,26 @@
|
||||
|
||||
#include "virtgpu_drv.h"
|
||||
|
||||
static void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
|
||||
uint32_t *resid)
|
||||
{
|
||||
int handle;
|
||||
|
||||
idr_preload(GFP_KERNEL);
|
||||
spin_lock(&vgdev->resource_idr_lock);
|
||||
handle = idr_alloc(&vgdev->resource_idr, NULL, 1, 0, GFP_NOWAIT);
|
||||
spin_unlock(&vgdev->resource_idr_lock);
|
||||
idr_preload_end();
|
||||
*resid = handle;
|
||||
}
|
||||
|
||||
static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
|
||||
{
|
||||
spin_lock(&vgdev->resource_idr_lock);
|
||||
idr_remove(&vgdev->resource_idr, id);
|
||||
spin_unlock(&vgdev->resource_idr_lock);
|
||||
}
|
||||
|
||||
static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
{
|
||||
struct virtio_gpu_object *bo;
|
||||
@ -40,6 +60,7 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
if (bo->vmap)
|
||||
virtio_gpu_object_kunmap(bo);
|
||||
drm_gem_object_release(&bo->gem_base);
|
||||
virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
|
||||
kfree(bo);
|
||||
}
|
||||
|
||||
@ -81,9 +102,11 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
|
||||
bo = kzalloc(sizeof(struct virtio_gpu_object), GFP_KERNEL);
|
||||
if (bo == NULL)
|
||||
return -ENOMEM;
|
||||
virtio_gpu_resource_id_get(vgdev, &bo->hw_res_handle);
|
||||
size = roundup(size, PAGE_SIZE);
|
||||
ret = drm_gem_object_init(vgdev->ddev, &bo->gem_base, size);
|
||||
if (ret != 0) {
|
||||
virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
|
||||
kfree(bo);
|
||||
return ret;
|
||||
}
|
||||
|
@ -38,26 +38,6 @@
|
||||
+ MAX_INLINE_CMD_SIZE \
|
||||
+ MAX_INLINE_RESP_SIZE)
|
||||
|
||||
void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
|
||||
uint32_t *resid)
|
||||
{
|
||||
int handle;
|
||||
|
||||
idr_preload(GFP_KERNEL);
|
||||
spin_lock(&vgdev->resource_idr_lock);
|
||||
handle = idr_alloc(&vgdev->resource_idr, NULL, 1, 0, GFP_NOWAIT);
|
||||
spin_unlock(&vgdev->resource_idr_lock);
|
||||
idr_preload_end();
|
||||
*resid = handle;
|
||||
}
|
||||
|
||||
void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
|
||||
{
|
||||
spin_lock(&vgdev->resource_idr_lock);
|
||||
idr_remove(&vgdev->resource_idr, id);
|
||||
spin_unlock(&vgdev->resource_idr_lock);
|
||||
}
|
||||
|
||||
void virtio_gpu_ctrl_ack(struct virtqueue *vq)
|
||||
{
|
||||
struct drm_device *dev = vq->vdev->priv;
|
||||
|
Loading…
x
Reference in New Issue
Block a user