diff options
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/monitor.c | 25 | ||||
-rw-r--r-- | monitor/qmp.c | 5 |
2 files changed, 20 insertions, 10 deletions
diff --git a/monitor/monitor.c b/monitor/monitor.c index 1e4a6b3f20..e94f532cf5 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -619,16 +619,6 @@ void monitor_data_destroy(Monitor *mon) void monitor_cleanup(void) { /* - * We need to explicitly stop the I/O thread (but not destroy it), - * clean up the monitor resources, then destroy the I/O thread since - * we need to unregister from chardev below in - * monitor_data_destroy(), and chardev is not thread-safe yet - */ - if (mon_iothread) { - iothread_stop(mon_iothread); - } - - /* * The dispatcher needs to stop before destroying the monitor and * the I/O thread. * @@ -637,6 +627,11 @@ void monitor_cleanup(void) * eventually terminates. qemu_aio_context is automatically * polled by calling AIO_WAIT_WHILE on it, but we must poll * iohandler_ctx manually. + * + * Letting the iothread continue while shutting down the dispatcher + * means that new requests may still be coming in. This is okay, + * we'll just leave them in the queue without sending a response + * and monitor_data_destroy() will free them. */ qmp_dispatcher_co_shutdown = true; if (!qatomic_xchg(&qmp_dispatcher_co_busy, true)) { @@ -647,6 +642,16 @@ void monitor_cleanup(void) (aio_poll(iohandler_get_aio_context(), false), qatomic_mb_read(&qmp_dispatcher_co_busy))); + /* + * We need to explicitly stop the I/O thread (but not destroy it), + * clean up the monitor resources, then destroy the I/O thread since + * we need to unregister from chardev below in + * monitor_data_destroy(), and chardev is not thread-safe yet + */ + if (mon_iothread) { + iothread_stop(mon_iothread); + } + /* Flush output buffers and destroy monitors */ qemu_mutex_lock(&monitor_lock); monitor_destroyed = true; diff --git a/monitor/qmp.c b/monitor/qmp.c index 43880fa623..2326bd7f9b 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -227,6 +227,11 @@ void coroutine_fn monitor_qmp_dispatcher_co(void *data) */ qatomic_mb_set(&qmp_dispatcher_co_busy, false); + /* On shutdown, don't take any more requests from the queue */ + if (qmp_dispatcher_co_shutdown) { + return; + } + while (!(req_obj = monitor_qmp_requests_pop_any_with_lock())) { /* * No more requests to process. Wait to be reentered from |