From: Marc-André Lureau Date: Thu, 4 Feb 2021 10:52:29 +0000 (+0400) Subject: virtio-gpu: avoid re-entering cmdq processing X-Git-Tag: v6.0.0-rc0~107^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f8f3c2719e11145d4f2902c562f7979df741daf0;p=thirdparty%2Fqemu.git virtio-gpu: avoid re-entering cmdq processing 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 Message-Id: <20210204105232.834642-18-marcandre.lureau@redhat.com> Signed-off-by: Gerd Hoffmann --- diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 0e833a462ba..7eb4265a6da 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) diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index 4f3dbf79f9b..0043268e902 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;