[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v13 03/13] virtio-gpu: Handle virtio_gpu_virgl_init() failure
From: |
Dmitry Osipenko |
Subject: |
[PATCH v13 03/13] virtio-gpu: Handle virtio_gpu_virgl_init() failure |
Date: |
Mon, 27 May 2024 06:02:23 +0300 |
virtio_gpu_virgl_init() may fail, leading to a further Qemu crash
because Qemu assumes it never fails. Check virtio_gpu_virgl_init()
return code and don't execute virtio commands on error. Failed
virtio_gpu_virgl_init() will result in a timed out virtio commands
for a guest OS.
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
---
hw/display/virtio-gpu-gl.c | 29 +++++++++++++++++++++--------
include/hw/virtio/virtio-gpu.h | 11 +++++++++--
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c
index e06be60dfbfc..38a2b1bd3916 100644
--- a/hw/display/virtio-gpu-gl.c
+++ b/hw/display/virtio-gpu-gl.c
@@ -29,9 +29,14 @@ static void virtio_gpu_gl_update_cursor_data(VirtIOGPU *g,
struct virtio_gpu_scanout *s,
uint32_t resource_id)
{
+ VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);
uint32_t width, height;
uint32_t pixels, *data;
+ if (gl->renderer_state != RS_INITED) {
+ return;
+ }
+
data = virgl_renderer_get_cursor_data(resource_id, &width, &height);
if (!data) {
return;
@@ -65,13 +70,21 @@ static void virtio_gpu_gl_handle_ctrl(VirtIODevice *vdev,
VirtQueue *vq)
return;
}
- if (!gl->renderer_inited) {
- virtio_gpu_virgl_init(g);
- gl->renderer_inited = true;
- }
- if (gl->renderer_reset) {
- gl->renderer_reset = false;
+ switch (gl->renderer_state) {
+ case RS_RESET:
virtio_gpu_virgl_reset(g);
+ /* fallthrough */
+ case RS_START:
+ if (virtio_gpu_virgl_init(g)) {
+ gl->renderer_state = RS_INIT_FAILED;
+ } else {
+ gl->renderer_state = RS_INITED;
+ }
+ break;
+ case RS_INIT_FAILED:
+ return;
+ case RS_INITED:
+ break;
}
cmd = virtqueue_pop(vq, sizeof(struct virtio_gpu_ctrl_command));
@@ -98,9 +111,9 @@ static void virtio_gpu_gl_reset(VirtIODevice *vdev)
* GL functions must be called with the associated GL context in main
* thread, and when the renderer is unblocked.
*/
- if (gl->renderer_inited && !gl->renderer_reset) {
+ if (gl->renderer_state == RS_INITED) {
virtio_gpu_virgl_reset_scanout(g);
- gl->renderer_reset = true;
+ gl->renderer_state = RS_RESET;
}
}
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index 7ff989a45a5c..6e71d799e5da 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -224,11 +224,18 @@ struct VirtIOGPUClass {
Error **errp);
};
+/* VirtIOGPUGL renderer states */
+typedef enum {
+ RS_START, /* starting state */
+ RS_INIT_FAILED, /* failed initialisation */
+ RS_INITED, /* initialised and working */
+ RS_RESET, /* inited and reset pending, moves to start after reset */
+} RenderState;
+
struct VirtIOGPUGL {
struct VirtIOGPU parent_obj;
- bool renderer_inited;
- bool renderer_reset;
+ RenderState renderer_state;
QEMUTimer *fence_poll;
QEMUTimer *print_stats;
--
2.44.0
- [PATCH v13 00/13] Support blob memory and venus on qemu, Dmitry Osipenko, 2024/05/26
- [PATCH v13 01/13] virtio-gpu: Move fence_poll timer to VirtIOGPUGL, Dmitry Osipenko, 2024/05/26
- [PATCH v13 02/13] virtio-gpu: Move print_stats timer to VirtIOGPUGL, Dmitry Osipenko, 2024/05/26
- [PATCH v13 03/13] virtio-gpu: Handle virtio_gpu_virgl_init() failure,
Dmitry Osipenko <=
- [PATCH v13 04/13] virtio-gpu: Unrealize GL device, Dmitry Osipenko, 2024/05/26
- [PATCH v13 05/13] virtio-gpu: Use pkgconfig version to decide which virgl features are available, Dmitry Osipenko, 2024/05/26
- [PATCH v13 06/13] virtio-gpu: Support context-init feature with virglrenderer, Dmitry Osipenko, 2024/05/26
- [PATCH v13 07/13] virtio-gpu: Don't require udmabuf when blobs and virgl are enabled, Dmitry Osipenko, 2024/05/26
- [PATCH v13 08/13] virtio-gpu: Add virgl resource management, Dmitry Osipenko, 2024/05/26
- [PATCH v13 10/13] virtio-gpu: Support suspension of commands processing, Dmitry Osipenko, 2024/05/26
- [PATCH v13 09/13] virtio-gpu: Support blob scanout using dmabuf fd, Dmitry Osipenko, 2024/05/26
- [PATCH v13 11/13] virtio-gpu: Handle resource blob commands, Dmitry Osipenko, 2024/05/26
- [PATCH v13 12/13] virtio-gpu: Register capsets dynamically, Dmitry Osipenko, 2024/05/26
- [PATCH v13 13/13] virtio-gpu: Support Venus context, Dmitry Osipenko, 2024/05/26