From: Honglei Huang <[email protected]> Integrate userptr functionality into the blob resource creation path.
This patch adds validation for the userptr blob creation: - Include VIRTGPU_BLOB_FLAG_USE_USERPTR and VIRTGPU_BLOB_FLAG_USERPTR_RDONLY in VIRTGPU_BLOB_FLAG_USE_MASK. - Verify that a userptr is provided if and only if the VIRTGPU_BLOB_FLAG_USE_USERPTR flag is set. - Pass the userptr address from the ioctl params to the internal structure. - Invoke virtio_gpu_userptr_create() when a userptr blob is requested. With this change, userspace can create userptr blob resources by setting the VIRTGPU_BLOB_FLAG_USE_USERPTR flag and providing a valid userptr address. Signed-off-by: Honglei Huang <[email protected]> --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index c33c05736..adaaf80b2 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -36,7 +36,9 @@ #define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \ VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \ - VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) + VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | \ + VIRTGPU_BLOB_FLAG_USE_USERPTR | \ + VIRTGPU_BLOB_FLAG_USERPTR_RDONLY) /* Must be called with &virtio_gpu_fpriv.struct_mutex held. */ static void virtio_gpu_create_context_locked(struct virtio_gpu_device *vgdev, @@ -453,6 +455,17 @@ static int verify_blob(struct virtio_gpu_device *vgdev, return -EINVAL; } + if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_USERPTR) { + if (!rc_blob->userptr) + return -EINVAL; + } else { + if (rc_blob->userptr) + return -EINVAL; + + if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USERPTR_RDONLY) + return -EINVAL; + } + switch (rc_blob->blob_mem) { case VIRTGPU_BLOB_MEM_GUEST: *guest_blob = true; @@ -489,6 +502,7 @@ static int verify_blob(struct virtio_gpu_device *vgdev, params->size = rc_blob->size; params->blob = true; params->blob_flags = rc_blob->blob_flags; + params->userptr = rc_blob->userptr; return 0; } @@ -527,8 +541,10 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev, vfpriv->ctx_id, NULL, NULL); } - if (guest_blob) + if (guest_blob && !params.userptr) ret = virtio_gpu_object_create(vgdev, ¶ms, &bo, NULL); + else if (guest_blob && params.userptr) + ret = virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo); else if (!guest_blob && host3d_blob) ret = virtio_gpu_vram_create(vgdev, ¶ms, &bo); else -- 2.34.1
