The monitor_is_hmp_non_interactive method is used by
monitor_suspend and monitor_resume, to make them a no-op
if the HMP does not use readline.
There are only a handful of callers of suspend/resume and
they can be made to skip the call when readline is not
present.
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>
---
include/monitor/monitor.h | 2 +-
migration/migration-hmp-cmds.c | 5 ++++-
monitor/hmp-cmds.c | 5 ++++-
monitor/hmp.c | 11 ++++++++---
monitor/monitor.c | 30 +-----------------------------
5 files changed, 18 insertions(+), 35 deletions(-)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index e802e8dfb2..890497b0d2 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -37,7 +37,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp);
int monitor_new_opts(QemuOpts *opts, Error **errp);
void monitor_cleanup(void);
-int monitor_suspend(Monitor *mon);
+void monitor_suspend(Monitor *mon);
void monitor_resume(Monitor *mon);
int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 8b385f560e..502ca704da 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -19,6 +19,7 @@
#include "monitor/hmp.h"
#include "monitor/hmp-completion.h"
#include "monitor/monitor.h"
+#include "monitor/monitor-internal.h"
#include "qapi/error.h"
#include "qapi/qapi-commands-migration.h"
#include "qapi/qapi-visit-migration.h"
@@ -853,12 +854,14 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
if (!detach) {
HMPMigrationStatus *status;
+ MonitorHMP *hmp = MONITOR_HMP(mon);
- if (monitor_suspend(mon) < 0) {
+ if (!hmp->use_readline) {
monitor_printf(mon, "terminal does not allow synchronous "
"migration, continuing detached\n");
return;
}
+ monitor_suspend(mon);
status = g_malloc0(sizeof(*status));
status->mon = mon;
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index e139caeba9..e9fb8d827a 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -129,7 +129,10 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)
void hmp_quit(Monitor *mon, const QDict *qdict)
{
- monitor_suspend(mon);
+ MonitorHMP *hmp = MONITOR_HMP(mon);
+ if (hmp->use_readline) {
+ monitor_suspend(mon);
+ }
qmp_quit(NULL);
}
diff --git a/monitor/hmp.c b/monitor/hmp.c
index 4636165d0b..a51de8e467 100644
--- a/monitor/hmp.c
+++ b/monitor/hmp.c
@@ -1528,13 +1528,16 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)
static void monitor_event(void *opaque, QEMUChrEvent event)
{
Monitor *mon = opaque;
+ MonitorHMP *hmp = MONITOR_HMP(mon);
switch (event) {
case CHR_EVENT_MUX_IN:
qemu_mutex_lock(&mon->mon_lock);
if (mon->mux_out) {
mon->mux_out = 0;
- monitor_resume(mon);
+ if (hmp->use_readline) {
+ monitor_resume(mon);
+ }
}
qemu_mutex_unlock(&mon->mon_lock);
break;
@@ -1547,7 +1550,9 @@ static void monitor_event(void *opaque, QEMUChrEvent event)
} else {
monitor_flush_locked(mon);
}
- monitor_suspend(mon);
+ if (hmp->use_readline) {
+ monitor_suspend(mon);
+ }
mon->mux_out = 1;
}
qemu_mutex_unlock(&mon->mon_lock);
@@ -1558,7 +1563,7 @@ static void monitor_event(void *opaque, QEMUChrEvent event)
"information\n", QEMU_VERSION);
qemu_mutex_lock(&mon->mon_lock);
mon->reset_seen = 1;
- if (!mon->mux_out) {
+ if (!mon->mux_out && hmp->use_readline) {
/* Suspend-resume forces the prompt to be printed. */
monitor_suspend(mon);
monitor_resume(mon);
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 9b62716033..f1b189c1c2 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -157,25 +157,6 @@ bool monitor_requires_iothread(const Monitor *mon)
return cls->requires_iothread && cls->requires_iothread(mon);
}
-/**
- * Is @mon is using readline?
- * Note: not all HMP monitors use readline, e.g., gdbserver has a
- * non-interactive HMP monitor, so readline is not used there.
- */
-static inline bool monitor_uses_readline(const MonitorHMP *mon)
-{
- return mon->use_readline;
-}
-
-static inline bool monitor_is_hmp_non_interactive(const Monitor *mon)
-{
- if (!object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_HMP)) {
- return false;
- }
-
- return !monitor_uses_readline(container_of(mon, MonitorHMP, parent_obj));
-}
-
static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond,
void *opaque)
{
@@ -550,12 +531,8 @@ static gboolean qapi_event_throttle_equal(const void *a, const void *b)
return TRUE;
}
-int monitor_suspend(Monitor *mon)
+void monitor_suspend(Monitor *mon)
{
- if (monitor_is_hmp_non_interactive(mon)) {
- return -ENOTTY;
- }
-
qatomic_inc(&mon->suspend_cnt);
if (monitor_requires_iothread(mon)) {
@@ -567,7 +544,6 @@ int monitor_suspend(Monitor *mon)
}
trace_monitor_suspend(mon, 1);
- return 0;
}
static void monitor_accept_input(void *opaque)
@@ -584,10 +560,6 @@ static void monitor_accept_input(void *opaque)
void monitor_resume(Monitor *mon)
{
- if (monitor_is_hmp_non_interactive(mon)) {
- return;
- }
-
if (qatomic_dec_fetch(&mon->suspend_cnt) == 0) {
AioContext *ctx;
--
2.55.0