From: Markus Armbruster <armbru@redhat.com>
To: "hongmianquan" <hongmianquan@bytedance.com>
Cc: <qemu-devel@nongnu.org>, <kwolf@redhat.com>,
<armbru@redhat.com>, <michael.roth@amd.com>,
<wubo.bob@bytedance.com>
Subject: Re: [PATCH v2] monitor: Fix deadlock in monitor_cleanup
Date: Tue, 31 Mar 2026 15:24:15 +0200 [thread overview]
Message-ID: <875x6ci134.fsf@pond.sub.org> (raw)
In-Reply-To: <20260327131024.51947-1-hongmianquan@bytedance.com> (hongmianquan@bytedance.com's message of "Fri, 27 Mar 2026 21:10:24 +0800")
"hongmianquan" <hongmianquan@bytedance.com> writes:
> During qemu_cleanup, if a non-coroutine QMP command (e.g., query-commands) is concurrently
> received and processed by the mon_iothread, it can lead to a deadlock in monitor_cleanup.
>
> The root cause is a race condition between the main thread's shutdown sequence and the coroutine's dispatching mechanism. When handling a non-coroutine QMP command, qmp_dispatcher_co schedules the actual command execution as a bottom half in iohandler_ctx and then yields. At this suspended point, qmp_dispatcher_co_busy remains true.
> Subsequently, the main thread in monitor_cleanup(), sets qmp_dispatcher_co_shutdown, and calls qmp_dispatcher_co_wake(). Since qmp_dispatcher_co_busy is already true, the aio_co_wake is skipped. The main thread then enters the AIO_WAIT_WHILE_UNLOCKED loop, it executes the scheduled BH (do_qmp_dispatch_bh) via aio_poll(iohandler_ctx, false), which attempts to wake up the coroutine, aio_co_wake schedules a new wake-up BH in iohandler_ctx. The main thread then blocks indefinitely in aio_poll(qemu_aio_context, true), while the coroutine's wake-up BH is starved in iohandler_ctx, qmp_dispatcher_co never reaches termination, resulting in a deadlock.
>
> The execution sequence is illustrated below:
>
> IO Thread Main Thread (qemu_aio_context) qmp_dispatcher_co (iohandler_ctx)
> | | |
> |-- query-commands | |
> |-- qmp_dispatcher_co_wake() | |
> | (sets busy = true) | |
> | | <-- Wakes up in iohandler_ctx --> |
> | | |-- qmp_dispatch()
> | | |-- Schedules BH (do_qmp_dispatch_bh)
> | | |-- qemu_coroutine_yield()
> | | [State: Suspended, busy=true]
> | [ quit triggered ] |
> | |-- monitor_cleanup()
> | |-- qmp_dispatcher_co_shutdown = true
> | |-- qmp_dispatcher_co_wake()
> | | -> Checks busy flag. It's TRUE!
> | | -> Skips aio_co_wake().
> | |
> | |-- AIO_WAIT_WHILE_UNLOCKED:
> | | |-- aio_poll(iohandler_ctx, false)
> | | | -> Executes do_qmp_dispatch_bh
> | | | -> Schedules 'co_schedule_bh' in iohandler_ctx
> | | |
> | | |-- aio_poll(qemu_aio_context, true)
> | | | -> Blocks indefinitely! (Deadlock)
> | |
> | X (Main thread sleeping) X (Waiting for next iohandler_ctx poll)
>
> To fix this, we add an explicit aio_wait_kick() in do_qmp_dispatch_bh() to break the main loop out of its blocking poll, allowing it to evaluate the loop condition and poll iohandler_ctx.
>
> Signed-off-by: hongmianquan <hongmianquan@bytedance.com>
> Signed-off-by: wubo.bob <wubo.bob@bytedance.com>
Please line-wrap your paragraphs at 70 columns or so. The maintainer
accepting the patch may do that for you, to save you a respin.
Suggested-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
next prev parent reply other threads:[~2026-03-31 13:24 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-27 13:10 [PATCH v2] monitor: Fix deadlock in monitor_cleanup hongmianquan
2026-03-31 13:24 ` Markus Armbruster [this message]
2026-03-31 13:36 ` Kevin Wolf
2026-03-31 21:38 ` Michael Tokarev
2026-04-01 8:32 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=875x6ci134.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=hongmianquan@bytedance.com \
--cc=kwolf@redhat.com \
--cc=michael.roth@amd.com \
--cc=qemu-devel@nongnu.org \
--cc=wubo.bob@bytedance.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.