[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even with Q
From: |
Peter Xu |
Subject: |
[Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even with QMPs |
Date: |
Tue, 19 Dec 2017 16:45:45 +0800 |
One thing to mention is that for QMPs that are using IOThreads, we need
an explicit kick for the IOThread in case it is sleeping.
Since at it, add traces for the operations.
Signed-off-by: Peter Xu <address@hidden>
---
monitor.c | 26 +++++++++++++++++++++-----
trace-events | 1 +
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/monitor.c b/monitor.c
index 844508d134..5f05f2e9da 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3992,19 +3992,35 @@ static void monitor_command_cb(void *opaque, const char
*cmdline,
int monitor_suspend(Monitor *mon)
{
- if (!mon->rs)
- return -ENOTTY;
atomic_inc(&mon->suspend_cnt);
+ if (monitor_is_qmp(mon)) {
+ /*
+ * Kick iothread to make sure this takes effect. It'll be
+ * evaluated again in prepare() of the watch object.
+ */
+ aio_notify(iothread_get_aio_context(mon_global.mon_iothread));
+ }
+ trace_monitor_suspend(mon, 1);
return 0;
}
void monitor_resume(Monitor *mon)
{
- if (!mon->rs)
- return;
if (atomic_dec_fetch(&mon->suspend_cnt) == 0) {
- readline_show_prompt(mon->rs);
+ if (monitor_is_qmp(mon)) {
+ /*
+ * For QMP monitors that are running in IOThread, let's
+ * kick the thread in case it's sleeping.
+ */
+ if (mon->use_io_thr) {
+ aio_notify(iothread_get_aio_context(mon_global.mon_iothread));
+ }
+ } else {
+ assert(mon->rs);
+ readline_show_prompt(mon->rs);
+ }
}
+ trace_monitor_suspend(mon, -1);
}
static QObject *get_qmp_greeting(Monitor *mon)
diff --git a/trace-events b/trace-events
index 1d2eb5d3e4..2646241a0f 100644
--- a/trace-events
+++ b/trace-events
@@ -47,6 +47,7 @@ monitor_protocol_event_emit(uint32_t event, void *data)
"event=%d data=%p"
monitor_protocol_event_queue(uint32_t event, void *qdict, uint64_t rate)
"event=%d data=%p rate=%" PRId64
handle_hmp_command(void *mon, const char *cmdline) "mon %p cmdline: %s"
handle_qmp_command(void *mon, const char *req) "mon %p req: %s"
+monitor_suspend(void *ptr, int cnt) "mon %p: %d"
# dma-helpers.c
dma_blk_io(void *dbs, void *bs, int64_t offset, bool to_dev) "dbs=%p bs=%p
offset=%" PRId64 " to_dev=%d"
--
2.14.3
- [Qemu-devel] [RFC v6 10/27] monitor: allow to use IO thread for parsing, (continued)
- [Qemu-devel] [RFC v6 10/27] monitor: allow to use IO thread for parsing, Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 11/27] qmp: introduce QMPCapability, Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 12/27] qmp: negotiate QMP capabilities, Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 13/27] monitor: introduce monitor_qmp_respond(), Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 14/27] monitor: let suspend_cnt be thread safe, Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even with QMPs,
Peter Xu <=
- [Qemu-devel] [RFC v6 16/27] monitor: separate QMP parser and dispatcher, Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 17/27] qmp: add new event "command-dropped", Peter Xu, 2017/12/19
- [Qemu-devel] [RFC v6 18/27] monitor: send event when command queue full, Peter Xu, 2017/12/19