lkml.org 
[lkml]   [2020]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 115/168] drm/virtio: make resource id workaround runtime switchable.
    Date
    From: Gerd Hoffmann <kraxel@redhat.com>

    commit 3e93bc2a58aa241081e043ef9e6e86c42808499a upstream.

    Also update the comment with a reference to the virglrenderer fix.

    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20190822102614.18164-1-kraxel@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/virtio/virtgpu_object.c | 44 +++++++++++++++++---------------
    1 file changed, 24 insertions(+), 20 deletions(-)

    --- a/drivers/gpu/drm/virtio/virtgpu_object.c
    +++ b/drivers/gpu/drm/virtio/virtgpu_object.c
    @@ -27,34 +27,38 @@

    #include "virtgpu_drv.h"

    +static int virtio_gpu_virglrenderer_workaround = 1;
    +module_param_named(virglhack, virtio_gpu_virglrenderer_workaround, int, 0400);
    +
    static int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
    uint32_t *resid)
    {
    -#if 0
    - int handle = ida_alloc(&vgdev->resource_ida, GFP_KERNEL);
    -
    - if (handle < 0)
    - return handle;
    -#else
    - static int handle;
    -
    - /*
    - * FIXME: dirty hack to avoid re-using IDs, virglrenderer
    - * can't deal with that. Needs fixing in virglrenderer, also
    - * should figure a better way to handle that in the guest.
    - */
    - handle++;
    -#endif
    -
    - *resid = handle + 1;
    + if (virtio_gpu_virglrenderer_workaround) {
    + /*
    + * Hack to avoid re-using resource IDs.
    + *
    + * virglrenderer versions up to (and including) 0.7.0
    + * can't deal with that. virglrenderer commit
    + * "f91a9dd35715 Fix unlinking resources from hash
    + * table." (Feb 2019) fixes the bug.
    + */
    + static int handle;
    + handle++;
    + *resid = handle + 1;
    + } else {
    + int handle = ida_alloc(&vgdev->resource_ida, GFP_KERNEL);
    + if (handle < 0)
    + return handle;
    + *resid = handle + 1;
    + }
    return 0;
    }

    static void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id)
    {
    -#if 0
    - ida_free(&vgdev->resource_ida, id - 1);
    -#endif
    + if (!virtio_gpu_virglrenderer_workaround) {
    + ida_free(&vgdev->resource_ida, id - 1);
    + }
    }

    static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)

    \
     
     \ /
      Last update: 2020-03-10 13:55    [W:4.217 / U:0.644 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site