| From 16065fcdd19ddb9e093192914ac863884f308766 Mon Sep 17 00:00:00 2001 |
| From: Gerd Hoffmann <kraxel@redhat.com> |
| Date: Fri, 8 Feb 2019 15:04:09 +0100 |
| Subject: drm/virtio: do NOT reuse resource ids |
| |
| From: Gerd Hoffmann <kraxel@redhat.com> |
| |
| commit 16065fcdd19ddb9e093192914ac863884f308766 upstream. |
| |
| Bisected guest kernel changes crashing qemu. Landed at |
| "6c1cd97bda drm/virtio: fix resource id handling". Looked again, and |
| noticed we where not only leaking *some* ids, but *all* ids. The old |
| code never ever called virtio_gpu_resource_id_put(). |
| |
| So, commit 6c1cd97bda effectively makes the linux kernel starting |
| re-using IDs after releasing them, and apparently virglrenderer can't |
| deal with that. Oops. |
| |
| This patch puts a temporary stopgap into place for the 5.0 release. |
| |
| Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> |
| Reviewed-by: Dave Airlie <airlied@redhat.com> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190208140409.15280-1-kraxel@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/virtio/virtgpu_object.c | 13 +++++++++++++ |
| 1 file changed, 13 insertions(+) |
| |
| --- a/drivers/gpu/drm/virtio/virtgpu_object.c |
| +++ b/drivers/gpu/drm/virtio/virtgpu_object.c |
| @@ -28,10 +28,21 @@ |
| 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; |
| return 0; |
| @@ -39,7 +50,9 @@ static int virtio_gpu_resource_id_get(st |
| |
| 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 |
| } |
| |
| static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) |