The 'skip_flush' field is set on the dummy throwaway HMP monitor
object created by QMP's 'human-monitor-command', as an indication
not to try to write data to the chardev. Instead the QMP command
impl will grab the data straight out of the in-memory buffer.
The flag is redundant, however, as the monitor code could instead
simply check the 'fe_is_open' field on the CharFrontend, which
will be false in the same scenarios that 'skip_flush' is true.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
monitor/hmp.c | 2 +-
monitor/monitor-internal.h | 4 +---
monitor/monitor.c | 11 +++++++----
monitor/qmp-cmds.c | 2 +-
monitor/qmp.c | 2 +-
5 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/monitor/hmp.c b/monitor/hmp.c
index 54fd25f220..5644c9c4f5 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -1590,7 +1590,7 @@ void monitor_new_hmp(const char *id, const char *chardev_id,
return;
}
- monitor_data_init(&mon->parent_obj, false, false, false);
+ monitor_data_init(&mon->parent_obj, false, false);
if (mon->use_readline) {
mon->rs = readline_init(monitor_readline_printf,
diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h
index 145d52fd71..d34f9be139 100644
--- a/monitor/monitor-internal.h
+++ b/monitor/monitor-internal.h
@@ -112,7 +112,6 @@ struct Monitor {
CharFrontend chr;
int suspend_cnt; /* Needs to be accessed atomically */
bool is_qmp;
- bool skip_flush;
bool use_io_thread;
char *mon_cpu_path;
@@ -194,8 +193,7 @@ extern QemuMutex monitor_lock;
extern MonitorList mon_list;
void monitor_complete(Monitor *mon, Error **errp);
-void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush,
- bool use_io_thread);
+void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread);
void monitor_data_destroy(Monitor *mon);
int monitor_can_read(void *opaque);
void monitor_list_append(Monitor *mon);
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 1648946c92..db9243410a 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -190,7 +190,12 @@ void monitor_flush_locked(Monitor *mon)
size_t len;
const char *buf;
- if (mon->skip_flush) {
+ /*
+ * When used by QMP human-monitor-command, no chardev
+ * will be connected, as we want to just collect the
+ * output in the buffer
+ */
+ if (!mon->chr.fe_is_open) {
return;
}
@@ -644,8 +649,7 @@ static void monitor_iothread_init(void)
mon_iothread = iothread_create("mon_iothread", &error_abort);
}
-void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush,
- bool use_io_thread)
+void monitor_data_init(Monitor *mon, bool is_qmp, bool use_io_thread)
{
if (use_io_thread && !mon_iothread) {
monitor_iothread_init();
@@ -653,7 +657,6 @@ void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush,
qemu_mutex_init(&mon->mon_lock);
mon->is_qmp = is_qmp;
mon->outbuf = g_string_new(NULL);
- mon->skip_flush = skip_flush;
mon->use_io_thread = use_io_thread;
}
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index bfde769ef0..0d9adad288 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -168,7 +168,7 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
char *output = NULL;
MonitorHMP *hmp = MONITOR_HMP(object_new(TYPE_MONITOR_HMP));
- monitor_data_init(&hmp->parent_obj, false, true, false);
+ monitor_data_init(&hmp->parent_obj, false, false);
if (has_cpu_index) {
int ret = monitor_set_cpu(&hmp->parent_obj, cpu_index);
diff --git a/monitor/qmp.c b/monitor/qmp.c
index d7adb9ba8b..b300886f33 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -572,7 +572,7 @@ void monitor_new_qmp(const char *id, const char *chardev_id,
qemu_chr_fe_set_echo(&mon->parent_obj.chr, true);
/* Note: we run QMP monitor in I/O thread when @chr supports that */
- monitor_data_init(&mon->parent_obj, true, false,
+ monitor_data_init(&mon->parent_obj, true,
qemu_chr_has_feature(mon->parent_obj.chr.chr,
QEMU_CHAR_FEATURE_GCONTEXT));
--
2.55.0