[PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects

Daniel P. Berrangé posted 35 patches 1 day, 10 hours ago
Failed in applying to current master (apply log)
There is a newer version of this series
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
[PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Daniel P. Berrangé 1 day, 10 hours ago
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


Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Peter Krempa 1 day, 9 hours ago
On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> 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

I was giving this a spin by implementing libvirt support for it. The
basic usage seems to work well but I've encoutered a regression in
behaviour which happens both when the QMP monitor is instantiated using
the new syntax but also the old one
( -mon chardev=charmonitor,id=monitor,mode=control)

When libvirt wants to re-connect to a qemu running with these patches it
re-issues a 'qmp_capabilities' command after connecting.

With these patches qemu does not respond to that command even when the
old syntax is used. This makes libvirt stuck when re-connecting to VMs.

The log on libvirt's side is not very interesting:

2026-06-23 11:00:11.229+0000: 529808: debug : virSecuritySELinuxSetDaemonSocketLabel:3190 : Setting VM ha socket context unconfined_u:unconfined_r:unconfined_t:s0:c677,c680
2026-06-23 11:00:11.229+0000: 529807: info : qemuMonitorOpenInternal:608 : QEMU_MONITOR_NEW: mon=0x7fff94001b80 fd=35
2026-06-23 11:00:11.229+0000: 529807: debug : qemuDomainObjEnterMonitorInternal:5165 : Entering monitor (mon=0x7fff94001b80 vm=0x7fffac185b60 name=cd)
2026-06-23 11:00:11.229+0000: 529807: debug : qemuMonitorSetCapabilities:1437 : mon:0x7fff94001b80 vm:0x7fffac185b60 monfd:35
2026-06-23 11:00:11.229+0000: 529807: info : qemuMonitorSend:822 : QEMU_MONITOR_SEND_MSG: mon=0x7fff94001b80 msg={"execute":"qmp_capabilities","id":"libvirt-1"}^M

as nothing else ever comes from monitor 0x7fff94001b80
Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Daniel P. Berrangé 1 day, 8 hours ago
On Tue, Jun 23, 2026 at 01:03:46PM +0200, Peter Krempa wrote:
> On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > 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
> 
> I was giving this a spin by implementing libvirt support for it. The
> basic usage seems to work well but I've encoutered a regression in
> behaviour which happens both when the QMP monitor is instantiated using
> the new syntax but also the old one
> ( -mon chardev=charmonitor,id=monitor,mode=control)
> 
> When libvirt wants to re-connect to a qemu running with these patches it
> re-issues a 'qmp_capabilities' command after connecting.
> 
> With these patches qemu does not respond to that command even when the
> old syntax is used. This makes libvirt stuck when re-connecting to VMs.

Oh that's odd, thanks for the warning. I'll investigate this.


With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Daniel P. Berrangé 1 day, 8 hours ago
On Tue, Jun 23, 2026 at 12:38:10PM +0100, Daniel P. Berrangé wrote:
> On Tue, Jun 23, 2026 at 01:03:46PM +0200, Peter Krempa wrote:
> > On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > > 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
> > 
> > I was giving this a spin by implementing libvirt support for it. The
> > basic usage seems to work well but I've encoutered a regression in
> > behaviour which happens both when the QMP monitor is instantiated using
> > the new syntax but also the old one
> > ( -mon chardev=charmonitor,id=monitor,mode=control)
> > 
> > When libvirt wants to re-connect to a qemu running with these patches it
> > re-issues a 'qmp_capabilities' command after connecting.
> > 
> > With these patches qemu does not respond to that command even when the
> > old syntax is used. This makes libvirt stuck when re-connecting to VMs.
> 
> Oh that's odd, thanks for the warning. I'll investigate this.

/face-palm - a misplaced a line in the auto-delete code, and did not
have test coverage of re-opening a monitor. Try testing libvirt with
this additional change on top

diff --git a/monitor/qmp.c b/monitor/qmp.c
index f6b7fe65bb..10d651ca5c 100644
--- a/monitor/qmp.c
+++ b/monitor/qmp.c
@@ -613,7 +613,6 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
         qobject_unref(data);
         break;
     case CHR_EVENT_CLOSED:
-        mon->delete_pending = true;
         /*
          * Note: this is only useful when the output of the chardev
          * backend is still open.  For example, when the backend is
@@ -629,6 +628,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
         case MONITOR_QMP_CLOSE_ACTION_NONE:
             break; /* nada */
         case MONITOR_QMP_CLOSE_ACTION_DELETE:
+            mon->delete_pending = true;
             /*
              * Do NOT run in the AIO context associated with the
              * monitor. We need to run in the default AIO context


With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Peter Krempa 1 day, 8 hours ago
On Tue, Jun 23, 2026 at 12:52:53 +0100, Daniel P. Berrangé wrote:
> On Tue, Jun 23, 2026 at 12:38:10PM +0100, Daniel P. Berrangé wrote:
> > On Tue, Jun 23, 2026 at 01:03:46PM +0200, Peter Krempa wrote:
> > > On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > > > 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
> > > 
> > > I was giving this a spin by implementing libvirt support for it. The
> > > basic usage seems to work well but I've encoutered a regression in
> > > behaviour which happens both when the QMP monitor is instantiated using
> > > the new syntax but also the old one
> > > ( -mon chardev=charmonitor,id=monitor,mode=control)
> > > 
> > > When libvirt wants to re-connect to a qemu running with these patches it
> > > re-issues a 'qmp_capabilities' command after connecting.
> > > 
> > > With these patches qemu does not respond to that command even when the
> > > old syntax is used. This makes libvirt stuck when re-connecting to VMs.
> > 
> > Oh that's odd, thanks for the warning. I'll investigate this.
> 
> /face-palm - a misplaced a line in the auto-delete code, and did not
> have test coverage of re-opening a monitor. Try testing libvirt with
> this additional change on top
> 
> diff --git a/monitor/qmp.c b/monitor/qmp.c
> index f6b7fe65bb..10d651ca5c 100644
> --- a/monitor/qmp.c
> +++ b/monitor/qmp.c
> @@ -613,7 +613,6 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
>          qobject_unref(data);
>          break;
>      case CHR_EVENT_CLOSED:
> -        mon->delete_pending = true;
>          /*
>           * Note: this is only useful when the output of the chardev
>           * backend is still open.  For example, when the backend is
> @@ -629,6 +628,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
>          case MONITOR_QMP_CLOSE_ACTION_NONE:
>              break; /* nada */
>          case MONITOR_QMP_CLOSE_ACTION_DELETE:
> +            mon->delete_pending = true;
>              /*
>               * Do NOT run in the AIO context associated with the
>               * monitor. We need to run in the default AIO context

With this, startup, reconnect and FD passing work correctly both when
instantiated via -object and via -mon and it satisfies the normal
libvirt usage.

Tested-by: Peter Krempa <pkrempa@redhat.com>

I've tested it with following libvirt patches:

https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/PUVLG73H35JZQPYNMHSBIVUF56EKEEC2/
Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Marc-André Lureau 1 day, 8 hours ago
Hi

On Tue, Jun 23, 2026 at 3:53 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Tue, Jun 23, 2026 at 12:38:10PM +0100, Daniel P. Berrangé wrote:
> > On Tue, Jun 23, 2026 at 01:03:46PM +0200, Peter Krempa wrote:
> > > On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > > > 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
> > >
> > > I was giving this a spin by implementing libvirt support for it. The
> > > basic usage seems to work well but I've encoutered a regression in
> > > behaviour which happens both when the QMP monitor is instantiated using
> > > the new syntax but also the old one
> > > ( -mon chardev=charmonitor,id=monitor,mode=control)
> > >
> > > When libvirt wants to re-connect to a qemu running with these patches it
> > > re-issues a 'qmp_capabilities' command after connecting.
> > >
> > > With these patches qemu does not respond to that command even when the
> > > old syntax is used. This makes libvirt stuck when re-connecting to VMs.
> >
> > Oh that's odd, thanks for the warning. I'll investigate this.
>
> /face-palm - a misplaced a line in the auto-delete code, and did not
> have test coverage of re-opening a monitor. Try testing libvirt with
> this additional change on top
>
> diff --git a/monitor/qmp.c b/monitor/qmp.c
> index f6b7fe65bb..10d651ca5c 100644
> --- a/monitor/qmp.c
> +++ b/monitor/qmp.c
> @@ -613,7 +613,6 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
>          qobject_unref(data);
>          break;
>      case CHR_EVENT_CLOSED:
> -        mon->delete_pending = true;
>          /*
>           * Note: this is only useful when the output of the chardev
>           * backend is still open.  For example, when the backend is
> @@ -629,6 +628,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
>          case MONITOR_QMP_CLOSE_ACTION_NONE:
>              break; /* nada */
>          case MONITOR_QMP_CLOSE_ACTION_DELETE:
> +            mon->delete_pending = true;
>              /*
>               * Do NOT run in the AIO context associated with the
>               * monitor. We need to run in the default AIO context
>
>

Good, I just asked the same in my review :)

btw, you didn't collect my r-b from v3.

> With regards,
> Daniel
> --
> |: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
> |: https://libvirt.org          ~~          https://entangle-photo.org :|
> |: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|
>
Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Daniel P. Berrangé 1 day, 8 hours ago
On Tue, Jun 23, 2026 at 03:54:54PM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Tue, Jun 23, 2026 at 3:53 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
> >
> > On Tue, Jun 23, 2026 at 12:38:10PM +0100, Daniel P. Berrangé wrote:
> > > On Tue, Jun 23, 2026 at 01:03:46PM +0200, Peter Krempa wrote:
> > > > On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > > > > 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
> > > >
> > > > I was giving this a spin by implementing libvirt support for it. The
> > > > basic usage seems to work well but I've encoutered a regression in
> > > > behaviour which happens both when the QMP monitor is instantiated using
> > > > the new syntax but also the old one
> > > > ( -mon chardev=charmonitor,id=monitor,mode=control)
> > > >
> > > > When libvirt wants to re-connect to a qemu running with these patches it
> > > > re-issues a 'qmp_capabilities' command after connecting.
> > > >
> > > > With these patches qemu does not respond to that command even when the
> > > > old syntax is used. This makes libvirt stuck when re-connecting to VMs.
> > >
> > > Oh that's odd, thanks for the warning. I'll investigate this.
> >
> > /face-palm - a misplaced a line in the auto-delete code, and did not
> > have test coverage of re-opening a monitor. Try testing libvirt with
> > this additional change on top
> >
> > diff --git a/monitor/qmp.c b/monitor/qmp.c
> > index f6b7fe65bb..10d651ca5c 100644
> > --- a/monitor/qmp.c
> > +++ b/monitor/qmp.c
> > @@ -613,7 +613,6 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
> >          qobject_unref(data);
> >          break;
> >      case CHR_EVENT_CLOSED:
> > -        mon->delete_pending = true;
> >          /*
> >           * Note: this is only useful when the output of the chardev
> >           * backend is still open.  For example, when the backend is
> > @@ -629,6 +628,7 @@ static void monitor_qmp_event(void *opaque, QEMUChrEvent event)
> >          case MONITOR_QMP_CLOSE_ACTION_NONE:
> >              break; /* nada */
> >          case MONITOR_QMP_CLOSE_ACTION_DELETE:
> > +            mon->delete_pending = true;
> >              /*
> >               * Do NOT run in the AIO context associated with the
> >               * monitor. We need to run in the default AIO context
> >
> >
> 
> Good, I just asked the same in my review :)
> 
> btw, you didn't collect my r-b from v3.

Oh sorry, I will get those.


With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


Re: [PATCH v4 00/35] monitor: turn QMP and HMP into QOM objects
Posted by Peter Krempa 1 day, 9 hours ago
On Tue, Jun 23, 2026 at 13:03:46 +0200, Peter Krempa wrote:
> On Tue, Jun 23, 2026 at 10:55:16 +0100, Daniel P. Berrangé via Devel wrote:
> > 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
> 
> I was giving this a spin by implementing libvirt support for it. The
> basic usage seems to work well but I've encoutered a regression in
> behaviour which happens both when the QMP monitor is instantiated using
> the new syntax but also the old one
> ( -mon chardev=charmonitor,id=monitor,mode=control)
> 
> When libvirt wants to re-connect to a qemu running with these patches it
> re-issues a 'qmp_capabilities' command after connecting.
> 
> With these patches qemu does not respond to that command even when the
> old syntax is used. This makes libvirt stuck when re-connecting to VMs.
> 
> The log on libvirt's side is not very interesting:
> 
> 2026-06-23 11:00:11.229+0000: 529808: debug : virSecuritySELinuxSetDaemonSocketLabel:3190 : Setting VM ha socket context unconfined_u:unconfined_r:unconfined_t:s0:c677,c680
> 2026-06-23 11:00:11.229+0000: 529807: info : qemuMonitorOpenInternal:608 : QEMU_MONITOR_NEW: mon=0x7fff94001b80 fd=35
> 2026-06-23 11:00:11.229+0000: 529807: debug : qemuDomainObjEnterMonitorInternal:5165 : Entering monitor (mon=0x7fff94001b80 vm=0x7fffac185b60 name=cd)
> 2026-06-23 11:00:11.229+0000: 529807: debug : qemuMonitorSetCapabilities:1437 : mon:0x7fff94001b80 vm:0x7fffac185b60 monfd:35
> 2026-06-23 11:00:11.229+0000: 529807: info : qemuMonitorSend:822 : QEMU_MONITOR_SEND_MSG: mon=0x7fff94001b80 msg={"execute":"qmp_capabilities","id":"libvirt-1"}^M
> 
> as nothing else ever comes from monitor 0x7fff94001b80

I'll post the libvirt patches as rfc to the libvirt list in a while.