Cover Letter Detail
Show a cover letter.
GET /api/1.2/covers/2219975/?format=api
{ "id": 2219975, "url": "http://patchwork.ozlabs.org/api/1.2/covers/2219975/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260405-work-qmp-monitor-hotplug-v2-0-ad5bedd2917a@kernel.org/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.2/projects/14/?format=api", "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": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260405-work-qmp-monitor-hotplug-v2-0-ad5bedd2917a@kernel.org>", "list_archive_url": null, "date": "2026-04-05T13:11:16", "name": "[v2,0/5] monitor: add dynamic QMP monitor hotplug support", "submitter": { "id": 82326, "url": "http://patchwork.ozlabs.org/api/1.2/people/82326/?format=api", "name": "Christian Brauner", "email": "brauner@kernel.org" }, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260405-work-qmp-monitor-hotplug-v2-0-ad5bedd2917a@kernel.org/mbox/", "series": [ { "id": 498784, "url": "http://patchwork.ozlabs.org/api/1.2/series/498784/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=498784", "date": "2026-04-05T13:11:16", "name": "monitor: add dynamic QMP monitor hotplug support", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/498784/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/covers/2219975/comments/", "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=Xw/tVr9s;\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 4fpXtP3pgSz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 05 Apr 2026 23:12:13 +1000 (AEST)", "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 1w9NGR-0006VQ-Bg; Sun, 05 Apr 2026 09:11:43 -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 1w9NGK-0006Tn-Pd\n for qemu-devel@nongnu.org; Sun, 05 Apr 2026 09:11:37 -0400", "from tor.source.kernel.org ([2600:3c04:e001:324: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 1w9NGI-0006cW-SZ\n for qemu-devel@nongnu.org; Sun, 05 Apr 2026 09:11:36 -0400", "from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n by tor.source.kernel.org (Postfix) with ESMTP id 351256001A;\n Sun, 5 Apr 2026 13:11:33 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id 935D9C116C6;\n Sun, 5 Apr 2026 13:11:30 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n s=k20201202; t=1775394692;\n bh=Mv1cwnfF+cb83p3K4P7Z7Twk5nRgBI0T46wsJ+2+Z3c=;\n h=From:Subject:Date:To:Cc:From;\n b=Xw/tVr9sZktgI3/Aw6c49UVnA6V9E8NrwSz6ZOgUa9KVO2DR7m/mxIkOB2an8Yn8J\n yQUqpRgGxXBCPFj4euDpcV4GCG3iJpISJmNku0glx9oEtkOAA4QwR357948C9mI3wp\n TkgL5uRZUPSWGXkQBqKorGlLfW4SKrlubRx7IauAoNOoJWHK23RjtdEwhRd9LZ7ECj\n M57N+JaeSPbCCBU9ktUg8HdTb+jwqPgEWl1mADChhYeax4EEbFQpJ31qW9hjz2B6Ao\n KqUM4SllwU09LRWOKGbG9tfZTqZc3GO37M+4hBTIbpwCDGrj2sz/+qIh20dH8DsKhP\n DovYagXcarRRg==", "From": "Christian Brauner <brauner@kernel.org>", "Subject": "[PATCH v2 0/5] monitor: add dynamic QMP monitor hotplug support", "Date": "Sun, 05 Apr 2026 15:11:16 +0200", "Message-Id": "<20260405-work-qmp-monitor-hotplug-v2-0-ad5bedd2917a@kernel.org>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "X-B4-Tracking": "v=1; b=H4sIAHRf0mkC/42OyxKCMAxFf4Xp2ji8cVz5Hw6LPgJUoMUUUIfh3\n 23xB1yem+TcbMwhaXTsGm2McNVOW+MhPUVMdty0CFp5ZmmclnEep/Cy1MNznGC0Rs+WoLPzNCw\n tNIJXskwumCnB/PlE2Oj3ob7XP3aLeKCcgy9sCO4QBHEjuxCN3M1IYdBp582f46k1CYI/+tcEY\n iizJOOFVKqo8luPZHA4W2pZve/7F2Pj4pDsAAAA", "X-Change-ID": "20260402-work-qmp-monitor-hotplug-fba7c618e3db", "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=4078; i=brauner@kernel.org;\n h=from:subject:message-id; bh=Mv1cwnfF+cb83p3K4P7Z7Twk5nRgBI0T46wsJ+2+Z3c=;\n b=owGbwMvMwCU28Zj0gdSKO4sYT6slMWReiq974Bz2KO6ZyOHmN4LGkz4l5qhxXuJhXP753Y64U\n 7/mJTgkd5SyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAEzk0XmG/44TlX/u9LPI7Lat\n 9G+44vv41HKhl4duycw52L1dKIDHwI7hn4numi9nZltPPSHvkn/4qM3EnG03m5yMRNos2LIcj09\n 5xAcA", "X-Developer-Key": "i=brauner@kernel.org; a=openpgp;\n fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624", "Received-SPF": "pass client-ip=2600:3c04:e001:324:0:1991:8:25;\n envelope-from=brauner@kernel.org; helo=tor.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.54,\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": "QEMU supports runtime hotplug for chardevs, devices, block backends,\nand netdevs. Monitors are the only major subsystem that lacks this --\nall QMP monitors must be configured at launch via -mon or -qmp CLI\noptions.\n\nThis series adds monitor-add, monitor-remove, and query-monitors QMP\ncommands so that management tools can create independent QMP sessions\non demand at runtime.\n\nI've implemented a QMP-to-Varlink bridge in systemd. This allows\nsystemd-vmspawn to control virtual machines and containers through a\nunified Varlink interface. Varlink allows protocol upgrades. For\nexample, it is possible to switch from Varlink to say http. I'm\nallowing Varlink clients to upgrade from the Varlink interface to the\nnative QMP interface. Such clients get a new monitor assigned that\nallows them to manage the virtual machine directly via QMP. The main\nmonitor remains unaffected and tied to the generic Varlink interface. We\ncan't pre-allocate monitors as we have no control over how many protocol\nupgrades we actually get but it won't just be one. And having unused\nmonitors around really isn't ideal either.\n\nHaving the ability to hotplug monitors would really be helpful. I'm not\nyet super well-versed in qemu internals so this might be done wrong but\ntesting works so far.\n\nMy systemd patch that triggered this is at\nhttps://github.com/systemd/systemd/pull/41449.\n\nThe usage pattern mirrors chardev hotplug:\n\n -> chardev-add id=qmp-extra backend=socket,...\n -> monitor-add id=extra-qmp chardev=qmp-extra\n [client connects to socket, gets QMP greeting, negotiates, sends commands]\n -> monitor-remove id=extra-qmp\n -> chardev-remove id=qmp-extra\n\nPatches 1-2 add the data model (id/dynamic/dead fields in Monitor) and\nthe infrastructure for safe per-monitor destruction without shutting\ndown the shared dispatcher coroutine.\n\nPatch 3 adds the QAPI schema and command handlers.\n\nPatches 4-5 add qtest unit tests and a functional e2e test that\nperforms a full hotplug -> connect -> handshake -> unplug cycle.\n\nSigned-off-by: Christian Brauner <brauner@kernel.org>\n---\nChanges in v2:\n- Fix use-after-free in self-removal path: skip monitor_resume() when\n the monitor is dead to avoid scheduling a BH against a monitor that\n is about to be freed by monitor_qmp_destroy().\n- Hold monitor_lock in monitor_find_by_id() to prevent races with\n the I/O thread BH that appends to mon_list.\n- Deduplicate monitor-remove commit message: trim the gcontext/out_watch\n explanation that repeated the infrastructure commit, reference\n monitor_cancel_out_watch() instead.\n- Add missing test descriptions to patch 4 (chardev-in-use, CLI monitor\n rejection, HMP monitor rejection) and patch 5 (self-removal, large\n response, events).\n- Fix cover letter wording.\n- Link to v1: https://patch.msgid.link/20260402-work-qmp-monitor-hotplug-v1-0-6313a5cdd574@kernel.org\n\n---\nChristian Brauner (5):\n monitor: store monitor id and dynamic flag in Monitor struct\n monitor/qmp: add infrastructure for safe dynamic monitor removal\n qapi: add monitor-add, monitor-remove, query-monitors commands\n tests/qtest: add tests for dynamic monitor add/remove\n tests/functional: add e2e test for dynamic QMP monitor hotplug\n\n include/monitor/monitor.h | 3 +-\n monitor/monitor-internal.h | 11 ++\n monitor/monitor.c | 70 +++++++--\n monitor/qmp-cmds-control.c | 111 ++++++++++++++\n monitor/qmp.c | 77 +++++++++-\n qapi/control.json | 104 +++++++++++++\n tests/functional/generic/meson.build | 1 +\n tests/functional/generic/test_monitor_hotplug.py | 183 ++++++++++++++++++++++\n tests/qtest/qmp-test.c | 185 +++++++++++++++++++++++\n 9 files changed, 729 insertions(+), 16 deletions(-)\n---\nbase-commit: b6a7d06213e5d2f7d124d16418bc289c4a8a4b82\nchange-id: 20260402-work-qmp-monitor-hotplug-fba7c618e3db" }