Cover Letter Detail
Show a cover letter.
GET /api/1.0/covers/2221295/?format=api
{ "id": 2221295, "url": "http://patchwork.ozlabs.org/api/1.0/covers/2221295/?format=api", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.0/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": "" }, "msgid": "<20260409-work-qmp-monitor-hotplug-v4-0-89c4fdf69df1@kernel.org>", "date": "2026-04-09T07:18:17", "name": "[v4,0/5] monitor: add dynamic QMP monitor hotplug support", "submitter": { "id": 82326, "url": "http://patchwork.ozlabs.org/api/1.0/people/82326/?format=api", "name": "Christian Brauner", "email": "brauner@kernel.org" }, "series": [ { "id": 499242, "url": "http://patchwork.ozlabs.org/api/1.0/series/499242/?format=api", "date": "2026-04-09T07:18:17", "name": "monitor: add dynamic QMP monitor hotplug support", "version": 4, "mbox": "http://patchwork.ozlabs.org/series/499242/mbox/" } ], "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=PJSWR0za;\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 (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 4frrtH1CY9z1yJK\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 17:20:05 +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 1wAjf6-0007Ks-O8; Thu, 09 Apr 2026 03:18:48 -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 <brauner@kernel.org>)\n id 1wAjf3-0007KS-OE\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 03:18:45 -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 1wAjf1-0000Yj-GL\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 03:18:45 -0400", "from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n by tor.source.kernel.org (Postfix) with ESMTP id 70068600AD;\n Thu, 9 Apr 2026 07:18:32 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id E336CC4CEF7;\n Thu, 9 Apr 2026 07:18:29 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n s=k20201202; t=1775719112;\n bh=8Ti+PWIVHDcunJ1cTVo2D4I6xsYIaP1ZSB4RjxeRgU4=;\n h=From:Subject:Date:To:Cc:From;\n b=PJSWR0zaPpwoWtYsMxJlKJrf6rW/8USqOGU2Wz2qMqvnI4M2DXiD4NilMkje8dPrJ\n FqyUQzkcCByltRJSPuiAKggCF/RY/O8hcZBJDTAY6V4f/FxWuAg6XdBqLeGM+zSeTd\n GA3JurYy/vv3NOnYZb4ctgk9dhjvHkvUXodD0YKvMLS+j7l7x7TJn4abYtXWZ7utXs\n GSk4wYdaw5v+4Q3YUUFzACcF15K7uUtvei95OH9uH+34f7oMZVvdGBs7+rySaDR1lQ\n I24SYCInB6IORtOxmrydDWCeZ40nwrRvyzHDgQpMaskX4zmX91jVYCYIV5XAjDjLH9\n TXBD6vYLav4xw==", "From": "Christian Brauner <brauner@kernel.org>", "Subject": "[PATCH v4 0/5] monitor: add dynamic QMP monitor hotplug support", "Date": "Thu, 09 Apr 2026 09:18:17 +0200", "Message-Id": "<20260409-work-qmp-monitor-hotplug-v4-0-89c4fdf69df1@kernel.org>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "8bit", "X-B4-Tracking": "v=1; b=H4sIALlS12kC/43OyW7CMBAG4FdBPneQlziBnvoeqAcv48SF2MEOa\n SuUd8emF6pKqMd/lm/mSjImj5m8bq4k4eKzj6GE5mVDzKBCj+BtyYRT3tKGcviM6QjncYIxBj/\n HBEOcp9OlB6dVZ1q2Q2E1KetTQue/7vTh/Sfni/5AM1evTmiVEXRSwQy1NKo8Y6qNwecif9+fW\n lgF/nF/YUChFUwoaayVXfN2xBTwtI2pJ/WBhT9K8onEi6Ss1Ggt37NO/ZHEo9Q9kUSRjOZyv6P\n UOad/Seu63gAitP/agAEAAA==", "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=8600; i=brauner@kernel.org;\n h=from:subject:message-id; bh=8Ti+PWIVHDcunJ1cTVo2D4I6xsYIaP1ZSB4RjxeRgU4=;\n b=owGbwMvMwCU28Zj0gdSKO4sYT6slMWReDzr6/fvkP7aSvNfTvep0/816Hilwme/c9OSDubZvl\n WU+ye672FHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjARm3UMv9kyA9iVFs7dK7eo\n XNzZ8N2OGWKlfUxTXaYWmn5UYL1QdoKRodXTfr22jjKzpIJ/SqmU4vL3e3IDbvSu2ss1XexiMvd\n xFgA=", "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 field in Monitor) and the\ninfrastructure for safe per-monitor destruction without shutting down\nthe 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\n> meson test \"qtest-x86_64/qmp-test\" \"func-x86_64-monitor_hotplug\" -v\nninja: Entering directory `/home/brauner/src/git/qemu/build'\n[45/45] Linking target qemu-img\n1/2 qemu:func-quick+func-x86_64 / func-x86_64-monitor_hotplug RUNNING\n>>> QEMU_TEST_QEMU_IMG=/home/brauner/src/git/qemu/build/qemu-img ASAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MESON_BUILD_ROOT=/home/brauner/src/git/qemu/build LD_LIBRARY_PATH=/home/brauner/src/git/qemu/build/tests/tcg/plugins:/home/brauner/src/git/qemu/build/contrib/plugins:/home/brauner/src/go/deps/raft/.libs/:/home/brauner/src/go/deps/cowsql/.libs/ MALLOC_PERTURB_=165 PYTHONPATH=/home/brauner/src/git/qemu/python:/home/brauner/src/git/qemu/tests/functional QEMU_TEST_GDB=/usr/bin/gdb QEMU_TEST_QEMU_BINARY=/home/brauner/src/git/qemu/build/qemu-system-x86_64 MESON_TEST_ITERATION=1 UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 RUST_BACKTRACE=1 /home/brauner/src/git/qemu/build/pyvenv/bin/python3 /home/brauner/src/git/qemu/tests/functional/generic/test_monitor_hotplug.py\n2/2 qemu:qtest+qtest-x86_64 / qtest-x86_64/qmp-test RUNNING\n>>> ASAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1 MALLOC_PERTURB_=244 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 PYTHON=/home/brauner/src/git/qemu/build/pyvenv/bin/python3 QTEST_QEMU_STORAGE_DAEMON_BINARY=./storage-daemon/qemu-storage-daemon QTEST_QEMU_IMG=./qemu-img G_TEST_DBUS_DAEMON=/home/brauner/src/git/qemu/tests/dbus-vmstate-daemon.sh QTEST_QEMU_BINARY=./qemu-system-x86_64 MESON_TEST_ITERATION=1 UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 RUST_BACKTRACE=1 /home/brauner/src/git/qemu/build/tests/qtest/qmp-test --tap -k\n▶ 1/2 test_monitor_hotplug.MonitorHotplug.test_events_after_negotiation OK\n▶ 2/2 /x86_64/qmp/protocol OK\n▶ 1/2 test_monitor_hotplug.MonitorHotplug.test_hotplug_cycle OK\n▶ 1/2 test_monitor_hotplug.MonitorHotplug.test_large_response OK\n▶ 2/2 /x86_64/qmp/oob OK\n▶ 1/2 test_monitor_hotplug.MonitorHotplug.test_self_removal OK\n1/2 qemu:func-quick+func-x86_64 / func-x86_64-monitor_hotplug OK 0.30s 4 subtests passed\n\n▶ 2/2 /x86_64/qmp/preconfig OK\n▶ 2/2 /x86_64/qmp/missing-any-arg OK\n▶ 2/2 /x86_64/qmp/monitor-add-remove OK\n▶ 2/2 /x86_64/qmp/monitor-error-paths OK\n▶ 2/2 /x86_64/qmp/monitor-chardev-in-use OK\n▶ 2/2 /x86_64/qmp/monitor-remove-cli OK\n▶ 2/2 /x86_64/qmp/monitor-remove-hmp OK\n2/2 qemu:qtest+qtest-x86_64 / qtest-x86_64/qmp-test OK 1.09s 9 subtests passed\n\nOk: 2\nExpected Fail: 0\nFail: 0\nUnexpected Pass: 0\nSkipped: 0\nTimeout: 0\n\nSigned-off-by: Christian Brauner <brauner@kernel.org>\n---\nChanges in v4:\n- Move 'dead' field from patch 1 to patch 2 where it is first used.\n- Allow removal of any QMP monitor, drop the 'dynamic' gate in\n qmp_monitor_remove(). Drop the 'dynamic' field from struct Monitor\n and from MonitorInfo entirely since it no longer serves a purpose.\n- Auto-generate monitor ids (\"mon0\", \"mon1\", ...) for QMP monitors\n created via CLI without an explicit id, so every QMP monitor is\n addressable by monitor-remove and always appears with an id in\n query-monitors output.\n- Change Since: 11.0 to Since: 11.1 throughout the QAPI schema.\n- Drop \"GenericError\" from QAPI error descriptions.\n- Update monitor-remove QAPI doc to reflect that any QMP monitor can\n be removed, not just dynamically added ones.\n- Update qtest: test_qmp_monitor_remove_cli now expects success\n instead of error.\n- Link to v3: https://patch.msgid.link/20260407-work-qmp-monitor-hotplug-v3-0-cb259800fffb@kernel.org\n\nChanges in v3:\n- Use SPDX license identifier in functional test.\n- Use framework's socket_dir() helper instead of manual tempfile\n handling for socket paths in the functional test, drop tearDown().\n- Tighten struct field comments in monitor-internal.h.\n- Wrap long qtest_add_func() registration line.\n- Link to v2: https://patch.msgid.link/20260405-work-qmp-monitor-hotplug-v2-0-ad5bedd2917a@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 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 | 10 ++\n monitor/monitor.c | 70 ++++++--\n monitor/qmp-cmds-control.c | 105 ++++++++++++\n monitor/qmp.c | 81 +++++++++-\n qapi/control.json | 97 ++++++++++++\n tests/functional/generic/meson.build | 1 +\n tests/functional/generic/test_monitor_hotplug.py | 170 ++++++++++++++++++++\n tests/qtest/qmp-test.c | 193 +++++++++++++++++++++++\n 9 files changed, 714 insertions(+), 16 deletions(-)\n---\nbase-commit: 6d3e9dddefdd2e8e6a4942ba9399df0e47df21ed\nchange-id: 20260402-work-qmp-monitor-hotplug-fba7c618e3db" }