[PATCH v6 0/8] Add dbus-vmstate

Marc-André Lureau posted 8 patches 4 years, 3 months ago
Test asan failed
Test checkpatch passed
Test FreeBSD failed
Test docker-mingw@fedora failed
Test docker-clang@ubuntu failed
Test docker-quick@centos7 failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20191211134506.1803403-1-marcandre.lureau@redhat.com
Maintainers: Peter Maydell <peter.maydell@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Max Reitz <mreitz@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>, Christian Borntraeger <borntraeger@de.ibm.com>, Juan Quintela <quintela@redhat.com>, Richard Henderson <rth@twiddle.net>, Fam Zheng <fam@euphon.net>, Andrzej Zaborowski <balrogg@gmail.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, Jason Wang <jasowang@redhat.com>, David Hildenbrand <david@redhat.com>, John Snow <jsnow@redhat.com>, Thomas Huth <thuth@redhat.com>, Stefan Weil <sw@weilnetz.de>, "Alex Bennée" <alex.bennee@linaro.org>, "Daniel P. Berrangé" <berrange@redhat.com>, Laurent Vivier <lvivier@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, David Gibson <david@gibson.dropbear.id.au>, Cornelia Huck <cohuck@redhat.com>, Kevin Wolf <kwolf@redhat.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, Halil Pasic <pasic@linux.ibm.com>
There is a newer version of this series
MAINTAINERS                              |  12 +
backends/Makefile.objs                   |   4 +
backends/dbus-vmstate.c                  | 496 +++++++++++++++++++++++
configure                                |   7 +
docs/interop/dbus-vmstate.rst            |  74 ++++
docs/interop/dbus.rst                    | 104 +++++
docs/interop/index.rst                   |   2 +
hw/block/onenand.c                       |   2 +-
hw/core/Makefile.objs                    |   1 +
hw/core/qdev.c                           |  21 +-
hw/core/vmstate-if.c                     |  23 ++
hw/ide/cmd646.c                          |   2 +-
hw/ide/isa.c                             |   2 +-
hw/ide/piix.c                            |   2 +-
hw/ide/via.c                             |   2 +-
hw/misc/max111x.c                        |   2 +-
hw/net/eepro100.c                        |   4 +-
hw/net/virtio-net.c                      |   3 +-
hw/nvram/eeprom93xx.c                    |   4 +-
hw/ppc/spapr_drc.c                       |   9 +-
hw/ppc/spapr_iommu.c                     |   4 +-
hw/s390x/s390-skeys.c                    |   2 +-
include/hw/vmstate-if.h                  |  40 ++
include/migration/register.h             |   4 +-
include/migration/vmstate.h              |  10 +-
include/qemu/dbus.h                      |  18 +
migration/savevm.c                       |  20 +-
stubs/vmstate.c                          |   4 +-
tests/Makefile.include                   |  23 +-
tests/dbus-vmstate-daemon.sh             |  95 +++++
tests/dbus-vmstate-test.c                | 399 ++++++++++++++++++
tests/dbus-vmstate1.xml                  |  12 +
tests/docker/dockerfiles/centos7.docker  |   1 +
tests/docker/dockerfiles/debian10.docker |   1 +
tests/docker/dockerfiles/fedora.docker   |   1 +
tests/docker/dockerfiles/ubuntu.docker   |   1 +
util/Makefile.objs                       |   3 +
util/dbus.c                              |  55 +++
38 files changed, 1430 insertions(+), 39 deletions(-)
create mode 100644 backends/dbus-vmstate.c
create mode 100644 docs/interop/dbus-vmstate.rst
create mode 100644 docs/interop/dbus.rst
create mode 100644 hw/core/vmstate-if.c
create mode 100644 include/hw/vmstate-if.h
create mode 100644 include/qemu/dbus.h
create mode 100755 tests/dbus-vmstate-daemon.sh
create mode 100644 tests/dbus-vmstate-test.c
create mode 100644 tests/dbus-vmstate1.xml
create mode 100644 util/dbus.c
[PATCH v6 0/8] Add dbus-vmstate
Posted by Marc-André Lureau 4 years, 3 months ago
Hi,

With external processes or helpers participating to the VM support, it
becomes necessary to handle their migration. Various options exist to
transfer their state:
1) as the VM memory, RAM or devices (we could say that's how
   vhost-user devices can be handled today, they are expected to
   restore from ring state)
2) other "vmstate" (as with TPM emulator state blobs)
3) left to be handled by management layer

1) is not practical, since an external processes may legitimatelly
need arbitrary state date to back a device or a service, or may not
even have an associated device.

2) needs ad-hoc code for each helper, but is simple and working

3) is complicated for management layer, QEMU has the migration timing

The proposed "dbus-vmstate" object will connect to a given D-Bus
address, and save/load from org.qemu.VMState1 owners on migration.

Thus helpers can easily have their state migrated with QEMU, without
implementing ad-hoc support (such as done for TPM emulation)

