From: Marc-André Lureau <marcandre.lur...@redhat.com> The next patch will notify the GL context got flush, which will resume the queue processing. However, if this happens within the caller context, it will end up with a stack overflow flush/update loop.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> Message-Id: <20210204105232.834642-18-marcandre.lur...@redhat.com> Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- include/hw/virtio/virtio-gpu.h | 1 + hw/display/virtio-gpu.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index 4f3dbf79f9bc..0043268e9021 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -148,6 +148,7 @@ struct VirtIOGPU { uint64_t hostmem; + bool processing_cmdq; bool renderer_inited; bool renderer_reset; QEMUTimer *fence_poll; diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 0e833a462bae..7eb4265a6da7 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -814,6 +814,10 @@ void virtio_gpu_process_cmdq(VirtIOGPU *g) { struct virtio_gpu_ctrl_command *cmd; + if (g->processing_cmdq) { + return; + } + g->processing_cmdq = true; while (!QTAILQ_EMPTY(&g->cmdq)) { cmd = QTAILQ_FIRST(&g->cmdq); @@ -843,6 +847,7 @@ void virtio_gpu_process_cmdq(VirtIOGPU *g) g_free(cmd); } } + g->processing_cmdq = false; } static void virtio_gpu_gl_unblock(VirtIOGPUBase *b) -- 2.29.2