* [Qemu-devel] [PATCH 0/3] Add dbus-vmstate @ 2019-07-08 7:24 Marc-André Lureau 2019-07-08 7:24 ` [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations Marc-André Lureau ` (6 more replies) 0 siblings, 7 replies; 23+ messages in thread From: Marc-André Lureau @ 2019-07-08 7:24 UTC (permalink / raw) To: qemu-devel Cc: Laurent Vivier, Thomas Huth, berrange, Juan Quintela, Dr. David Alan Gilbert, Marc-André Lureau, Paolo Bonzini 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) I chose D-Bus as it 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) The D-Bus protocol can be made to work peer-to-peer, but the most common and practical way is through a bus daemon. This also has the advantage of increased debuggability (you can eavesdrop on the bus and introspect it). dbus-vmstate is put into use by the libvirt series "[PATCH 00/23] Use a slirp helper process". Marc-André Lureau (3): qemu-file: move qemu_{get,put}_counted_string() declarations tests: add qtest_set_exit_status() Add dbus-vmstate object MAINTAINERS | 6 + backends/Makefile.objs | 4 + backends/dbus-vmstate.c | 497 ++++++++++++++++++++++++++++ configure | 7 + docs/interop/dbus-vmstate.rst | 64 ++++ docs/interop/index.rst | 1 + include/migration/qemu-file-types.h | 4 + migration/qemu-file.h | 4 - tests/Makefile.include | 18 +- tests/dbus-vmstate-test.c | 387 ++++++++++++++++++++++ tests/dbus-vmstate1.xml | 12 + tests/libqtest.c | 41 +-- tests/libqtest.h | 9 + 13 files changed, 1030 insertions(+), 24 deletions(-) create mode 100644 backends/dbus-vmstate.c create mode 100644 docs/interop/dbus-vmstate.rst create mode 100644 tests/dbus-vmstate-test.c create mode 100644 tests/dbus-vmstate1.xml -- 2.22.0.214.g8dca754b1e ^ permalink raw reply [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau @ 2019-07-08 7:24 ` Marc-André Lureau 2019-07-08 8:03 ` Juan Quintela 2019-07-08 7:24 ` [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() Marc-André Lureau ` (5 subsequent siblings) 6 siblings, 1 reply; 23+ messages in thread From: Marc-André Lureau @ 2019-07-08 7:24 UTC (permalink / raw) To: qemu-devel Cc: Laurent Vivier, Thomas Huth, berrange, Juan Quintela, Dr. David Alan Gilbert, Marc-André Lureau, Paolo Bonzini Move migration helpers for strings under include/, so they can be used outside of migration/ Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- include/migration/qemu-file-types.h | 4 ++++ migration/qemu-file.h | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/migration/qemu-file-types.h b/include/migration/qemu-file-types.h index c0a1988155..2867e3da84 100644 --- a/include/migration/qemu-file-types.h +++ b/include/migration/qemu-file-types.h @@ -161,6 +161,10 @@ static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv) qemu_get_be64s(f, (uint64_t *)pv); } +size_t qemu_get_counted_string(QEMUFile *f, char buf[256]); + +void qemu_put_counted_string(QEMUFile *f, const char *name); + int qemu_file_rate_limit(QEMUFile *f); #endif diff --git a/migration/qemu-file.h b/migration/qemu-file.h index 13baf896bd..185d3de505 100644 --- a/migration/qemu-file.h +++ b/migration/qemu-file.h @@ -155,8 +155,6 @@ QEMUFile *qemu_file_get_return_path(QEMUFile *f); void qemu_fflush(QEMUFile *f); void qemu_file_set_blocking(QEMUFile *f, bool block); -size_t qemu_get_counted_string(QEMUFile *f, char buf[256]); - void ram_control_before_iterate(QEMUFile *f, uint64_t flags); void ram_control_after_iterate(QEMUFile *f, uint64_t flags); void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data); @@ -175,6 +173,4 @@ size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset, ram_addr_t offset, size_t size, uint64_t *bytes_sent); -void qemu_put_counted_string(QEMUFile *f, const char *name); - #endif -- 2.22.0.214.g8dca754b1e ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations 2019-07-08 7:24 ` [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations Marc-André Lureau @ 2019-07-08 8:03 ` Juan Quintela 0 siblings, 0 replies; 23+ messages in thread From: Juan Quintela @ 2019-07-08 8:03 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, berrange, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini Marc-André Lureau <marcandre.lureau@redhat.com> wrote: > Move migration helpers for strings under include/, so they can be used > outside of migration/ > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Not that I am the biggest fan of exporting it, but we don't have anything better to offer. ^ permalink raw reply [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau 2019-07-08 7:24 ` [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations Marc-André Lureau @ 2019-07-08 7:24 ` Marc-André Lureau 2019-07-08 8:04 ` Juan Quintela 2019-07-17 11:50 ` Thomas Huth 2019-07-08 7:24 ` [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object Marc-André Lureau ` (4 subsequent siblings) 6 siblings, 2 replies; 23+ messages in thread From: Marc-André Lureau @ 2019-07-08 7:24 UTC (permalink / raw) To: qemu-devel Cc: Laurent Vivier, Thomas Huth, berrange, Juan Quintela, Dr. David Alan Gilbert, Marc-André Lureau, Paolo Bonzini Modify the behaviour of qtest_quit() to check against the expected exit status value. The default remains 0. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- tests/libqtest.c | 41 ++++++++++++++++++++++------------------- tests/libqtest.h | 9 +++++++++ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index 3c5c3f49d8..d722de6da8 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -46,6 +46,7 @@ struct QTestState bool big_endian; bool irq_level[MAX_IRQ]; GString *rx; + int exit_status; }; static GHookList abrt_hooks; @@ -125,27 +126,29 @@ static void kill_qemu(QTestState *s) assert(pid == s->qemu_pid); } - /* - * We expect qemu to exit with status 0; anything else is - * fishy and should be logged with as much detail as possible. - */ wstatus = s->wstatus; - if (wstatus) { - if (WIFEXITED(wstatus)) { - fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " - "process but encountered exit status %d\n", - __FILE__, __LINE__, WEXITSTATUS(wstatus)); - } else if (WIFSIGNALED(wstatus)) { - int sig = WTERMSIG(wstatus); - const char *signame = strsignal(sig) ?: "unknown ???"; - const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : ""; - - fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death " - "from signal %d (%s)%s\n", - __FILE__, __LINE__, sig, signame, dump); + if (WIFEXITED(wstatus)) { + if (WEXITSTATUS(wstatus) == s->exit_status) { + return; } - abort(); + fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " + "process but encountered exit status %d\n", + __FILE__, __LINE__, WEXITSTATUS(wstatus)); + } else if (WIFSIGNALED(wstatus)) { + int sig = WTERMSIG(wstatus); + const char *signame = strsignal(sig) ?: "unknown ???"; + const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : ""; + + fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death " + "from signal %d (%s)%s\n", + __FILE__, __LINE__, sig, signame, dump); } + abort(); +} + +void qtest_set_exit_status(QTestState *s, int status) +{ + s->exit_status = status; } static void kill_qemu_hook_func(void *s) @@ -215,7 +218,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args) gchar *command; const char *qemu_binary = qtest_qemu_binary(); - s = g_new(QTestState, 1); + s = g_new0(QTestState, 1); socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid()); qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid()); diff --git a/tests/libqtest.h b/tests/libqtest.h index cadf1d4a03..aa54225c0e 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -84,6 +84,15 @@ QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd); */ void qtest_quit(QTestState *s); +/** + * qtest_set_exit_status: + * @s: #QTestState instance to operate on. + * @status: the expected exit status + * + * Set the expected exit status when calling qtest_quit(). + */ +void qtest_set_exit_status(QTestState *s, int status); + /** * qtest_qmp_fds: * @s: #QTestState instance to operate on. -- 2.22.0.214.g8dca754b1e ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() 2019-07-08 7:24 ` [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() Marc-André Lureau @ 2019-07-08 8:04 ` Juan Quintela 2019-07-17 11:50 ` Thomas Huth 1 sibling, 0 replies; 23+ messages in thread From: Juan Quintela @ 2019-07-08 8:04 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, berrange, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini Marc-André Lureau <marcandre.lureau@redhat.com> wrote: > Modify the behaviour of qtest_quit() to check against the expected > exit status value. The default remains 0. > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> But I would like a review from anyone from qtest. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() 2019-07-08 7:24 ` [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() Marc-André Lureau 2019-07-08 8:04 ` Juan Quintela @ 2019-07-17 11:50 ` Thomas Huth 1 sibling, 0 replies; 23+ messages in thread From: Thomas Huth @ 2019-07-17 11:50 UTC (permalink / raw) To: Marc-André Lureau, qemu-devel Cc: Laurent Vivier, Paolo Bonzini, berrange, Dr. David Alan Gilbert, Juan Quintela On 08/07/2019 09.24, Marc-André Lureau wrote: > Modify the behaviour of qtest_quit() to check against the expected > exit status value. The default remains 0. > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > tests/libqtest.c | 41 ++++++++++++++++++++++------------------- > tests/libqtest.h | 9 +++++++++ > 2 files changed, 31 insertions(+), 19 deletions(-) > > diff --git a/tests/libqtest.c b/tests/libqtest.c > index 3c5c3f49d8..d722de6da8 100644 > --- a/tests/libqtest.c > +++ b/tests/libqtest.c > @@ -46,6 +46,7 @@ struct QTestState > bool big_endian; > bool irq_level[MAX_IRQ]; > GString *rx; > + int exit_status; Could you please call the variable "expected_exit_status" or "expected_status"? I think that's less confusing. Thanks, Thomas ^ permalink raw reply [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau 2019-07-08 7:24 ` [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations Marc-André Lureau 2019-07-08 7:24 ` [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() Marc-André Lureau @ 2019-07-08 7:24 ` Marc-André Lureau 2019-07-08 8:41 ` Juan Quintela 2019-07-10 6:14 ` Paolo Bonzini 2019-07-08 8:01 ` [Qemu-devel] [PATCH 0/3] Add dbus-vmstate no-reply ` (3 subsequent siblings) 6 siblings, 2 replies; 23+ messages in thread From: Marc-André Lureau @ 2019-07-08 7:24 UTC (permalink / raw) To: qemu-devel Cc: Laurent Vivier, Thomas Huth, berrange, Juan Quintela, Dr. David Alan Gilbert, Marc-André Lureau, Paolo Bonzini When instanciated, this object will connect to the given D-Bus bus. During migration, it will take the data from org.qemu.VMState1 instances. See documentation for further details. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- MAINTAINERS | 6 + backends/Makefile.objs | 4 + backends/dbus-vmstate.c | 497 ++++++++++++++++++++++++++++++++++ configure | 7 + docs/interop/dbus-vmstate.rst | 64 +++++ docs/interop/index.rst | 1 + tests/Makefile.include | 18 +- tests/dbus-vmstate-test.c | 387 ++++++++++++++++++++++++++ tests/dbus-vmstate1.xml | 12 + 9 files changed, 995 insertions(+), 1 deletion(-) create mode 100644 backends/dbus-vmstate.c create mode 100644 docs/interop/dbus-vmstate.rst create mode 100644 tests/dbus-vmstate-test.c create mode 100644 tests/dbus-vmstate1.xml diff --git a/MAINTAINERS b/MAINTAINERS index 2cce50287a..9fa592f1b3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2144,6 +2144,12 @@ F: tests/migration-test.c F: docs/devel/migration.rst F: qapi/migration.json +DBus VMState +M: Marc-André Lureau <marcandre.lureau@redhat.com> +S: Maintained +F: backends/dbus-vmstate.c +F: tests/dbus-vmstate* + Seccomp M: Eduardo Otubo <otubo@redhat.com> S: Supported diff --git a/backends/Makefile.objs b/backends/Makefile.objs index 981e8e122f..dbbe12b225 100644 --- a/backends/Makefile.objs +++ b/backends/Makefile.objs @@ -17,3 +17,7 @@ endif common-obj-$(call land,$(CONFIG_VHOST_USER),$(CONFIG_VIRTIO)) += vhost-user.o common-obj-$(CONFIG_LINUX) += hostmem-memfd.o + +common-obj-$(CONFIG_GIO) += dbus-vmstate.o +dbus-vmstate.o-cflags = $(GIO_CFLAGS) +dbus-vmstate.o-libs = $(GIO_LIBS) diff --git a/backends/dbus-vmstate.c b/backends/dbus-vmstate.c new file mode 100644 index 0000000000..f9117d9fce --- /dev/null +++ b/backends/dbus-vmstate.c @@ -0,0 +1,497 @@ +/* + * QEMU dbus-vmstate + * + * Copyright (C) 2019 Red Hat Inc + * + * Authors: + * Marc-André Lureau <marcandre.lureau@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "qom/object_interfaces.h" +#include "qapi/qmp/qerror.h" +#include "migration/register.h" +#include "migration/qemu-file-types.h" +#include <gio/gio.h> + +typedef struct DBusVMState DBusVMState; +typedef struct DBusVMStateClass DBusVMStateClass; + +#define TYPE_DBUS_VMSTATE "dbus-vmstate" +#define DBUS_VMSTATE(obj) \ + OBJECT_CHECK(DBusVMState, (obj), TYPE_DBUS_VMSTATE) +#define DBUS_VMSTATE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(DBusVMStateClass, (obj), TYPE_DBUS_VMSTATE) +#define DBUS_VMSTATE_CLASS(klass) \ + OBJECT_CLASS_CHECK(DBusVMStateClass, (klass), TYPE_DBUS_VMSTATE) + +struct DBusVMStateClass { + ObjectClass parent_class; +}; + +struct DBusVMState { + Object parent; + + GDBusConnection *bus; + char *dbus_addr; + char *id_list; +}; + +static const GDBusPropertyInfo vmstate_property_info[] = { + { -1, (char *) "Id", (char *) "s", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, NULL }, +}; + +static const GDBusPropertyInfo * const vmstate_property_info_pointers[] = { + &vmstate_property_info[0], + NULL +}; + +static const GDBusInterfaceInfo vmstate1_interface_info = { + -1, + (char *) "org.qemu.VMState1", + (GDBusMethodInfo **) NULL, + (GDBusSignalInfo **) NULL, + (GDBusPropertyInfo **) &vmstate_property_info_pointers, + NULL, +}; + +#define DBUS_VMSTATE_SIZE_LIMIT (1 << 20) /* 1mb */ +#define DBUS_VMSTATE_SECTION 0x00 +#define DBUS_VMSTATE_EOF 0xff + + +static char ** +dbus_get_vmstate1_names(DBusVMState *self, GError **err) +{ + char **names = NULL; + GDBusProxy *proxy; + GVariant *result = NULL, *child = NULL; + + proxy = g_dbus_proxy_new_sync(self->bus, G_DBUS_PROXY_FLAGS_NONE, NULL, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + NULL, err); + if (!proxy) { + goto end; + } + + result = g_dbus_proxy_call_sync(proxy, "ListQueuedOwners", + g_variant_new("(s)", "org.qemu.VMState1"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, err); + if (!result) { + goto end; + } + + child = g_variant_get_child_value(result, 0); + names = g_variant_dup_strv(child, NULL); + +end: + g_clear_pointer(&child, g_variant_unref); + g_clear_pointer(&result, g_variant_unref); + g_clear_object(&proxy); + return names; +} + +static GHashTable * +get_id_list_set(DBusVMState *self) +{ + char **ids; + GHashTable *set; + int i; + + if (!self->id_list) { + return NULL; + } + + ids = g_strsplit(self->id_list, ",", -1); + set = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + for (i = 0; ids[i]; i++) { + g_hash_table_add(set, ids[i]); + ids[i] = NULL; + } + + g_strfreev(ids); + return set; +} + +static GHashTable * +dbus_get_proxies(DBusVMState *self, GError **err) +{ + GError *local_err = NULL; + GHashTable *proxies = NULL; + GVariant *result = NULL; + char **names = NULL; + char **left = NULL; + GHashTable *ids = get_id_list_set(self); + size_t i; + + proxies = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_object_unref); + + names = dbus_get_vmstate1_names(self, &local_err); + if (!names) { + if (g_error_matches(local_err, + G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER)) { + return proxies; + } + g_propagate_error(err, local_err); + goto err; + } + + for (i = 0; names[i]; i++) { + GDBusProxy *proxy; + char *id; + size_t size; + + proxy = g_dbus_proxy_new_sync(self->bus, G_DBUS_PROXY_FLAGS_NONE, + (GDBusInterfaceInfo *) &vmstate1_interface_info, + names[i], + "/org/qemu/VMState1", + "org.qemu.VMState1", + NULL, err); + if (!proxy) { + goto err; + } + + result = g_dbus_proxy_get_cached_property(proxy, "Id"); + if (!result) { + g_set_error_literal(err, G_IO_ERROR, G_IO_ERROR_FAILED, + "VMState Id property is missing."); + g_clear_object(&proxy); + goto err; + } + + id = g_variant_dup_string(result, &size); + if (ids && !g_hash_table_remove(ids, id)) { + g_free(id); + g_clear_object(&proxy); + continue; + } + if (size == 0 || size >= 256) { + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, + "VMState Id '%s' is invalid.", id); + g_free(id); + g_clear_object(&proxy); + goto err; + } + + if (!g_hash_table_insert(proxies, id, proxy)) { + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, + "Duplicated VMState Id '%s'", id); + goto err; + } + + g_clear_pointer(&result, g_variant_unref); + } + + if (ids) { + left = (char **)g_hash_table_get_keys_as_array(ids, NULL); + if (*left) { + char *leftids = g_strjoinv(",", left); + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, + "Required VMState Id are missing: %s", leftids); + g_free(leftids); + goto err; + } + g_free(left); + } + + g_clear_pointer(&ids, g_hash_table_unref); + g_strfreev(names); + return proxies; + +err: + g_free(left); + g_clear_pointer(&proxies, g_hash_table_unref); + g_clear_pointer(&result, g_variant_unref); + g_clear_pointer(&ids, g_hash_table_unref); + g_strfreev(names); + return NULL; +} + +static int +dbus_load_state_proxy(GDBusProxy *proxy, const uint8_t *data, size_t size) +{ + GError *err = NULL; + GVariant *value, *result; + int ret = -1; + + value = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, + data, size, sizeof(char)); + result = g_dbus_proxy_call_sync(proxy, "Load", + g_variant_new("(@ay)", value), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, &err); + if (!result) { + error_report("Failed to Load: %s", err->message); + goto end; + } + + ret = 0; + +end: + g_clear_pointer(&result, g_variant_unref); + g_clear_error(&err); + return ret; +} + +static int +dbus_load_state(QEMUFile *f, void *opaque, int version_id) +{ + DBusVMState *self = DBUS_VMSTATE(opaque); + GError *err = NULL; + GHashTable *proxies = NULL; + uint8_t *data = NULL; + int ret = -1; + + proxies = dbus_get_proxies(self, &err); + if (!proxies) { + error_report("Failed to get proxies: %s", err->message); + goto end; + } + + while (qemu_get_byte(f) != DBUS_VMSTATE_EOF) { + GDBusProxy *proxy = NULL; + char id[256]; + unsigned int size; + + if (qemu_get_counted_string(f, id) == 0) { + error_report("Invalid vmstate Id"); + goto end; + } + + proxy = g_hash_table_lookup(proxies, id); + if (!proxy) { + error_report("Failed to find proxy Id '%s'", id); + goto end; + } + + size = qemu_get_be32(f); + if (size > DBUS_VMSTATE_SIZE_LIMIT) { + error_report("Invalid vmstate size: %u", size); + goto end; + } + + data = g_malloc(size); + if (qemu_get_buffer(f, data, size) != size) { + error_report("Failed to read %u bytes", size); + goto end; + } + + if (dbus_load_state_proxy(proxy, data, size) < 0) { + error_report("Failed to restore Id '%s'", id); + goto end; + } + + g_clear_pointer(&data, g_free); + g_hash_table_remove(proxies, id); + } + + if (g_hash_table_size(proxies) != 0) { + error_report("Missing DBus states from migration stream."); + goto end; + } + + ret = 0; + +end: + g_clear_pointer(&proxies, g_hash_table_unref); + g_clear_pointer(&data, g_free); + g_clear_error(&err); + return ret; +} + +static void +dbus_save_state_proxy(gpointer key, + gpointer value, + gpointer user_data) +{ + QEMUFile *f = user_data; + const char *id = key; + GDBusProxy *proxy = value; + GVariant *result = NULL, *child = NULL; + const uint8_t *data; + size_t size; + GError *err = NULL; + + result = g_dbus_proxy_call_sync(proxy, "Save", + NULL, G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, NULL, &err); + if (!result) { + error_report("Failed to Save: %s", err->message); + g_clear_error(&err); + goto end; + } + + child = g_variant_get_child_value(result, 0); + data = g_variant_get_fixed_array(child, &size, sizeof(char)); + if (!data) { + error_report("Failed to Save: not a byte array"); + goto end; + } + if (size > DBUS_VMSTATE_SIZE_LIMIT) { + error_report("Too much vmstate data to save: %lu", size); + goto end; + } + + qemu_put_byte(f, DBUS_VMSTATE_SECTION); + qemu_put_counted_string(f, id); + qemu_put_be32(f, size); + qemu_put_buffer(f, data, size); + +end: + g_clear_pointer(&child, g_variant_unref); + g_clear_pointer(&result, g_variant_unref); +} + +static void +dbus_save_state(QEMUFile *f, void *opaque) +{ + DBusVMState *self = DBUS_VMSTATE(opaque); + GHashTable *proxies; + GError *err = NULL; + + proxies = dbus_get_proxies(self, &err); + if (!proxies) { + error_report("Failed to get proxies: %s", err->message); + goto end; + } + + /* TODO: how to report an error and cancel? */ + g_hash_table_foreach(proxies, dbus_save_state_proxy, f); + qemu_put_byte(f, DBUS_VMSTATE_EOF); + +end: + g_clear_error(&err); + g_clear_pointer(&proxies, g_hash_table_unref); +} + +static const SaveVMHandlers savevm_handlers = { + .save_state = dbus_save_state, + .load_state = dbus_load_state, +}; + +static void +dbus_vmstate_complete(UserCreatable *uc, Error **errp) +{ + DBusVMState *self = DBUS_VMSTATE(uc); + GError *err = NULL; + GDBusConnection *bus; + + if (!object_resolve_path_type("", TYPE_DBUS_VMSTATE, NULL)) { + error_setg(errp, "There is already an instance of %s", + TYPE_DBUS_VMSTATE); + return; + } + + if (!self->dbus_addr) { + error_setg(errp, QERR_MISSING_PARAMETER, "addr"); + return; + } + + if (register_savevm_live(NULL, TYPE_DBUS_VMSTATE, 0, 0, + &savevm_handlers, self) < 0) { + error_setg(errp, "Failed to register savevm handler"); + return; + } + + bus = g_dbus_connection_new_for_address_sync(self->dbus_addr, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, NULL, &err); + if (err) { + error_setg(errp, "failed to connect to DBus: '%s'", err->message); + g_clear_error(&err); + } + + self->bus = bus; +} + +static void +dbus_vmstate_finalize(Object *o) +{ + DBusVMState *self = DBUS_VMSTATE(o); + + unregister_savevm(NULL, TYPE_DBUS_VMSTATE, self); + g_clear_object(&self->bus); + g_free(self->dbus_addr); + g_free(self->id_list); +} + +static char * +get_dbus_addr(Object *o, Error **errp) +{ + DBusVMState *self = DBUS_VMSTATE(o); + + return g_strdup(self->dbus_addr); +} + +static void +set_dbus_addr(Object *o, const char *str, Error **errp) +{ + DBusVMState *self = DBUS_VMSTATE(o); + + g_free(self->dbus_addr); + self->dbus_addr = g_strdup(str); +} + +static char * +get_id_list(Object *o, Error **errp) +{ + DBusVMState *self = DBUS_VMSTATE(o); + + return g_strdup(self->id_list); +} + +static void +set_id_list(Object *o, const char *str, Error **errp) +{ + DBusVMState *self = DBUS_VMSTATE(o); + + g_free(self->id_list); + self->id_list = g_strdup(str); +} + +static void +dbus_vmstate_class_init(ObjectClass *oc, void *data) +{ + UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); + + ucc->complete = dbus_vmstate_complete; + + object_class_property_add_str(oc, "addr", + get_dbus_addr, set_dbus_addr, + &error_abort); + object_class_property_add_str(oc, "id-list", + get_id_list, set_id_list, + &error_abort); +} + +static const TypeInfo dbus_vmstate_info = { + .name = TYPE_DBUS_VMSTATE, + .parent = TYPE_OBJECT, + .instance_size = sizeof(DBusVMState), + .instance_finalize = dbus_vmstate_finalize, + .class_size = sizeof(DBusVMStateClass), + .class_init = dbus_vmstate_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_USER_CREATABLE }, + { } + } +}; + +static void +register_types(void) +{ + type_register_static(&dbus_vmstate_info); +} + +type_init(register_types); diff --git a/configure b/configure index 4983c8b533..2a64f85d20 100755 --- a/configure +++ b/configure @@ -3659,10 +3659,16 @@ if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then gio=yes gio_cflags=$($pkg_config --cflags gio-2.0) gio_libs=$($pkg_config --libs gio-2.0) + gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0) else gio=no fi +if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then + gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)" + gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)" +fi + # Sanity check that the current size_t matches the # size that glib thinks it should be. This catches # problems on multi-arch where people try to build @@ -6823,6 +6829,7 @@ if test "$gio" = "yes" ; then echo "CONFIG_GIO=y" >> $config_host_mak echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak echo "GIO_LIBS=$gio_libs" >> $config_host_mak + echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak fi echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak if test "$gnutls" = "yes" ; then diff --git a/docs/interop/dbus-vmstate.rst b/docs/interop/dbus-vmstate.rst new file mode 100644 index 0000000000..32d3475315 --- /dev/null +++ b/docs/interop/dbus-vmstate.rst @@ -0,0 +1,64 @@ +============ +DBus VMState +============ + +Introduction +============ + +Helper processes may have their state migrated with the help of the +QEMU object "dbus-vmstate". + +Upon migration, QEMU will go through the queue of "org.qemu.VMState1" +DBus name owners and query their "Id". It must be unique among the +helpers. + +It will then save arbitrary data of each Id to be transferred in the +migration stream and restored/loaded at the corresponding destination +helper. + +The data amount to be transferred is limited to 1Mb. The state must be +saved quickly (a few seconds maximum). (DBus imposes a time limit on +reply anyway, and migration would fail if data isn't given quickly +enough) + +dbus-vmstate object can be configured with the expected list of +helpers by setting its "id-list" property, with a coma-separated Id +list. + +Interface +========= + +.. code:: xml + + <interface name="org.qemu.VMState1"> + <property name="Id" type="s" access="read"/> + <method name="Load"> + <arg type="ay" name="data" direction="in"/> + </method> + <method name="Save"> + <arg type="ay" name="data" direction="out"/> + </method> + </interface> + +"Id" property +------------- + +A string that identifies the helper uniquely. + +Load(in u8[] bytes) method +-------------------------- + +The method called on destination with the state to restore. + +The helper may be initially started in a waiting state (with +an --incoming argument for example), and it may resume on success. + +An error may be returned to the caller. + +Save(out u8[] bytes) method +--------------------------- + +The method called on the source to get the current state to be +migrated. The helper should continue to run normally. + +An error may be returned to the caller. diff --git a/docs/interop/index.rst b/docs/interop/index.rst index b4bfcab417..6bb173cfa6 100644 --- a/docs/interop/index.rst +++ b/docs/interop/index.rst @@ -13,6 +13,7 @@ Contents: :maxdepth: 2 bitmaps + dbus-vmstate live-block-operations pr-helper vhost-user diff --git a/tests/Makefile.include b/tests/Makefile.include index a983dd32da..4023a20c62 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -156,7 +156,9 @@ check-qtest-pci-$(CONFIG_RTL8139_PCI) += tests/rtl8139-test$(EXESUF) check-qtest-pci-$(CONFIG_VGA) += tests/display-vga-test$(EXESUF) check-qtest-pci-$(CONFIG_HDA) += tests/intel-hda-test$(EXESUF) check-qtest-pci-$(CONFIG_IVSHMEM_DEVICE) += tests/ivshmem-test$(EXESUF) - +ifneq ($(GDBUS_CODEGEN),) +check-qtest-pci-$(CONFIG_GIO) += tests/dbus-vmstate-test$(EXESUF) +endif check-qtest-i386-$(CONFIG_ISA_TESTDEV) = tests/endianness-test$(EXESUF) check-qtest-i386-y += tests/fdc-test$(EXESUF) check-qtest-i386-y += tests/ide-test$(EXESUF) @@ -616,6 +618,18 @@ tests/qapi-schema/doc-good.test.texi: $(SRC_PATH)/tests/qapi-schema/doc-good.jso @mv tests/qapi-schema/doc-good-qapi-doc.texi $@ @rm -f tests/qapi-schema/doc-good-qapi-*.[ch] tests/qapi-schema/doc-good-qmp-*.[ch] +tests/dbus-vmstate1.h tests/dbus-vmstate1.c: tests/dbus-vmstate1-gen-timestamp ; +tests/dbus-vmstate1-gen-timestamp: $(SRC_PATH)/tests/dbus-vmstate1.xml + $(call quiet-command,$(GDBUS_CODEGEN) $< \ + --interface-prefix org.qemu --generate-c-code tests/dbus-vmstate1, \ + "GEN","$(@:%-timestamp=%)") + @>$@ + +tests/dbus-vmstate1.o-cflags := $(GIO_CFLAGS) +tests/dbus-vmstate1.o-libs := $(GIO_LIBS) + +tests/dbus-vmstate-test.o: tests/dbus-vmstate1.h + tests/test-string-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(test-qapi-obj-y) tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(test-qapi-obj-y) tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y) tests/test-qapi-events.o @@ -818,6 +832,7 @@ tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y) tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y) tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y) tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y) +tests/dbus-vmstate-test$(EXESUF): tests/dbus-vmstate-test.o tests/dbus-vmstate1.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y) tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y) tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o @@ -1170,6 +1185,7 @@ check-clean: rm -rf $(check-unit-y) tests/*.o $(QEMU_IOTESTS_HELPERS-y) rm -rf $(sort $(foreach target,$(SYSEMU_TARGET_LIST), $(check-qtest-$(target)-y)) $(check-qtest-generic-y)) rm -f tests/test-qapi-gen-timestamp + rm -f tests/dbus-vmstate1-gen-timestamp rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR) clean: check-clean diff --git a/tests/dbus-vmstate-test.c b/tests/dbus-vmstate-test.c new file mode 100644 index 0000000000..11e806442f --- /dev/null +++ b/tests/dbus-vmstate-test.c @@ -0,0 +1,387 @@ +#include "qemu/osdep.h" +#include <glib/gstdio.h> +#include <gio/gio.h> +#include "libqtest.h" +#include "qemu-common.h" +#include "dbus-vmstate1.h" + +static char *workdir; + +typedef struct TestServerId { + const char *name; + const char *data; + size_t size; +} TestServerId; + +static const TestServerId idA = { + "idA", "I'am\0idA!", sizeof("I'am\0idA!") +}; + +static const TestServerId idB = { + "idB", "I'am\0idB!", sizeof("I'am\0idB!") +}; + +typedef struct TestServer { + const TestServerId *id; + bool save_called; + bool load_called; +} TestServer; + +typedef struct Test { + const char *id_list; + bool migrate_fail; + bool without_dst_b; + TestServer srcA; + TestServer dstA; + TestServer srcB; + TestServer dstB; + GMainLoop *loop; + QTestState *src_qemu; +} Test; + +static gboolean +vmstate_load(VMState1 *object, GDBusMethodInvocation *invocation, + const gchar *arg_data, gpointer user_data) +{ + TestServer *h = user_data; + GVariant *args, *var; + const uint8_t *data; + size_t size; + + args = g_dbus_method_invocation_get_parameters(invocation); + var = g_variant_get_child_value(args, 0); + data = g_variant_get_fixed_array(var, &size, sizeof(char)); + g_assert_cmpuint(size, ==, h->id->size); + g_assert(!memcmp(data, h->id->data, h->id->size)); + h->load_called = true; + g_variant_unref(var); + + g_dbus_method_invocation_return_value(invocation, g_variant_new("()")); + return TRUE; +} + +static gboolean +vmstate_save(VMState1 *object, GDBusMethodInvocation *invocation, + gpointer user_data) +{ + TestServer *h = user_data; + GVariant *var; + + var = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, + h->id->data, h->id->size, sizeof(char)); + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(@ay)", var)); + h->save_called = true; + + return TRUE; +} + +static gboolean +wait_for_migration_complete(gpointer user_data) +{ + Test *test = user_data; + QDict *rsp_return; + bool stop = false; + const char *status; + + qtest_qmp_send(test->src_qemu, "{ 'execute': 'query-migrate' }"); + rsp_return = qtest_qmp_receive_success(test->src_qemu, NULL, NULL); + status = qdict_get_str(rsp_return, "status"); + if (g_str_equal(status, "completed") || g_str_equal(status, "failed")) { + stop = true; + g_assert_cmpstr(status, ==, + test->migrate_fail ? "failed" : "completed"); + } + qobject_unref(rsp_return); + + if (stop) { + g_main_loop_quit(test->loop); + } + return stop ? G_SOURCE_REMOVE : G_SOURCE_CONTINUE; +} + +static void migrate(QTestState *who, const char *uri) +{ + QDict *args, *rsp; + + args = qdict_new(); + qdict_put_str(args, "uri", uri); + + rsp = qtest_qmp(who, "{ 'execute': 'migrate', 'arguments': %p }", args); + + g_assert(qdict_haskey(rsp, "return")); + qobject_unref(rsp); +} + +typedef struct WaitNamed { + GMainLoop *loop; + bool named; +} WaitNamed; + +static void +named_cb(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + WaitNamed *t = user_data; + + t->named = true; + g_main_loop_quit(t->loop); +} + +static GDBusConnection * +get_connection(Test *test, guint *ownid) +{ + WaitNamed *wait = g_new0(WaitNamed, 1); + GError *err = NULL; + GDBusConnection *c; + gchar *addr; + + wait->loop = test->loop; + addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SESSION, NULL, &err); + g_assert_no_error(err); + + c = g_dbus_connection_new_for_address_sync( + addr, + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION | + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, NULL, &err); + g_assert_no_error(err); + *ownid = g_bus_own_name_on_connection(c, "org.qemu.VMState1", + G_BUS_NAME_OWNER_FLAGS_NONE, + named_cb, named_cb, wait, g_free); + if (!wait->named) { + g_main_loop_run(wait->loop); + } + + g_free(addr); + return c; +} + +static GDBusObjectManagerServer * +get_server(GDBusConnection *conn, TestServer *s, const TestServerId *id) +{ + GDBusObjectManagerServer *os; + GDBusObjectSkeleton *sk; + VMState1 *v; + + s->id = id; + os = g_dbus_object_manager_server_new("/org/qemu"); + sk = g_dbus_object_skeleton_new("/org/qemu/VMState1"); + + v = vmstate1_skeleton_new(); + g_object_set(v, "id", id->name, NULL); + + g_signal_connect(v, "handle-load", G_CALLBACK(vmstate_load), s); + g_signal_connect(v, "handle-save", G_CALLBACK(vmstate_save), s); + + g_dbus_object_skeleton_add_interface(sk, G_DBUS_INTERFACE_SKELETON(v)); + g_dbus_object_manager_server_export(os, sk); + g_dbus_object_manager_server_set_connection(os, conn); + + g_clear_object(&v); + g_clear_object(&sk); + + return os; +} + +static void +set_id_list(Test *test, QTestState *s) +{ + if (!test->id_list) { + return; + } + + g_assert(!qmp_rsp_is_err(qtest_qmp(s, + "{ 'execute': 'qom-set', 'arguments': " + "{ 'path': '/objects/dv', 'property': 'id-list', 'value': %s } }", + test->id_list))); +} +static void +test_dbus_vmstate(Test *test) +{ + QTestState *src_qemu = NULL, *dst_qemu = NULL; + char *src_qemu_args = NULL, *dst_qemu_args = NULL; + GTestDBus *srcbus = NULL, *dstbus = NULL; + GDBusConnection *srcconnA = NULL, *srcconnB = NULL; + GDBusConnection *dstconnA = NULL, *dstconnB = NULL; + guint ownsrcA, ownsrcB, owndstA, owndstB; + GDBusObjectManagerServer *srcserverA = NULL, *srcserverB = NULL; + GDBusObjectManagerServer *dstserverA = NULL, *dstserverB = NULL; + char **srcaddr = NULL, **dstaddr = NULL; + char *uri = g_strdup_printf("unix:%s/migsocket", workdir); + + test->loop = g_main_loop_new(NULL, TRUE); + + srcbus = g_test_dbus_new(G_TEST_DBUS_NONE); + g_test_dbus_up(srcbus); + srcconnA = get_connection(test, &ownsrcA); + srcserverA = get_server(srcconnA, &test->srcA, &idA); + srcconnB = get_connection(test, &ownsrcB); + srcserverB = get_server(srcconnB, &test->srcB, &idB); + + /* remove ,guid=foo part */ + srcaddr = g_strsplit(g_test_dbus_get_bus_address(srcbus), ",", 2); + src_qemu_args = + g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s", srcaddr[0]); + + dstbus = g_test_dbus_new(G_TEST_DBUS_NONE); + g_test_dbus_up(dstbus); + dstconnA = get_connection(test, &owndstA); + dstserverA = get_server(dstconnA, &test->dstA, &idA); + if (!test->without_dst_b) { + dstconnB = get_connection(test, &owndstB); + dstserverB = get_server(dstconnB, &test->dstB, &idB); + } + + dstaddr = g_strsplit(g_test_dbus_get_bus_address(dstbus), ",", 2); + dst_qemu_args = + g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s -incoming %s", + dstaddr[0], uri); + + src_qemu = qtest_init(src_qemu_args); + dst_qemu = qtest_init(dst_qemu_args); + set_id_list(test, src_qemu); + set_id_list(test, dst_qemu); + + migrate(src_qemu, uri); + test->src_qemu = src_qemu; + g_timeout_add_seconds(1, wait_for_migration_complete, test); + + g_main_loop_run(test->loop); + g_main_loop_unref(test->loop); + + g_free(uri); + if (test->migrate_fail) { + qtest_set_exit_status(dst_qemu, 1); + } + qtest_quit(dst_qemu); + qtest_quit(src_qemu); + g_free(dst_qemu_args); + g_free(src_qemu_args); + g_bus_unown_name(ownsrcA); + g_bus_unown_name(ownsrcB); + g_bus_unown_name(owndstA); + if (!test->without_dst_b) { + g_bus_unown_name(owndstB); + } + g_clear_object(&srcbus); + g_clear_object(&dstbus); + g_clear_object(&srcserverA); + g_clear_object(&dstserverA); + g_clear_object(&srcserverB); + g_clear_object(&dstserverB); + g_clear_object(&srcconnA); + g_clear_object(&dstconnA); + g_clear_object(&srcconnB); + g_clear_object(&dstconnB); + g_strfreev(srcaddr); + g_strfreev(dstaddr); +} + +static void +check_not_migrated(TestServer *s, TestServer *d) +{ + assert(!s->save_called); + assert(!s->load_called); + assert(!d->save_called); + assert(!d->load_called); +} + +static void +check_migrated(TestServer *s, TestServer *d) +{ + assert(s->save_called); + assert(!s->load_called); + assert(!d->save_called); + assert(d->load_called); +} + +static void +test_dbus_vmstate_without_list(void) +{ + Test test = { 0, }; + + test_dbus_vmstate(&test); + + check_migrated(&test.srcA, &test.dstA); + check_migrated(&test.srcB, &test.dstB); +} + +static void +test_dbus_vmstate_with_list(void) +{ + Test test = { .id_list = "idA,idB" }; + + test_dbus_vmstate(&test); + + check_migrated(&test.srcA, &test.dstA); + check_migrated(&test.srcB, &test.dstB); +} + +static void +test_dbus_vmstate_only_a(void) +{ + Test test = { .id_list = "idA" }; + + test_dbus_vmstate(&test); + + check_migrated(&test.srcA, &test.dstA); + check_not_migrated(&test.srcB, &test.dstB); +} + +static void +test_dbus_vmstate_missing_src(void) +{ + Test test = { .id_list = "idA,idC", .migrate_fail = true }; + + test_dbus_vmstate(&test); + check_not_migrated(&test.srcA, &test.dstA); + check_not_migrated(&test.srcB, &test.dstB); +} + +static void +test_dbus_vmstate_missing_dst(void) +{ + Test test = { .id_list = "idA,idB", + .without_dst_b = true, + .migrate_fail = true }; + + test_dbus_vmstate(&test); + + assert(test.srcA.save_called); + assert(test.srcB.save_called); + assert(!test.dstB.save_called); +} + +int +main(int argc, char **argv) +{ + GError *err = NULL; + int ret; + + g_test_init(&argc, &argv, NULL); + + workdir = g_dir_make_tmp("dbus-vmstate-test-XXXXXX", &err); + if (!workdir) { + g_error("Unable to create temporary dir: %s\n", err->message); + } + + qtest_add_func("/dbus-vmstate/without-list", + test_dbus_vmstate_without_list); + qtest_add_func("/dbus-vmstate/with-list", + test_dbus_vmstate_with_list); + qtest_add_func("/dbus-vmstate/only-a", + test_dbus_vmstate_only_a); + qtest_add_func("/dbus-vmstate/missing-src", + test_dbus_vmstate_missing_src); + qtest_add_func("/dbus-vmstate/missing-dst", + test_dbus_vmstate_missing_dst); + + ret = g_test_run(); + + rmdir(workdir); + g_free(workdir); + + return ret; +} diff --git a/tests/dbus-vmstate1.xml b/tests/dbus-vmstate1.xml new file mode 100644 index 0000000000..cc8563be4c --- /dev/null +++ b/tests/dbus-vmstate1.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> + <interface name="org.qemu.VMState1"> + <property name="Id" type="s" access="read"/> + <method name="Load"> + <arg type="ay" name="data" direction="in"/> + </method> + <method name="Save"> + <arg type="ay" name="data" direction="out"/> + </method> + </interface> +</node> -- 2.22.0.214.g8dca754b1e ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object 2019-07-08 7:24 ` [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object Marc-André Lureau @ 2019-07-08 8:41 ` Juan Quintela 2019-07-08 16:11 ` Eric Blake 2019-07-10 6:14 ` Paolo Bonzini 1 sibling, 1 reply; 23+ messages in thread From: Juan Quintela @ 2019-07-08 8:41 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, berrange, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini Marc-André Lureau <marcandre.lureau@redhat.com> wrote: > When instanciated, this object will connect to the given D-Bus > bus. During migration, it will take the data from org.qemu.VMState1 > instances. > > See documentation for further details. > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > diff --git a/backends/Makefile.objs b/backends/Makefile.objs > index 981e8e122f..dbbe12b225 100644 > --- a/backends/Makefile.objs > +++ b/backends/Makefile.objs > @@ -17,3 +17,7 @@ endif > common-obj-$(call land,$(CONFIG_VHOST_USER),$(CONFIG_VIRTIO)) += vhost-user.o > > common-obj-$(CONFIG_LINUX) += hostmem-memfd.o > + > +common-obj-$(CONFIG_GIO) += dbus-vmstate.o > +dbus-vmstate.o-cflags = $(GIO_CFLAGS) > +dbus-vmstate.o-libs = $(GIO_LIBS) I assume this only deppends of GIO, the variable that this patch introduces is GDBUS_CODEGEN in configure. I think it would be a good idea to be able to disable this "feature" entirely. Before anything, I have no clue about DBUS and not a lot about glib, so don't expect anything else that questions on that front. Several questions: > +#define DBUS_VMSTATE_SIZE_LIMIT (1 << 20) /* 1mb */ What size do you expect in real life? I am assuming that you have an user case in mind. > +#define DBUS_VMSTATE_SECTION 0x00 A section name of 0x00 is asking for trouble, I would try a magic number here? > +#define DBUS_VMSTATE_EOF 0xff You are doing: - registering a savevm live subsection I don't understand why. If this list is small enough, we would like probably preffer a normal device, and if it is big, are we expecting that the dbus source handle duplicates, etc, etc. > +static GHashTable * > +get_id_list_set(DBusVMState *self) > +{ > + char **ids; > + GHashTable *set; > + int i; > + > + if (!self->id_list) { > + return NULL; > + } > + > + ids = g_strsplit(self->id_list, ",", -1); > + set = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); > + for (i = 0; ids[i]; i++) { > + g_hash_table_add(set, ids[i]); > + ids[i] = NULL; > + } Why are we using a hash table here? > + > + g_strfreev(ids); > + return set; > +} > + > +static GHashTable * > +dbus_get_proxies(DBusVMState *self, GError **err) > +{ > + GError *local_err = NULL; > + GHashTable *proxies = NULL; > + GVariant *result = NULL; > + char **names = NULL; > + char **left = NULL; > + GHashTable *ids = get_id_list_set(self); > + size_t i; > + > + proxies = g_hash_table_new_full(g_str_hash, g_str_equal, > + g_free, g_object_unref); > + > + names = dbus_get_vmstate1_names(self, &local_err); > + if (!names) { > + if (g_error_matches(local_err, > + G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER)) { > + return proxies; > + } > + g_propagate_error(err, local_err); > + goto err; > + } > + > + for (i = 0; names[i]; i++) { > + GDBusProxy *proxy; > + char *id; > + size_t size; > + > + proxy = g_dbus_proxy_new_sync(self->bus, G_DBUS_PROXY_FLAGS_NONE, > + (GDBusInterfaceInfo *) &vmstate1_interface_info, > + names[i], > + "/org/qemu/VMState1", > + "org.qemu.VMState1", > + NULL, err); > + if (!proxy) { > + goto err; > + } > + > + result = g_dbus_proxy_get_cached_property(proxy, "Id"); > + if (!result) { > + g_set_error_literal(err, G_IO_ERROR, G_IO_ERROR_FAILED, > + "VMState Id property is missing."); > + g_clear_object(&proxy); > + goto err; > + } > + > + id = g_variant_dup_string(result, &size); > + if (ids && !g_hash_table_remove(ids, id)) { > + g_free(id); > + g_clear_object(&proxy); > + continue; > + } > + if (size == 0 || size >= 256) { Why are we using 256 char limit here? Is that a dbus thing, or it is about this implementation? > + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, > + "VMState Id '%s' is invalid.", id); "VMState Id '%s' has invalid size '%d", id, size); ?? > + g_free(id); > + g_clear_object(&proxy); > + goto err; > + } > + > + if (!g_hash_table_insert(proxies, id, proxy)) { > + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, > + "Duplicated VMState Id '%s'", id); > + goto err; > + } > + > + g_clear_pointer(&result, g_variant_unref); > + } > + > + if (ids) { > + left = (char **)g_hash_table_get_keys_as_array(ids, NULL); > + if (*left) { > + char *leftids = g_strjoinv(",", left); > + g_set_error(err, G_IO_ERROR, G_IO_ERROR_FAILED, > + "Required VMState Id are missing: %s", leftids); > + g_free(leftids); > + goto err; > + } > + g_free(left); > + } > + > + g_clear_pointer(&ids, g_hash_table_unref); > + g_strfreev(names); > + return proxies; > + > +err: > + g_free(left); > + g_clear_pointer(&proxies, g_hash_table_unref); > + g_clear_pointer(&result, g_variant_unref); > + g_clear_pointer(&ids, g_hash_table_unref); > + g_strfreev(names); > + return NULL; > +} > + > +static int > +dbus_load_state_proxy(GDBusProxy *proxy, const uint8_t *data, size_t size) > +{ > + GError *err = NULL; > + GVariant *value, *result; > + int ret = -1; > + > + value = g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, > + data, size, sizeof(char)); > + result = g_dbus_proxy_call_sync(proxy, "Load", > + g_variant_new("(@ay)", value), > + G_DBUS_CALL_FLAGS_NO_AUTO_START, > + -1, NULL, &err); > + if (!resultp) { > + error_report("Failed to Load: %s", err->message); > + goto end; > + } > + > + ret = 0; > + > +end: > + g_clear_pointer(&result, g_variant_unref); > + g_clear_error(&err); > + return ret; > +} > + > +static int > +dbus_load_state(QEMUFile *f, void *opaque, int version_id) > +{ > + DBusVMState *self = DBUS_VMSTATE(opaque); > + GError *err = NULL; > + GHashTable *proxies = NULL; > + uint8_t *data = NULL; > + int ret = -1; > + > + proxies = dbus_get_proxies(self, &err); > + if (!proxies) { > + error_report("Failed to get proxies: %s", err->message); > + goto end; > + } > + > + while (qemu_get_byte(f) != DBUS_VMSTATE_EOF) { I know that there are other examples in qemu that uses this pattern: while (more items) proccess aonther item; But we are thing to move to a system that is: for (numef of items) process item I would expect that it would be better that you put a header with: - a version - number of elements - total size We would want at some point in the future to be able to introspect inside the migration stream, that kind of things help. What do you think? > + GDBusProxy *proxy = NULL; > + char id[256]; > + unsigned int size; > + > + if (qemu_get_counted_string(f, id) == 0) { > + error_report("Invalid vmstate Id"); error_report("Invalid vmstate Id: '%s'", id); ?? > + goto end; > + } > + > + proxy = g_hash_table_lookup(proxies, id); > + if (!proxy) { > + error_report("Failed to find proxy Id '%s'", id); > + goto end; > + } > + > + size = qemu_get_be32(f); > + if (size > DBUS_VMSTATE_SIZE_LIMIT) { > + error_report("Invalid vmstate size: %u", size); > + goto end; > + } > + > + data = g_malloc(size); > + if (qemu_get_buffer(f, data, size) != size) { > + error_report("Failed to read %u bytes", size); > + goto end; > + } > + > + if (dbus_load_state_proxy(proxy, data, size) < 0) { > + error_report("Failed to restore Id '%s'", id); > + goto end; > + } > + > + g_clear_pointer(&data, g_free); > + g_hash_table_remove(proxies, id); > + } > + > + if (g_hash_table_size(proxies) != 0) { > + error_report("Missing DBus states from migration stream."); > + goto end; > + } > + > + ret = 0; > + > +end: > + g_clear_pointer(&proxies, g_hash_table_unref); > + g_clear_pointer(&data, g_free); > + g_clear_error(&err); > + return ret; > +} > + > +static void > +dbus_save_state_proxy(gpointer key, > + gpointer value, > + gpointer user_data) > +{ > + QEMUFile *f = user_data; > + const char *id = key; > + GDBusProxy *proxy = value; > + GVariant *result = NULL, *child = NULL; > + const uint8_t *data; > + size_t size; > + GError *err = NULL; > + > + result = g_dbus_proxy_call_sync(proxy, "Save", > + NULL, G_DBUS_CALL_FLAGS_NO_AUTO_START, > + -1, NULL, &err); > + if (!result) { > + error_report("Failed to Save: %s", err->message); > + g_clear_error(&err); > + goto end; > + } > + > + child = g_variant_get_child_value(result, 0); > + data = g_variant_get_fixed_array(child, &size, sizeof(char)); > + if (!data) { > + error_report("Failed to Save: not a byte array"); > + goto end; > + } > + if (size > DBUS_VMSTATE_SIZE_LIMIT) { > + error_report("Too much vmstate data to save: %lu", size); > + goto end; > + } > + > + qemu_put_byte(f, DBUS_VMSTATE_SECTION); > + qemu_put_counted_string(f, id); > + qemu_put_be32(f, size); > + qemu_put_buffer(f, data, size); We are just using vmstate to send an opaque chunk of data. Normally we are against this, we need a good explanation about why we want to put this kind of handlers there. > + > +end: > + g_clear_pointer(&child, g_variant_unref); > + g_clear_pointer(&result, g_variant_unref); > +} > + > +static void > +dbus_save_state(QEMUFile *f, void *opaque) > +{ > + DBusVMState *self = DBUS_VMSTATE(opaque); > + GHashTable *proxies; > + GError *err = NULL; > + > + proxies = dbus_get_proxies(self, &err); > + if (!proxies) { > + error_report("Failed to get proxies: %s", err->message); > + goto end; > + } > + > + /* TODO: how to report an error and cancel? */ This is basically where I would like to have some kind of header. > + g_hash_table_foreach(proxies, dbus_save_state_proxy, f); > + qemu_put_byte(f, DBUS_VMSTATE_EOF); > + > +end: > + g_clear_error(&err); > + g_clear_pointer(&proxies, g_hash_table_unref); > +} > + > +static const SaveVMHandlers savevm_handlers = { > + .save_state = dbus_save_state, > + .load_state = dbus_load_state, > +}; > + > +static void > +dbus_vmstate_complete(UserCreatable *uc, Error **errp) > +{ > + DBusVMState *self = DBUS_VMSTATE(uc); > + GError *err = NULL; > + GDBusConnection *bus; > + > + if (!object_resolve_path_type("", TYPE_DBUS_VMSTATE, NULL)) { > + error_setg(errp, "There is already an instance of %s", > + TYPE_DBUS_VMSTATE); > + return; > + } > + > + if (!self->dbus_addr) { > + error_setg(errp, QERR_MISSING_PARAMETER, "addr"); > + return; > + } > + > + if (register_savevm_live(NULL, TYPE_DBUS_VMSTATE, 0, 0, > + &savevm_handlers, self) < 0) { > + error_setg(errp, "Failed to register savevm handler"); > + return; > + } > + > + bus = g_dbus_connection_new_for_address_sync(self->dbus_addr, > + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | > + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, > + NULL, NULL, &err); > + if (err) { > + error_setg(errp, "failed to connect to DBus: '%s'", err->message); > + g_clear_error(&err); > + } > + > + self->bus = bus; > +} > + > +static void > +dbus_vmstate_finalize(Object *o) > +{ > + DBusVMState *self = DBUS_VMSTATE(o); > + > + unregister_savevm(NULL, TYPE_DBUS_VMSTATE, self); > + g_clear_object(&self->bus); > + g_free(self->dbus_addr); > + g_free(self->id_list); > +} > + Documentation is nice. > diff --git a/docs/interop/dbus-vmstate.rst b/docs/interop/dbus-vmstate.rst > new file mode 100644 > index 0000000000..32d3475315 > --- /dev/null > +++ b/docs/interop/dbus-vmstate.rst > @@ -0,0 +1,64 @@ > +============ > +DBus VMState > +============ > + > +Introduction > +============ > + > +Helper processes may have their state migrated with the help of the > +QEMU object "dbus-vmstate". > + > +Upon migration, QEMU will go through the queue of "org.qemu.VMState1" > +DBus name owners and query their "Id". It must be unique among the > +helpers. > + > +It will then save arbitrary data of each Id to be transferred in the > +migration stream and restored/loaded at the corresponding destination > +helper. > + > +The data amount to be transferred is limited to 1Mb. The state must be > +saved quickly (a few seconds maximum). (DBus imposes a time limit on > +reply anyway, and migration would fail if data isn't given quickly > +enough) Seconds? here? We expect that the part of save_live to be clearly under a second except if configured otherwise. > +dbus-vmstate object can be configured with the expected list of > +helpers by setting its "id-list" property, with a coma-separated Id > +list. Documentation is ok. Test looks ok. Later, Juan. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object 2019-07-08 8:41 ` Juan Quintela @ 2019-07-08 16:11 ` Eric Blake 0 siblings, 0 replies; 23+ messages in thread From: Eric Blake @ 2019-07-08 16:11 UTC (permalink / raw) To: quintela, Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, berrange, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini [-- Attachment #1.1: Type: text/plain, Size: 831 bytes --] On 7/8/19 3:41 AM, Juan Quintela wrote: > Marc-André Lureau <marcandre.lureau@redhat.com> wrote: >> When instanciated, this object will connect to the given D-Bus >> bus. During migration, it will take the data from org.qemu.VMState1 >> instances. >> >> See documentation for further details. >> >> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> > > > Before anything, I have no clue about DBUS and not a lot about glib, so > don't expect anything else that questions on that front. > Ditto from me, but just noticing: > Several questions: > >> +#define DBUS_VMSTATE_SIZE_LIMIT (1 << 20) /* 1mb */ Should this include units.h and spell it (1 * MiB)? -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object 2019-07-08 7:24 ` [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object Marc-André Lureau 2019-07-08 8:41 ` Juan Quintela @ 2019-07-10 6:14 ` Paolo Bonzini 2019-07-10 8:05 ` Daniel P. Berrangé 1 sibling, 1 reply; 23+ messages in thread From: Paolo Bonzini @ 2019-07-10 6:14 UTC (permalink / raw) To: Marc-André Lureau, qemu-devel Cc: Laurent Vivier, Thomas Huth, berrange, Dr. David Alan Gilbert, Juan Quintela On 08/07/19 09:24, Marc-André Lureau wrote: > + > + dstaddr = g_strsplit(g_test_dbus_get_bus_address(dstbus), ",", 2); > + dst_qemu_args = > + g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s -incoming %s", > + dstaddr[0], uri); > + Stupid question: what does the address look like, and what prevents user A from using this to "steal" data from user B's virtual machine? Paolo ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object 2019-07-10 6:14 ` Paolo Bonzini @ 2019-07-10 8:05 ` Daniel P. Berrangé 0 siblings, 0 replies; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-10 8:05 UTC (permalink / raw) To: Paolo Bonzini Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Marc-André Lureau On Wed, Jul 10, 2019 at 08:14:03AM +0200, Paolo Bonzini wrote: > On 08/07/19 09:24, Marc-André Lureau wrote: > > + > > + dstaddr = g_strsplit(g_test_dbus_get_bus_address(dstbus), ",", 2); > > + dst_qemu_args = > > + g_strdup_printf("-object dbus-vmstate,id=dv,addr=%s -incoming %s", > > + dstaddr[0], uri); > > + > > Stupid question: what does the address look like, and what prevents user > A from using this to "steal" data from user B's virtual machine? This series is based on the idea of spawning a new instance of dbus-daemon for every VM that is run. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau ` (2 preceding siblings ...) 2019-07-08 7:24 ` [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object Marc-André Lureau @ 2019-07-08 8:01 ` no-reply 2019-07-08 9:35 ` no-reply ` (2 subsequent siblings) 6 siblings, 0 replies; 23+ messages in thread From: no-reply @ 2019-07-08 8:01 UTC (permalink / raw) To: marcandre.lureau Cc: lvivier, thuth, berrange, quintela, qemu-devel, dgilbert, pbonzini, marcandre.lureau Patchew URL: https://patchew.org/QEMU/20190708072437.3339-1-marcandre.lureau@redhat.com/ Hi, This series failed the asan build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally. === TEST SCRIPT BEGIN === #!/bin/bash make docker-image-fedora V=1 NETWORK=1 time make docker-test-debug@fedora TARGET_LIST=x86_64-softmmu J=14 NETWORK=1 === TEST SCRIPT END === PASS 2 fdc-test /x86_64/fdc/no_media_on_start MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-string-output-visitor -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-string-output-visitor" PASS 3 fdc-test /x86_64/fdc/read_without_media ==10016==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 fdc-test /x86_64/fdc/media_change PASS 5 fdc-test /x86_64/fdc/sense_interrupt PASS 6 fdc-test /x86_64/fdc/relative_seek --- PASS 32 test-opts-visitor /visitor/opts/range/beyond PASS 33 test-opts-visitor /visitor/opts/dict/unvisited MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-coroutine -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-coroutine" ==10047==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-coroutine /basic/no-dangling-access PASS 2 test-coroutine /basic/lifecycle ==10047==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff648aa000; bottom 0x7fdcf7af8000; size: 0x00226cdb2000 (147855187968) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-coroutine /basic/yield --- PASS 12 test-aio /aio/event/flush PASS 13 test-aio /aio/event/wait/no-flush-cb PASS 11 fdc-test /x86_64/fdc/read_no_dma_18 ==10062==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 test-aio /aio/timer/schedule PASS 15 test-aio /aio/coroutine/queue-chaining PASS 16 test-aio /aio-gsource/flush --- PASS 12 fdc-test /x86_64/fdc/read_no_dma_19 PASS 13 fdc-test /x86_64/fdc/fuzz-registers MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-aio-multithread -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-aio-multithread" ==10069==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-aio-multithread /aio/multi/lifecycle MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/ide-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="ide-test" PASS 2 test-aio-multithread /aio/multi/schedule ==10086==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 ide-test /x86_64/ide/identify PASS 3 test-aio-multithread /aio/multi/mutex/contended ==10097==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 ide-test /x86_64/ide/flush ==10108==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 ide-test /x86_64/ide/bmdma/simple_rw PASS 4 test-aio-multithread /aio/multi/mutex/handoff ==10114==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 ide-test /x86_64/ide/bmdma/trim PASS 5 test-aio-multithread /aio/multi/mutex/mcs ==10125==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 ide-test /x86_64/ide/bmdma/short_prdt PASS 6 test-aio-multithread /aio/multi/mutex/pthread ==10136==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-throttle -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-throttle" ==10143==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-throttle /throttle/leak_bucket PASS 2 test-throttle /throttle/compute_wait PASS 3 test-throttle /throttle/init --- PASS 15 test-throttle /throttle/config/iops_size PASS 6 ide-test /x86_64/ide/bmdma/one_sector_short_prdt MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-thread-pool -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-thread-pool" ==10151==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-thread-pool /thread-pool/submit PASS 2 test-thread-pool /thread-pool/submit-aio PASS 3 test-thread-pool /thread-pool/submit-co PASS 4 test-thread-pool /thread-pool/submit-many ==10149==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 ide-test /x86_64/ide/bmdma/long_prdt ==10223==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10223==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe284ec000; bottom 0x7ffa0fdfe000; size: 0x0004186ee000 (17589788672) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 5 test-thread-pool /thread-pool/cancel --- PASS 9 ide-test /x86_64/ide/flush/nodev PASS 6 test-thread-pool /thread-pool/cancel-async MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-hbitmap -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-hbitmap" ==10234==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-hbitmap /hbitmap/granularity PASS 2 test-hbitmap /hbitmap/size/0 PASS 3 test-hbitmap /hbitmap/size/unaligned PASS 4 test-hbitmap /hbitmap/iter/empty PASS 10 ide-test /x86_64/ide/flush/empty_drive PASS 5 test-hbitmap /hbitmap/iter/partial ==10244==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-hbitmap /hbitmap/iter/granularity PASS 7 test-hbitmap /hbitmap/iter/iter_and_reset PASS 8 test-hbitmap /hbitmap/get/all --- PASS 11 ide-test /x86_64/ide/flush/retry_pci PASS 15 test-hbitmap /hbitmap/set/overlap PASS 16 test-hbitmap /hbitmap/reset/empty ==10250==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 17 test-hbitmap /hbitmap/reset/general PASS 18 test-hbitmap /hbitmap/reset/all PASS 19 test-hbitmap /hbitmap/truncate/nop --- PASS 29 test-hbitmap /hbitmap/truncate/shrink/large PASS 30 test-hbitmap /hbitmap/meta/zero PASS 12 ide-test /x86_64/ide/flush/retry_isa ==10256==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 13 ide-test /x86_64/ide/cdrom/pio ==10262==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 ide-test /x86_64/ide/cdrom/pio_large ==10268==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 31 test-hbitmap /hbitmap/meta/one PASS 32 test-hbitmap /hbitmap/meta/byte PASS 33 test-hbitmap /hbitmap/meta/word --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/ahci-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="ahci-test" PASS 34 test-hbitmap /hbitmap/meta/sector PASS 35 test-hbitmap /hbitmap/serialize/align ==10282==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 ahci-test /x86_64/ahci/sanity PASS 36 test-hbitmap /hbitmap/serialize/basic PASS 37 test-hbitmap /hbitmap/serialize/part PASS 38 test-hbitmap /hbitmap/serialize/zeroes PASS 39 test-hbitmap /hbitmap/next_zero/next_zero_0 ==10288==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 40 test-hbitmap /hbitmap/next_zero/next_zero_4 PASS 41 test-hbitmap /hbitmap/next_dirty_area/next_dirty_area_0 PASS 42 test-hbitmap /hbitmap/next_dirty_area/next_dirty_area_1 PASS 43 test-hbitmap /hbitmap/next_dirty_area/next_dirty_area_4 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bdrv-drain -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bdrv-drain" ==10295==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bdrv-drain /bdrv-drain/nested PASS 2 test-bdrv-drain /bdrv-drain/multiparent PASS 3 test-bdrv-drain /bdrv-drain/set_aio_context --- PASS 39 test-bdrv-drain /bdrv-drain/attach/drain PASS 2 ahci-test /x86_64/ahci/pci_spec MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bdrv-graph-mod -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bdrv-graph-mod" ==10337==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10335==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bdrv-graph-mod /bdrv-graph-mod/update-perm-tree PASS 2 test-bdrv-graph-mod /bdrv-graph-mod/should-update-child MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-blockjob -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-blockjob" ==10347==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-blockjob /blockjob/ids PASS 2 test-blockjob /blockjob/cancel/created PASS 3 test-blockjob /blockjob/cancel/running --- PASS 6 test-blockjob /blockjob/cancel/standby PASS 7 test-blockjob /blockjob/cancel/pending PASS 8 test-blockjob /blockjob/cancel/concluded ==10350==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-blockjob-txn -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-blockjob-txn" ==10357==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-blockjob-txn /single/success PASS 2 test-blockjob-txn /single/failure PASS 3 test-blockjob-txn /single/cancel --- PASS 7 test-blockjob-txn /pair/fail-cancel-race MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-block-backend -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-block-backend" PASS 4 ahci-test /x86_64/ahci/hba_spec ==10363==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-block-backend /block-backend/drain_aio_error PASS 2 test-block-backend /block-backend/drain_all_aio_error ==10365==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-block-iothread -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-block-iothread" ==10372==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-block-iothread /sync-op/pread PASS 2 test-block-iothread /sync-op/pwrite PASS 3 test-block-iothread /sync-op/load_vmstate --- PASS 15 test-block-iothread /propagate/diamond PASS 16 test-block-iothread /propagate/mirror MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-image-locking -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-image-locking" ==10395==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-image-locking /image-locking/basic PASS 2 test-image-locking /image-locking/set-perm-abort PASS 5 ahci-test /x86_64/ahci/hba_enable MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-x86-cpuid -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-x86-cpuid" ==10399==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-x86-cpuid /cpuid/topology/basic MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-xbzrle -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-xbzrle" PASS 1 test-xbzrle /xbzrle/uleb --- PASS 15 test-vmstate /vmstate/array/ptr/prim/0/load PASS 16 test-vmstate /vmstate/qtailq/save/saveq PASS 17 test-vmstate /vmstate/qtailq/load/loadq ==10412==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-cutils -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-cutils" PASS 1 test-cutils /cutils/parse_uint/null PASS 2 test-cutils /cutils/parse_uint/empty --- PASS 9 test-int128 /int128/int128_gt PASS 10 test-int128 /int128/int128_rshift MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/rcutorture -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="rcutorture" ==10435==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 rcutorture /rcu/torture/1reader PASS 8 ahci-test /x86_64/ahci/reset ==10473==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 rcutorture /rcu/torture/10readers MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-list -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-list" ==10473==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe6fa56000; bottom 0x7fbe33dfe000; size: 0x00403bc58000 (275880706048) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 9 ahci-test /x86_64/ahci/io/pio/lba28/simple/zero PASS 1 test-rcu-list /rcu/qlist/single-threaded ==10486==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10486==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffd3035d000; bottom 0x7fc9145fe000; size: 0x00341bd5f000 (223805304832) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 2 test-rcu-list /rcu/qlist/short-few PASS 10 ahci-test /x86_64/ahci/io/pio/lba28/simple/low ==10519==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10519==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc554bf000; bottom 0x7faecb9fe000; size: 0x004d89ac1000 (333022236672) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-rcu-list /rcu/qlist/long-many MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-simpleq -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-simpleq" PASS 11 ahci-test /x86_64/ahci/io/pio/lba28/simple/high ==10532==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10532==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe84b1a000; bottom 0x7f495dbfe000; size: 0x00b526f1c000 (778042458112) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 1 test-rcu-simpleq /rcu/qsimpleq/single-threaded PASS 12 ahci-test /x86_64/ahci/io/pio/lba28/double/zero ==10544==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10544==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffcb186d000; bottom 0x7f9ebe5fe000; size: 0x005df326f000 (403511373824) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 2 test-rcu-simpleq /rcu/qsimpleq/short-few PASS 13 ahci-test /x86_64/ahci/io/pio/lba28/double/low ==10571==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10571==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffd54911000; bottom 0x7f9df7dfe000; size: 0x005f5cb13000 (409577009152) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 14 ahci-test /x86_64/ahci/io/pio/lba28/double/high PASS 3 test-rcu-simpleq /rcu/qsimpleq/long-many MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-tailq -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-tailq" ==10577==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10577==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc4fca3000; bottom 0x7f808417c000; size: 0x007bcbb27000 (531698446336) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 1 test-rcu-tailq /rcu/qtailq/single-threaded PASS 15 ahci-test /x86_64/ahci/io/pio/lba28/long/zero PASS 2 test-rcu-tailq /rcu/qtailq/short-few ==10596==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10596==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffdee41f000; bottom 0x7fba739fe000; size: 0x00437aa21000 (289820250112) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 16 ahci-test /x86_64/ahci/io/pio/lba28/long/low PASS 3 test-rcu-tailq /rcu/qtailq/long-many ==10623==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qdist -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qdist" PASS 1 test-qdist /qdist/none PASS 2 test-qdist /qdist/pr --- PASS 7 test-qdist /qdist/binning/expand PASS 8 test-qdist /qdist/binning/shrink MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qht -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qht" ==10623==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff6992f000; bottom 0x7f0b441fe000; size: 0x00f425731000 (1048600317952) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 17 ahci-test /x86_64/ahci/io/pio/lba28/long/high ==10638==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 18 ahci-test /x86_64/ahci/io/pio/lba28/short/zero ==10644==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 19 ahci-test /x86_64/ahci/io/pio/lba28/short/low ==10650==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 20 ahci-test /x86_64/ahci/io/pio/lba28/short/high ==10656==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10656==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffff77b1000; bottom 0x7f398cbfe000; size: 0x00c66abb3000 (852194177024) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 21 ahci-test /x86_64/ahci/io/pio/lba48/simple/zero ==10662==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10662==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff5eae7000; bottom 0x7fb6905fe000; size: 0x0048ce4e9000 (312698900480) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 22 ahci-test /x86_64/ahci/io/pio/lba48/simple/low ==10668==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10668==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff6b6c3000; bottom 0x7f9ead7fe000; size: 0x0060bdec5000 (415503241216) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 23 ahci-test /x86_64/ahci/io/pio/lba48/simple/high ==10674==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10674==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc364fb000; bottom 0x7f67817fe000; size: 0x0094b4cfd000 (638688677888) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 24 ahci-test /x86_64/ahci/io/pio/lba48/double/zero ==10680==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10680==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffef55b1000; bottom 0x7f0b3b9fe000; size: 0x00f3b9bb3000 (1046793105408) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 25 ahci-test /x86_64/ahci/io/pio/lba48/double/low ==10686==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10686==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe27c79000; bottom 0x7fbb62dfe000; size: 0x0042c4e7b000 (286771359744) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 26 ahci-test /x86_64/ahci/io/pio/lba48/double/high ==10692==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10692==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff76fcb000; bottom 0x7ff56ed7c000; size: 0x000a0824f000 (43086311424) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 1 test-qht /qht/mode/default PASS 2 test-qht /qht/mode/resize MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qht-par -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qht-par" PASS 27 ahci-test /x86_64/ahci/io/pio/lba48/long/zero ==10708==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-qht-par /qht/parallel/2threads-0%updates-1s ==10708==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffddf8da000; bottom 0x7ff528b24000; size: 0x0008b6db6000 (37427568640) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 28 ahci-test /x86_64/ahci/io/pio/lba48/long/low --- PASS 5 test-bitops /bitops/half_unshuffle32 PASS 6 test-bitops /bitops/half_unshuffle64 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bitcnt -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bitcnt" ==10721==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bitcnt /bitcnt/ctpop8 PASS 2 test-bitcnt /bitcnt/ctpop16 PASS 3 test-bitcnt /bitcnt/ctpop32 --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qdev-global-props -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qdev-global-props" PASS 1 test-qdev-global-props /qdev/properties/static/default PASS 2 test-qdev-global-props /qdev/properties/static/global ==10721==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc3e33b000; bottom 0x7f5cf1ffe000; size: 0x009f4c33d000 (684178264064) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-qdev-global-props /qdev/properties/dynamic/global --- PASS 18 test-qemu-opts /qemu-opts/to_qdict/filtered PASS 19 test-qemu-opts /qemu-opts/to_qdict/duplicates MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-keyval -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-keyval" ==10760==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-keyval /keyval/keyval_parse PASS 2 test-keyval /keyval/keyval_parse/list PASS 3 test-keyval /keyval/visit/bool --- PASS 3 test-crypto-hmac /crypto/hmac/prealloc PASS 4 test-crypto-hmac /crypto/hmac/digest MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-cipher -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-cipher" ==10775==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-cipher /crypto/cipher/aes-ecb-128 PASS 2 test-crypto-cipher /crypto/cipher/aes-ecb-192 PASS 3 test-crypto-cipher /crypto/cipher/aes-ecb-256 --- PASS 31 ahci-test /x86_64/ahci/io/pio/lba48/short/low PASS 1 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/perfectserver PASS 2 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/perfectclient ==10805==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 32 ahci-test /x86_64/ahci/io/pio/lba48/short/high PASS 3 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca1 ==10811==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca2 PASS 5 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca3 PASS 6 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badca1 --- PASS 8 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badca3 PASS 33 ahci-test /x86_64/ahci/io/dma/lba28/fragmented PASS 9 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver1 ==10817==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver2 PASS 11 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver3 PASS 34 ahci-test /x86_64/ahci/io/dma/lba28/retry ==10823==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 12 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver4 PASS 13 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver5 PASS 14 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver6 PASS 35 ahci-test /x86_64/ahci/io/dma/lba28/simple/zero ==10829==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver7 PASS 16 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badserver1 PASS 17 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badserver2 --- PASS 39 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/missingclient MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-tlssession -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-tlssession" PASS 36 ahci-test /x86_64/ahci/io/dma/lba28/simple/low ==10840==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 37 ahci-test /x86_64/ahci/io/dma/lba28/simple/high ==10846==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-tlssession /qcrypto/tlssession/psk PASS 2 test-crypto-tlssession /qcrypto/tlssession/basicca PASS 38 ahci-test /x86_64/ahci/io/dma/lba28/double/zero ==10852==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 test-crypto-tlssession /qcrypto/tlssession/differentca PASS 39 ahci-test /x86_64/ahci/io/dma/lba28/double/low ==10858==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 test-crypto-tlssession /qcrypto/tlssession/altname1 PASS 40 ahci-test /x86_64/ahci/io/dma/lba28/double/high PASS 5 test-crypto-tlssession /qcrypto/tlssession/altname2 ==10864==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-crypto-tlssession /qcrypto/tlssession/altname3 PASS 7 test-crypto-tlssession /qcrypto/tlssession/altname4 PASS 8 test-crypto-tlssession /qcrypto/tlssession/altname5 PASS 41 ahci-test /x86_64/ahci/io/dma/lba28/long/zero PASS 9 test-crypto-tlssession /qcrypto/tlssession/altname6 PASS 10 test-crypto-tlssession /qcrypto/tlssession/wildcard1 ==10870==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 11 test-crypto-tlssession /qcrypto/tlssession/wildcard2 PASS 42 ahci-test /x86_64/ahci/io/dma/lba28/long/low PASS 12 test-crypto-tlssession /qcrypto/tlssession/wildcard3 PASS 13 test-crypto-tlssession /qcrypto/tlssession/wildcard4 ==10876==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 test-crypto-tlssession /qcrypto/tlssession/wildcard5 PASS 15 test-crypto-tlssession /qcrypto/tlssession/wildcard6 PASS 16 test-crypto-tlssession /qcrypto/tlssession/cachain MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qga -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qga" PASS 43 ahci-test /x86_64/ahci/io/dma/lba28/long/high ==10889==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-qga /qga/sync-delimited PASS 2 test-qga /qga/sync PASS 3 test-qga /qga/ping --- PASS 16 test-qga /qga/invalid-args PASS 17 test-qga /qga/fsfreeze-status PASS 44 ahci-test /x86_64/ahci/io/dma/lba28/short/zero ==10896==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 18 test-qga /qga/blacklist PASS 19 test-qga /qga/config PASS 20 test-qga /qga/guest-exec PASS 21 test-qga /qga/guest-exec-invalid PASS 45 ahci-test /x86_64/ahci/io/dma/lba28/short/low ==10909==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 22 test-qga /qga/guest-get-osinfo PASS 23 test-qga /qga/guest-get-host-name PASS 24 test-qga /qga/guest-get-timezone --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-authz-simple -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-authz-simple" PASS 1 test-authz-simple /authz/simple MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-authz-list -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-authz-list" ==10932==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-authz-list /auth/list/complex PASS 2 test-authz-list /auth/list/add-remove PASS 3 test-authz-list /auth/list/default/deny --- PASS 4 test-io-channel-file /io/channel/pipe/sync PASS 5 test-io-channel-file /io/channel/pipe/async MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-io-channel-tls -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-io-channel-tls" ==10993==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-io-channel-tls /qio/channel/tls/basic MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-io-channel-command -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-io-channel-command" PASS 48 ahci-test /x86_64/ahci/io/dma/lba48/simple/low --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-io-channel-buffer -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-io-channel-buffer" PASS 1 test-io-channel-buffer /io/channel/buf MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-base64 -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-base64" ==11031==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-base64 /util/base64/good PASS 2 test-base64 /util/base64/embedded-nul PASS 3 test-base64 /util/base64/not-nul-terminated --- PASS 17 test-crypto-xts /crypto/xts/t-21-key-32-ptx-31/basic PASS 18 test-crypto-xts /crypto/xts/t-21-key-32-ptx-31/unaligned MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-block -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-block" ==11061==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-block /crypto/block/qcow MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-logging -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-logging" PASS 1 test-logging /logging/parse_range PASS 2 test-logging /logging/parse_path MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-replication -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-replication" ==11082==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 50 ahci-test /x86_64/ahci/io/dma/lba48/double/zero PASS 1 test-replication /replication/primary/read PASS 2 test-replication /replication/primary/write ==11086==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 test-replication /replication/primary/start PASS 4 test-replication /replication/primary/stop PASS 5 test-replication /replication/primary/do_checkpoint PASS 6 test-replication /replication/primary/get_error_all PASS 51 ahci-test /x86_64/ahci/io/dma/lba48/double/low ==11092==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 test-replication /replication/secondary/read PASS 52 ahci-test /x86_64/ahci/io/dma/lba48/double/high PASS 8 test-replication /replication/secondary/write ==11098==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 53 ahci-test /x86_64/ahci/io/dma/lba48/long/zero ==11104==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11082==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff918bd000; bottom 0x7eff617fc000; size: 0x0100300c1000 (1100317724672) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 54 ahci-test /x86_64/ahci/io/dma/lba48/long/low ==11129==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 9 test-replication /replication/secondary/start PASS 55 ahci-test /x86_64/ahci/io/dma/lba48/long/high ==11135==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 56 ahci-test /x86_64/ahci/io/dma/lba48/short/zero PASS 10 test-replication /replication/secondary/stop ==11142==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 57 ahci-test /x86_64/ahci/io/dma/lba48/short/low ==11148==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 11 test-replication /replication/secondary/do_checkpoint PASS 58 ahci-test /x86_64/ahci/io/dma/lba48/short/high PASS 12 test-replication /replication/secondary/get_error_all ==11154==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bufferiszero -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bufferiszero" PASS 59 ahci-test /x86_64/ahci/io/ncq/simple ==11164==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 60 ahci-test /x86_64/ahci/io/ncq/retry ==11170==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 61 ahci-test /x86_64/ahci/flush/simple ==11176==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 62 ahci-test /x86_64/ahci/flush/retry ==11182==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11187==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 63 ahci-test /x86_64/ahci/flush/migrate ==11196==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11201==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 64 ahci-test /x86_64/ahci/migrate/sanity ==11210==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11215==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 65 ahci-test /x86_64/ahci/migrate/dma/simple ==11224==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11229==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 66 ahci-test /x86_64/ahci/migrate/dma/halted ==11238==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11243==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 67 ahci-test /x86_64/ahci/migrate/ncq/simple ==11252==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11257==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 68 ahci-test /x86_64/ahci/migrate/ncq/halted ==11266==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 69 ahci-test /x86_64/ahci/cdrom/eject ==11271==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 70 ahci-test /x86_64/ahci/cdrom/dma/single ==11277==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bufferiszero /cutils/bufferiszero MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-uuid -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-uuid" PASS 1 test-uuid /uuid/is_null --- PASS 21 test-qgraph /qgraph/test_two_test_same_interface PASS 22 test-qgraph /qgraph/test_test_in_path PASS 23 test-qgraph /qgraph/test_double_edge ==11291==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 72 ahci-test /x86_64/ahci/cdrom/pio/single ==11306==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11306==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffef0e7c000; bottom 0x7fd9f57fe000; size: 0x0024fb67e000 (158836711424) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 73 ahci-test /x86_64/ahci/cdrom/pio/multi ==11312==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 74 ahci-test /x86_64/ahci/cdrom/pio/bcl MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/hd-geo-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="hd-geo-test" PASS 1 hd-geo-test /x86_64/hd-geo/ide/none ==11326==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 hd-geo-test /x86_64/hd-geo/ide/drive/cd_0 ==11332==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/blank ==11338==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/lba ==11344==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/chs ==11350==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 hd-geo-test /x86_64/hd-geo/ide/device/mbr/blank ==11356==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 hd-geo-test /x86_64/hd-geo/ide/device/mbr/lba ==11362==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 hd-geo-test /x86_64/hd-geo/ide/device/mbr/chs ==11368==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 9 hd-geo-test /x86_64/hd-geo/ide/device/user/chs ==11373==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 hd-geo-test /x86_64/hd-geo/ide/device/user/chst MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/boot-order-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="boot-order-test" PASS 1 boot-order-test /x86_64/boot-order/pc --- Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11441==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 bios-tables-test /x86_64/acpi/piix4 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11447==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 bios-tables-test /x86_64/acpi/q35 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11453==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 bios-tables-test /x86_64/acpi/piix4/bridge Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11459==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 bios-tables-test /x86_64/acpi/piix4/ipmi Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11465==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 bios-tables-test /x86_64/acpi/piix4/cpuhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11472==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 bios-tables-test /x86_64/acpi/piix4/memhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11478==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 bios-tables-test /x86_64/acpi/piix4/numamem Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11484==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 bios-tables-test /x86_64/acpi/piix4/dimmpxm Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11493==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 9 bios-tables-test /x86_64/acpi/q35/bridge Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11499==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 bios-tables-test /x86_64/acpi/q35/mmio64 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11505==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 11 bios-tables-test /x86_64/acpi/q35/ipmi Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11511==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 12 bios-tables-test /x86_64/acpi/q35/cpuhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11518==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 13 bios-tables-test /x86_64/acpi/q35/memhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11524==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 bios-tables-test /x86_64/acpi/q35/numamem Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11530==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 bios-tables-test /x86_64/acpi/q35/dimmpxm MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/boot-serial-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="boot-serial-test" PASS 1 boot-serial-test /x86_64/boot-serial/isapc --- PASS 1 i440fx-test /x86_64/i440fx/defaults PASS 2 i440fx-test /x86_64/i440fx/pam PASS 3 i440fx-test /x86_64/i440fx/firmware/bios ==11614==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 i440fx-test /x86_64/i440fx/firmware/pflash MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/fw_cfg-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="fw_cfg-test" PASS 1 fw_cfg-test /x86_64/fw_cfg/signature --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/drive_del-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="drive_del-test" PASS 1 drive_del-test /x86_64/drive_del/without-dev PASS 2 drive_del-test /x86_64/drive_del/after_failed_device_add ==11702==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 drive_del-test /x86_64/blockdev/drive_del_device_del MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/wdt_ib700-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="wdt_ib700-test" PASS 1 wdt_ib700-test /x86_64/wdt_ib700/pause --- PASS 3 ivshmem-test /x86_64/ivshmem/memdev MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/dbus-vmstate-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="dbus-vmstate-test" ** GLib-GIO:ERROR:../gio/gtestdbus.c:619:start_daemon: assertion failed (error == NULL): Failed to execute child process ?dbus-daemon? (No such file or directory) (g-exec-error-quark, 8) ERROR - Bail out! GLib-GIO:ERROR:../gio/gtestdbus.c:619:start_daemon: assertion failed (error == NULL): Failed to execute child process ?dbus-daemon? (No such file or directory) (g-exec-error-quark, 8) make: *** [/tmp/qemu-test/src/tests/Makefile.include:912: check-qtest-x86_64] Error 1 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): The full log is available at http://patchew.org/logs/20190708072437.3339-1-marcandre.lureau@redhat.com/testing.asan/?type=message. --- Email generated automatically by Patchew [https://patchew.org/]. Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau ` (3 preceding siblings ...) 2019-07-08 8:01 ` [Qemu-devel] [PATCH 0/3] Add dbus-vmstate no-reply @ 2019-07-08 9:35 ` no-reply 2019-07-08 15:44 ` Dr. David Alan Gilbert 2019-07-08 16:04 ` Daniel P. Berrangé 6 siblings, 0 replies; 23+ messages in thread From: no-reply @ 2019-07-08 9:35 UTC (permalink / raw) To: marcandre.lureau Cc: lvivier, thuth, berrange, quintela, qemu-devel, dgilbert, pbonzini, marcandre.lureau Patchew URL: https://patchew.org/QEMU/20190708072437.3339-1-marcandre.lureau@redhat.com/ Hi, This series failed the asan build test. Please find the testing commands and their output below. If you have Docker installed, you can probably reproduce it locally. === TEST SCRIPT BEGIN === #!/bin/bash make docker-image-fedora V=1 NETWORK=1 time make docker-test-debug@fedora TARGET_LIST=x86_64-softmmu J=14 NETWORK=1 === TEST SCRIPT END === PASS 2 fdc-test /x86_64/fdc/no_media_on_start MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qobject-input-visitor -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qobject-input-visitor" PASS 3 fdc-test /x86_64/fdc/read_without_media ==10077==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 fdc-test /x86_64/fdc/media_change PASS 5 fdc-test /x86_64/fdc/sense_interrupt PASS 6 fdc-test /x86_64/fdc/relative_seek --- PASS 32 test-opts-visitor /visitor/opts/range/beyond PASS 33 test-opts-visitor /visitor/opts/dict/unvisited MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-coroutine -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-coroutine" ==10121==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-coroutine /basic/no-dangling-access PASS 2 test-coroutine /basic/lifecycle ==10121==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe12e7d000; bottom 0x7f68670f8000; size: 0x0095abd85000 (642833207296) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-coroutine /basic/yield --- PASS 11 test-aio /aio/event/wait PASS 12 test-aio /aio/event/flush PASS 13 test-aio /aio/event/wait/no-flush-cb ==10136==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 test-aio /aio/timer/schedule PASS 15 test-aio /aio/coroutine/queue-chaining PASS 16 test-aio /aio-gsource/flush --- PASS 28 test-aio /aio-gsource/timer/schedule MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-aio-multithread -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-aio-multithread" PASS 1 test-aio-multithread /aio/multi/lifecycle ==10142==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 12 fdc-test /x86_64/fdc/read_no_dma_19 PASS 13 fdc-test /x86_64/fdc/fuzz-registers PASS 2 test-aio-multithread /aio/multi/schedule MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/ide-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="ide-test" ==10165==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 test-aio-multithread /aio/multi/mutex/contended PASS 1 ide-test /x86_64/ide/identify ==10176==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 ide-test /x86_64/ide/flush ==10182==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 ide-test /x86_64/ide/bmdma/simple_rw PASS 4 test-aio-multithread /aio/multi/mutex/handoff ==10188==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 ide-test /x86_64/ide/bmdma/trim PASS 5 test-aio-multithread /aio/multi/mutex/mcs ==10199==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 ide-test /x86_64/ide/bmdma/short_prdt ==10210==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-aio-multithread /aio/multi/mutex/pthread MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-throttle -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-throttle" PASS 6 ide-test /x86_64/ide/bmdma/one_sector_short_prdt --- PASS 5 test-throttle /throttle/have_timer PASS 6 test-throttle /throttle/detach_attach PASS 7 test-throttle /throttle/config_functions ==10218==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 test-throttle /throttle/accounting PASS 9 test-throttle /throttle/groups PASS 10 test-throttle /throttle/config/enabled --- PASS 14 test-throttle /throttle/config/max PASS 15 test-throttle /throttle/config/iops_size MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-thread-pool -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-thread-pool" ==10224==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-thread-pool /thread-pool/submit PASS 2 test-thread-pool /thread-pool/submit-aio PASS 3 test-thread-pool /thread-pool/submit-co PASS 4 test-thread-pool /thread-pool/submit-many ==10220==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 ide-test /x86_64/ide/bmdma/long_prdt ==10256==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10256==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff07b6f000; bottom 0x7fa7bd1fe000; size: 0x00574a971000 (374913568768) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 8 ide-test /x86_64/ide/bmdma/no_busmaster PASS 5 test-thread-pool /thread-pool/cancel PASS 9 ide-test /x86_64/ide/flush/nodev ==10268==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 ide-test /x86_64/ide/flush/empty_drive ==10273==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 11 ide-test /x86_64/ide/flush/retry_pci PASS 6 test-thread-pool /thread-pool/cancel-async MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-hbitmap -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-hbitmap" --- PASS 2 test-hbitmap /hbitmap/size/0 PASS 3 test-hbitmap /hbitmap/size/unaligned PASS 4 test-hbitmap /hbitmap/iter/empty ==10279==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 12 ide-test /x86_64/ide/flush/retry_isa PASS 5 test-hbitmap /hbitmap/iter/partial PASS 6 test-hbitmap /hbitmap/iter/granularity PASS 7 test-hbitmap /hbitmap/iter/iter_and_reset ==10290==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 test-hbitmap /hbitmap/get/all PASS 9 test-hbitmap /hbitmap/get/some PASS 10 test-hbitmap /hbitmap/set/all --- PASS 13 ide-test /x86_64/ide/cdrom/pio PASS 15 test-hbitmap /hbitmap/set/overlap PASS 16 test-hbitmap /hbitmap/reset/empty ==10296==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 17 test-hbitmap /hbitmap/reset/general PASS 18 test-hbitmap /hbitmap/reset/all PASS 19 test-hbitmap /hbitmap/truncate/nop --- PASS 29 test-hbitmap /hbitmap/truncate/shrink/large PASS 30 test-hbitmap /hbitmap/meta/zero PASS 14 ide-test /x86_64/ide/cdrom/pio_large ==10302==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 ide-test /x86_64/ide/cdrom/dma MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/ahci-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="ahci-test" ==10316==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 ahci-test /x86_64/ahci/sanity PASS 31 test-hbitmap /hbitmap/meta/one PASS 32 test-hbitmap /hbitmap/meta/byte PASS 33 test-hbitmap /hbitmap/meta/word ==10322==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 ahci-test /x86_64/ahci/pci_spec PASS 34 test-hbitmap /hbitmap/meta/sector PASS 35 test-hbitmap /hbitmap/serialize/align ==10328==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 ahci-test /x86_64/ahci/pci_enable ==10334==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 36 test-hbitmap /hbitmap/serialize/basic PASS 37 test-hbitmap /hbitmap/serialize/part PASS 38 test-hbitmap /hbitmap/serialize/zeroes --- PASS 42 test-hbitmap /hbitmap/next_dirty_area/next_dirty_area_1 PASS 43 test-hbitmap /hbitmap/next_dirty_area/next_dirty_area_4 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bdrv-drain -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bdrv-drain" ==10343==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bdrv-drain /bdrv-drain/nested PASS 2 test-bdrv-drain /bdrv-drain/multiparent PASS 3 test-bdrv-drain /bdrv-drain/set_aio_context --- PASS 20 test-bdrv-drain /bdrv-drain/iothread/drain_subtree PASS 21 test-bdrv-drain /bdrv-drain/blockjob/drain_all PASS 22 test-bdrv-drain /bdrv-drain/blockjob/drain ==10340==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 23 test-bdrv-drain /bdrv-drain/blockjob/drain_subtree PASS 24 test-bdrv-drain /bdrv-drain/blockjob/error/drain_all PASS 25 test-bdrv-drain /bdrv-drain/blockjob/error/drain --- PASS 38 test-bdrv-drain /bdrv-drain/detach/driver_cb PASS 39 test-bdrv-drain /bdrv-drain/attach/drain PASS 5 ahci-test /x86_64/ahci/hba_enable ==10387==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bdrv-graph-mod -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bdrv-graph-mod" ==10391==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-bdrv-graph-mod /bdrv-graph-mod/update-perm-tree PASS 2 test-bdrv-graph-mod /bdrv-graph-mod/should-update-child MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-blockjob -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-blockjob" ==10399==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-blockjob /blockjob/ids PASS 2 test-blockjob /blockjob/cancel/created PASS 3 test-blockjob /blockjob/cancel/running --- PASS 8 test-blockjob /blockjob/cancel/concluded PASS 6 ahci-test /x86_64/ahci/identify MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-blockjob-txn -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-blockjob-txn" ==10405==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-blockjob-txn /single/success PASS 2 test-blockjob-txn /single/failure PASS 3 test-blockjob-txn /single/cancel PASS 4 test-blockjob-txn /pair/success PASS 5 test-blockjob-txn /pair/failure ==10403==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-blockjob-txn /pair/cancel PASS 7 test-blockjob-txn /pair/fail-cancel-race MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-block-backend -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-block-backend" ==10414==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-block-backend /block-backend/drain_aio_error PASS 2 test-block-backend /block-backend/drain_all_aio_error MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-block-iothread -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-block-iothread" PASS 7 ahci-test /x86_64/ahci/max ==10420==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-block-iothread /sync-op/pread PASS 2 test-block-iothread /sync-op/pwrite PASS 3 test-block-iothread /sync-op/load_vmstate --- PASS 14 test-block-iothread /propagate/basic PASS 15 test-block-iothread /propagate/diamond PASS 16 test-block-iothread /propagate/mirror ==10422==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-image-locking -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-image-locking" ==10446==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-image-locking /image-locking/basic PASS 2 test-image-locking /image-locking/set-perm-abort MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-x86-cpuid -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-x86-cpuid" --- PASS 4 test-xbzrle /xbzrle/encode_decode_1_byte PASS 5 test-xbzrle /xbzrle/encode_decode_overflow PASS 8 ahci-test /x86_64/ahci/reset ==10458==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-xbzrle /xbzrle/encode_decode ==10458==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe8bbf0000; bottom 0x7fa3249fe000; size: 0x005b671f2000 (392572116992) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-vmstate -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-vmstate" --- PASS 9 test-int128 /int128/int128_gt PASS 10 test-int128 /int128/int128_rshift MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/rcutorture -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="rcutorture" ==10485==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10485==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff1b413000; bottom 0x7efcd13fe000; size: 0x01024a015000 (1109343162368) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 1 rcutorture /rcu/torture/1reader PASS 10 ahci-test /x86_64/ahci/io/pio/lba28/simple/low ==10519==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10519==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff71d1a000; bottom 0x7f3cac9fe000; size: 0x00c2c531c000 (836532027392) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 2 rcutorture /rcu/torture/10readers MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-list -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-list" PASS 11 ahci-test /x86_64/ahci/io/pio/lba28/simple/high ==10532==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10532==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc67b2d000; bottom 0x7f3907ffe000; size: 0x00c35fb2f000 (839124185088) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 1 test-rcu-list /rcu/qlist/single-threaded PASS 12 ahci-test /x86_64/ahci/io/pio/lba28/double/zero ==10544==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10544==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffc58a63000; bottom 0x7f5a389fe000; size: 0x00a220065000 (696321986560) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 2 test-rcu-list /rcu/qlist/short-few PASS 13 ahci-test /x86_64/ahci/io/pio/lba28/double/low ==10571==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10571==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffdf1c60000; bottom 0x7f50a0dfe000; size: 0x00ad50e62000 (744386600960) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 14 ahci-test /x86_64/ahci/io/pio/lba28/double/high ==10577==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10577==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffccdc7b000; bottom 0x7fe119dfe000; size: 0x001bb3e7d000 (118982430720) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-rcu-list /rcu/qlist/long-many MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-simpleq -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-simpleq" PASS 15 ahci-test /x86_64/ahci/io/pio/lba28/long/zero ==10590==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-rcu-simpleq /rcu/qsimpleq/single-threaded ==10590==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffed742b000; bottom 0x7f94af97c000; size: 0x006a27aaf000 (455932047360) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 16 ahci-test /x86_64/ahci/io/pio/lba28/long/low PASS 2 test-rcu-simpleq /rcu/qsimpleq/short-few ==10602==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10602==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffeeb6eb000; bottom 0x7fa994ffe000; size: 0x0055566ed000 (366522322944) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 17 ahci-test /x86_64/ahci/io/pio/lba28/long/high ==10629==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 test-rcu-simpleq /rcu/qsimpleq/long-many MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-rcu-tailq -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-rcu-tailq" PASS 18 ahci-test /x86_64/ahci/io/pio/lba28/short/zero ==10642==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-rcu-tailq /rcu/qtailq/single-threaded PASS 19 ahci-test /x86_64/ahci/io/pio/lba28/short/low ==10654==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 test-rcu-tailq /rcu/qtailq/short-few PASS 20 ahci-test /x86_64/ahci/io/pio/lba28/short/high ==10681==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10681==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7fff63d6d000; bottom 0x7f40c4bfe000; size: 0x00be9f16f000 (818712866816) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 21 ahci-test /x86_64/ahci/io/pio/lba48/simple/zero ==10687==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10687==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffce2f77000; bottom 0x7f75973fe000; size: 0x00874bb79000 (581090906112) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 3 test-rcu-tailq /rcu/qtailq/long-many --- PASS 8 test-qdist /qdist/binning/shrink MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qht -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qht" PASS 22 ahci-test /x86_64/ahci/io/pio/lba48/simple/low ==10702==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10702==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffebf6a9000; bottom 0x7fd5595fe000; size: 0x0029660ab000 (177805635584) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 23 ahci-test /x86_64/ahci/io/pio/lba48/simple/high ==10708==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10708==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe288f0000; bottom 0x7f87555fe000; size: 0x0076d32f2000 (510349221888) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 24 ahci-test /x86_64/ahci/io/pio/lba48/double/zero ==10714==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10714==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe9240f000; bottom 0x7f824cffe000; size: 0x007c45411000 (533737836544) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 25 ahci-test /x86_64/ahci/io/pio/lba48/double/low ==10720==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10720==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffd67cdb000; bottom 0x7fda43dfe000; size: 0x002323edd000 (150926643200) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 26 ahci-test /x86_64/ahci/io/pio/lba48/double/high ==10726==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10726==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe5be3c000; bottom 0x7ff2e477c000; size: 0x000b776c0000 (49248206848) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 27 ahci-test /x86_64/ahci/io/pio/lba48/long/zero ==10732==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10732==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffdd6cba000; bottom 0x7f292b3fe000; size: 0x00d4ab8bc000 (913411129344) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 28 ahci-test /x86_64/ahci/io/pio/lba48/long/low ==10738==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==10738==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffdf3325000; bottom 0x7fcb79bfe000; size: 0x003279727000 (216785907712) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 29 ahci-test /x86_64/ahci/io/pio/lba48/long/high ==10744==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 30 ahci-test /x86_64/ahci/io/pio/lba48/short/zero ==10750==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 31 ahci-test /x86_64/ahci/io/pio/lba48/short/low ==10756==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 32 ahci-test /x86_64/ahci/io/pio/lba48/short/high ==10762==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 33 ahci-test /x86_64/ahci/io/dma/lba28/fragmented PASS 1 test-qht /qht/mode/default ==10768==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 test-qht /qht/mode/resize MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qht-par -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qht-par" PASS 34 ahci-test /x86_64/ahci/io/dma/lba28/retry ==10784==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-qht-par /qht/parallel/2threads-0%updates-1s PASS 35 ahci-test /x86_64/ahci/io/dma/lba28/simple/zero ==10797==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 test-qht-par /qht/parallel/2threads-20%updates-1s MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bitops -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bitops" PASS 1 test-bitops /bitops/sextract32 --- PASS 1 check-qom-interface /qom/interface/direct_impl PASS 2 check-qom-interface /qom/interface/intermediate_impl MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/check-qom-proplist -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="check-qom-proplist" ==10819==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 check-qom-proplist /qom/proplist/createlist PASS 2 check-qom-proplist /qom/proplist/createv PASS 3 check-qom-proplist /qom/proplist/createcmdline --- PASS 4 test-crypto-hash /crypto/hash/digest PASS 5 test-crypto-hash /crypto/hash/base64 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-hmac -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-hmac" ==10851==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-hmac /crypto/hmac/iov PASS 2 test-crypto-hmac /crypto/hmac/alloc PASS 3 test-crypto-hmac /crypto/hmac/prealloc --- PASS 16 test-crypto-secret /crypto/secret/crypt/badiv MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-tlscredsx509 -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-tlscredsx509" PASS 38 ahci-test /x86_64/ahci/io/dma/lba28/double/zero ==10881==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/perfectserver PASS 2 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/perfectclient PASS 3 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca1 PASS 39 ahci-test /x86_64/ahci/io/dma/lba28/double/low PASS 4 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca2 ==10887==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodca3 PASS 6 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badca1 PASS 7 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badca2 PASS 8 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badca3 PASS 40 ahci-test /x86_64/ahci/io/dma/lba28/double/high PASS 9 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver1 ==10893==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver2 PASS 11 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver3 PASS 12 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver4 PASS 41 ahci-test /x86_64/ahci/io/dma/lba28/long/zero ==10899==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 13 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver5 PASS 42 ahci-test /x86_64/ahci/io/dma/lba28/long/low ==10905==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver6 PASS 43 ahci-test /x86_64/ahci/io/dma/lba28/long/high ==10911==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/goodserver7 PASS 16 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badserver1 PASS 17 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/badserver2 --- PASS 38 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/missingserver PASS 39 test-crypto-tlscredsx509 /qcrypto/tlscredsx509/missingclient MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-tlssession -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-tlssession" ==10917==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 45 ahci-test /x86_64/ahci/io/dma/lba28/short/low ==10928==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-tlssession /qcrypto/tlssession/psk PASS 46 ahci-test /x86_64/ahci/io/dma/lba28/short/high PASS 2 test-crypto-tlssession /qcrypto/tlssession/basicca ==10934==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 test-crypto-tlssession /qcrypto/tlssession/differentca PASS 4 test-crypto-tlssession /qcrypto/tlssession/altname1 PASS 47 ahci-test /x86_64/ahci/io/dma/lba48/simple/zero PASS 5 test-crypto-tlssession /qcrypto/tlssession/altname2 ==10940==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 test-crypto-tlssession /qcrypto/tlssession/altname3 PASS 48 ahci-test /x86_64/ahci/io/dma/lba48/simple/low ==10946==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 49 ahci-test /x86_64/ahci/io/dma/lba48/simple/high PASS 7 test-crypto-tlssession /qcrypto/tlssession/altname4 ==10952==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 50 ahci-test /x86_64/ahci/io/dma/lba48/double/zero ==10958==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 test-crypto-tlssession /qcrypto/tlssession/altname5 PASS 51 ahci-test /x86_64/ahci/io/dma/lba48/double/low PASS 9 test-crypto-tlssession /qcrypto/tlssession/altname6 ==10964==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 test-crypto-tlssession /qcrypto/tlssession/wildcard1 PASS 52 ahci-test /x86_64/ahci/io/dma/lba48/double/high PASS 11 test-crypto-tlssession /qcrypto/tlssession/wildcard2 ==10970==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 53 ahci-test /x86_64/ahci/io/dma/lba48/long/zero PASS 12 test-crypto-tlssession /qcrypto/tlssession/wildcard3 ==10976==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 13 test-crypto-tlssession /qcrypto/tlssession/wildcard4 PASS 14 test-crypto-tlssession /qcrypto/tlssession/wildcard5 PASS 54 ahci-test /x86_64/ahci/io/dma/lba48/long/low ==10982==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 55 ahci-test /x86_64/ahci/io/dma/lba48/long/high ==10988==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 56 ahci-test /x86_64/ahci/io/dma/lba48/short/zero ==10994==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 test-crypto-tlssession /qcrypto/tlssession/wildcard6 PASS 57 ahci-test /x86_64/ahci/io/dma/lba48/short/low PASS 16 test-crypto-tlssession /qcrypto/tlssession/cachain MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-qga -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-qga" ==11000==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 58 ahci-test /x86_64/ahci/io/dma/lba48/short/high PASS 1 test-qga /qga/sync-delimited PASS 2 test-qga /qga/sync --- PASS 15 test-qga /qga/invalid-cmd PASS 16 test-qga /qga/invalid-args PASS 17 test-qga /qga/fsfreeze-status ==11012==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 59 ahci-test /x86_64/ahci/io/ncq/simple PASS 18 test-qga /qga/blacklist PASS 19 test-qga /qga/config PASS 20 test-qga /qga/guest-exec PASS 21 test-qga /qga/guest-exec-invalid ==11020==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 60 ahci-test /x86_64/ahci/io/ncq/retry PASS 22 test-qga /qga/guest-get-osinfo PASS 23 test-qga /qga/guest-get-host-name PASS 24 test-qga /qga/guest-get-timezone PASS 25 test-qga /qga/guest-get-users MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-timed-average -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-timed-average" ==11033==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-timed-average /timed-average/average MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-util-filemonitor -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-util-filemonitor" PASS 1 test-util-filemonitor /util/filemonitor --- PASS 8 test-io-channel-socket /io/channel/socket/unix-fd-pass PASS 9 test-io-channel-socket /io/channel/socket/unix-listen-cleanup MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-io-channel-file -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-io-channel-file" ==11072==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-io-channel-file /io/channel/file PASS 2 test-io-channel-file /io/channel/file/rdwr PASS 3 test-io-channel-file /io/channel/file/fd --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-io-channel-buffer -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-io-channel-buffer" PASS 1 test-io-channel-buffer /io/channel/buf MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-base64 -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-base64" ==11147==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-base64 /util/base64/good PASS 2 test-base64 /util/base64/embedded-nul PASS 3 test-base64 /util/base64/not-nul-terminated --- PASS 3 test-crypto-afsplit /crypto/afsplit/sha256/big PASS 4 test-crypto-afsplit /crypto/afsplit/sha1/1000 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-crypto-xts -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-crypto-xts" ==11172==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-crypto-xts /crypto/xts/t-1-key-32-ptx-32/basic PASS 2 test-crypto-xts /crypto/xts/t-1-key-32-ptx-32/split PASS 3 test-crypto-xts /crypto/xts/t-1-key-32-ptx-32/unaligned --- PASS 1 test-logging /logging/parse_range PASS 2 test-logging /logging/parse_path MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-replication -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-replication" ==11200==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 test-replication /replication/primary/read PASS 2 test-replication /replication/primary/write PASS 3 test-replication /replication/primary/start --- PASS 6 test-replication /replication/primary/get_error_all PASS 63 ahci-test /x86_64/ahci/flush/migrate PASS 7 test-replication /replication/secondary/read ==11206==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 test-replication /replication/secondary/write ==11211==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11200==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffe30b0c000; bottom 0x7f1509bfc000; size: 0x00e926f10000 (1001380708352) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 9 test-replication /replication/secondary/start PASS 64 ahci-test /x86_64/ahci/migrate/sanity ==11230==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11235==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 test-replication /replication/secondary/stop PASS 11 test-replication /replication/secondary/do_checkpoint PASS 65 ahci-test /x86_64/ahci/migrate/dma/simple PASS 12 test-replication /replication/secondary/get_error_all ==11253==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} tests/test-bufferiszero -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-bufferiszero" ==11262==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 66 ahci-test /x86_64/ahci/migrate/dma/halted ==11272==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11277==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 67 ahci-test /x86_64/ahci/migrate/ncq/simple ==11286==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11291==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 68 ahci-test /x86_64/ahci/migrate/ncq/halted ==11300==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 69 ahci-test /x86_64/ahci/cdrom/eject ==11305==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 70 ahci-test /x86_64/ahci/cdrom/dma/single ==11311==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 71 ahci-test /x86_64/ahci/cdrom/dma/multi ==11317==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 72 ahci-test /x86_64/ahci/cdrom/pio/single ==11323==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! ==11323==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x7ffcfdd0e000; bottom 0x7fc5df1fe000; size: 0x00371eb10000 (236738117632) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 PASS 73 ahci-test /x86_64/ahci/cdrom/pio/multi ==11329==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 74 ahci-test /x86_64/ahci/cdrom/pio/bcl MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/hd-geo-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="hd-geo-test" PASS 1 hd-geo-test /x86_64/hd-geo/ide/none ==11343==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 hd-geo-test /x86_64/hd-geo/ide/drive/cd_0 ==11349==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/blank ==11355==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/lba ==11361==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 hd-geo-test /x86_64/hd-geo/ide/drive/mbr/chs ==11367==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 hd-geo-test /x86_64/hd-geo/ide/device/mbr/blank ==11373==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 hd-geo-test /x86_64/hd-geo/ide/device/mbr/lba ==11379==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 hd-geo-test /x86_64/hd-geo/ide/device/mbr/chs ==11385==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 9 hd-geo-test /x86_64/hd-geo/ide/device/user/chs ==11390==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 hd-geo-test /x86_64/hd-geo/ide/device/user/chst MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/boot-order-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="boot-order-test" PASS 1 test-bufferiszero /cutils/bufferiszero --- Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11475==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 1 bios-tables-test /x86_64/acpi/piix4 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11481==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 2 bios-tables-test /x86_64/acpi/q35 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11487==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 bios-tables-test /x86_64/acpi/piix4/bridge Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11493==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 bios-tables-test /x86_64/acpi/piix4/ipmi Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11499==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 5 bios-tables-test /x86_64/acpi/piix4/cpuhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11506==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 6 bios-tables-test /x86_64/acpi/piix4/memhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11512==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 7 bios-tables-test /x86_64/acpi/piix4/numamem Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11518==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 8 bios-tables-test /x86_64/acpi/piix4/dimmpxm Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11527==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 9 bios-tables-test /x86_64/acpi/q35/bridge Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11533==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 10 bios-tables-test /x86_64/acpi/q35/mmio64 Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11539==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 11 bios-tables-test /x86_64/acpi/q35/ipmi Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11545==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 12 bios-tables-test /x86_64/acpi/q35/cpuhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11552==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 13 bios-tables-test /x86_64/acpi/q35/memhp Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11558==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 14 bios-tables-test /x86_64/acpi/q35/numamem Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory qemu-system-x86_64: Back to tcg accelerator ==11564==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 15 bios-tables-test /x86_64/acpi/q35/dimmpxm MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/boot-serial-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="boot-serial-test" PASS 1 boot-serial-test /x86_64/boot-serial/isapc --- PASS 1 i440fx-test /x86_64/i440fx/defaults PASS 2 i440fx-test /x86_64/i440fx/pam PASS 3 i440fx-test /x86_64/i440fx/firmware/bios ==11648==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 4 i440fx-test /x86_64/i440fx/firmware/pflash MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/fw_cfg-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="fw_cfg-test" PASS 1 fw_cfg-test /x86_64/fw_cfg/signature --- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/drive_del-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="drive_del-test" PASS 1 drive_del-test /x86_64/drive_del/without-dev PASS 2 drive_del-test /x86_64/drive_del/after_failed_device_add ==11736==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases! PASS 3 drive_del-test /x86_64/blockdev/drive_del_device_del MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/wdt_ib700-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="wdt_ib700-test" PASS 1 wdt_ib700-test /x86_64/wdt_ib700/pause --- PASS 3 ivshmem-test /x86_64/ivshmem/memdev MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))} QTEST_QEMU_BINARY=x86_64-softmmu/qemu-system-x86_64 QTEST_QEMU_IMG=qemu-img tests/dbus-vmstate-test -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="dbus-vmstate-test" ** GLib-GIO:ERROR:../gio/gtestdbus.c:619:start_daemon: assertion failed (error == NULL): Failed to execute child process ?dbus-daemon? (No such file or directory) (g-exec-error-quark, 8) ERROR - Bail out! GLib-GIO:ERROR:../gio/gtestdbus.c:619:start_daemon: assertion failed (error == NULL): Failed to execute child process ?dbus-daemon? (No such file or directory) (g-exec-error-quark, 8) make: *** [/tmp/qemu-test/src/tests/Makefile.include:912: check-qtest-x86_64] Error 1 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): The full log is available at http://patchew.org/logs/20190708072437.3339-1-marcandre.lureau@redhat.com/testing.asan/?type=message. --- Email generated automatically by Patchew [https://patchew.org/]. Please send your feedback to patchew-devel@redhat.com ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau ` (4 preceding siblings ...) 2019-07-08 9:35 ` no-reply @ 2019-07-08 15:44 ` Dr. David Alan Gilbert 2019-07-08 16:08 ` Daniel P. Berrangé 2019-07-08 16:04 ` Daniel P. Berrangé 6 siblings, 1 reply; 23+ messages in thread From: Dr. David Alan Gilbert @ 2019-07-08 15:44 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, berrange, Juan Quintela, qemu-devel, Paolo Bonzini * 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. Some very high level questions: a) If I've got two QEMU's running, how do the right devices end up migrating to the right qemu? b) Why use dbus for the comms? Don't all of the daemons have some protocol'd socket between QEMU and the daemon? If so they could send up a separate FD for migration data c) Your 1MB limit is pretty aribtary - it's nice to have a limit but it's hard to justify why it's that one. Dave > Thus helpers can easily have their state migrated with QEMU, without > implementing ad-hoc support (such as done for TPM emulation) > > I chose D-Bus as it 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) > > The D-Bus protocol can be made to work peer-to-peer, but the most > common and practical way is through a bus daemon. This also has the > advantage of increased debuggability (you can eavesdrop on the bus and > introspect it). > > dbus-vmstate is put into use by the libvirt series "[PATCH 00/23] Use > a slirp helper process". > > Marc-André Lureau (3): > qemu-file: move qemu_{get,put}_counted_string() declarations > tests: add qtest_set_exit_status() > Add dbus-vmstate object > > MAINTAINERS | 6 + > backends/Makefile.objs | 4 + > backends/dbus-vmstate.c | 497 ++++++++++++++++++++++++++++ > configure | 7 + > docs/interop/dbus-vmstate.rst | 64 ++++ > docs/interop/index.rst | 1 + > include/migration/qemu-file-types.h | 4 + > migration/qemu-file.h | 4 - > tests/Makefile.include | 18 +- > tests/dbus-vmstate-test.c | 387 ++++++++++++++++++++++ > tests/dbus-vmstate1.xml | 12 + > tests/libqtest.c | 41 +-- > tests/libqtest.h | 9 + > 13 files changed, 1030 insertions(+), 24 deletions(-) > create mode 100644 backends/dbus-vmstate.c > create mode 100644 docs/interop/dbus-vmstate.rst > create mode 100644 tests/dbus-vmstate-test.c > create mode 100644 tests/dbus-vmstate1.xml > > -- > 2.22.0.214.g8dca754b1e > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 15:44 ` Dr. David Alan Gilbert @ 2019-07-08 16:08 ` Daniel P. Berrangé 0 siblings, 0 replies; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-08 16:08 UTC (permalink / raw) To: Dr. David Alan Gilbert Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Paolo Bonzini, Marc-André Lureau On Mon, Jul 08, 2019 at 04:44:06PM +0100, Dr. David Alan Gilbert wrote: > * 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. > > Some very high level questions: > a) If I've got two QEMU's running, how do the right devices > end up migrating to the right qemu? This isn't using the normal DBus instance. It needs a new isntance of dbus-daemon to be spawned for each VM IIUC. > b) Why use dbus for the comms? Don't all of the daemons have some > protocol'd socket between QEMU and the daemon? If so they could > send up a separate FD for migration data There's two distinct aspects here - Whether to use a bus vs peer-to-peer - What protocol to run over the wire DBus defines a low level wire protocol. It just happens that it is commonly used in bus topology, but it is fine being used peer-to-peer instead. IOW, we could use Dbus as the wire encoding, and still have a direct FD betwwen QEMU & the helper program, without needign dbus-daemon present. > c) Your 1MB limit is pretty aribtary - it's nice to have a limit > but it's hard to justify why it's that one. IIRC, that's the default DBus message size limit. You can choose to raise that in the client & server impl if desired, or alternatively just pass back a memfd() handle with the DBus relpy, over which to access the bulk data out of band. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau ` (5 preceding siblings ...) 2019-07-08 15:44 ` Dr. David Alan Gilbert @ 2019-07-08 16:04 ` Daniel P. Berrangé 2019-07-09 8:26 ` Marc-André Lureau 2019-07-10 8:53 ` Paolo Bonzini 6 siblings, 2 replies; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-08 16:04 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini On Mon, Jul 08, 2019 at 11:24:34AM +0400, Marc-André Lureau 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) > > I chose D-Bus as it 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) > > The D-Bus protocol can be made to work peer-to-peer, but the most > common and practical way is through a bus daemon. This also has the > advantage of increased debuggability (you can eavesdrop on the bus and > introspect it). The downside of using the bus daemon is that we have to spawn a new instance of dbus-daemon for every QEMU VM that's running on the host, which is yet more memory overhead for each VM & another process to manage, and yet another thing to go wrong. QEMU already has a direct UNIX socket connection to the helper processes in question. I'd much rather we just had another direct UNIX socket connection to that helper, using D-Bus peer-to-peer. The benefit of debugging doesn't feel compelling enough to justify running an extra daemon for each VM. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 16:04 ` Daniel P. Berrangé @ 2019-07-09 8:26 ` Marc-André Lureau 2019-07-09 9:01 ` Daniel P. Berrangé 2019-07-10 8:53 ` Paolo Bonzini 1 sibling, 1 reply; 23+ messages in thread From: Marc-André Lureau @ 2019-07-09 8:26 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini Hi On Mon, Jul 8, 2019 at 8:04 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > The D-Bus protocol can be made to work peer-to-peer, but the most > > common and practical way is through a bus daemon. This also has the > > advantage of increased debuggability (you can eavesdrop on the bus and > > introspect it). > > The downside of using the bus daemon is that we have to spawn a new > instance of dbus-daemon for every QEMU VM that's running on the host, > which is yet more memory overhead for each VM & another process to > manage, and yet another thing to go wrong. dbus-daemon (or dbus-broker) has been optimized to fit on many devices and use cases, it doesn't take much memory (3mb for my session dbus right now). More processes to manage is inevitable. In a near future, we may have 5-10 processes running around qemu. I think dbus-daemon will be one of the easiest to deal with. (as can be seen in the dbus-vmstate test, it is very simple to start a private dbus-daemon) > > QEMU already has a direct UNIX socket connection to the helper > processes in question. I'd much rather we just had another direct > UNIX socket connection to that helper, using D-Bus peer-to-peer. > The benefit of debugging doesn't feel compelling enough to justify > running an extra daemon for each VM. I wouldn't minor the need for easier debugging. Debugging multiple processes talking to each other is really hard. Having a bus is awesome (if not required) in this case. There are other advantages of using a bus, those come to my mind: - less connections (bus topology) - configuring/enforcing policies & limits - on-demand service activation & discoverability I also think D-Bus is the IPC of choice for multi-process. It's easier to use than many other IPC due to the various tools and language bindings available. Having a common bus is a good incentive to use a common IPC, instead of a dozen of half-baked protocols. Nevertheless, I also think we could use D-Bus in peer-to-peer mode, and I did some investigation. The slirp-helper supports it. We could teach dbus-vmstate to eastablish peer-to-peer connections. Instead of receiving a bus address and list of Ids, it could have a list of dbus peer socket path. Both approaches are not incompatible, but I think the bus benefits outweigh the downside of running an extra process. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-09 8:26 ` Marc-André Lureau @ 2019-07-09 9:01 ` Daniel P. Berrangé 2019-07-09 10:47 ` Marc-André Lureau 0 siblings, 1 reply; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-09 9:01 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini On Tue, Jul 09, 2019 at 12:26:38PM +0400, Marc-André Lureau wrote: > Hi > > On Mon, Jul 8, 2019 at 8:04 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > > The D-Bus protocol can be made to work peer-to-peer, but the most > > > common and practical way is through a bus daemon. This also has the > > > advantage of increased debuggability (you can eavesdrop on the bus and > > > introspect it). > > > > The downside of using the bus daemon is that we have to spawn a new > > instance of dbus-daemon for every QEMU VM that's running on the host, > > which is yet more memory overhead for each VM & another process to > > manage, and yet another thing to go wrong. > > dbus-daemon (or dbus-broker) has been optimized to fit on many devices > and use cases, it doesn't take much memory (3mb for my session dbus > right now). > > More processes to manage is inevitable. In a near future, we may have > 5-10 processes running around qemu. I think dbus-daemon will be one of > the easiest to deal with. (as can be seen in the dbus-vmstate test, it > is very simple to start a private dbus-daemon) The increase in processes per-QEMU is a significant concern I have around complexity & manageability in general, hence a desire to avoid requiring processes unless they have a compelling reason to exist. > > QEMU already has a direct UNIX socket connection to the helper > > processes in question. I'd much rather we just had another direct > > UNIX socket connection to that helper, using D-Bus peer-to-peer. > > The benefit of debugging doesn't feel compelling enough to justify > > running an extra daemon for each VM. > > I wouldn't minor the need for easier debugging. Debugging multiple > processes talking to each other is really hard. Having a bus is > awesome (if not required) in this case. > > There are other advantages of using a bus, those come to my mind: > > - less connections (bus topology) That applies to general use of DBus, but doesn't really apply to the proposed QEMU usage, as every single helper is talking to the same QEMU endpoint. So if we have 10 helpers, in p2p mode, we get 10 sockets open between the helper & QEMU. In bus mode, we get 10 sockets open between the helper & dbus and another socket open between dbus & QEMU. The bus is only a win in connections if you have a mesh-like connection topology not hub & spoke. > - configuring/enforcing policies & limits I don't see that as an advantage. Rather it is addressing the decreased security that the bus model exposes. In peer2peer mode, the helpers can only talk to QEMU, so can't directly interact with each other. In bus mode, the helpers have a direct communications path to attack each other over, so we absolutely need policy to mitigate this increased risk. It would be better to remove that risk at any architectural level by not having a bus at all. > - on-demand service activation & discoverability Again useful for dbus in general, but I don't see any clear scenario in which this is relevant to QEMU's usage. > I also think D-Bus is the IPC of choice for multi-process. It's easier > to use than many other IPC due to the various tools and language > bindings available. Having a common bus is a good incentive to use a > common IPC, instead of a dozen of half-baked protocols. As I said, I don't have any objection to DBus as a protocol. I think it would serve our needs well, most especially because GIO has decent API bindings to using it, so we avoid having to depend on another 3rd party library for something else. I think from QEMU's POV, the only real alternative to DBus would be to build something on QMP. I prefer DBus, because JSON is a disaster for integer type handling, and DBus is more accessible for the helper apps which can easily use a DBus API of their choice. > Nevertheless, I also think we could use D-Bus in peer-to-peer mode, > and I did some investigation. The slirp-helper supports it. We could > teach dbus-vmstate to eastablish peer-to-peer connections. Instead of > receiving a bus address and list of Ids, it could have a list of dbus > peer socket path. Both approaches are not incompatible, but I think > the bus benefits outweigh the downside of running an extra process. As above I'm not seeing the compelling benefits of using a bus, so think we shoud stick to dbus in p2p mode. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-09 9:01 ` Daniel P. Berrangé @ 2019-07-09 10:47 ` Marc-André Lureau 2019-07-10 9:10 ` Daniel P. Berrangé 0 siblings, 1 reply; 23+ messages in thread From: Marc-André Lureau @ 2019-07-09 10:47 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini Hi On Tue, Jul 9, 2019 at 1:02 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > On Tue, Jul 09, 2019 at 12:26:38PM +0400, Marc-André Lureau wrote: > > Hi > > > > On Mon, Jul 8, 2019 at 8:04 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > > > The D-Bus protocol can be made to work peer-to-peer, but the most > > > > common and practical way is through a bus daemon. This also has the > > > > advantage of increased debuggability (you can eavesdrop on the bus and > > > > introspect it). > > > > > > The downside of using the bus daemon is that we have to spawn a new > > > instance of dbus-daemon for every QEMU VM that's running on the host, > > > which is yet more memory overhead for each VM & another process to > > > manage, and yet another thing to go wrong. > > > > dbus-daemon (or dbus-broker) has been optimized to fit on many devices > > and use cases, it doesn't take much memory (3mb for my session dbus > > right now). > > > > More processes to manage is inevitable. In a near future, we may have > > 5-10 processes running around qemu. I think dbus-daemon will be one of > > the easiest to deal with. (as can be seen in the dbus-vmstate test, it > > is very simple to start a private dbus-daemon) > > The increase in processes per-QEMU is a significant concern I have > around complexity & manageability in general, hence a desire to avoid > requiring processes unless they have a compelling reason to exist. Fair enough, although when the job a bus is done by some other process (libvirt, qemu or other external process), then I would much rather have dbus-daemon doing it. > > > > QEMU already has a direct UNIX socket connection to the helper > > > processes in question. I'd much rather we just had another direct > > > UNIX socket connection to that helper, using D-Bus peer-to-peer. > > > The benefit of debugging doesn't feel compelling enough to justify > > > running an extra daemon for each VM. > > > > I wouldn't minor the need for easier debugging. Debugging multiple > > processes talking to each other is really hard. Having a bus is > > awesome (if not required) in this case. > > > > There are other advantages of using a bus, those come to my mind: > > > > - less connections (bus topology) > > That applies to general use of DBus, but doesn't really apply to > the proposed QEMU usage, as every single helper is talking to the > same QEMU endpoint. So if we have 10 helpers, in p2p mode, we > get 10 sockets open between the helper & QEMU. In bus mode, we > get 10 sockets open between the helper & dbus and another socket > open between dbus & QEMU. The bus is only a win in connections > if you have a mesh-like connection topology not hub & spoke. The mesh already exist, as it's not just QEMU that want to talk to the helpers, but the management layer, and 3rd parties (debug tools, audit, other management tools etc). There are also cases where helpers may want to talk to each other. Taking networking as an example, 2 slirp interfaces may want to share the same DHCP, bootp/TFTP, filter/service provider. Redirection/forwarding may be provided on demand (chardev-like services). The same is probably true for block layers, security, GPU/display etc. In this case, the bus topology makes more sense than hiding it under. > > > - configuring/enforcing policies & limits > > I don't see that as an advantage. Rather it is addressing the > decreased security that the bus model exposes. In peer2peer > mode, the helpers can only talk to QEMU, so can't directly > interact with each other. In bus mode, the helpers have a > direct communications path to attack each other over, so we > absolutely need policy to mitigate this increased risk. It > would be better to remove that risk at any architectural > level by not having a bus at all. You can enforce security/policy at the bus level, in a single place (including with selinux/apparmor context - although I am not sure how much that gives you). If each helper process implements its own protocol, you will probably never have that kind of central enforcement. And if they exist, libvirt/management layer, qemu & helpers will have to implement it for each case... > > > - on-demand service activation & discoverability > > Again useful for dbus in general, but I don't see any clear scenario > in which this is relevant to QEMU's usage. Perhaps not to QEMU itself, but helpers could benefit it, see examples I listed above. > > > I also think D-Bus is the IPC of choice for multi-process. It's easier > > to use than many other IPC due to the various tools and language > > bindings available. Having a common bus is a good incentive to use a > > common IPC, instead of a dozen of half-baked protocols. > > As I said, I don't have any objection to DBus as a protocol. I think it > would serve our needs well, most especially because GIO has decent API > bindings to using it, so we avoid having to depend on another 3rd party > library for something else. > > I think from QEMU's POV, the only real alternative to DBus would be to > build something on QMP. I prefer DBus, because JSON is a disaster for > integer type handling, and DBus is more accessible for the helper apps > which can easily use a DBus API of their choice. I am glad we can agree on that! > > > Nevertheless, I also think we could use D-Bus in peer-to-peer mode, > > and I did some investigation. The slirp-helper supports it. We could > > teach dbus-vmstate to eastablish peer-to-peer connections. Instead of > > receiving a bus address and list of Ids, it could have a list of dbus > > peer socket path. Both approaches are not incompatible, but I think > > the bus benefits outweigh the downside of running an extra process. > > As above I'm not seeing the compelling benefits of using a bus, so > think we shoud stick to dbus in p2p mode. As you can see, there are benefits in having a bus. But if there are strong concerns about it, I can also work on the p2p mode. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-09 10:47 ` Marc-André Lureau @ 2019-07-10 9:10 ` Daniel P. Berrangé 0 siblings, 0 replies; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-10 9:10 UTC (permalink / raw) To: Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Paolo Bonzini On Tue, Jul 09, 2019 at 02:47:32PM +0400, Marc-André Lureau wrote: > Hi > > On Tue, Jul 9, 2019 at 1:02 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > > > On Tue, Jul 09, 2019 at 12:26:38PM +0400, Marc-André Lureau wrote: > > > Hi > > > > > > On Mon, Jul 8, 2019 at 8:04 PM Daniel P. Berrangé <berrange@redhat.com> wrote: > > > > QEMU already has a direct UNIX socket connection to the helper > > > > processes in question. I'd much rather we just had another direct > > > > UNIX socket connection to that helper, using D-Bus peer-to-peer. > > > > The benefit of debugging doesn't feel compelling enough to justify > > > > running an extra daemon for each VM. > > > > > > I wouldn't minor the need for easier debugging. Debugging multiple > > > processes talking to each other is really hard. Having a bus is > > > awesome (if not required) in this case. > > > > > > There are other advantages of using a bus, those come to my mind: > > > > > > - less connections (bus topology) > > > > That applies to general use of DBus, but doesn't really apply to > > the proposed QEMU usage, as every single helper is talking to the > > same QEMU endpoint. So if we have 10 helpers, in p2p mode, we > > get 10 sockets open between the helper & QEMU. In bus mode, we > > get 10 sockets open between the helper & dbus and another socket > > open between dbus & QEMU. The bus is only a win in connections > > if you have a mesh-like connection topology not hub & spoke. > > The mesh already exist, as it's not just QEMU that want to talk to the > helpers, but the management layer, and 3rd parties (debug tools, > audit, other management tools etc). There are also cases where helpers > may want to talk to each other. Taking networking as an example, 2 > slirp interfaces may want to share the same DHCP, bootp/TFTP, > filter/service provider. Redirection/forwarding may be provided on > demand (chardev-like services). The same is probably true for block > layers, security, GPU/display etc. In this case, the bus topology > makes more sense than hiding it under. These are alot of scenarios / use cases not described in the cover letter for this series. I'm reviewing this series from the POV of the need to transfer vmstate from a helper back to QEMU, which was the scenario in the cover letter. From this I see no need for a bus. If you think there's a more general use cases involving QEMU backends that will need the bus, then I think the bigger picture needs to be described when proposing the use of the bus, instead of only describing the very simple vmstate use case as the motivation. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-08 16:04 ` Daniel P. Berrangé 2019-07-09 8:26 ` Marc-André Lureau @ 2019-07-10 8:53 ` Paolo Bonzini 2019-07-10 9:03 ` Daniel P. Berrangé 1 sibling, 1 reply; 23+ messages in thread From: Paolo Bonzini @ 2019-07-10 8:53 UTC (permalink / raw) To: Daniel P. Berrangé, Marc-André Lureau Cc: Laurent Vivier, Thomas Huth, qemu-devel, Dr. David Alan Gilbert, Juan Quintela On 08/07/19 18:04, Daniel P. Berrangé wrote: > The downside of using the bus daemon is that we have to spawn a new > instance of dbus-daemon for every QEMU VM that's running on the host, > which is yet more memory overhead for each VM & another process to > manage, and yet another thing to go wrong. > > QEMU already has a direct UNIX socket connection to the helper > processes in question. I'd much rather we just had another direct > UNIX socket connection to that helper, using D-Bus peer-to-peer. > The benefit of debugging doesn't feel compelling enough to justify > running an extra daemon for each VM. Would it be possible to make QEMU the broker? That is, how hard would it be to embed a minimal DBus broker (which only takes care of connecting servers and clients---stuff like launching servers would be completely out of scope)? Would it for example make sense to split the bus handling part of dbus-broker into a library that QEMU could reuse? (And if we plan to do this, should QEMU use sd-bus instead of gdbus?) In QOM that would be something like -object dbus-connection,id=client1,chardev=...,addr=foo # p2p -object dbus-vmstate,connection=client1 # the interface -object dbus-connection,id=client1,addr=foo # via external daemon -object dbus-vmstate,client=client1 # the interface -object dbus-session,id=session1,chardev=... -object dbus-connection,id=client1,session=session1,addr=foo # via internal daemon -object dbus-vmstate,client=client1 # the interface Paolo ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-10 8:53 ` Paolo Bonzini @ 2019-07-10 9:03 ` Daniel P. Berrangé 2019-07-10 9:54 ` Paolo Bonzini 0 siblings, 1 reply; 23+ messages in thread From: Daniel P. Berrangé @ 2019-07-10 9:03 UTC (permalink / raw) To: Paolo Bonzini Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Marc-André Lureau On Wed, Jul 10, 2019 at 10:53:10AM +0200, Paolo Bonzini wrote: > On 08/07/19 18:04, Daniel P. Berrangé wrote: > > The downside of using the bus daemon is that we have to spawn a new > > instance of dbus-daemon for every QEMU VM that's running on the host, > > which is yet more memory overhead for each VM & another process to > > manage, and yet another thing to go wrong. > > > > QEMU already has a direct UNIX socket connection to the helper > > processes in question. I'd much rather we just had another direct > > UNIX socket connection to that helper, using D-Bus peer-to-peer. > > The benefit of debugging doesn't feel compelling enough to justify > > running an extra daemon for each VM. > > Would it be possible to make QEMU the broker? That is, how hard would it > be to embed a minimal DBus broker (which only takes care of connecting servers > and clients---stuff like launching servers would be completely out of scope)? What would be the benefit of embedding it in QEMU ? I see significant security downside to that which would mean its not something I'd want to support. If we accept the need for a bus then this implies there's a need for service <-> service messages, where neither service is QEMU. This in turn requires enforcement of security policies for the separation of services. It is highly desirable, if not mandatory, to have such security enforcement outside the QEMU address space, given that QEMU is an untrustworthy component. > Would it for example make sense to split the bus handling part of dbus-broker > into a library that QEMU could reuse? (And if we plan to do this, should QEMU > use sd-bus instead of gdbus?) > > In QOM that would be something like > > -object dbus-connection,id=client1,chardev=...,addr=foo # p2p > -object dbus-vmstate,connection=client1 # the interface > > -object dbus-connection,id=client1,addr=foo # via external daemon > -object dbus-vmstate,client=client1 # the interface > > -object dbus-session,id=session1,chardev=... > -object dbus-connection,id=client1,session=session1,addr=foo # via internal daemon > -object dbus-vmstate,client=client1 # the interface From my POV I only see two viable options. Either p2p with no bus & QEMU being one endpoint so there's no requirement for security policies, or bus based mesh with an external process to enforce security policy. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] Add dbus-vmstate 2019-07-10 9:03 ` Daniel P. Berrangé @ 2019-07-10 9:54 ` Paolo Bonzini 0 siblings, 0 replies; 23+ messages in thread From: Paolo Bonzini @ 2019-07-10 9:54 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Laurent Vivier, Thomas Huth, Juan Quintela, qemu-devel, Dr. David Alan Gilbert, Marc-André Lureau On 10/07/19 11:03, Daniel P. Berrangé wrote: >> Would it be possible to make QEMU the broker? That is, how hard would it >> be to embed a minimal DBus broker (which only takes care of connecting servers >> and clients---stuff like launching servers would be completely out of scope)? > What would be the benefit of embedding it in QEMU ? If in the future we want to keep only the multiprocess case then QEMU would be able to launch subprocesses itself. In this case you'd keep the old command line working but QEMU would set up the bus and the services that work together on it (for example the basic QOM operations such as unparent and property get/set could be mapped to a DBus interface, and QOM classes and interfaces could also become DBus interfaces). The broker itself could be a separate subprocess. Paolo ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2019-07-17 11:50 UTC | newest] Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-07-08 7:24 [Qemu-devel] [PATCH 0/3] Add dbus-vmstate Marc-André Lureau 2019-07-08 7:24 ` [Qemu-devel] [PATCH 1/3] qemu-file: move qemu_{get, put}_counted_string() declarations Marc-André Lureau 2019-07-08 8:03 ` Juan Quintela 2019-07-08 7:24 ` [Qemu-devel] [PATCH 2/3] tests: add qtest_set_exit_status() Marc-André Lureau 2019-07-08 8:04 ` Juan Quintela 2019-07-17 11:50 ` Thomas Huth 2019-07-08 7:24 ` [Qemu-devel] [PATCH 3/3] Add dbus-vmstate object Marc-André Lureau 2019-07-08 8:41 ` Juan Quintela 2019-07-08 16:11 ` Eric Blake 2019-07-10 6:14 ` Paolo Bonzini 2019-07-10 8:05 ` Daniel P. Berrangé 2019-07-08 8:01 ` [Qemu-devel] [PATCH 0/3] Add dbus-vmstate no-reply 2019-07-08 9:35 ` no-reply 2019-07-08 15:44 ` Dr. David Alan Gilbert 2019-07-08 16:08 ` Daniel P. Berrangé 2019-07-08 16:04 ` Daniel P. Berrangé 2019-07-09 8:26 ` Marc-André Lureau 2019-07-09 9:01 ` Daniel P. Berrangé 2019-07-09 10:47 ` Marc-André Lureau 2019-07-10 9:10 ` Daniel P. Berrangé 2019-07-10 8:53 ` Paolo Bonzini 2019-07-10 9:03 ` Daniel P. Berrangé 2019-07-10 9:54 ` Paolo Bonzini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).