D-Bus is ubiquitous on Linux (it is systemd IPC), and can be made to
work on various other OSes. There are several implementations and good
bindings for various languages.  (the tests/dbus-vmstate-test.c is a
good example of how simple the implementation of services can be, even
in C)

dbus-vmstate is put into use by the libvirt series "[PATCH 00/23] Use
a slirp helper process".

v6:
- rebased (minor change in patch 2)

v5:
- trying to fix patchew/ci: install dbus-daemon in containers, skip
  test if unavailable

v4:
- add Daniel security scenarios to the D-Bus document
- misc doc improvements
- add "util: add dbus helper unit" patch, with
  qemu_dbus_get_queued_owners()
- add "configure: add GDBUS_CODEGEN", explaining why gio-unix is
  required when available
- silence the expected failing tests
- update copyright headers, MAINTAINERS
- add r-b/a-b tags
- rebased

(Note: patchew dbus test fails for unclear reasons, but I can't
reproduce locally nor on travis)

v3:
- after various discussions on helper processes, we settled on a
  preference for having a bus for communications. This version is
  actually v1 updated.
- added a dbus.rst document to describe D-Bus recommendations for QEMU
- added dbus-vmstate-daemon.sh to play with the dbus-daemon configuration
  (although it is not very useful in the context of a single UID)
- added a new vmstate interface, so that any object can implement
  VMStateDescription, and converted dbus-vmstate
- added "migration: fix vmdesc leak on vmstate_save() error"
- convert to g_auto

v2:
- D-Bus is most common and practical through a bus, but it requires a
  daemon to be running. I argue that the benefits outweight the cost
  of running an extra daemon in v1 in the context of multi-process
  qemu, but it is also possible to connect in p2p mode as done in this
  new version.

Marc-André Lureau (8):
  vmstate: add qom interface to get id
  vmstate: replace DeviceState with VMStateIf
  docs: start a document to describe D-Bus usage
  util: add dbus helper unit
  Add dbus-vmstate object
  configure: add GDBUS_CODEGEN
  dockerfiles: add dbus-daemon to some of latest distributions
  tests: add dbus-vmstate-test

 MAINTAINERS                              |  12 +
 backends/Makefile.objs                   |   4 +
 backends/dbus-vmstate.c                  | 496 +++++++++++++++++++++++
 configure                                |   7 +
 docs/interop/dbus-vmstate.rst            |  74 ++++
 docs/interop/dbus.rst                    | 104 +++++
 docs/interop/index.rst                   |   2 +
 hw/block/onenand.c                       |   2 +-
 hw/core/Makefile.objs                    |   1 +
 hw/core/qdev.c                           |  21 +-
 hw/core/vmstate-if.c                     |  23 ++
 hw/ide/cmd646.c                          |   2 +-
 hw/ide/isa.c                             |   2 +-
 hw/ide/piix.c                            |   2 +-
 hw/ide/via.c                             |   2 +-
 hw/misc/max111x.c                        |   2 +-
 hw/net/eepro100.c                        |   4 +-
 hw/net/virtio-net.c                      |   3 +-
 hw/nvram/eeprom93xx.c                    |   4 +-
 hw/ppc/spapr_drc.c                       |   9 +-
 hw/ppc/spapr_iommu.c                     |   4 +-
 hw/s390x/s390-skeys.c                    |   2 +-
 include/hw/vmstate-if.h                  |  40 ++
 include/migration/register.h             |   4 +-
 include/migration/vmstate.h              |  10 +-
 include/qemu/dbus.h                      |  18 +
 migration/savevm.c                       |  20 +-
 stubs/vmstate.c                          |   4 +-
 tests/Makefile.include                   |  23 +-
 tests/dbus-vmstate-daemon.sh             |  95 +++++
 tests/dbus-vmstate-test.c                | 399 ++++++++++++++++++
 tests/dbus-vmstate1.xml                  |  12 +
 tests/docker/dockerfiles/centos7.docker  |   1 +
 tests/docker/dockerfiles/debian10.docker |   1 +
 tests/docker/dockerfiles/fedora.docker   |   1 +
 tests/docker/dockerfiles/ubuntu.docker   |   1 +
 util/Makefile.objs                       |   3 +
 util/dbus.c                              |  55 +++
 38 files changed, 1430 insertions(+), 39 deletions(-)
 create mode 100644 backends/dbus-vmstate.c
 create mode 100644 docs/interop/dbus-vmstate.rst
 create mode 100644 docs/interop/dbus.rst
 create mode 100644 hw/core/vmstate-if.c
 create mode 100644 include/hw/vmstate-if.h
 create mode 100644 include/qemu/dbus.h
 create mode 100755 tests/dbus-vmstate-daemon.sh
 create mode 100644 tests/dbus-vmstate-test.c
 create mode 100644 tests/dbus-vmstate1.xml
 create mode 100644 util/dbus.c

-- 
2.24.0.308.g228f53135a