[{"id":3676949,"web_url":"http://patchwork.ozlabs.org/comment/3676949/","msgid":"<ad1yisSWpU2TZt5_@gallifrey>","list_archive_url":null,"date":"2026-04-13T22:47:38","subject":"Re: [PATCH 16/17] monitor: eliminate monitor_is_hmp_non_interactive\n method","submitter":{"id":86099,"url":"http://patchwork.ozlabs.org/api/people/86099/","name":"Dr. David Alan Gilbert","email":"dave@treblig.org"},"content":"* Daniel P. Berrangé (berrange@redhat.com) wrote:\n> The monitor_is_hmp_non_interactive method is used by\n> monitor_suspend and monitor_resume, to make them a no-op\n> if the HMP does not use readline.\n> \n> There are only a handful of callers of suspend/resume and\n> they can be made to skip the call with readline is not\n> present.\n> \n> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>\n\nReviewed-by: Dr. David Alan Gilbert <dave@treblig.org>\n\n> ---\n>  include/monitor/monitor.h      |  2 +-\n>  migration/migration-hmp-cmds.c |  5 ++++-\n>  monitor/hmp-cmds.c             |  5 ++++-\n>  monitor/hmp.c                  | 14 +++++++++-----\n>  monitor/monitor-internal.h     |  1 -\n>  monitor/monitor.c              | 30 +-----------------------------\n>  6 files changed, 19 insertions(+), 38 deletions(-)\n> \n> diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h\n> index f66e465775..52df053c6d 100644\n> --- a/include/monitor/monitor.h\n> +++ b/include/monitor/monitor.h\n> @@ -34,7 +34,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp);\n>  int monitor_new_opts(QemuOpts *opts, Error **errp);\n>  void monitor_cleanup(void);\n>  \n> -int monitor_suspend(Monitor *mon);\n> +void monitor_suspend(Monitor *mon);\n>  void monitor_resume(Monitor *mon);\n>  \n>  int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);\n> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c\n> index 0a193b8f54..e9bb970b20 100644\n> --- a/migration/migration-hmp-cmds.c\n> +++ b/migration/migration-hmp-cmds.c\n> @@ -18,6 +18,7 @@\n>  #include \"migration/snapshot.h\"\n>  #include \"monitor/hmp.h\"\n>  #include \"monitor/monitor.h\"\n> +#include \"monitor/monitor-internal.h\"\n>  #include \"qapi/error.h\"\n>  #include \"qapi/qapi-commands-migration.h\"\n>  #include \"qapi/qapi-visit-migration.h\"\n> @@ -836,12 +837,14 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)\n>  \n>      if (!detach) {\n>          HMPMigrationStatus *status;\n> +        MonitorHMP *hmp = MONITOR_HMP(mon);\n>  \n> -        if (monitor_suspend(mon) < 0) {\n> +        if (!hmp->rs) {\n>              monitor_printf(mon, \"terminal does not allow synchronous \"\n>                             \"migration, continuing detached\\n\");\n>              return;\n>          }\n> +        monitor_suspend(mon);\n>  \n>          status = g_malloc0(sizeof(*status));\n>          status->mon = mon;\n> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c\n> index 911d984cbe..a6314c1159 100644\n> --- a/monitor/hmp-cmds.c\n> +++ b/monitor/hmp-cmds.c\n> @@ -90,7 +90,10 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)\n>  \n>  void hmp_quit(Monitor *mon, const QDict *qdict)\n>  {\n> -    monitor_suspend(mon);\n> +    MonitorHMP *hmp = MONITOR_HMP(mon);\n> +    if (hmp->rs) {\n> +        monitor_suspend(mon);\n> +    }\n>      qmp_quit(NULL);\n>  }\n>  \n> diff --git a/monitor/hmp.c b/monitor/hmp.c\n> index 5f9373a87b..387dab2567 100644\n> --- a/monitor/hmp.c\n> +++ b/monitor/hmp.c\n> @@ -1491,13 +1491,16 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)\n>  static void monitor_event(void *opaque, QEMUChrEvent event)\n>  {\n>      Monitor *mon = opaque;\n> +    MonitorHMP *hmp = MONITOR_HMP(mon);\n>  \n>      switch (event) {\n>      case CHR_EVENT_MUX_IN:\n>          qemu_mutex_lock(&mon->mon_lock);\n>          if (mon->mux_out) {\n>              mon->mux_out = 0;\n> -            monitor_resume(mon);\n> +            if (hmp->rs) {\n> +                monitor_resume(mon);\n> +            }\n>          }\n>          qemu_mutex_unlock(&mon->mon_lock);\n>          break;\n> @@ -1510,7 +1513,9 @@ static void monitor_event(void *opaque, QEMUChrEvent event)\n>              } else {\n>                  monitor_flush_locked(mon);\n>              }\n> -            monitor_suspend(mon);\n> +            if (hmp->rs) {\n> +                monitor_suspend(mon);\n> +            }\n>              mon->mux_out = 1;\n>          }\n>          qemu_mutex_unlock(&mon->mon_lock);\n> @@ -1521,7 +1526,7 @@ static void monitor_event(void *opaque, QEMUChrEvent event)\n>                         \"information\\n\", QEMU_VERSION);\n>          qemu_mutex_lock(&mon->mon_lock);\n>          mon->reset_seen = 1;\n> -        if (!mon->mux_out) {\n> +        if (!mon->mux_out && hmp->rs) {\n>              /* Suspend-resume forces the prompt to be printed.  */\n>              monitor_suspend(mon);\n>              monitor_resume(mon);\n> @@ -1569,8 +1574,7 @@ void monitor_new_hmp(Chardev *chr, bool use_readline, Error **errp)\n>          return;\n>      }\n>  \n> -    mon->use_readline = use_readline;\n> -    if (mon->use_readline) {\n> +    if (use_readline) {\n>          mon->rs = readline_init(monitor_readline_printf,\n>                                  monitor_readline_flush,\n>                                  mon,\n> diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h\n> index d40fdde793..7557deb978 100644\n> --- a/monitor/monitor-internal.h\n> +++ b/monitor/monitor-internal.h\n> @@ -133,7 +133,6 @@ struct MonitorHMPClass {\n>  \n>  struct MonitorHMP {\n>      Monitor parent;\n> -    bool use_readline;\n>      /*\n>       * State used only in the thread \"owning\" the monitor.\n>       * If @use_io_thread, this is @mon_iothread. (This does not actually happen\n> diff --git a/monitor/monitor.c b/monitor/monitor.c\n> index f48603a7e8..3860486a32 100644\n> --- a/monitor/monitor.c\n> +++ b/monitor/monitor.c\n> @@ -130,25 +130,6 @@ Monitor *monitor_set_cur(Coroutine *co, Monitor *mon)\n>      return old_monitor;\n>  }\n>  \n> -/**\n> - * Is @mon is using readline?\n> - * Note: not all HMP monitors use readline, e.g., gdbserver has a\n> - * non-interactive HMP monitor, so readline is not used there.\n> - */\n> -static inline bool monitor_uses_readline(const MonitorHMP *mon)\n> -{\n> -    return mon->use_readline;\n> -}\n> -\n> -static inline bool monitor_is_hmp_non_interactive(const Monitor *mon)\n> -{\n> -    if (!object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_HMP)) {\n> -        return false;\n> -    }\n> -\n> -    return !monitor_uses_readline(container_of(mon, MonitorHMP, parent));\n> -}\n> -\n>  static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond,\n>                                    void *opaque)\n>  {\n> @@ -523,12 +504,8 @@ static gboolean qapi_event_throttle_equal(const void *a, const void *b)\n>      return TRUE;\n>  }\n>  \n> -int monitor_suspend(Monitor *mon)\n> +void monitor_suspend(Monitor *mon)\n>  {\n> -    if (monitor_is_hmp_non_interactive(mon)) {\n> -        return -ENOTTY;\n> -    }\n> -\n>      qatomic_inc(&mon->suspend_cnt);\n>  \n>      if (mon->use_io_thread) {\n> @@ -540,7 +517,6 @@ int monitor_suspend(Monitor *mon)\n>      }\n>  \n>      trace_monitor_suspend(mon, 1);\n> -    return 0;\n>  }\n>  \n>  static void monitor_accept_input(void *opaque)\n> @@ -557,10 +533,6 @@ static void monitor_accept_input(void *opaque)\n>  \n>  void monitor_resume(Monitor *mon)\n>  {\n> -    if (monitor_is_hmp_non_interactive(mon)) {\n> -        return;\n> -    }\n> -\n>      if (qatomic_dec_fetch(&mon->suspend_cnt) == 0) {\n>          AioContext *ctx;\n>  \n> -- \n> 2.53.0\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=treblig.org header.i=@treblig.org header.a=rsa-sha256\n header.s=bytemarkmx header.b=Lz5Z4CfO;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fvjHG1hWvz1yD4\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 08:48:10 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wCQ4Q-0000cP-EL; Mon, 13 Apr 2026 18:47:54 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dg@treblig.org>)\n id 1wCQ4F-0000aR-86; Mon, 13 Apr 2026 18:47:46 -0400","from mx.treblig.org ([2a00:1098:5b::1])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dg@treblig.org>)\n id 1wCQ4D-0000Rc-8C; Mon, 13 Apr 2026 18:47:43 -0400","from dg by mx.treblig.org with local (Exim 4.98.2)\n (envelope-from <dg@treblig.org>) id 1wCQ4A-000000086mE-1Ckv;\n Mon, 13 Apr 2026 22:47:38 +0000"],"DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=treblig.org\n ; s=bytemarkmx;\n h=Content-Type:MIME-Version:Message-ID:Subject:From:Date:From\n :Subject; bh=dPeixRmjbMbik0WnhUVF88u4/q6R7HCPcA54F6D+VTw=; b=Lz5Z4CfOBKG6P2m6\n pLV8eY0QzYJTOmA5FTtC38ZclF3pbHVuG4tioAUot/pjkjSNNSpJ4EUA3LXXJ/L4S5XeQjUG8hVhr\n 1VUr1QjcOv4v6hFksjkyEb7V0R9j55nA22HFHTVPZ6iqthPWrd6JQqlI3Giq0yeRqR/rYMrRi1Mk4\n pepDeM5hS4Pnj8Uwh1xnG3ZLcFuepvyBumekEK0h/g4HyO2nCog7T82oAshdDfM1GaESW1do0usZu\n lqilJi66axMk7IGV5fCBqGYwG0dbR4fbZR4lMybAZloYnp8823K/sXQT01fupB1HVU/n8P/UAQq0F\n Il7qaqkmiogk5feO3A==;","Date":"Mon, 13 Apr 2026 22:47:38 +0000","From":"\"Dr. David Alan Gilbert\" <dave@treblig.org>","To":"Daniel =?iso-8859-1?q?P=2E_Berrang=E9?= <berrange@redhat.com>","Cc":"qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,\n Markus Armbruster <armbru@redhat.com>,\n Christian Brauner <brauner@kernel.org>,\n Alex =?iso-8859-1?q?Benn=E9e?= <alex.bennee@linaro.org>, Philippe\n\t=?iso-8859-1?q?Mathieu-Daud=E9?= <philmd@linaro.org>,\n Fabiano Rosas <farosas@suse.de>,\n =?iso-8859-1?q?Marc-Andr=E9?= Lureau <marcandre.lureau@redhat.com>,\n Peter Xu <peterx@redhat.com>, Kevin Wolf <kwolf@redhat.com>,\n qemu-block@nongnu.org, Eric Blake <eblake@redhat.com>","Subject":"Re: [PATCH 16/17] monitor: eliminate monitor_is_hmp_non_interactive\n method","Message-ID":"<ad1yisSWpU2TZt5_@gallifrey>","References":"<20260410160458.3778874-1-berrange@redhat.com>\n <20260410160458.3778874-17-berrange@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260410160458.3778874-17-berrange@redhat.com>","X-Chocolate":"70 percent or better cocoa solids preferably","X-Operating-System":"Linux/6.12.74+deb13+1-amd64 (x86_64)","X-Uptime":"22:47:34 up 32 days, 0 min,  2 users,  load average: 0.00, 0.01,\n 0.00","User-Agent":"Mutt/2.2.13 (2024-03-09)","Received-SPF":"pass client-ip=2a00:1098:5b::1; envelope-from=dg@treblig.org;\n helo=mx.treblig.org","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]