[PATCH] virtio-gpu: fix ioctl and expose the fixed status to userspace.
Dave Airlie
airlied at gmail.com
Tue Feb 27 23:28:06 UTC 2018
Hi Gerd,
Could I get an ack or review for the kernel patch now the qemu patch is in,
I'll merge it into drm-fixes unless you want to drop it in drm-misc-fixes first.
Thanks,
Dave.
On 21 February 2018 at 11:50, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This exposes to mesa that it can use the fixed ioctl for querying
> later cap sets, cap set 1 is forever frozen in time.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> drivers/gpu/drm/virtio/virtgpu_ioctl.c | 17 +++++++++++------
> include/uapi/drm/virtgpu_drm.h | 1 +
> 2 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> index 5720a0d4ac0a..677ac16c8a6d 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
> @@ -197,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;
> }
> @@ -472,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;
> @@ -481,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) {
> @@ -496,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/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
> index 91a31ffed828..9a781f0611df 100644
> --- a/include/uapi/drm/virtgpu_drm.h
> +++ b/include/uapi/drm/virtgpu_drm.h
> @@ -63,6 +63,7 @@ struct drm_virtgpu_execbuffer {
> };
>
> #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */
> +#define VIRTGPU_PARAM_CAPSET_QUERY_FIX 2 /* do we have the capset fix */
>
> struct drm_virtgpu_getparam {
> __u64 param;
> --
> 2.14.3
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list