diff options
Diffstat (limited to 'drivers/gpu/drm/virtio')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_display.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_ioctl.c | 30 | ||||
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_kms.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_object.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_ttm.c | 13 | 
5 files changed, 43 insertions, 24 deletions
| diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c index 41b0930f7968..19114a3c5ee4 100644 --- a/drivers/gpu/drm/virtio/virtgpu_display.c +++ b/drivers/gpu/drm/virtio/virtgpu_display.c @@ -71,7 +71,19 @@ virtio_gpu_framebuffer_surface_dirty(struct drm_framebuffer *fb,  	return virtio_gpu_surface_dirty(virtio_gpu_fb, clips, num_clips);  } +static int +virtio_gpu_framebuffer_create_handle(struct drm_framebuffer *fb, +				     struct drm_file *file_priv, +				     unsigned int *handle) +{ +	struct virtio_gpu_framebuffer *virtio_gpu_fb = +		to_virtio_gpu_framebuffer(fb); + +	return drm_gem_handle_create(file_priv, virtio_gpu_fb->obj, handle); +} +  static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = { +	.create_handle = virtio_gpu_framebuffer_create_handle,  	.destroy = virtio_gpu_user_framebuffer_destroy,  	.dirty = virtio_gpu_framebuffer_surface_dirty,  }; diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 0528edb4a2bf..677ac16c8a6d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -56,6 +56,7 @@ static int virtio_gpu_map_ioctl(struct drm_device *dev, void *data,  static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,  					   struct list_head *head)  { +	struct ttm_operation_ctx ctx = { false, false };  	struct ttm_validate_buffer *buf;  	struct ttm_buffer_object *bo;  	struct virtio_gpu_object *qobj; @@ -68,7 +69,7 @@ static int virtio_gpu_object_list_validate(struct ww_acquire_ctx *ticket,  	list_for_each_entry(buf, head, head) {  		bo = buf->bo;  		qobj = container_of(bo, struct virtio_gpu_object, tbo); -		ret = ttm_bo_validate(bo, &qobj->placement, false, false); +		ret = ttm_bo_validate(bo, &qobj->placement, &ctx);  		if (ret) {  			ttm_eu_backoff_reservation(ticket, head);  			return ret; @@ -196,6 +197,9 @@ static int virtio_gpu_getparam_ioctl(struct drm_device *dev, void *data,  	case VIRTGPU_PARAM_3D_FEATURES:  		value = vgdev->has_virgl_3d == true ? 1 : 0;  		break; +	case VIRTGPU_PARAM_CAPSET_QUERY_FIX: +		value = 1; +		break;  	default:  		return -EINVAL;  	} @@ -261,7 +265,7 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,  		ret = virtio_gpu_object_attach(vgdev, qobj, res_id, NULL);  	} else {  		/* use a gem reference since unref list undoes them */ -		drm_gem_object_reference(&qobj->gem_base); +		drm_gem_object_get(&qobj->gem_base);  		mainbuf.bo = &qobj->tbo;  		list_add(&mainbuf.head, &validate_list); @@ -352,6 +356,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,  	struct virtio_gpu_device *vgdev = dev->dev_private;  	struct virtio_gpu_fpriv *vfpriv = file->driver_priv;  	struct drm_virtgpu_3d_transfer_from_host *args = data; +	struct ttm_operation_ctx ctx = { true, false };  	struct drm_gem_object *gobj = NULL;  	struct virtio_gpu_object *qobj = NULL;  	struct virtio_gpu_fence *fence; @@ -372,8 +377,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,  	if (ret)  		goto out; -	ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, -			      true, false); +	ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, &ctx);  	if (unlikely(ret))  		goto out_unres; @@ -399,6 +403,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,  	struct virtio_gpu_device *vgdev = dev->dev_private;  	struct virtio_gpu_fpriv *vfpriv = file->driver_priv;  	struct drm_virtgpu_3d_transfer_to_host *args = data; +	struct ttm_operation_ctx ctx = { true, false };  	struct drm_gem_object *gobj = NULL;  	struct virtio_gpu_object *qobj = NULL;  	struct virtio_gpu_fence *fence; @@ -416,8 +421,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,  	if (ret)  		goto out; -	ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, -			      true, false); +	ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, &ctx);  	if (unlikely(ret))  		goto out_unres; @@ -471,7 +475,7 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev,  {  	struct virtio_gpu_device *vgdev = dev->dev_private;  	struct drm_virtgpu_get_caps *args = data; -	int size; +	unsigned size, host_caps_size;  	int i;  	int found_valid = -1;  	int ret; @@ -480,6 +484,10 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev,  	if (vgdev->num_capsets == 0)  		return -ENOSYS; +	/* don't allow userspace to pass 0 */ +	if (args->size == 0) +		return -EINVAL; +  	spin_lock(&vgdev->display_info_lock);  	for (i = 0; i < vgdev->num_capsets; i++) {  		if (vgdev->capsets[i].id == args->cap_set_id) { @@ -495,11 +503,9 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev,  		return -EINVAL;  	} -	size = vgdev->capsets[found_valid].max_size; -	if (args->size > size) { -		spin_unlock(&vgdev->display_info_lock); -		return -EINVAL; -	} +	host_caps_size = vgdev->capsets[found_valid].max_size; +	/* only copy to user the minimum of the host caps size or the guest caps size */ +	size = min(args->size, host_caps_size);  	list_for_each_entry(cache_ent, &vgdev->cap_cache, head) {  		if (cache_ent->id == args->cap_set_id && diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 6400506a06b0..65060c08522d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -272,20 +272,18 @@ int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file)  	struct virtio_gpu_device *vgdev = dev->dev_private;  	struct virtio_gpu_fpriv *vfpriv;  	uint32_t id; -	char dbgname[64], tmpname[TASK_COMM_LEN]; +	char dbgname[TASK_COMM_LEN];  	/* can't create contexts without 3d renderer */  	if (!vgdev->has_virgl_3d)  		return 0; -	get_task_comm(tmpname, current); -	snprintf(dbgname, sizeof(dbgname), "%s", tmpname); -	dbgname[63] = 0;  	/* allocate a virt GPU context for this opener */  	vfpriv = kzalloc(sizeof(*vfpriv), GFP_KERNEL);  	if (!vfpriv)  		return -ENOMEM; +	get_task_comm(dbgname, current);  	virtio_gpu_context_create(vgdev, strlen(dbgname), dbgname, &id);  	vfpriv->ctx_id = id; diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 6f66b7347cd0..0b90cdb3d9fe 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -124,13 +124,17 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,  	int ret;  	struct page **pages = bo->tbo.ttm->pages;  	int nr_pages = bo->tbo.num_pages; +	struct ttm_operation_ctx ctx = { +		.interruptible = false, +		.no_wait_gpu = false +	};  	/* wtf swapping */  	if (bo->pages)  		return 0;  	if (bo->tbo.ttm->state == tt_unpopulated) -		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm); +		bo->tbo.ttm->bdev->driver->ttm_tt_populate(bo->tbo.ttm, &ctx);  	bo->pages = kmalloc(sizeof(struct sg_table), GFP_KERNEL);  	if (!bo->pages)  		goto out; diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c index cd389c5eaef5..36655b709eb2 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c @@ -324,12 +324,13 @@ static struct ttm_backend_func virtio_gpu_backend_func = {  	.destroy = &virtio_gpu_ttm_backend_destroy,  }; -static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm) +static int virtio_gpu_ttm_tt_populate(struct ttm_tt *ttm, +		struct ttm_operation_ctx *ctx)  {  	if (ttm->state != tt_unpopulated)  		return 0; -	return ttm_pool_populate(ttm); +	return ttm_pool_populate(ttm, ctx);  }  static void virtio_gpu_ttm_tt_unpopulate(struct ttm_tt *ttm) @@ -369,14 +370,13 @@ static void virtio_gpu_move_null(struct ttm_buffer_object *bo,  	new_mem->mm_node = NULL;  } -static int virtio_gpu_bo_move(struct ttm_buffer_object *bo, -			      bool evict, bool interruptible, -			      bool no_wait_gpu, +static int virtio_gpu_bo_move(struct ttm_buffer_object *bo, bool evict, +			      struct ttm_operation_ctx *ctx,  			      struct ttm_mem_reg *new_mem)  {  	int ret; -	ret = ttm_bo_wait(bo, interruptible, no_wait_gpu); +	ret = ttm_bo_wait(bo, ctx->interruptible, ctx->no_wait_gpu);  	if (ret)  		return ret; @@ -431,7 +431,6 @@ static struct ttm_bo_driver virtio_gpu_bo_driver = {  	.verify_access = &virtio_gpu_verify_access,  	.io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve,  	.io_mem_free = &virtio_gpu_ttm_io_mem_free, -	.io_mem_pfn = ttm_bo_default_io_mem_pfn,  	.move_notify = &virtio_gpu_bo_move_notify,  	.swap_notify = &virtio_gpu_bo_swap_notify,  }; |