From: "Daniel P. Berrangé" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Dr. David Alan Gilbert" <dave@treblig.org>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Christian Brauner" <brauner@kernel.org>,
devel@lists.libvirt.org, "Markus Armbruster" <armbru@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@mailo.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Daniel P. Berrangé" <berrange@redhat.com>
Subject: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Date: Tue, 23 Jun 2026 10:55:16 +0100 [thread overview]
Message-ID: <20260623095551.2106712-1-berrange@redhat.com> (raw)
Conceptually -object and object_add/object_del should be sufficient
for essentially all QEMU configuration....if only we ported all our
internal custom backends/devices/etc to QOM. That is of course a big
job which is why it hasn't happened.
This series started with the premise that the monitor is one of the
easier areas to convert since we have no more than three classes,
a common base, and QMP and HMP subclasses[1]. So why not give it a
go and thus unlock the ability to dynamically create/delete monitors
in QMP/HMP.
This series does the conversion in a great many small steps to better
understand the implications at each stage.
The high level outcome of this series is
* HMP and QMP monitors are QOM objects, 'monitor-hmp' and
'monitor-qmp' respectively
* Both can be cold plugged and hot plugged. QMP only, can
also be hot unplugged.
* '-mon' is obsolete, deprecated and replaced by '-object',
but -monitor, -qmp and kept as high level syntax sugar
* QMP gains a concept of "close-action" which makes it
possible to mark a monitor for auto-delete.
The monitor hot-unplug code and the qtest and functional testing
code is heavily derived from a series sent by Christian Brauner
which proposed new monitor_add/monitor_del commands:
https://lists.nongnu.org/archive/html/qemu-devel/2026-04/msg01349.html
I left Christian's authorship & SoB on the patches which were
derived from his code, though the code has been refactored quite
a bit in places, so bugs are quite possibly my own.
Note that Christian's series allowed the use of "monitor_del"
commands against the current monitor session. ie a client could
delete the very monitor it was using. This is an awkward concept
as it needs special casing to delay the deletion to happen in
the background, such that that the QMP response to 'monitor_del'
could still be sent back. This also left the chardev was orphaned
as there's no way to run 'chardev_dev' in that usage pattern.
To provide an alternative mechanism to address the same use case,
this series introduces the 'close-action' concept mentioned above,
that allows hotplugging a monitor to service a specific task,
with the monitor being purged when the script closes its connection.
This avoids the special casing that an explicit "self deletion"
paradigm required.
While supporting hotplug of HMP was trivial, I didn't do any work
to think about hotunplug of HMP, since IMHO it is of limited value
given HMP's typical use cases.
[1] ~~~ we did all this not because it was easy,
but because we thought it would be easy ~~~
Changed in v4:
- Hold reference into BH to avoid race with auto-delete
Changed in v3:
- Removed unused 'dead' struct field
- Make use of 'setup_pending' struct field across BH
- Add missing free of chardev_id
- Add missnig ERRP_GUARD in monitor_new_qmp
- Misc docs typos / rephrasing
- Moved docs patch to the end
- Fixed docs about the default QOM ID naming for legacy
monitor syntax
- Fixed random sleep time calculation in tests
Christian Brauner (6):
monitor: convert from oneshot BH to persistent BH
monitor: reject attempts to delete the current monitor
monitor: protect qemu_chr_fe_accept_input with monitor lock
monitor: implement support for deleting QMP objects
tests/qtest: add tests for dynamic monitor add/remove
tests/functional: add e2e test for dynamic QMP monitor hotplug
Daniel P. Berrangé (29):
qom: replace 'can_be_deleted' with 'prepare_delete'
monitor: replace 'common' with 'parent_obj' in MonitorHMP
monitor: replace 'common' with 'parent_obj' in MonitorQMP
monitor: rename monitor_init* to monitor_new*
monitor: minimal conversion of monitors to QOM
monitor: add 'chardev' property to Monitor base class
monitor: add 'readline' property to HMP Monitor class
monitor: add 'pretty' property to QMP Monitor class
monitor: remove 'skip_flush' field
monitor: move monitor_data_(init|destroy) into QOM init/finalize
monitor: use class methods for monitor_vprintf
monitor: use class methods for monitor_qapi_event_emit
monitor: use class methods for monitor_accept_input
monitor: use class method for I/O thread request
monitor: use dynamic cast in monitor_qmp_requests_pop_any_with_lock
util: use dynamic cast in error vreport
monitor: drop unused monitor_cur_is_qmp
monitor: use dynamic cast in QMP commands
monitor: use dynamic cast in monitor_is_hmp_non_interactive
monitor: drop unused monitor_is_qmp method
monitor: eliminate monitor_is_hmp_non_interactive method
monitor: implement "user creatable" interface for adding monitors
tests/functional: add a stress test for monitor hot unplug
qom: add method for getting the "id" of a QOM object
qom: add trace events for user creatable create/delete APIs
monitor: add support for auto-deleting monitors upon close
tests: switch from -mon to -object monitor-qmp
qemu-options: document new monitor-hmp and monitor-qmp objects
docs: mark '-mon' as deprecated in favour of -object
MAINTAINERS | 1 +
backends/cryptodev.c | 10 +-
backends/hostmem.c | 5 +-
backends/iommufd.c | 10 +-
block/throttle-groups.c | 10 +-
chardev/char.c | 3 +-
docs/about/deprecated.rst | 10 +
docs/devel/writing-monitor-commands.rst | 4 +-
docs/system/arm/xenpvh.rst | 4 +-
docs/system/i386/xen.rst | 3 +-
docs/system/i386/xenpvh.rst | 4 +-
event-loop-base.c | 8 +-
gdbstub/system.c | 4 +-
include/monitor/monitor.h | 23 +-
include/qom/object.h | 10 +
include/qom/object_interfaces.h | 26 +-
include/system/event-loop-base.h | 2 +-
migration/migration-hmp-cmds.c | 5 +-
monitor/hmp-cmds.c | 7 +-
monitor/hmp.c | 181 ++++++++--
monitor/monitor-internal.h | 73 ++--
monitor/monitor.c | 262 ++++++++-------
monitor/qmp-cmds-control.c | 12 +-
monitor/qmp-cmds.c | 14 +-
monitor/qmp.c | 312 +++++++++++++++---
net/can/can_core.c | 5 +-
python/qemu/machine/machine.py | 4 +-
qapi/qom.json | 62 ++++
qemu-options.hx | 57 +++-
qom/object.c | 17 +
qom/object_interfaces.c | 20 +-
qom/trace-events | 5 +
storage-daemon/qemu-storage-daemon.c | 2 +-
stubs/monitor-core.c | 5 -
stubs/monitor-internal.c | 3 +-
system/vl.c | 12 +-
tests/functional/generic/meson.build | 1 +
.../generic/test_monitor_hotplug.py | 277 ++++++++++++++++
tests/qemu-iotests/245 | 4 +-
tests/qtest/libqtest.c | 2 +-
tests/qtest/qmp-test.c | 174 ++++++++++
tests/unit/test-util-sockets.c | 1 -
tools/qemu-vnc/stubs.c | 5 -
ui/ui-hmp-cmds.c | 2 +-
util/error-report.c | 13 +-
util/main-loop.c | 5 +-
46 files changed, 1352 insertions(+), 327 deletions(-)
create mode 100755 tests/functional/generic/test_monitor_hotplug.py
--
2.54.0
next reply other threads:[~2026-06-23 9:57 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-23 9:55 Daniel P. Berrangé [this message]
2026-06-23 9:55 ` [PATCH v4 01/35] qom: replace 'can_be_deleted' with 'prepare_delete' Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 02/35] monitor: replace 'common' with 'parent_obj' in MonitorHMP Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 03/35] monitor: replace 'common' with 'parent_obj' in MonitorQMP Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 04/35] monitor: rename monitor_init* to monitor_new* Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 05/35] monitor: minimal conversion of monitors to QOM Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 06/35] monitor: add 'chardev' property to Monitor base class Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 07/35] monitor: add 'readline' property to HMP Monitor class Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 08/35] monitor: add 'pretty' property to QMP " Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 09/35] monitor: remove 'skip_flush' field Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 10/35] monitor: move monitor_data_(init|destroy) into QOM init/finalize Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 11/35] monitor: use class methods for monitor_vprintf Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 12/35] monitor: use class methods for monitor_qapi_event_emit Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 13/35] monitor: use class methods for monitor_accept_input Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 14/35] monitor: use class method for I/O thread request Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 15/35] monitor: use dynamic cast in monitor_qmp_requests_pop_any_with_lock Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 16/35] util: use dynamic cast in error vreport Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 17/35] monitor: drop unused monitor_cur_is_qmp Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 18/35] monitor: use dynamic cast in QMP commands Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 19/35] monitor: use dynamic cast in monitor_is_hmp_non_interactive Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 20/35] monitor: drop unused monitor_is_qmp method Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 21/35] monitor: eliminate monitor_is_hmp_non_interactive method Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 22/35] monitor: implement "user creatable" interface for adding monitors Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 23/35] monitor: convert from oneshot BH to persistent BH Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 24/35] monitor: reject attempts to delete the current monitor Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 25/35] monitor: protect qemu_chr_fe_accept_input with monitor lock Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 26/35] monitor: implement support for deleting QMP objects Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 27/35] tests/qtest: add tests for dynamic monitor add/remove Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 28/35] tests/functional: add e2e test for dynamic QMP monitor hotplug Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 29/35] tests/functional: add a stress test for monitor hot unplug Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 30/35] qom: add method for getting the "id" of a QOM object Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 31/35] qom: add trace events for user creatable create/delete APIs Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 32/35] monitor: add support for auto-deleting monitors upon close Daniel P. Berrangé
2026-06-23 11:53 ` marcandre.lureau
2026-06-23 11:55 ` Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 33/35] tests: switch from -mon to -object monitor-qmp Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 34/35] qemu-options: document new monitor-hmp and monitor-qmp objects Daniel P. Berrangé
2026-06-23 9:55 ` [PATCH v4 35/35] docs: mark '-mon' as deprecated in favour of -object Daniel P. Berrangé
2026-06-23 11:03 ` [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects Peter Krempa
2026-06-23 11:07 ` Peter Krempa
2026-06-23 11:38 ` Daniel P. Berrangé
2026-06-23 11:52 ` Daniel P. Berrangé
2026-06-23 11:54 ` Marc-André Lureau
2026-06-23 12:01 ` Daniel P. Berrangé
2026-06-23 12:18 ` Peter Krempa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260623095551.2106712-1-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=brauner@kernel.org \
--cc=dave@treblig.org \
--cc=devel@lists.libvirt.org \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@mailo.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.