lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 113/268] virtio-gpu: fix ioctl and expose the fixed status to userspace.
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dave Airlie <airlied@redhat.com>

    [ Upstream commit 9a191b114906457c4b2494c474f58ae4142d4e67 ]

    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@redhat.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20180221015003.22884-1-airlied@gmail.com
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/gpu/drm/virtio/virtgpu_ioctl.c | 17 +++++++++++------
    include/uapi/drm/virtgpu_drm.h | 1 +
    2 files changed, 12 insertions(+), 6 deletions(-)

    --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
    +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
    @@ -208,6 +208,9 @@ static int virtio_gpu_getparam_ioctl(str
    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;
    }
    @@ -483,7 +486,7 @@ static int virtio_gpu_get_caps_ioctl(str
    {
    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;
    @@ -492,6 +495,10 @@ static int virtio_gpu_get_caps_ioctl(str
    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) {
    @@ -507,11 +514,9 @@ static int virtio_gpu_get_caps_ioctl(str
    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 &&
    --- a/include/uapi/drm/virtgpu_drm.h
    +++ b/include/uapi/drm/virtgpu_drm.h
    @@ -60,6 +60,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 {
    uint64_t param;

    \
     
     \ /
      Last update: 2018-05-28 17:28    [W:2.983 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site