{"id":2219330,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2219330/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260402-work-qmp-monitor-hotplug-v1-1-6313a5cdd574@kernel.org>","date":"2026-04-02T21:19:16","name":"[1/5] monitor: store monitor id and dynamic flag in Monitor struct","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"8488c11a38ae9f06ac870229a61e161c3be3a3c7","submitter":{"id":82326,"url":"http://patchwork.ozlabs.org/api/1.0/people/82326/?format=json","name":"Christian Brauner","email":"brauner@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260402-work-qmp-monitor-hotplug-v1-1-6313a5cdd574@kernel.org/mbox/","series":[{"id":498554,"url":"http://patchwork.ozlabs.org/api/1.0/series/498554/?format=json","date":"2026-04-02T21:19:15","name":"monitor: add dynamic QMP monitor hotplug support","version":1,"mbox":"http://patchwork.ozlabs.org/series/498554/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2219330/checks/","tags":{},"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=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=TkdNgeJS;\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=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists.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 4fmvry2HW3z1yCs\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 08:20:16 +1100 (AEDT)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w8PS5-0003kH-NY; Thu, 02 Apr 2026 17:19:45 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <brauner@kernel.org>)\n id 1w8PS4-0003k0-FC\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:19:44 -0400","from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <brauner@kernel.org>)\n id 1w8PS2-0004an-Ne\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:19:44 -0400","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n by sea.source.kernel.org (Postfix) with ESMTP id E167F4084D;\n Thu,  2 Apr 2026 21:19:32 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 94BADC19424;\n Thu,  2 Apr 2026 21:19:30 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n s=k20201202; t=1775164772;\n bh=ieDCuJn1WMUVM16tnw255pab6Dta4Qq851/s71lqv+w=;\n h=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n b=TkdNgeJSUvsdY4wPbjLkkppe/fghaLg5v4a7/Qjm3eWTZD4JTJ3pxYJd+mPPXUgIs\n LwdqeSMhlVr04VmQbFqvDPRjlLlzte7cR/9kp0Mo84oR9/d6X2Q7ybg9xziAX2czeT\n i71gwMLT6KrdPl9eTfgMaZgs1slRg7rozzwIa7ei+BoYILND3SE82ATEy770+HyUUm\n 0GMV5dMshFzVShH+qtxeiGmmgxW0w73QGMLD0Lcz8isSOaCqKNOSfjeM0ipotf4kWx\n fv43F/XfR6EsU8TRI+0U+J7OGLMFfYcjuRDwWdNYQ7TBvMEKKd1VJF6cNEx62YBhvg\n A+YgEIx9QdWaw==","From":"Christian Brauner <brauner@kernel.org>","Date":"Thu, 02 Apr 2026 23:19:16 +0200","Subject":"[PATCH 1/5] monitor: store monitor id and dynamic flag in Monitor\n struct","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260402-work-qmp-monitor-hotplug-v1-1-6313a5cdd574@kernel.org>","References":"<20260402-work-qmp-monitor-hotplug-v1-0-6313a5cdd574@kernel.org>","In-Reply-To":"<20260402-work-qmp-monitor-hotplug-v1-0-6313a5cdd574@kernel.org>","To":"qemu-devel@nongnu.org","Cc":"Markus Armbruster <armbru@redhat.com>, Eric Blake <eblake@redhat.com>,\n  Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>,\n  Paolo Bonzini <pbonzini@redhat.com>, Thomas Huth <th.huth+qemu@posteo.eu>,\n\t=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>, =?utf-8?q?Dani?=\n\t=?utf-8?q?el_P=2E_Berrang=C3=A9?= <berrange@redhat.com>,\n  Christian Brauner <brauner@kernel.org>","X-Mailer":"b4 0.16-dev","X-Developer-Signature":"v=1; a=openpgp-sha256; l=4689; i=brauner@kernel.org;\n h=from:subject:message-id; bh=ieDCuJn1WMUVM16tnw255pab6Dta4Qq851/s71lqv+w=;\n b=owGbwMvMwCU28Zj0gdSKO4sYT6slMWSeuxu/WeyRxvau3op1t0xbqw/zf5qbJyzxwO166IGO2\n ftmC11d2lHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCRZ1mMDEs4pFt/3jn8d9IW\n LaejU7T77W+UBv+RNVE4+XmCzs4swcOMDM8jp6WYlsYv/q8oL6pzkf9B87NL/gc51JKk6n7IdC3\n NZwYA","X-Developer-Key":"i=brauner@kernel.org; a=openpgp;\n fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624","Received-SPF":"pass client-ip=2600:3c0a:e001:78e:0:1991:8:25;\n envelope-from=brauner@kernel.org; helo=sea.source.kernel.org","X-Spam_score_int":"-25","X-Spam_score":"-2.6","X-Spam_bar":"--","X-Spam_report":"(-2.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.542,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n SPF_HELO_NONE=0.001, 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"},"content":"Add 'id', 'dynamic', and 'dead' fields to struct Monitor. The id field\nstores the monitor identifier from MonitorOptions which was previously\nparsed but discarded. The dynamic flag marks monitors created at runtime\nvia the upcoming monitor-add command, and the dead flag will be used for\ndeferred destruction during monitor-remove.\n\nExtend monitor_init_qmp() to accept id and dynamic parameters so these\nare set before the monitor is added to mon_list -- this is important for\nthe BH/iothread path where the monitor becomes visible asynchronously.\n\nAdd monitor_find_by_id() to look up monitors by identifier, and free the\nid string in monitor_data_destroy().\n\nSigned-off-by: Christian Brauner (Amutable) <brauner@kernel.org>\n---\n include/monitor/monitor.h  |  3 ++-\n monitor/monitor-internal.h |  5 +++++\n monitor/monitor.c          | 15 ++++++++++++++-\n monitor/qmp.c              |  5 ++++-\n 4 files changed, 25 insertions(+), 3 deletions(-)","diff":"diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h\nindex 296690e1f1..7a2bb603e4 100644\n--- a/include/monitor/monitor.h\n+++ b/include/monitor/monitor.h\n@@ -19,7 +19,8 @@ bool monitor_cur_is_qmp(void);\n \n void monitor_init_globals(void);\n void monitor_init_globals_core(void);\n-void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp);\n+void monitor_init_qmp(Chardev *chr, bool pretty, const char *id,\n+                      bool dynamic, Error **errp);\n void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp);\n int monitor_init(MonitorOptions *opts, bool allow_hmp, Error **errp);\n int monitor_init_opts(QemuOpts *opts, Error **errp);\ndiff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h\nindex feca111ae3..8f5fe7c111 100644\n--- a/monitor/monitor-internal.h\n+++ b/monitor/monitor-internal.h\n@@ -98,7 +98,10 @@ struct Monitor {\n     bool is_qmp;\n     bool skip_flush;\n     bool use_io_thread;\n+    bool dynamic;               /* true if created via monitor-add */\n+    bool dead;                  /* true if monitor-remove called, awaiting drain */\n \n+    char *id;                   /* Monitor identifier (NULL for unnamed CLI monitors) */\n     char *mon_cpu_path;\n     QTAILQ_ENTRY(Monitor) entry;\n \n@@ -181,6 +184,8 @@ void monitor_data_destroy_qmp(MonitorQMP *mon);\n void coroutine_fn monitor_qmp_dispatcher_co(void *data);\n void qmp_dispatcher_co_wake(void);\n \n+Monitor *monitor_find_by_id(const char *id);\n+\n int get_monitor_def(Monitor *mon, int64_t *pval, const char *name);\n void handle_hmp_command(MonitorHMP *mon, const char *cmdline);\n int hmp_compare_cmd(const char *name, const char *list);\ndiff --git a/monitor/monitor.c b/monitor/monitor.c\nindex 00b93ed612..09e32b6364 100644\n--- a/monitor/monitor.c\n+++ b/monitor/monitor.c\n@@ -622,6 +622,7 @@ void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush,\n \n void monitor_data_destroy(Monitor *mon)\n {\n+    g_free(mon->id);\n     g_free(mon->mon_cpu_path);\n     qemu_chr_fe_deinit(&mon->chr, false);\n     if (monitor_is_qmp(mon)) {\n@@ -633,6 +634,18 @@ void monitor_data_destroy(Monitor *mon)\n     qemu_mutex_destroy(&mon->mon_lock);\n }\n \n+Monitor *monitor_find_by_id(const char *id)\n+{\n+    Monitor *mon;\n+\n+    QTAILQ_FOREACH(mon, &mon_list, entry) {\n+        if (mon->id && strcmp(mon->id, id) == 0) {\n+            return mon;\n+        }\n+    }\n+    return NULL;\n+}\n+\n void monitor_cleanup(void)\n {\n     /*\n@@ -732,7 +745,7 @@ int monitor_init(MonitorOptions *opts, bool allow_hmp, Error **errp)\n \n     switch (opts->mode) {\n     case MONITOR_MODE_CONTROL:\n-        monitor_init_qmp(chr, opts->pretty, errp);\n+        monitor_init_qmp(chr, opts->pretty, opts->id, false, errp);\n         break;\n     case MONITOR_MODE_READLINE:\n         if (!allow_hmp) {\ndiff --git a/monitor/qmp.c b/monitor/qmp.c\nindex 687019811f..5fbc7af074 100644\n--- a/monitor/qmp.c\n+++ b/monitor/qmp.c\n@@ -513,7 +513,8 @@ static void monitor_qmp_setup_handlers_bh(void *opaque)\n     monitor_list_append(&mon->common);\n }\n \n-void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)\n+void monitor_init_qmp(Chardev *chr, bool pretty, const char *id,\n+                      bool dynamic, Error **errp)\n {\n     MonitorQMP *mon = g_new0(MonitorQMP, 1);\n \n@@ -527,6 +528,8 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)\n     monitor_data_init(&mon->common, true, false,\n                       qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT));\n \n+    mon->common.id = g_strdup(id);\n+    mon->common.dynamic = dynamic;\n     mon->pretty = pretty;\n \n     qemu_mutex_init(&mon->qmp_queue_lock);\n","prefixes":["1/5"]}