Message ID | 20191004102051.19738-1-marcandre.lureau@redhat.com |
---|---|
Headers | show |
Series | Add dbus-vmstate | expand |
Hi On Fri, Oct 4, 2019 at 1:23 PM Marc-André Lureau <marcandre.lureau@redhat.com> wrote: > > 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". > > 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 > ping, any chance to get it merged before freeze? thanks > 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/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 +++ > 37 files changed, 1428 insertions(+), 38 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.23.0 > >
Hi On Fri, Oct 4, 2019 at 3:23 PM Marc-André Lureau <marcandre.lureau@redhat.com> wrote: > > 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". > ping (there is a minor vmstate_register() change required in patch 2 for the next rebase) > 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/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 +++ > 37 files changed, 1428 insertions(+), 38 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.23.0 > >