aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Drobyshev <andrey.drobyshev@virtuozzo.com>2025-05-03 00:47:29 +0300
committerPaolo Bonzini <pbonzini@redhat.com>2025-05-02 23:51:30 +0200
commit03f50d7ee756eecbd4481c3008b5e01e999729c7 (patch)
tree769b8482a559649e3e510fbff00ea35cba5ce9fd
parentffd5a60e9b67e14f7bac7ea29300ea46a944e508 (diff)
downloadqemu-03f50d7ee756eecbd4481c3008b5e01e999729c7.zip
qemu-03f50d7ee756eecbd4481c3008b5e01e999729c7.tar.gz
qemu-03f50d7ee756eecbd4481c3008b5e01e999729c7.tar.bz2
monitor: don't wake up qmp_dispatcher_co coroutine upon cleanup
Since the commit 3e6bed61 ("monitor: cleanup detection of qmp_dispatcher_co shutting down"), coroutine pointer qmp_dispatcher_co is set to NULL upon cleanup. If a QMP command is sent after monitor_cleanup() (e.g. after shutdown), this may lead to SEGFAULT on aio_co_wake(NULL). As mentioned in the comment inside monitor_cleanup(), the intention is to allow incoming requests while shutting down, but simply leave them without any response. Let's do exactly that, and if qmp_dispatcher_co coroutine pointer has already been set to NULL, let's simply skip the aio_co_wake() part. Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> Link: https://lore.kernel.org/r/20250502214729.928380-2-andrey.drobyshev@virtuozzo.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--monitor/qmp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/monitor/qmp.c b/monitor/qmp.c
index 2f46cf9..cb99a12 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -356,7 +356,8 @@ void qmp_dispatcher_co_wake(void)
/* Write request before reading qmp_dispatcher_co_busy. */
smp_mb__before_rmw();
- if (!qatomic_xchg(&qmp_dispatcher_co_busy, true)) {
+ if (!qatomic_xchg(&qmp_dispatcher_co_busy, true) &&
+ qatomic_read(&qmp_dispatcher_co)) {
aio_co_wake(qmp_dispatcher_co);
}
}