From b971b81094e2d0ccddbf58ede4782f7d2638aa35 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Jul 10 2020 01:39:13 +0000 Subject: import libvirt-6.0.0-25.module+el8.3.0+7176+57f10f42 --- diff --git a/SOURCES/libvirt-conf-Don-t-format-http-cookies-unless-VIR_DOMAIN_DEF_FORMAT_SECURE-is-used.patch b/SOURCES/libvirt-conf-Don-t-format-http-cookies-unless-VIR_DOMAIN_DEF_FORMAT_SECURE-is-used.patch new file mode 100644 index 0000000..6c4c17c --- /dev/null +++ b/SOURCES/libvirt-conf-Don-t-format-http-cookies-unless-VIR_DOMAIN_DEF_FORMAT_SECURE-is-used.patch @@ -0,0 +1,58 @@ +From 898e0003ae21e9fbe49995980c8746e9d2ac9b8b Mon Sep 17 00:00:00 2001 +Message-Id: <898e0003ae21e9fbe49995980c8746e9d2ac9b8b@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 14:23:06 +0200 +Subject: [PATCH] conf: Don't format http cookies unless + VIR_DOMAIN_DEF_FORMAT_SECURE is used + +Starting with 3b076391befc3fe72deb0c244ac6c2b4c100b410 +(v6.1.0-122-g3b076391be) we support http cookies. Since they may contain +somewhat sensitive information we should not format them into the XML +unless VIR_DOMAIN_DEF_FORMAT_SECURE is asserted. + +Reported-by: Han Han +Signed-off-by: Peter Krempa +Reviewed-by: Erik Skultety +(cherry picked from commit a5b064bf4b17a9884d7d361733737fb614ad8979) + +CVE-2020-14301 +Message-Id: <592a0b594666f580e743b6bd2b4ddccbd1e0cc7c.1592914898.git.pkrempa@redhat.com> + +Reviewed-by: Jiri Denemark +--- + src/conf/domain_conf.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index ed9ca0e9d8..60962ee7c1 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -24377,11 +24377,15 @@ virDomainSourceDefFormatSeclabel(virBufferPtr buf, + + static void + virDomainDiskSourceFormatNetworkCookies(virBufferPtr buf, +- virStorageSourcePtr src) ++ virStorageSourcePtr src, ++ unsigned int flags) + { + g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); + size_t i; + ++ if (!(flags & VIR_DOMAIN_DEF_FORMAT_SECURE)) ++ return; ++ + for (i = 0; i < src->ncookies; i++) { + virBufferEscapeString(&childBuf, "", src->cookies[i]->name); + virBufferEscapeString(&childBuf, "%s\n", src->cookies[i]->value); +@@ -24442,7 +24446,7 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, + virTristateBoolTypeToString(src->sslverify)); + } + +- virDomainDiskSourceFormatNetworkCookies(childBuf, src); ++ virDomainDiskSourceFormatNetworkCookies(childBuf, src, flags); + + if (src->readahead) + virBufferAsprintf(childBuf, "\n", src->readahead); +-- +2.27.0 + diff --git a/SOURCES/libvirt-conf-add-new-PCI_CONNECT-flag-AUTOASSIGN.patch b/SOURCES/libvirt-conf-add-new-PCI_CONNECT-flag-AUTOASSIGN.patch new file mode 100644 index 0000000..7e0dba2 --- /dev/null +++ b/SOURCES/libvirt-conf-add-new-PCI_CONNECT-flag-AUTOASSIGN.patch @@ -0,0 +1,87 @@ +From 2780cb41f7682741be2bbe662d629dd1bd3b4f6e Mon Sep 17 00:00:00 2001 +Message-Id: <2780cb41f7682741be2bbe662d629dd1bd3b4f6e@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:10 -0400 +Subject: [PATCH] conf: add new PCI_CONNECT flag AUTOASSIGN + +This new flag will be set for any controller that we decide can have +devices assigned to it automatically during PCI device assignment. In +the past PCI_CONNECT_TYPE_HOTPLUGGABLE was used for this purpose, but +that is overloading that flag, and no longer technically correct; what +we *really* want is to auto-assign devices to any pcie-root-port or +pcie-switch-downstream-port regardless of whether or not that +controller happens to have hotplug enabled. + +This patch just adds the flag, but doesn't use it at all. Note that +the numbering of all the other flags was changed in order to insert +the new flag near the beginning of the list; that doesn't cause any +problem because the connect flags aren't stored anywhere between runs +of libvirtd. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit c296a846ad7de3066a17404f4f407d3e1b6d7935) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-8-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.h | 41 +++++++++++++++++++++-------------------- + 1 file changed, 21 insertions(+), 20 deletions(-) + +diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h +index dcb90618f8..40738ddb72 100644 +--- a/src/conf/domain_addr.h ++++ b/src/conf/domain_addr.h +@@ -32,26 +32,27 @@ typedef enum { + } virPCIDeviceAddressExtensionFlags; + + typedef enum { +- VIR_PCI_CONNECT_HOTPLUGGABLE = 1 << 0, /* is hotplug needed/supported */ +- +- /* set for devices that can share a single slot in auto-assignment +- * (by assigning one device to each of the 8 functions on the slot) +- */ +- VIR_PCI_CONNECT_AGGREGATE_SLOT = 1 << 1, +- +- /* kinds of devices as a bitmap so they can be combined (some PCI +- * controllers permit connecting multiple types of devices) +- */ +- VIR_PCI_CONNECT_TYPE_PCI_DEVICE = 1 << 2, +- VIR_PCI_CONNECT_TYPE_PCIE_DEVICE = 1 << 3, +- VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT = 1 << 4, +- VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT = 1 << 5, +- VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT = 1 << 6, +- VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE = 1 << 7, +- VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS = 1 << 8, +- VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS = 1 << 9, +- VIR_PCI_CONNECT_TYPE_PCI_BRIDGE = 1 << 10, +- VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE = 1 << 11, ++ VIR_PCI_CONNECT_AUTOASSIGN = 1 << 0, /* okay to autoassign a device to this controller */ ++ VIR_PCI_CONNECT_HOTPLUGGABLE = 1 << 1, /* is hotplug needed/supported */ ++ ++ /* set for devices that can share a single slot in auto-assignment ++ * (by assigning one device to each of the 8 functions on the slot) ++ */ ++ VIR_PCI_CONNECT_AGGREGATE_SLOT = 1 << 2, ++ ++ /* kinds of devices as a bitmap so they can be combined (some PCI ++ * controllers permit connecting multiple types of devices) ++ */ ++ VIR_PCI_CONNECT_TYPE_PCI_DEVICE = 1 << 3, ++ VIR_PCI_CONNECT_TYPE_PCIE_DEVICE = 1 << 4, ++ VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT = 1 << 5, ++ VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT = 1 << 6, ++ VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT = 1 << 7, ++ VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE = 1 << 8, ++ VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS = 1 << 9, ++ VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS = 1 << 10, ++ VIR_PCI_CONNECT_TYPE_PCI_BRIDGE = 1 << 11, ++ VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE = 1 << 12, + } virDomainPCIConnectFlags; + + /* a combination of all bits that describe the type of connections +-- +2.26.2 + diff --git a/SOURCES/libvirt-conf-backup-Store-incremental-backup-checkpoint-name-per-disk.patch b/SOURCES/libvirt-conf-backup-Store-incremental-backup-checkpoint-name-per-disk.patch new file mode 100644 index 0000000..acc76c3 --- /dev/null +++ b/SOURCES/libvirt-conf-backup-Store-incremental-backup-checkpoint-name-per-disk.patch @@ -0,0 +1,67 @@ +From 7f5c44bfd2b6290e142380775b6a6205ccc43840 Mon Sep 17 00:00:00 2001 +Message-Id: <7f5c44bfd2b6290e142380775b6a6205ccc43840@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:37 +0200 +Subject: [PATCH] conf: backup: Store incremental backup checkpoint name + per-disk +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In preparation to allow heterogenous backups store the 'incremental' +field per-disk and fill it by default from the per-backup field. + +Having this will be important once we'll want to allow incremental +backup working while hotplugging a new disk. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit b8295160c36e555d8bcaef5015d0c1e3ae85fb17) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/conf/backup_conf.c | 8 ++++++++ + src/conf/backup_conf.h | 1 + + 2 files changed, 9 insertions(+) + +diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c +index 64c8f6cc09..58fb3ec759 100644 +--- a/src/conf/backup_conf.c ++++ b/src/conf/backup_conf.c +@@ -71,6 +71,7 @@ virDomainBackupDefFree(virDomainBackupDefPtr def) + virDomainBackupDiskDefPtr disk = def->disks + i; + + g_free(disk->name); ++ g_free(disk->incremental); + g_free(disk->exportname); + g_free(disk->exportbitmap); + virObjectUnref(disk->store); +@@ -503,5 +504,12 @@ virDomainBackupAlignDisks(virDomainBackupDefPtr def, + } + } + ++ for (i = 0; i < def->ndisks; i++) { ++ virDomainBackupDiskDefPtr backupdisk = &def->disks[i]; ++ ++ if (def->incremental && !backupdisk->incremental) ++ backupdisk->incremental = g_strdup(def->incremental); ++ } ++ + return 0; + } +diff --git a/src/conf/backup_conf.h b/src/conf/backup_conf.h +index 672fd52ee7..7ce7a46ad4 100644 +--- a/src/conf/backup_conf.h ++++ b/src/conf/backup_conf.h +@@ -51,6 +51,7 @@ typedef virDomainBackupDiskDef *virDomainBackupDiskDefPtr; + struct _virDomainBackupDiskDef { + char *name; /* name matching the +From: Laine Stump +Date: Sun, 26 Apr 2020 13:17:02 -0400 +Subject: [PATCH] conf: check HOTPLUGGABLE connect flag when validating a PCI + address + +The HOTPLUGGABLE flag is set for appropriates buses in a PCI address +set, and thnis patch updates virDomainPCIAddressFlagsCompatible() to +check the HOTPLUGGABLE flag when searching for a suitable bus/slot for +a device. No devices request HOTPLUGGABLE though (yet), so there is no +observable effect. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit a283189f8c64882681ea99259ccfc8d1b8e524dd) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426171703.18808-2-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index cc45a0bbf1..ed41eca114 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -376,6 +376,18 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddressPtr addr, + return false; + } + ++ if ((devFlags & VIR_PCI_CONNECT_HOTPLUGGABLE) && ++ !(busFlags & VIR_PCI_CONNECT_HOTPLUGGABLE)) { ++ if (reportError) { ++ virReportError(errType, ++ _("The device at PCI address %s requires " ++ "hotplug capability, but the PCI controller " ++ "with index='%d' doesn't support hotplug"), ++ addrStr, addr->bus); ++ } ++ return false; ++ } ++ + /* If this bus doesn't allow the type of connection (PCI + * vs. PCIe) required by the device, or if the device requires + * hot-plug and this bus doesn't have it, return false. +-- +2.26.2 + diff --git a/SOURCES/libvirt-conf-during-PCI-hotplug-require-that-the-controller-support-hotplug.patch b/SOURCES/libvirt-conf-during-PCI-hotplug-require-that-the-controller-support-hotplug.patch new file mode 100644 index 0000000..a66d8c1 --- /dev/null +++ b/SOURCES/libvirt-conf-during-PCI-hotplug-require-that-the-controller-support-hotplug.patch @@ -0,0 +1,47 @@ +From 5ec240811e391f97378d0b6b726e0dee13ae8a40 Mon Sep 17 00:00:00 2001 +Message-Id: <5ec240811e391f97378d0b6b726e0dee13ae8a40@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:17:03 -0400 +Subject: [PATCH] conf: during PCI hotplug, require that the controller support + hotplug + +Before this patch we would simply rely on QEMU failing to attach the +device. Since we have a flag in the address set telling us which +controllers support hotplug, we can fail the operation sooner. + +This also assures that when hotplugging with no provided PCI address, +that we skip any controllers with hotplug='off', and attempt to assign +the device to a controller that not only supports hotplug, but also +has it enabled. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit 7118bdee1550b6022e7362402ca8204add4cf80b) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426171703.18808-3-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index ed41eca114..34ea7bc051 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -936,6 +936,11 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, + if (!flags) + return 0; + ++ /* This function is only called during hotplug, so we require hotplug ++ * support from the controller. ++ */ ++ flags |= VIR_PCI_CONNECT_HOTPLUGGABLE; ++ + if (!(addrStr = virPCIDeviceAddressAsString(&dev->addr.pci))) + goto cleanup; + +-- +2.26.2 + diff --git a/SOURCES/libvirt-conf-new-attribute-hotplug-for-pci-controllers.patch b/SOURCES/libvirt-conf-new-attribute-hotplug-for-pci-controllers.patch new file mode 100644 index 0000000..7d6bd50 --- /dev/null +++ b/SOURCES/libvirt-conf-new-attribute-hotplug-for-pci-controllers.patch @@ -0,0 +1,290 @@ +From 12892e0376be4dc07dc317b807f2ec86c27a94b2 Mon Sep 17 00:00:00 2001 +Message-Id: <12892e0376be4dc07dc317b807f2ec86c27a94b2@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:07 -0400 +Subject: [PATCH] conf: new attribute "hotplug" for pci controllers + +a element can now have a "hotplug" +attribute in the subelement. This is intended to control +whether or not the slot(s) of the controller support +hotplugging/unplugging a device: + + + + + +The default value of hotplug is "on". + +Since support for configuring such an option is hypervisor-dependent +(and will vary among different types of PCI controllers even on a +single hypervisor), no validation is done in this patch - that +validation will be done in the patch that wires support for the +setting into the hypervisor. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit 78f4d5e6f188a9f0f8d6da6b1fe78b9f4172d9ad) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump + +Conflicts/Changes from upstread: + + tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml: + + had to be modified to remove reference to the qemu64 CPU type. + +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-5-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + docs/formatdomain.html.in | 11 +++ + docs/schemas/domaincommon.rng | 5 ++ + src/conf/domain_conf.c | 20 +++++- + src/conf/domain_conf.h | 1 + + .../pcie-root-port-nohotplug.xml | 35 ++++++++++ + ...pcie-root-port-nohotplug.x86_64-latest.xml | 67 +++++++++++++++++++ + tests/qemuxml2xmltest.c | 2 +- + 7 files changed, 139 insertions(+), 2 deletions(-) + create mode 100644 tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml + create mode 100644 tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml + +diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in +index 9c588185df..76799f5ffc 100644 +--- a/docs/formatdomain.html.in ++++ b/docs/formatdomain.html.in +@@ -4651,6 +4651,17 @@ + which is visible to the virtual machine. If set, port must be + between 0 and 255. + ++
hotplug
++
++ pcie-root-port and pcie-switch-downstream-port controllers can ++ also have a hotplug attribute in ++ the <target> subelement, which is used to ++ disable hotplug/unplug of devices on a particular ++ controller. The default setting of hotplug ++ is on; it should be set to off to ++ disable hotplug/unplug of devices on a particular controller. ++ Since 6.3.0 ++
+
busNr
+
+ pci-expander-bus and pcie-expander-bus controllers can have an +diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng +index dd8f27243a..9fda5f17e0 100644 +--- a/docs/schemas/domaincommon.rng ++++ b/docs/schemas/domaincommon.rng +@@ -2475,6 +2475,11 @@ + + + ++ ++ ++ ++ ++ + + + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 28160a2967..ed9ca0e9d8 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -10933,6 +10933,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, + g_autofree char *port = NULL; + g_autofree char *busNr = NULL; + g_autofree char *targetIndex = NULL; ++ g_autofree char *hotplug = NULL; + g_autofree char *ioeventfd = NULL; + g_autofree char *portsStr = NULL; + g_autofree char *iothread = NULL; +@@ -11004,6 +11005,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, + chassis = virXMLPropString(cur, "chassis"); + port = virXMLPropString(cur, "port"); + busNr = virXMLPropString(cur, "busNr"); ++ hotplug = virXMLPropString(cur, "hotplug"); + targetIndex = virXMLPropString(cur, "index"); + processedTarget = true; + } +@@ -11240,6 +11242,17 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, + } + def->opts.pciopts.numaNode = numaNode; + } ++ if (hotplug) { ++ int val = virTristateSwitchTypeFromString(hotplug); ++ ++ if (val <= 0) { ++ virReportError(VIR_ERR_XML_ERROR, ++ _("PCI controller unrecognized hotplug setting '%s'"), ++ hotplug); ++ goto error; ++ } ++ def->opts.pciopts.hotplug = val; ++ } + break; + case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: { + g_autofree char *gntframes = virXMLPropString(node, "maxGrantFrames"); +@@ -25112,7 +25125,8 @@ virDomainControllerDefFormat(virBufferPtr buf, + def->opts.pciopts.port != -1 || + def->opts.pciopts.busNr != -1 || + def->opts.pciopts.targetIndex != -1 || +- def->opts.pciopts.numaNode != -1) { ++ def->opts.pciopts.numaNode != -1 || ++ def->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAddLit(&childBuf, "opts.pciopts.chassisNr != -1) + virBufferAsprintf(&childBuf, " chassisNr='%d'", +@@ -25129,6 +25143,10 @@ virDomainControllerDefFormat(virBufferPtr buf, + if (def->opts.pciopts.targetIndex != -1) + virBufferAsprintf(&childBuf, " index='%d'", + def->opts.pciopts.targetIndex); ++ if (def->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_ABSENT) { ++ virBufferAsprintf(&childBuf, " hotplug='%s'", ++ virTristateSwitchTypeToString(def->opts.pciopts.hotplug)); ++ } + if (def->opts.pciopts.numaNode == -1) { + virBufferAddLit(&childBuf, "/>\n"); + } else { +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 2a382ede72..118077edaa 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -719,6 +719,7 @@ struct _virDomainPCIControllerOpts { + * item in memory target config) -1 == unspecified + */ + int numaNode; ++ virTristateSwitch hotplug; /* 'off' to prevent hotplug/unplug, default 'on' */ + }; + + struct _virDomainUSBControllerOpts { +diff --git a/tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml b/tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml +new file mode 100644 +index 0000000000..8a01494470 +--- /dev/null ++++ b/tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml +@@ -0,0 +1,35 @@ ++ ++ guest ++ 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 ++ 2097152 ++ 2097152 ++ 2 ++ ++ hvm ++ ++ ++ /usr/bin/qemu-system-x86_64 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml b/tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml +new file mode 100644 +index 0000000000..f7dbaccae9 +--- /dev/null ++++ b/tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml +@@ -0,0 +1,67 @@ ++ ++ guest ++ 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 ++ 2097152 ++ 2097152 ++ 2 ++ ++ hvm ++ ++ ++ ++ destroy ++ restart ++ destroy ++ ++ /usr/bin/qemu-system-x86_64 ++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++ ++ ++
++ ++ ++
++ ++ ++
++ ++ ++ ++ ++ ++ +diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c +index 15110dd104..c8218e423e 100644 +--- a/tests/qemuxml2xmltest.c ++++ b/tests/qemuxml2xmltest.c +@@ -953,7 +953,7 @@ mymain(void) + QEMU_CAPS_DEVICE_IOH3420); + DO_TEST("pcie-root-port-model-ioh3420", + QEMU_CAPS_DEVICE_IOH3420); +- ++ DO_TEST_CAPS_LATEST("pcie-root-port-nohotplug"); + DO_TEST("pcie-switch-upstream-port", + QEMU_CAPS_DEVICE_IOH3420, + QEMU_CAPS_DEVICE_X3130_UPSTREAM, +-- +2.26.2 + diff --git a/SOURCES/libvirt-conf-qemu-s-VIR_PCI_CONNECT_HOTPLUGGABLE-VIR_PCI_CONNECT_AUTOASSIGN-g.patch b/SOURCES/libvirt-conf-qemu-s-VIR_PCI_CONNECT_HOTPLUGGABLE-VIR_PCI_CONNECT_AUTOASSIGN-g.patch new file mode 100644 index 0000000..b6c0102 --- /dev/null +++ b/SOURCES/libvirt-conf-qemu-s-VIR_PCI_CONNECT_HOTPLUGGABLE-VIR_PCI_CONNECT_AUTOASSIGN-g.patch @@ -0,0 +1,161 @@ +From 4f2bf4edfb640c38281d63e54145433ce8a78d28 Mon Sep 17 00:00:00 2001 +Message-Id: <4f2bf4edfb640c38281d63e54145433ce8a78d28@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:11 -0400 +Subject: [PATCH] conf/qemu: + s/VIR_PCI_CONNECT_HOTPLUGGABLE/VIR_PCI_CONNECT_AUTOASSIGN/g + +When the HOTPLUGGABLE flag was originally added, it was set for all +the PCI controllers that accepted hotplugged devices, and requested +for all devices that were auto-assigned to a controller. While we're +still autoassigning to the same list of controllers, those controllers +may or may not support hotplug, so let's use the flag that fits what +we're actually doing. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit 7c98f5e3652e19e4eb015d290c1eed2f1b58ee72) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-9-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.c | 18 +++++++++--------- + src/qemu/qemu_domain_address.c | 14 +++++++------- + 2 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index e0be655772..53be6cd34b 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -362,8 +362,8 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddressPtr addr, + * libvirt's assumptions about whether or not hotplug + * capability will be required. + */ +- if (devFlags & VIR_PCI_CONNECT_HOTPLUGGABLE) +- busFlags |= VIR_PCI_CONNECT_HOTPLUGGABLE; ++ if (devFlags & VIR_PCI_CONNECT_AUTOASSIGN) ++ busFlags |= VIR_PCI_CONNECT_AUTOASSIGN; + /* if the device is a pci-bridge, allow manually + * assigning to any bus that would also accept a + * standard PCI device. +@@ -419,8 +419,8 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddressPtr addr, + addrStr, addr->bus, connectStr); + return false; + } +- if ((devFlags & VIR_PCI_CONNECT_HOTPLUGGABLE) && +- !(busFlags & VIR_PCI_CONNECT_HOTPLUGGABLE)) { ++ if ((devFlags & VIR_PCI_CONNECT_AUTOASSIGN) && ++ !(busFlags & VIR_PCI_CONNECT_AUTOASSIGN)) { + if (reportError) { + virReportError(errType, + _("The device at PCI address %s requires " +@@ -509,7 +509,7 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + */ + switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: +- bus->flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | + VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS); +@@ -517,14 +517,14 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: +- bus->flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); + bus->minSlot = 1; + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: +- bus->flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); + bus->minSlot = 0; +@@ -555,7 +555,7 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: + /* Same as pci-bridge: 32 hotpluggable traditional PCI slots (0-31), + * the first of which is not usable because of the SHPC */ +- bus->flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); + bus->minSlot = 1; +@@ -566,7 +566,7 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + /* provides one slot which is pcie, can be used by endpoint + * devices, pcie-switch-upstream-ports or pcie-to-pci-bridges, + * and is hotpluggable */ +- bus->flags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCIE_DEVICE | + VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT | + VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE); +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index 3c6ac62ff5..e81585bc6c 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -571,7 +571,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, + virDomainPCIConnectFlags virtioFlags) + { + virDomainPCIConnectFlags pciFlags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_HOTPLUGGABLE); ++ VIR_PCI_CONNECT_AUTOASSIGN); + + switch ((virDomainDeviceType)dev->type) { + case VIR_DOMAIN_DEVICE_CONTROLLER: { +@@ -1063,17 +1063,17 @@ qemuDomainFillDevicePCIConnectFlagsIterInit(virDomainDefPtr def, + + if (qemuDomainHasPCIeRoot(def)) { + data->pcieFlags = (VIR_PCI_CONNECT_TYPE_PCIE_DEVICE | +- VIR_PCI_CONNECT_HOTPLUGGABLE); ++ VIR_PCI_CONNECT_AUTOASSIGN); + } else { + data->pcieFlags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_HOTPLUGGABLE); ++ VIR_PCI_CONNECT_AUTOASSIGN); + } + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY)) { + data->virtioFlags = data->pcieFlags; + } else { + data->virtioFlags = (VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_HOTPLUGGABLE); ++ VIR_PCI_CONNECT_AUTOASSIGN); + } + } + +@@ -1729,7 +1729,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def, + virPCIDeviceAddress tmp_addr; + bool qemuDeviceVideoUsable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); + g_autofree char *addrStr = NULL; +- virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE ++ virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_AUTOASSIGN + | VIR_PCI_CONNECT_TYPE_PCI_DEVICE); + + /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */ +@@ -2666,7 +2666,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + * domain. + */ + virDomainDeviceInfo info = { +- .pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ .pciConnectFlags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE), + .pciAddrExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE + }; +@@ -2707,7 +2707,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, + addrs->nbuses > max_idx + 1 && + qemuDomainHasPCIeRoot(def)) { + virDomainDeviceInfo info = { +- .pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE | ++ .pciConnectFlags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCIE_DEVICE), + .pciAddrExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE + }; +-- +2.26.2 + diff --git a/SOURCES/libvirt-conf-simplify-logic-when-checking-for-AUTOASSIGN-PCI-addresses.patch b/SOURCES/libvirt-conf-simplify-logic-when-checking-for-AUTOASSIGN-PCI-addresses.patch new file mode 100644 index 0000000..cedc221 --- /dev/null +++ b/SOURCES/libvirt-conf-simplify-logic-when-checking-for-AUTOASSIGN-PCI-addresses.patch @@ -0,0 +1,83 @@ +From f52197675b2babfafb1b89058e3fd01decebd8ab Mon Sep 17 00:00:00 2001 +Message-Id: +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:12 -0400 +Subject: [PATCH] conf: simplify logic when checking for AUTOASSIGN PCI + addresses + +Old behavior: If the address was manually provided by config, copy +device AUTOASSIGN flag into the bus flag, and then later on in the +function *always* check for a match of the flags (which will always +match if the address came from config, since we just copied it). + +New behavior: Don't mess with the bus flags - just directly check if +the AUTOASSIGN flag matches in bus and dev, but only make the check if +the address didn't come from config (i.e. it was auto-assigned by +libvirt). + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit fcdf87d3ef14de9dfb0acaf4b4445e1580dfc629) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-10-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.c | 27 ++++++++++----------------- + 1 file changed, 10 insertions(+), 17 deletions(-) + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index 53be6cd34b..05f036e3e6 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -358,18 +358,22 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddressPtr addr, + */ + if (busFlags & VIR_PCI_CONNECT_TYPES_ENDPOINT) + busFlags |= VIR_PCI_CONNECT_TYPES_ENDPOINT; +- /* Also allow manual specification of bus to override +- * libvirt's assumptions about whether or not hotplug +- * capability will be required. +- */ +- if (devFlags & VIR_PCI_CONNECT_AUTOASSIGN) +- busFlags |= VIR_PCI_CONNECT_AUTOASSIGN; + /* if the device is a pci-bridge, allow manually + * assigning to any bus that would also accept a + * standard PCI device. + */ + if (devFlags & VIR_PCI_CONNECT_TYPE_PCI_BRIDGE) + devFlags |= VIR_PCI_CONNECT_TYPE_PCI_DEVICE; ++ } else if ((devFlags & VIR_PCI_CONNECT_AUTOASSIGN) && ++ !(busFlags & VIR_PCI_CONNECT_AUTOASSIGN)) { ++ if (reportError) { ++ virReportError(errType, ++ _("The device at PCI address %s was auto-assigned " ++ "this address, but the PCI controller " ++ "with index='%d' doesn't allow auto-assignment"), ++ addrStr, addr->bus); ++ } ++ return false; + } + + /* If this bus doesn't allow the type of connection (PCI +@@ -419,17 +423,6 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddressPtr addr, + addrStr, addr->bus, connectStr); + return false; + } +- if ((devFlags & VIR_PCI_CONNECT_AUTOASSIGN) && +- !(busFlags & VIR_PCI_CONNECT_AUTOASSIGN)) { +- if (reportError) { +- virReportError(errType, +- _("The device at PCI address %s requires " +- "hotplug capability, but the PCI controller " +- "with index='%d' doesn't support hotplug"), +- addrStr, addr->bus); +- } +- return false; +- } + return true; + } + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu-Change-control-flow-in-virCPUUpdateLive.patch b/SOURCES/libvirt-cpu-Change-control-flow-in-virCPUUpdateLive.patch new file mode 100644 index 0000000..b4dcabc --- /dev/null +++ b/SOURCES/libvirt-cpu-Change-control-flow-in-virCPUUpdateLive.patch @@ -0,0 +1,53 @@ +From 2145d7b6f4370dfcd7dadae7daf544767cde0392 Mon Sep 17 00:00:00 2001 +Message-Id: <2145d7b6f4370dfcd7dadae7daf544767cde0392@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:51 +0200 +Subject: [PATCH] cpu: Change control flow in virCPUUpdateLive +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The updateLive CPU sub-driver function is supposed to be called only for +a subset of CPU definitions. Let's make it more obvious by turning a +negative test and return into a positive check. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 68c0b85ecb07c8cefcf4f4a2ffc28e123baa9e8c) + +https://bugzilla.redhat.com/show_bug.cgi?id=1839999 + +Signed-off-by: Jiri Denemark +Message-Id: <2633727669ca50970bd10abe9b045e24b76028d1.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c +index ae3a0acc10..1cb2dd04f4 100644 +--- a/src/cpu/cpu.c ++++ b/src/cpu/cpu.c +@@ -647,13 +647,14 @@ virCPUUpdateLive(virArch arch, + if (!driver->updateLive) + return 1; + +- if (cpu->mode != VIR_CPU_MODE_CUSTOM) +- return 1; ++ if (cpu->mode == VIR_CPU_MODE_CUSTOM) { ++ if (driver->updateLive(cpu, dataEnabled, dataDisabled) < 0) ++ return -1; + +- if (driver->updateLive(cpu, dataEnabled, dataDisabled) < 0) +- return -1; ++ return 0; ++ } + +- return 0; ++ return 1; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu-Honor-check-full-for-host-passthrough-CPUs.patch b/SOURCES/libvirt-cpu-Honor-check-full-for-host-passthrough-CPUs.patch new file mode 100644 index 0000000..ff0dbcf --- /dev/null +++ b/SOURCES/libvirt-cpu-Honor-check-full-for-host-passthrough-CPUs.patch @@ -0,0 +1,100 @@ +From 781e82d0330afe60ab1c366e43dfe8292fcf68eb Mon Sep 17 00:00:00 2001 +Message-Id: <781e82d0330afe60ab1c366e43dfe8292fcf68eb@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:53 +0200 +Subject: [PATCH] cpu: Honor check='full' for host-passthrough CPUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The check attribute was completely ignored for host-passthrough CPUs +even if they explicitly requested some features to be enabled. For +example, a domain with the following CPU definition + + + + + +would happily start even when 'svm' cannot be enabled. + +Let's call virCPUArchUpdateLive for host-passthrough CPUs with +VIR_CPU_CHECK_FULL to make sure the architecture specific code can +validate the provided virtual CPU against the desired definition. + +https://bugzilla.redhat.com/show_bug.cgi?id=1515677 + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit ac36a824641862dcac057c6403b27ab1e91874f5) + +https://bugzilla.redhat.com/show_bug.cgi?id=1839999 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu.c | 3 ++- + src/cpu/cpu_x86.c | 10 +++++++++- + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c +index 1cb2dd04f4..f2a0f560f6 100644 +--- a/src/cpu/cpu.c ++++ b/src/cpu/cpu.c +@@ -647,7 +647,8 @@ virCPUUpdateLive(virArch arch, + if (!driver->updateLive) + return 1; + +- if (cpu->mode == VIR_CPU_MODE_CUSTOM) { ++ if (cpu->mode == VIR_CPU_MODE_CUSTOM || ++ cpu->check == VIR_CPU_CHECK_FULL) { + if (driver->updateLive(cpu, dataEnabled, dataDisabled) < 0) + return -1; + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 9e686a86d2..8c865bdaa4 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3009,8 +3009,10 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + virCPUDataPtr dataEnabled, + virCPUDataPtr dataDisabled) + { ++ bool hostPassthrough = cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH; + virCPUx86MapPtr map; + virCPUx86ModelPtr model = NULL; ++ virCPUx86ModelPtr modelDisabled = NULL; + virCPUx86Data enabled = VIR_CPU_X86_DATA_INIT; + virCPUx86Data disabled = VIR_CPU_X86_DATA_INIT; + virBuffer bufAdded = VIR_BUFFER_INITIALIZER; +@@ -3026,6 +3028,10 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + if (!(model = x86ModelFromCPU(cpu, map, -1))) + goto cleanup; + ++ if (hostPassthrough && ++ !(modelDisabled = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE))) ++ goto cleanup; ++ + if (dataEnabled && + x86DataCopy(&enabled, &dataEnabled->data.x86) < 0) + goto cleanup; +@@ -3040,7 +3046,8 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + + if (x86DataIsSubset(&model->data, &feature->data)) + expected = VIR_CPU_FEATURE_REQUIRE; +- else ++ else if (!hostPassthrough || ++ x86DataIsSubset(&modelDisabled->data, &feature->data)) + expected = VIR_CPU_FEATURE_DISABLE; + + if (expected == VIR_CPU_FEATURE_DISABLE && +@@ -3101,6 +3108,7 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + + cleanup: + x86ModelFree(model); ++ x86ModelFree(modelDisabled); + virCPUx86DataClear(&enabled); + virCPUx86DataClear(&disabled); + VIR_FREE(added); +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Add-Cooperlake-x86-CPU-model.patch b/SOURCES/libvirt-cpu_map-Add-Cooperlake-x86-CPU-model.patch new file mode 100644 index 0000000..45155f5 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Add-Cooperlake-x86-CPU-model.patch @@ -0,0 +1,289 @@ +From 1c8af21807f2cdaaa24651808f6dfeebfbcf75bb Mon Sep 17 00:00:00 2001 +Message-Id: <1c8af21807f2cdaaa24651808f6dfeebfbcf75bb@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:40 +0200 +Subject: [PATCH] cpu_map: Add Cooperlake x86 CPU model +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The stepping range (10-11) is likely incomplete. QEMU uses 10 and the +CPUID data for Cooperlake show 11. We will update the range if needed +once more details about he CPU are available. + +Signed-off-by: Jiri Denemark +Reviewed-by: Pavel Hrdina +(cherry picked from commit 3944f6855b9d4df73754bb6e5c8023d77399879b) + +https://bugzilla.redhat.com/show_bug.cgi?id=1781878 + +Conflicts: + tests/domaincapsdata/qemu_5.1.0-q35.x86_64.xml + tests/domaincapsdata/qemu_5.1.0-tcg.x86_64.xml + tests/domaincapsdata/qemu_5.1.0.x86_64.xml + - test data files do not exist downstream + +Signed-off-by: Jiri Denemark +Message-Id: <62f2fa3e2ecab2026c41e93430b4e2b695c674f0.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu_map/index.xml | 1 + + src/cpu_map/x86_Cooperlake.xml | 90 +++++++++++++++++++ + .../x86_64-cpuid-Cooperlake-guest.xml | 13 +-- + .../x86_64-cpuid-Cooperlake-host.xml | 13 +-- + .../x86_64-cpuid-Cooperlake-json.xml | 13 +-- + .../domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 1 + + .../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml | 1 + + tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 1 + + 8 files changed, 100 insertions(+), 33 deletions(-) + create mode 100644 src/cpu_map/x86_Cooperlake.xml + +diff --git a/src/cpu_map/index.xml b/src/cpu_map/index.xml +index 50b030de29..ff1da2e677 100644 +--- a/src/cpu_map/index.xml ++++ b/src/cpu_map/index.xml +@@ -54,6 +54,7 @@ + + + ++ + + + +diff --git a/src/cpu_map/x86_Cooperlake.xml b/src/cpu_map/x86_Cooperlake.xml +new file mode 100644 +index 0000000000..41bd210638 +--- /dev/null ++++ b/src/cpu_map/x86_Cooperlake.xml +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +index db5598740c..f169458399 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +@@ -1,5 +1,5 @@ + +- Cascadelake-Server ++ Cooperlake + Intel + + +@@ -20,22 +20,13 @@ + + + ++ + +- + + +- +- +- + + + + +- +- +- +- +- + +- + +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +index 6926b7c975..b0777181bb 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +@@ -1,6 +1,6 @@ + + x86_64 +- Cascadelake-Server ++ Cooperlake + Intel + + +@@ -21,22 +21,13 @@ + + + ++ + +- + + +- +- +- + + + + +- +- +- +- +- + +- + +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +index fc52805b2f..fb319d547c 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +@@ -1,24 +1,15 @@ + +- Cascadelake-Server ++ Cooperlake + Intel + + + + ++ + +- + +- +- +- + + + +- +- +- +- +- + +- + +diff --git a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +index b7e2c8a4fe..7bfd786ff6 100644 +--- a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +@@ -93,6 +93,7 @@ + EPYC-IBPB + EPYC + Dhyana ++ Cooperlake + Conroe + Cascadelake-Server-noTSX + Cascadelake-Server +diff --git a/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +index d634803b29..0a4bb16a89 100644 +--- a/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +@@ -101,6 +101,7 @@ + EPYC-IBPB + EPYC + Dhyana ++ Cooperlake + Conroe + Cascadelake-Server-noTSX + Cascadelake-Server +diff --git a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +index d2741375b4..d6ee66ab60 100644 +--- a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +@@ -92,6 +92,7 @@ + EPYC-IBPB + EPYC + Dhyana ++ Cooperlake + Conroe + Cascadelake-Server-noTSX + Cascadelake-Server +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Add-decode-element-to-x86-CPU-model-definitions.patch b/SOURCES/libvirt-cpu_map-Add-decode-element-to-x86-CPU-model-definitions.patch new file mode 100644 index 0000000..515fa17 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Add-decode-element-to-x86-CPU-model-definitions.patch @@ -0,0 +1,749 @@ +From 4658a565f5536002c3a65e942eed0d877cd1d070 Mon Sep 17 00:00:00 2001 +Message-Id: <4658a565f5536002c3a65e942eed0d877cd1d070@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:56 +0200 +Subject: [PATCH] cpu_map: Add element to x86 CPU model definitions +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The element specifies whether a particular CPU model can be used when +creating a CPU definition from raw CPUID/MSR data. The @host attribute +determines whether the CPU model can be used (host='on') for creating +CPU definition for host capabilities. Usability of the model for domain +capabilities and host-model CPU definitions is controlled by the @guest +attribute. + +Signed-off-by: Jiri Denemark +Reviewed-by: Christian Ehrhardt +Tested-by: Christian Ehrhardt +(cherry picked from commit f4914045c2bff46b120c6c2af80066d24e48b609) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840008 + +Signed-off-by: Jiri Denemark +Message-Id: <3097db79eff1e45257ef12f891e8f9243bc8580f.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 43 +++++++++++++++++++ + src/cpu_map/x86_486.xml | 1 + + src/cpu_map/x86_Broadwell-IBRS.xml | 1 + + src/cpu_map/x86_Broadwell-noTSX-IBRS.xml | 1 + + src/cpu_map/x86_Broadwell-noTSX.xml | 1 + + src/cpu_map/x86_Broadwell.xml | 1 + + src/cpu_map/x86_Cascadelake-Server-noTSX.xml | 1 + + src/cpu_map/x86_Cascadelake-Server.xml | 1 + + src/cpu_map/x86_Conroe.xml | 1 + + src/cpu_map/x86_Dhyana.xml | 1 + + src/cpu_map/x86_EPYC-IBPB.xml | 1 + + src/cpu_map/x86_EPYC.xml | 1 + + src/cpu_map/x86_Haswell-IBRS.xml | 1 + + src/cpu_map/x86_Haswell-noTSX-IBRS.xml | 1 + + src/cpu_map/x86_Haswell-noTSX.xml | 1 + + src/cpu_map/x86_Haswell.xml | 1 + + src/cpu_map/x86_Icelake-Client-noTSX.xml | 1 + + src/cpu_map/x86_Icelake-Client.xml | 1 + + src/cpu_map/x86_Icelake-Server-noTSX.xml | 1 + + src/cpu_map/x86_Icelake-Server.xml | 1 + + src/cpu_map/x86_IvyBridge-IBRS.xml | 1 + + src/cpu_map/x86_IvyBridge.xml | 1 + + src/cpu_map/x86_Nehalem-IBRS.xml | 1 + + src/cpu_map/x86_Nehalem.xml | 1 + + src/cpu_map/x86_Opteron_G1.xml | 1 + + src/cpu_map/x86_Opteron_G2.xml | 1 + + src/cpu_map/x86_Opteron_G3.xml | 1 + + src/cpu_map/x86_Opteron_G4.xml | 1 + + src/cpu_map/x86_Opteron_G5.xml | 1 + + src/cpu_map/x86_Penryn.xml | 1 + + src/cpu_map/x86_SandyBridge-IBRS.xml | 1 + + src/cpu_map/x86_SandyBridge.xml | 1 + + src/cpu_map/x86_Skylake-Client-IBRS.xml | 1 + + src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml | 1 + + src/cpu_map/x86_Skylake-Client.xml | 1 + + src/cpu_map/x86_Skylake-Server-IBRS.xml | 1 + + src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml | 1 + + src/cpu_map/x86_Skylake-Server.xml | 1 + + src/cpu_map/x86_Westmere-IBRS.xml | 1 + + src/cpu_map/x86_Westmere.xml | 1 + + src/cpu_map/x86_athlon.xml | 1 + + src/cpu_map/x86_core2duo.xml | 1 + + src/cpu_map/x86_coreduo.xml | 1 + + src/cpu_map/x86_cpu64-rhel5.xml | 1 + + src/cpu_map/x86_cpu64-rhel6.xml | 1 + + src/cpu_map/x86_kvm32.xml | 1 + + src/cpu_map/x86_kvm64.xml | 1 + + src/cpu_map/x86_n270.xml | 1 + + src/cpu_map/x86_pentium.xml | 1 + + src/cpu_map/x86_pentium2.xml | 1 + + src/cpu_map/x86_pentium3.xml | 1 + + src/cpu_map/x86_pentiumpro.xml | 1 + + src/cpu_map/x86_phenom.xml | 1 + + src/cpu_map/x86_qemu32.xml | 1 + + src/cpu_map/x86_qemu64.xml | 1 + + 55 files changed, 97 insertions(+) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 8c865bdaa4..7fbb4c9a6c 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -125,6 +125,8 @@ typedef struct _virCPUx86Model virCPUx86Model; + typedef virCPUx86Model *virCPUx86ModelPtr; + struct _virCPUx86Model { + char *name; ++ bool decodeHost; ++ bool decodeGuest; + virCPUx86VendorPtr vendor; + size_t nsignatures; + uint32_t *signatures; +@@ -1347,6 +1349,44 @@ x86ModelCompare(virCPUx86ModelPtr model1, + } + + ++static int ++x86ModelParseDecode(virCPUx86ModelPtr model, ++ xmlXPathContextPtr ctxt) ++{ ++ g_autofree char *host = NULL; ++ g_autofree char *guest = NULL; ++ int val; ++ ++ if ((host = virXPathString("string(./decode/@host)", ctxt))) ++ val = virTristateSwitchTypeFromString(host); ++ else ++ val = VIR_TRISTATE_SWITCH_ABSENT; ++ ++ if (val <= 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("invalid or missing decode/host attribute in CPU model %s"), ++ model->name); ++ return -1; ++ } ++ model->decodeHost = val == VIR_TRISTATE_SWITCH_ON; ++ ++ if ((guest = virXPathString("string(./decode/@guest)", ctxt))) ++ val = virTristateSwitchTypeFromString(guest); ++ else ++ val = VIR_TRISTATE_SWITCH_ABSENT; ++ ++ if (val <= 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("invalid or missing decode/guest attribute in CPU model %s"), ++ model->name); ++ return -1; ++ } ++ model->decodeGuest = val == VIR_TRISTATE_SWITCH_ON; ++ ++ return 0; ++} ++ ++ + static int + x86ModelParseAncestor(virCPUx86ModelPtr model, + xmlXPathContextPtr ctxt, +@@ -1521,6 +1561,9 @@ x86ModelParse(xmlXPathContextPtr ctxt, + + model->name = g_strdup(name); + ++ if (x86ModelParseDecode(model, ctxt) < 0) ++ goto cleanup; ++ + if (x86ModelParseAncestor(model, ctxt, map) < 0) + goto cleanup; + +diff --git a/src/cpu_map/x86_486.xml b/src/cpu_map/x86_486.xml +index 61fa3797e8..d05b277392 100644 +--- a/src/cpu_map/x86_486.xml ++++ b/src/cpu_map/x86_486.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Broadwell-IBRS.xml b/src/cpu_map/x86_Broadwell-IBRS.xml +index 4600cacec0..9033d5fcd5 100644 +--- a/src/cpu_map/x86_Broadwell-IBRS.xml ++++ b/src/cpu_map/x86_Broadwell-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Broadwell-noTSX-IBRS.xml b/src/cpu_map/x86_Broadwell-noTSX-IBRS.xml +index b3fc0b726a..c044b60e36 100644 +--- a/src/cpu_map/x86_Broadwell-noTSX-IBRS.xml ++++ b/src/cpu_map/x86_Broadwell-noTSX-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Broadwell-noTSX.xml b/src/cpu_map/x86_Broadwell-noTSX.xml +index ad932d0853..637f29ba1c 100644 +--- a/src/cpu_map/x86_Broadwell-noTSX.xml ++++ b/src/cpu_map/x86_Broadwell-noTSX.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Broadwell.xml b/src/cpu_map/x86_Broadwell.xml +index 6de9227322..82939a4509 100644 +--- a/src/cpu_map/x86_Broadwell.xml ++++ b/src/cpu_map/x86_Broadwell.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +index d24415ebce..5adea664e9 100644 +--- a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml ++++ b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Cascadelake-Server.xml b/src/cpu_map/x86_Cascadelake-Server.xml +index b69ac198b6..d7ec42f57e 100644 +--- a/src/cpu_map/x86_Cascadelake-Server.xml ++++ b/src/cpu_map/x86_Cascadelake-Server.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Conroe.xml b/src/cpu_map/x86_Conroe.xml +index 89fe0ad2cf..4cacee6142 100644 +--- a/src/cpu_map/x86_Conroe.xml ++++ b/src/cpu_map/x86_Conroe.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Dhyana.xml b/src/cpu_map/x86_Dhyana.xml +index cbc8020a94..689daf8649 100644 +--- a/src/cpu_map/x86_Dhyana.xml ++++ b/src/cpu_map/x86_Dhyana.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_EPYC-IBPB.xml b/src/cpu_map/x86_EPYC-IBPB.xml +index 283697ebd1..983c5f4445 100644 +--- a/src/cpu_map/x86_EPYC-IBPB.xml ++++ b/src/cpu_map/x86_EPYC-IBPB.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_EPYC.xml b/src/cpu_map/x86_EPYC.xml +index f0601392fd..3ebba9f4ed 100644 +--- a/src/cpu_map/x86_EPYC.xml ++++ b/src/cpu_map/x86_EPYC.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Haswell-IBRS.xml b/src/cpu_map/x86_Haswell-IBRS.xml +index 4f86db838f..0ffe2bae0d 100644 +--- a/src/cpu_map/x86_Haswell-IBRS.xml ++++ b/src/cpu_map/x86_Haswell-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Haswell-noTSX-IBRS.xml b/src/cpu_map/x86_Haswell-noTSX-IBRS.xml +index 47318be6d5..75d709c009 100644 +--- a/src/cpu_map/x86_Haswell-noTSX-IBRS.xml ++++ b/src/cpu_map/x86_Haswell-noTSX-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Haswell-noTSX.xml b/src/cpu_map/x86_Haswell-noTSX.xml +index efd10c47de..b0a0faa856 100644 +--- a/src/cpu_map/x86_Haswell-noTSX.xml ++++ b/src/cpu_map/x86_Haswell-noTSX.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Haswell.xml b/src/cpu_map/x86_Haswell.xml +index ac358d7967..ee16b30f19 100644 +--- a/src/cpu_map/x86_Haswell.xml ++++ b/src/cpu_map/x86_Haswell.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Client-noTSX.xml b/src/cpu_map/x86_Icelake-Client-noTSX.xml +index cd51881f40..540732af6f 100644 +--- a/src/cpu_map/x86_Icelake-Client-noTSX.xml ++++ b/src/cpu_map/x86_Icelake-Client-noTSX.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Client.xml b/src/cpu_map/x86_Icelake-Client.xml +index fbd53bbe11..5cf32e91fa 100644 +--- a/src/cpu_map/x86_Icelake-Client.xml ++++ b/src/cpu_map/x86_Icelake-Client.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Server-noTSX.xml b/src/cpu_map/x86_Icelake-Server-noTSX.xml +index 538c656712..5a53da23c7 100644 +--- a/src/cpu_map/x86_Icelake-Server-noTSX.xml ++++ b/src/cpu_map/x86_Icelake-Server-noTSX.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Server.xml b/src/cpu_map/x86_Icelake-Server.xml +index a565371977..367ade7240 100644 +--- a/src/cpu_map/x86_Icelake-Server.xml ++++ b/src/cpu_map/x86_Icelake-Server.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_IvyBridge-IBRS.xml b/src/cpu_map/x86_IvyBridge-IBRS.xml +index e0f2adfa82..430bc3232d 100644 +--- a/src/cpu_map/x86_IvyBridge-IBRS.xml ++++ b/src/cpu_map/x86_IvyBridge-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_IvyBridge.xml b/src/cpu_map/x86_IvyBridge.xml +index 16213dbc62..eaf5d02e82 100644 +--- a/src/cpu_map/x86_IvyBridge.xml ++++ b/src/cpu_map/x86_IvyBridge.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Nehalem-IBRS.xml b/src/cpu_map/x86_Nehalem-IBRS.xml +index 8cc19eff03..00d0d2fe51 100644 +--- a/src/cpu_map/x86_Nehalem-IBRS.xml ++++ b/src/cpu_map/x86_Nehalem-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Nehalem.xml b/src/cpu_map/x86_Nehalem.xml +index 530e5e8a0d..9968001fe7 100644 +--- a/src/cpu_map/x86_Nehalem.xml ++++ b/src/cpu_map/x86_Nehalem.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Opteron_G1.xml b/src/cpu_map/x86_Opteron_G1.xml +index 73cf1de71e..57648ca93f 100644 +--- a/src/cpu_map/x86_Opteron_G1.xml ++++ b/src/cpu_map/x86_Opteron_G1.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Opteron_G2.xml b/src/cpu_map/x86_Opteron_G2.xml +index 342105730e..db961b0067 100644 +--- a/src/cpu_map/x86_Opteron_G2.xml ++++ b/src/cpu_map/x86_Opteron_G2.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Opteron_G3.xml b/src/cpu_map/x86_Opteron_G3.xml +index 7fbf8ac9e9..dab59d4f82 100644 +--- a/src/cpu_map/x86_Opteron_G3.xml ++++ b/src/cpu_map/x86_Opteron_G3.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Opteron_G4.xml b/src/cpu_map/x86_Opteron_G4.xml +index 463b3676a0..a7fc8d5828 100644 +--- a/src/cpu_map/x86_Opteron_G4.xml ++++ b/src/cpu_map/x86_Opteron_G4.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Opteron_G5.xml b/src/cpu_map/x86_Opteron_G5.xml +index 0f8fe32c87..ff775bdcef 100644 +--- a/src/cpu_map/x86_Opteron_G5.xml ++++ b/src/cpu_map/x86_Opteron_G5.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Penryn.xml b/src/cpu_map/x86_Penryn.xml +index 279bb05570..29d4cd635b 100644 +--- a/src/cpu_map/x86_Penryn.xml ++++ b/src/cpu_map/x86_Penryn.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_SandyBridge-IBRS.xml b/src/cpu_map/x86_SandyBridge-IBRS.xml +index 7d1342ec6f..fbdb4f2bf6 100644 +--- a/src/cpu_map/x86_SandyBridge-IBRS.xml ++++ b/src/cpu_map/x86_SandyBridge-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_SandyBridge.xml b/src/cpu_map/x86_SandyBridge.xml +index 48e4ac8082..7c85ed42df 100644 +--- a/src/cpu_map/x86_SandyBridge.xml ++++ b/src/cpu_map/x86_SandyBridge.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Client-IBRS.xml b/src/cpu_map/x86_Skylake-Client-IBRS.xml +index 4440313fc4..5709e7c2f9 100644 +--- a/src/cpu_map/x86_Skylake-Client-IBRS.xml ++++ b/src/cpu_map/x86_Skylake-Client-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + + + + + + + +diff --git a/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +index 455a072119..91a206f575 100644 +--- a/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml ++++ b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Server.xml b/src/cpu_map/x86_Skylake-Server.xml +index 2da69e0dfc..f96875a85f 100644 +--- a/src/cpu_map/x86_Skylake-Server.xml ++++ b/src/cpu_map/x86_Skylake-Server.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Westmere-IBRS.xml b/src/cpu_map/x86_Westmere-IBRS.xml +index 3baf56f47a..c7898f0c22 100644 +--- a/src/cpu_map/x86_Westmere-IBRS.xml ++++ b/src/cpu_map/x86_Westmere-IBRS.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_Westmere.xml b/src/cpu_map/x86_Westmere.xml +index 95c1d690c8..16e4ad6c30 100644 +--- a/src/cpu_map/x86_Westmere.xml ++++ b/src/cpu_map/x86_Westmere.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_athlon.xml b/src/cpu_map/x86_athlon.xml +index 0d44508e20..81c43c81e8 100644 +--- a/src/cpu_map/x86_athlon.xml ++++ b/src/cpu_map/x86_athlon.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_core2duo.xml b/src/cpu_map/x86_core2duo.xml +index 3c9a148f3c..412039fe55 100644 +--- a/src/cpu_map/x86_core2duo.xml ++++ b/src/cpu_map/x86_core2duo.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_coreduo.xml b/src/cpu_map/x86_coreduo.xml +index 676e846920..e2fda9a1d4 100644 +--- a/src/cpu_map/x86_coreduo.xml ++++ b/src/cpu_map/x86_coreduo.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_cpu64-rhel5.xml b/src/cpu_map/x86_cpu64-rhel5.xml +index 670a92f274..be6bcdb7a6 100644 +--- a/src/cpu_map/x86_cpu64-rhel5.xml ++++ b/src/cpu_map/x86_cpu64-rhel5.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_cpu64-rhel6.xml b/src/cpu_map/x86_cpu64-rhel6.xml +index 3cae0f00c2..c62b1b5575 100644 +--- a/src/cpu_map/x86_cpu64-rhel6.xml ++++ b/src/cpu_map/x86_cpu64-rhel6.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_kvm32.xml b/src/cpu_map/x86_kvm32.xml +index 5f08a5e7fc..9dd96d5b56 100644 +--- a/src/cpu_map/x86_kvm32.xml ++++ b/src/cpu_map/x86_kvm32.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_kvm64.xml b/src/cpu_map/x86_kvm64.xml +index 80b24e2a49..185af06f78 100644 +--- a/src/cpu_map/x86_kvm64.xml ++++ b/src/cpu_map/x86_kvm64.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_n270.xml b/src/cpu_map/x86_n270.xml +index cb359d968e..5507d2ea3b 100644 +--- a/src/cpu_map/x86_n270.xml ++++ b/src/cpu_map/x86_n270.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_pentium.xml b/src/cpu_map/x86_pentium.xml +index d44c1399b0..f0a8982115 100644 +--- a/src/cpu_map/x86_pentium.xml ++++ b/src/cpu_map/x86_pentium.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_pentium2.xml b/src/cpu_map/x86_pentium2.xml +index 0d772bad2f..aeba082297 100644 +--- a/src/cpu_map/x86_pentium2.xml ++++ b/src/cpu_map/x86_pentium2.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_pentium3.xml b/src/cpu_map/x86_pentium3.xml +index 24eb227c28..ab85d2967f 100644 +--- a/src/cpu_map/x86_pentium3.xml ++++ b/src/cpu_map/x86_pentium3.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_pentiumpro.xml b/src/cpu_map/x86_pentiumpro.xml +index 9f7a610a87..b6e061187c 100644 +--- a/src/cpu_map/x86_pentiumpro.xml ++++ b/src/cpu_map/x86_pentiumpro.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_phenom.xml b/src/cpu_map/x86_phenom.xml +index 71f004057b..f0f8ece57a 100644 +--- a/src/cpu_map/x86_phenom.xml ++++ b/src/cpu_map/x86_phenom.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_qemu32.xml b/src/cpu_map/x86_qemu32.xml +index 3c9cdec981..f3fb1959be 100644 +--- a/src/cpu_map/x86_qemu32.xml ++++ b/src/cpu_map/x86_qemu32.xml +@@ -1,5 +1,6 @@ + + ++ + + + +diff --git a/src/cpu_map/x86_qemu64.xml b/src/cpu_map/x86_qemu64.xml +index a8e8dfe58d..0fe207a2b4 100644 +--- a/src/cpu_map/x86_qemu64.xml ++++ b/src/cpu_map/x86_qemu64.xml +@@ -1,5 +1,6 @@ + + ++ + + +diff --git a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +new file mode 100644 +index 0000000000..d24415ebce +--- /dev/null ++++ b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/cpu_map/x86_Icelake-Client-noTSX.xml b/src/cpu_map/x86_Icelake-Client-noTSX.xml +new file mode 100644 +index 0000000000..cd51881f40 +--- /dev/null ++++ b/src/cpu_map/x86_Icelake-Client-noTSX.xml +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/cpu_map/x86_Icelake-Server-noTSX.xml b/src/cpu_map/x86_Icelake-Server-noTSX.xml +new file mode 100644 +index 0000000000..538c656712 +--- /dev/null ++++ b/src/cpu_map/x86_Icelake-Server-noTSX.xml +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml b/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml +new file mode 100644 +index 0000000000..3d2976692f +--- /dev/null ++++ b/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +new file mode 100644 +index 0000000000..455a072119 +--- /dev/null ++++ b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +index 92404e4d03..e03c4a06ba 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +@@ -1,5 +1,5 @@ + +- Skylake-Client-IBRS ++ Skylake-Client-noTSX-IBRS + Intel + + +@@ -26,6 +26,4 @@ + + + +- +- + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +index 808a8ff969..7f6fe2eac3 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +@@ -1,8 +1,7 @@ + + x86_64 +- Broadwell-noTSX-IBRS ++ Skylake-Client-noTSX-IBRS + Intel +- + + + +@@ -18,22 +17,14 @@ + + + +- +- +- + +- + + + + + +- +- +- + + +- + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +index 645c0934c2..3d8e6775bf 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +@@ -1,5 +1,5 @@ + +- Skylake-Client-IBRS ++ Skylake-Client-noTSX-IBRS + Intel + + +@@ -14,6 +14,4 @@ + + + +- +- + +diff --git a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml +index c4c6bfb564..e257657981 100644 +--- a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml +@@ -63,8 +63,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -79,7 +81,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -89,6 +93,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +diff --git a/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml +index a7f8d9c5ee..c762b0b600 100644 +--- a/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml +@@ -73,8 +73,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -89,7 +91,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -99,6 +103,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +diff --git a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml +index f0e0f182a4..2918ba9715 100644 +--- a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml +@@ -62,8 +62,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -78,7 +80,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -88,6 +92,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +diff --git a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +index b635d573ef..7b2a929738 100644 +--- a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +@@ -63,8 +63,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -79,7 +81,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -89,6 +93,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +diff --git a/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +index 0fbc632267..d634803b29 100644 +--- a/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +@@ -72,8 +72,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -88,7 +90,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -98,6 +102,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +diff --git a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +index 27f76a8a5e..7609d49020 100644 +--- a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +@@ -62,8 +62,10 @@ + athlon + Westmere-IBRS + Westmere ++ Skylake-Server-noTSX-IBRS + Skylake-Server-IBRS + Skylake-Server ++ Skylake-Client-noTSX-IBRS + Skylake-Client-IBRS + Skylake-Client + SandyBridge-IBRS +@@ -78,7 +80,9 @@ + Nehalem + IvyBridge-IBRS + IvyBridge ++ Icelake-Server-noTSX + Icelake-Server ++ Icelake-Client-noTSX + Icelake-Client + Haswell-noTSX-IBRS + Haswell-noTSX +@@ -88,6 +92,7 @@ + EPYC + Dhyana + Conroe ++ Cascadelake-Server-noTSX + Cascadelake-Server + Broadwell-noTSX-IBRS + Broadwell-noTSX +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Add-pschange-mc-no-bit-in-IA32_ARCH_CAPABILITIES-MSR.patch b/SOURCES/libvirt-cpu_map-Add-pschange-mc-no-bit-in-IA32_ARCH_CAPABILITIES-MSR.patch new file mode 100644 index 0000000..82e7e94 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Add-pschange-mc-no-bit-in-IA32_ARCH_CAPABILITIES-MSR.patch @@ -0,0 +1,212 @@ +From 7d0790fb5061cb956390ce5f7a2b92ac9702ada6 Mon Sep 17 00:00:00 2001 +Message-Id: <7d0790fb5061cb956390ce5f7a2b92ac9702ada6@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:39 +0200 +Subject: [PATCH] cpu_map: Add pschange-mc-no bit in IA32_ARCH_CAPABILITIES MSR +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Pavel Hrdina +(cherry picked from commit 12eb0c9496e802bad9e5ec71cde888b8fdb1b0b4) + +https://bugzilla.redhat.com/show_bug.cgi?id=1781878 + +Conflicts: + tests/cputestdata/x86_64-cpuid-Ryzen-9-3900X-12-Core-enabled.xml + tests/cputestdata/x86_64-cpuid-Ryzen-9-3900X-12-Core-guest.xml + tests/cputestdata/x86_64-cpuid-Ryzen-9-3900X-12-Core-host.xml + tests/cputestdata/x86_64-cpuid-Ryzen-9-3900X-12-Core-json.xml + tests/domaincapsdata/qemu_5.1.0-q35.x86_64.xml + tests/domaincapsdata/qemu_5.1.0.x86_64.xml + - test data files do not exist downstream + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu_map/x86_features.xml | 3 +++ + tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml | 1 + + tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml | 1 + + tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml | 1 + + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml | 2 +- + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml | 1 + + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml | 1 + + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml | 1 + + tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml | 2 +- + tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml | 1 + + tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 1 + + tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 1 + + tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 1 + + tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 1 + + 14 files changed, 16 insertions(+), 2 deletions(-) + +diff --git a/src/cpu_map/x86_features.xml b/src/cpu_map/x86_features.xml +index 2c4c29dc99..8525ae0fa5 100644 +--- a/src/cpu_map/x86_features.xml ++++ b/src/cpu_map/x86_features.xml +@@ -509,6 +509,9 @@ + + + ++ ++ ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +index b5137e3c03..db5598740c 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +@@ -35,6 +35,7 @@ + + + ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +index 52b352f4f1..6926b7c975 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +@@ -36,6 +36,7 @@ + + + ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +index e323d6205e..fc52805b2f 100644 +--- a/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +@@ -18,6 +18,7 @@ + + + ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml +index 6c480eeacf..57f8ebabba 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml +@@ -5,5 +5,5 @@ + + + +- ++ + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +index 92404e4d03..ed06515e99 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +@@ -26,6 +26,7 @@ + + + ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +index 7f6fe2eac3..7681c94649 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +@@ -27,4 +27,5 @@ + + + ++ + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +index 645c0934c2..4774d39c7e 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +@@ -14,6 +14,7 @@ + + + ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml +index 43c3a93a16..cd082feffe 100644 +--- a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml +@@ -6,5 +6,5 @@ + + + +- ++ + +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml +index 36e95029be..10c256ee1e 100644 +--- a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml +@@ -17,5 +17,6 @@ + + + ++ + + +diff --git a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml +index e257657981..4d9616cb69 100644 +--- a/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml +@@ -47,6 +47,7 @@ + + + ++ + + + qemu64 +diff --git a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml +index 2918ba9715..5210c917aa 100644 +--- a/tests/domaincapsdata/qemu_4.2.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_4.2.0.x86_64.xml +@@ -46,6 +46,7 @@ + + + ++ + + + qemu64 +diff --git a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +index 7b2a929738..b7e2c8a4fe 100644 +--- a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +@@ -47,6 +47,7 @@ + + + ++ + + + qemu64 +diff --git a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +index 7609d49020..d2741375b4 100644 +--- a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml ++++ b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +@@ -46,6 +46,7 @@ + + + ++ + + + qemu64 +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Distinguish-Cascadelake-Server-from-Skylake-Server.patch b/SOURCES/libvirt-cpu_map-Distinguish-Cascadelake-Server-from-Skylake-Server.patch new file mode 100644 index 0000000..ff72f17 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Distinguish-Cascadelake-Server-from-Skylake-Server.patch @@ -0,0 +1,154 @@ +From f1926a0cb9147ce54484858f5e0f7376ee9ac648 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:37 +0200 +Subject: [PATCH] cpu_map: Distinguish Cascadelake-Server from Skylake-Server +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The signatures of these two CPU model differ only in stepping as both +report family 6 and model 85. Skylake-Server uses stepping 4 or less and +Cascadelake-Server uses stepping 5..7. + +https://bugzilla.redhat.com/show_bug.cgi?id=1761678 + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 5d6059f8ec16d64f240dc5e6413ca55a3b46b3f7) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <8711c401083e2605e7d8734764a5fe1b092749b0.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu_map/x86_Cascadelake-Server-noTSX.xml | 2 +- + src/cpu_map/x86_Cascadelake-Server.xml | 2 +- + src/cpu_map/x86_Skylake-Server-IBRS.xml | 2 +- + src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml | 2 +- + src/cpu_map/x86_Skylake-Server.xml | 2 +- + tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml | 5 +++-- + tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml | 5 +++-- + 7 files changed, 11 insertions(+), 9 deletions(-) + +diff --git a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +index 459174a30d..bfd4629836 100644 +--- a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml ++++ b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +@@ -1,7 +1,7 @@ + + + +- ++ + + + +diff --git a/src/cpu_map/x86_Cascadelake-Server.xml b/src/cpu_map/x86_Cascadelake-Server.xml +index d7ec42f57e..335e9cb584 100644 +--- a/src/cpu_map/x86_Cascadelake-Server.xml ++++ b/src/cpu_map/x86_Cascadelake-Server.xml +@@ -1,7 +1,7 @@ + + + +- ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Server-IBRS.xml b/src/cpu_map/x86_Skylake-Server-IBRS.xml +index bd6b6457ad..9fb3488809 100644 +--- a/src/cpu_map/x86_Skylake-Server-IBRS.xml ++++ b/src/cpu_map/x86_Skylake-Server-IBRS.xml +@@ -1,7 +1,7 @@ + + + +- ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +index c2b7de40e8..c162c0acc3 100644 +--- a/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml ++++ b/src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml +@@ -1,7 +1,7 @@ + + + +- ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Server.xml b/src/cpu_map/x86_Skylake-Server.xml +index f96875a85f..e022d94c84 100644 +--- a/src/cpu_map/x86_Skylake-Server.xml ++++ b/src/cpu_map/x86_Skylake-Server.xml +@@ -1,7 +1,7 @@ + + + +- ++ + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml +index cfb0eb982d..c21cb1e600 100644 +--- a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml +@@ -1,5 +1,5 @@ + +- Cascadelake-Server ++ Skylake-Server-IBRS + Intel + + +@@ -20,14 +20,15 @@ + + + ++ + + + + + ++ + + + + +- + +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml +index 968d904557..b482043ccf 100644 +--- a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml +@@ -1,16 +1,17 @@ + +- Cascadelake-Server ++ Skylake-Server-IBRS + Intel + + + + ++ + + + + + ++ + + +- + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Distribute-x86_Cooperlake.xml.patch b/SOURCES/libvirt-cpu_map-Distribute-x86_Cooperlake.xml.patch new file mode 100644 index 0000000..cdbabf5 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Distribute-x86_Cooperlake.xml.patch @@ -0,0 +1,37 @@ +From a48703c3f77054ba1bdfa1adf3aa8277814874d1 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Thu, 28 May 2020 09:50:05 +0200 +Subject: [PATCH] cpu_map: Distribute x86_Cooperlake.xml +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Daniel P. Berrangé +(cherry picked from commit 1c425857fb9f652c7811f075f3d31ff561b95632) + +https://bugzilla.redhat.com/show_bug.cgi?id=1781878 + +Signed-off-by: Jiri Denemark +Message-Id: <98b6a65536435b8130694e50adc9f39ff3110d90.1590652079.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu_map/Makefile.inc.am | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/cpu_map/Makefile.inc.am b/src/cpu_map/Makefile.inc.am +index be64c9a0d4..b949cb0bea 100644 +--- a/src/cpu_map/Makefile.inc.am ++++ b/src/cpu_map/Makefile.inc.am +@@ -22,6 +22,7 @@ cpumap_DATA = \ + cpu_map/x86_Cascadelake-Server.xml \ + cpu_map/x86_Cascadelake-Server-noTSX.xml \ + cpu_map/x86_Conroe.xml \ ++ cpu_map/x86_Cooperlake.xml \ + cpu_map/x86_core2duo.xml \ + cpu_map/x86_coreduo.xml \ + cpu_map/x86_cpu64-rhel5.xml \ +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_map-Don-t-use-new-noTSX-models-for-host-model-CPUs.patch b/SOURCES/libvirt-cpu_map-Don-t-use-new-noTSX-models-for-host-model-CPUs.patch new file mode 100644 index 0000000..e14d208 --- /dev/null +++ b/SOURCES/libvirt-cpu_map-Don-t-use-new-noTSX-models-for-host-model-CPUs.patch @@ -0,0 +1,137 @@ +From 2268a9862c16c87007bfbae117d345268f8420e4 Mon Sep 17 00:00:00 2001 +Message-Id: <2268a9862c16c87007bfbae117d345268f8420e4@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:58 +0200 +Subject: [PATCH] cpu_map: Don't use new noTSX models for host-model CPUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Host-model CPU definitions (and domain capabilities) will use the +original CPU models (without noTSX in their name) and explicitly disable +hle and rtm features. This way domains with host-model CPUs will be +migratable even to older versions of libvirt which do not support the +noTSX model variants. + +The new models will be advertised in host capabilities and they may +be used explicitly with custom CPUs. + +Signed-off-by: Jiri Denemark +Reviewed-by: Christian Ehrhardt +Tested-by: Christian Ehrhardt +(cherry picked from commit 17cdefe5f197030c70a0d250f3c5387b41663516) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840008 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu_map/x86_Cascadelake-Server-noTSX.xml | 2 +- + src/cpu_map/x86_Icelake-Client-noTSX.xml | 2 +- + src/cpu_map/x86_Icelake-Server-noTSX.xml | 2 +- + src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml | 2 +- + src/cpu_map/x86_Skylake-Server-noTSX-IBRS.xml | 2 +- + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml | 4 +++- + tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml | 4 +++- + 7 files changed, 11 insertions(+), 7 deletions(-) + +diff --git a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +index 5adea664e9..459174a30d 100644 +--- a/src/cpu_map/x86_Cascadelake-Server-noTSX.xml ++++ b/src/cpu_map/x86_Cascadelake-Server-noTSX.xml +@@ -1,6 +1,6 @@ + + +- ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Client-noTSX.xml b/src/cpu_map/x86_Icelake-Client-noTSX.xml +index 540732af6f..65e648ae21 100644 +--- a/src/cpu_map/x86_Icelake-Client-noTSX.xml ++++ b/src/cpu_map/x86_Icelake-Client-noTSX.xml +@@ -1,6 +1,6 @@ + + +- ++ + + + +diff --git a/src/cpu_map/x86_Icelake-Server-noTSX.xml b/src/cpu_map/x86_Icelake-Server-noTSX.xml +index 5a53da23c7..2fd6906406 100644 +--- a/src/cpu_map/x86_Icelake-Server-noTSX.xml ++++ b/src/cpu_map/x86_Icelake-Server-noTSX.xml +@@ -1,6 +1,6 @@ + + +- ++ + + + +diff --git a/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml b/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml +index 0c2f1e6ac4..ffba34502a 100644 +--- a/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml ++++ b/src/cpu_map/x86_Skylake-Client-noTSX-IBRS.xml +@@ -1,6 +1,6 @@ + + +- ++ + + + + + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +index e03c4a06ba..92404e4d03 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +@@ -1,5 +1,5 @@ + +- Skylake-Client-noTSX-IBRS ++ Skylake-Client-IBRS + Intel + + +@@ -26,4 +26,6 @@ + + + ++ ++ + +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +index 3d8e6775bf..645c0934c2 100644 +--- a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +@@ -1,5 +1,5 @@ + +- Skylake-Client-noTSX-IBRS ++ Skylake-Client-IBRS + Intel + + +@@ -14,4 +14,6 @@ + + + ++ ++ + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Add-support-for-stepping-part-of-CPU-signature.patch b/SOURCES/libvirt-cpu_x86-Add-support-for-stepping-part-of-CPU-signature.patch new file mode 100644 index 0000000..35c3988 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Add-support-for-stepping-part-of-CPU-signature.patch @@ -0,0 +1,183 @@ +From 51290a9442c1b9347c43b2fec34b7aa979d26c77 Mon Sep 17 00:00:00 2001 +Message-Id: <51290a9442c1b9347c43b2fec34b7aa979d26c77@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:34 +0200 +Subject: [PATCH] cpu_x86: Add support for stepping part of CPU signature +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +CPU models defined in the cpu_map can use signature/@stepping attribute +to match a limited set of stepping numbers. The value is a bitmap for +bits 0..15 each corresponding to a single stepping value. For example, +stepping='4-6,9' will match 4, 5, 6, and 9. Omitting the attribute is +equivalent to stepping='0-15'. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit c7a27949954d78dc95459758e329fb9c580361bb) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <20bd9df72a22a004bb665409ddba20ff89a5b66d.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 60 +++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 50 insertions(+), 10 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 45a073c1d0..0d81f3d2ae 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -125,6 +125,7 @@ typedef struct _virCPUx86Signature virCPUx86Signature; + struct _virCPUx86Signature { + unsigned int family; + unsigned int model; ++ virBitmapPtr stepping; + }; + + typedef struct _virCPUx86Signatures virCPUx86Signatures; +@@ -732,7 +733,17 @@ x86MakeSignature(unsigned int family, + static uint32_t + virCPUx86SignatureToCPUID(virCPUx86Signature *sig) + { +- return x86MakeSignature(sig->family, sig->model, 0); ++ unsigned int stepping = 0; ++ ++ if (sig->stepping) { ++ ssize_t firstBit; ++ ++ firstBit = virBitmapNextSetBit(sig->stepping, -1); ++ if (firstBit >= 0) ++ stepping = firstBit; ++ } ++ ++ return x86MakeSignature(sig->family, sig->model, stepping); + } + + +@@ -767,8 +778,8 @@ x86DataToSignatureFull(const virCPUx86Data *data, + } + + +-/* Mask out irrelevant bits (R and Step) from processor signature. */ +-#define SIGNATURE_MASK 0x0fff3ff0 ++/* Mask out reserved bits from processor signature. */ ++#define SIGNATURE_MASK 0x0fff3fff + + static uint32_t + x86DataToSignature(const virCPUx86Data *data) +@@ -1134,9 +1145,14 @@ virCPUx86SignaturesNew(size_t count) + static void + virCPUx86SignaturesFree(virCPUx86SignaturesPtr sigs) + { ++ size_t i; ++ + if (!sigs) + return; + ++ for (i = 0; i < sigs->count; i++) ++ virBitmapFree(sigs->items[i].stepping); ++ + g_free(sigs->items); + g_free(sigs); + } +@@ -1153,8 +1169,12 @@ virCPUx86SignaturesCopy(virCPUx86SignaturesPtr src) + + dst = virCPUx86SignaturesNew(src->count); + +- for (i = 0; i < src->count; i++) +- dst->items[i] = src->items[i]; ++ for (i = 0; i < src->count; i++) { ++ dst->items[i].family = src->items[i].family; ++ dst->items[i].model = src->items[i].model; ++ if (src->items[i].stepping) ++ dst->items[i].stepping = virBitmapNewCopy(src->items[i].stepping); ++ } + + return dst; + } +@@ -1176,7 +1196,9 @@ virCPUx86SignaturesMatch(virCPUx86SignaturesPtr sigs, + + for (i = 0; i < sigs->count; i++) { + if (sigs->items[i].family == family && +- sigs->items[i].model == model) ++ sigs->items[i].model == model && ++ (!sigs->items[i].stepping || ++ virBitmapIsBitSet(sigs->items[i].stepping, stepping))) + return true; + } + +@@ -1194,9 +1216,15 @@ virCPUx86SignaturesFormat(virCPUx86SignaturesPtr sigs) + return virBufferContentAndReset(&buf); + + for (i = 0; i < sigs->count; i++) { +- virBufferAsprintf(&buf, "(%u,%u,0), ", ++ g_autofree char *stepping = NULL; ++ ++ if (sigs->items[i].stepping) ++ stepping = virBitmapFormat(sigs->items[i].stepping); ++ ++ virBufferAsprintf(&buf, "(%u,%u,%s), ", + sigs->items[i].family, +- sigs->items[i].model); ++ sigs->items[i].model, ++ stepping ? stepping : "0-15"); + } + + virBufferTrim(&buf, ", ", -1); +@@ -1473,6 +1501,7 @@ x86ModelParseSignatures(virCPUx86ModelPtr model, + + for (i = 0; i < n; i++) { + virCPUx86Signature *sig = &model->signatures->items[i]; ++ g_autofree char *stepping = NULL; + int rc; + + ctxt->node = nodes[i]; +@@ -1492,6 +1521,11 @@ x86ModelParseSignatures(virCPUx86ModelPtr model, + model->name); + return -1; + } ++ ++ stepping = virXPathString("string(@stepping)", ctxt); ++ /* stepping corresponds to 4 bits in 32b signature, see above */ ++ if (stepping && virBitmapParse(stepping, &sig->stepping, 16) < 0) ++ return -1; + } + + ctxt->node = root; +@@ -2090,6 +2124,9 @@ x86Decode(virCPUDefPtr cpu, + virDomainCapsCPUModelPtr hvModel = NULL; + g_autofree char *sigs = NULL; + uint32_t signature; ++ unsigned int sigFamily; ++ unsigned int sigModel; ++ unsigned int sigStepping; + ssize_t i; + int rc; + +@@ -2103,6 +2140,7 @@ x86Decode(virCPUDefPtr cpu, + + vendor = x86DataToVendor(&data, map); + signature = x86DataToSignature(&data); ++ virCPUx86SignatureFromCPUID(signature, &sigFamily, &sigModel, &sigStepping); + + x86DataFilterTSX(&data, vendor, map); + +@@ -2184,8 +2222,10 @@ x86Decode(virCPUDefPtr cpu, + + sigs = virCPUx86SignaturesFormat(model->signatures); + +- VIR_DEBUG("Using CPU model %s (signatures %s) for CPU with signature %06lx", +- model->name, NULLSTR(sigs), (unsigned long)signature); ++ VIR_DEBUG("Using CPU model %s with signatures [%s] for " ++ "CPU with signature (%u,%u,%u)", ++ model->name, NULLSTR(sigs), ++ sigFamily, sigModel, sigStepping); + + cpu->model = g_steal_pointer(&cpuModel->model); + cpu->features = g_steal_pointer(&cpuModel->features); +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Don-t-check-return-value-of-x86ModelCopy.patch b/SOURCES/libvirt-cpu_x86-Don-t-check-return-value-of-x86ModelCopy.patch new file mode 100644 index 0000000..208599b --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Don-t-check-return-value-of-x86ModelCopy.patch @@ -0,0 +1,74 @@ +From 8a18e258633c347eb421904c63c2265ed59d61b5 Mon Sep 17 00:00:00 2001 +Message-Id: <8a18e258633c347eb421904c63c2265ed59d61b5@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:33 +0200 +Subject: [PATCH] cpu_x86: Don't check return value of x86ModelCopy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Thanks to glib allocation functions which abort on OOM the function +cannot ever return NULL. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 70f3041d39802e53a19901bee040ff33850cd5e0) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <3db9e891cf44e608a45504b120a5c276ead3ea8d.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index b87e3753da..45a073c1d0 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1287,9 +1287,6 @@ x86ModelFromCPU(const virCPUDef *cpu, + model = g_new0(virCPUx86Model, 1); + } + +- if (!model) +- return NULL; +- + for (i = 0; i < cpu->nfeatures; i++) { + virCPUx86FeaturePtr feature; + virCPUFeaturePolicy fpol; +@@ -1869,9 +1866,7 @@ x86Compute(virCPUDefPtr host, + return VIR_CPU_COMPARE_INCOMPATIBLE; + } + +- if (!(diff = x86ModelCopy(host_model))) +- return VIR_CPU_COMPARE_ERROR; +- ++ diff = x86ModelCopy(host_model); + x86DataSubtract(&diff->data, &cpu_optional->data); + x86DataSubtract(&diff->data, &cpu_require->data); + x86DataSubtract(&diff->data, &cpu_disable->data); +@@ -1892,8 +1887,7 @@ x86Compute(virCPUDefPtr host, + } + + if (guest) { +- if (!(guest_model = x86ModelCopy(host_model))) +- return VIR_CPU_COMPARE_ERROR; ++ guest_model = x86ModelCopy(host_model); + + if (cpu->vendor && host_model->vendor && + virCPUx86DataAddItem(&guest_model->data, +@@ -3131,8 +3125,8 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu) + return -1; + } + +- if (!(model = x86ModelCopy(model)) || +- x86DataToCPUFeatures(expanded, host ? -1 : VIR_CPU_FEATURE_REQUIRE, ++ model = x86ModelCopy(model); ++ if (x86DataToCPUFeatures(expanded, host ? -1 : VIR_CPU_FEATURE_REQUIRE, + &model->data, map) < 0) + return -1; + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Drop-noTSX-hint-for-incompatible-CPUs.patch b/SOURCES/libvirt-cpu_x86-Drop-noTSX-hint-for-incompatible-CPUs.patch new file mode 100644 index 0000000..ff9b9b1 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Drop-noTSX-hint-for-incompatible-CPUs.patch @@ -0,0 +1,102 @@ +From 882e0241f82b5bcbe239cf00134950e141de642a Mon Sep 17 00:00:00 2001 +Message-Id: <882e0241f82b5bcbe239cf00134950e141de642a@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:59 +0200 +Subject: [PATCH] cpu_x86: Drop noTSX hint for incompatible CPUs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The hint was introduced a long time ago when broken TSX implementation +was found in Haswell and Broadwell CPUs. Since then many more CPUs with +TSX were introduced and and disabled due to TAA vulnerability. + +Thus the hint is not very useful and I think removing it is a better +choice then updating it to cover all current noTSX models. + +This partially reverts: +commit 7f127ded657b24e0e55cd5f3539ef5b2dc935908 + cpu: Rework cpuCompare* APIs + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 8452779049ef785b1d2e373b4d42633d4a929a60) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <1126fcc8a0e18f0eed38c182013429fd7266c274.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 44 ++++++-------------------------------------- + 1 file changed, 6 insertions(+), 38 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index b4d5c795f7..1b388ec1b2 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1937,8 +1937,6 @@ virCPUx86Compare(virCPUDefPtr host, + bool failIncompatible) + { + virCPUCompareResult ret = VIR_CPU_COMPARE_ERROR; +- virCPUx86MapPtr map; +- virCPUx86ModelPtr model = NULL; + char *message = NULL; + + if (!host || !host->model) { +@@ -1954,46 +1952,16 @@ virCPUx86Compare(virCPUDefPtr host, + + ret = x86Compute(host, cpu, NULL, &message); + +- if (ret == VIR_CPU_COMPARE_INCOMPATIBLE) { +- bool noTSX = false; +- +- if (STREQ_NULLABLE(cpu->model, "Haswell") || +- STREQ_NULLABLE(cpu->model, "Broadwell")) { +- if (!(map = virCPUx86GetMap())) +- goto cleanup; +- +- if (!(model = x86ModelFromCPU(cpu, map, -1))) +- goto cleanup; +- +- noTSX = !x86FeatureInData("hle", &model->data, map) || +- !x86FeatureInData("rtm", &model->data, map); +- } +- +- if (failIncompatible) { +- ret = VIR_CPU_COMPARE_ERROR; +- if (message) { +- if (noTSX) { +- virReportError(VIR_ERR_CPU_INCOMPATIBLE, +- _("%s; try using '%s-noTSX' CPU model"), +- message, cpu->model); +- } else { +- virReportError(VIR_ERR_CPU_INCOMPATIBLE, "%s", message); +- } +- } else { +- if (noTSX) { +- virReportError(VIR_ERR_CPU_INCOMPATIBLE, +- _("try using '%s-noTSX' CPU model"), +- cpu->model); +- } else { +- virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); +- } +- } +- } ++ if (ret == VIR_CPU_COMPARE_INCOMPATIBLE && failIncompatible) { ++ ret = VIR_CPU_COMPARE_ERROR; ++ if (message) ++ virReportError(VIR_ERR_CPU_INCOMPATIBLE, "%s", message); ++ else ++ virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); + } + + cleanup: + VIR_FREE(message); +- x86ModelFree(model); + return ret; + } + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Honor-CPU-models-decode-element.patch b/SOURCES/libvirt-cpu_x86-Honor-CPU-models-decode-element.patch new file mode 100644 index 0000000..3928482 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Honor-CPU-models-decode-element.patch @@ -0,0 +1,67 @@ +From ba2f2a8c39f2e7fe5684d9b84a0a832be482a3ab Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:57 +0200 +Subject: [PATCH] cpu_x86: Honor CPU models' element +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Christian Ehrhardt +Tested-by: Christian Ehrhardt +(cherry picked from commit 7cd896ef31d33f78d40df918a33fe3867e251509) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840008 + +Signed-off-by: Jiri Denemark +Message-Id: <15f1eedf2c0df29a3942b4b28bc4575fa51ca19a.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 7fbb4c9a6c..b4d5c795f7 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2044,10 +2044,23 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, + virCPUx86ModelPtr candidate, + virCPUDefPtr cpuCandidate, + uint32_t signature, +- const char *preferred, +- bool checkPolicy) ++ const char *preferred) + { +- if (checkPolicy) { ++ if (cpuCandidate->type == VIR_CPU_TYPE_HOST && ++ !candidate->decodeHost) { ++ VIR_DEBUG("%s is not supposed to be used for host CPU definition", ++ cpuCandidate->model); ++ return 0; ++ } ++ ++ if (cpuCandidate->type == VIR_CPU_TYPE_GUEST && ++ !candidate->decodeGuest) { ++ VIR_DEBUG("%s is not supposed to be used for guest CPU definition", ++ cpuCandidate->model); ++ return 0; ++ } ++ ++ if (cpuCandidate->type == VIR_CPU_TYPE_HOST) { + size_t i; + for (i = 0; i < cpuCandidate->nfeatures; i++) { + if (cpuCandidate->features[i].policy == VIR_CPU_FEATURE_DISABLE) +@@ -2209,8 +2222,7 @@ x86Decode(virCPUDefPtr cpu, + + if ((rc = x86DecodeUseCandidate(model, cpuModel, + candidate, cpuCandidate, +- signature, preferred, +- cpu->type == VIR_CPU_TYPE_HOST))) { ++ signature, preferred))) { + virCPUDefFree(cpuModel); + cpuModel = cpuCandidate; + model = candidate; +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignatureFromCPUID.patch b/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignatureFromCPUID.patch new file mode 100644 index 0000000..2f1d44f --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignatureFromCPUID.patch @@ -0,0 +1,71 @@ +From 48e546c1097a61c806412efe53e216fbc8beafca Mon Sep 17 00:00:00 2001 +Message-Id: <48e546c1097a61c806412efe53e216fbc8beafca@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:31 +0200 +Subject: [PATCH] cpu_x86: Introduce virCPUx86SignatureFromCPUID +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It can be used for separating family, model, and stepping numbers from a +single 32b integer as reported by CPUID. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 3b474c1f8f3c1f124fab303625733ea79047660c) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <1fe352bfb7cf40b5b8e24eea3bf4e476269adb92.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index ed2090b0c6..dad3bceff0 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -717,6 +717,18 @@ x86MakeSignature(unsigned int family, + } + + ++static void ++virCPUx86SignatureFromCPUID(uint32_t sig, ++ unsigned int *family, ++ unsigned int *model, ++ unsigned int *stepping) ++{ ++ *family = ((sig >> 20) & 0xff) + ((sig >> 8) & 0xf); ++ *model = ((sig >> 12) & 0xf0) + ((sig >> 4) & 0xf); ++ *stepping = sig & 0xf; ++} ++ ++ + static void + x86DataToSignatureFull(const virCPUx86Data *data, + unsigned int *family, +@@ -725,17 +737,14 @@ x86DataToSignatureFull(const virCPUx86Data *data, + { + virCPUx86DataItem leaf1 = CPUID(.eax_in = 0x1); + virCPUx86DataItemPtr item; +- virCPUx86CPUIDPtr cpuid; + + *family = *model = *stepping = 0; + + if (!(item = virCPUx86DataGet(data, &leaf1))) + return; + +- cpuid = &item->data.cpuid; +- *family = ((cpuid->eax >> 20) & 0xff) + ((cpuid->eax >> 8) & 0xf); +- *model = ((cpuid->eax >> 12) & 0xf0) + ((cpuid->eax >> 4) & 0xf); +- *stepping = cpuid->eax & 0xf; ++ virCPUx86SignatureFromCPUID(item->data.cpuid.eax, ++ family, model, stepping); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignaturesFree.patch b/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignaturesFree.patch new file mode 100644 index 0000000..a299de9 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Introduce-virCPUx86SignaturesFree.patch @@ -0,0 +1,64 @@ +From 75afc6d9dc443666e1207ef6f1c968abdfec712a Mon Sep 17 00:00:00 2001 +Message-Id: <75afc6d9dc443666e1207ef6f1c968abdfec712a@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:30 +0200 +Subject: [PATCH] cpu_x86: Introduce virCPUx86SignaturesFree +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The function will be used for freeing virCPUx86Signatures structure +introduced later in this series. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 372b2cf1ca3f4361546732a3f5f9c0c0be2591e9) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <163ef39d14ce5457272e7508172f64d58d22a56b.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 9248403eff..ed2090b0c6 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1090,6 +1090,13 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + } + + ++static void ++virCPUx86SignaturesFree(uint32_t *signatures) ++{ ++ g_free(signatures); ++} ++ ++ + static int + virCPUx86SignaturesCopy(virCPUx86ModelPtr dst, + virCPUx86ModelPtr src) +@@ -1149,7 +1156,7 @@ x86ModelFree(virCPUx86ModelPtr model) + return; + + g_free(model->name); +- g_free(model->signatures); ++ virCPUx86SignaturesFree(model->signatures); + virCPUx86DataClear(&model->data); + g_free(model); + } +@@ -1414,7 +1421,7 @@ x86ModelParseSignatures(virCPUx86ModelPtr model, + return n; + + /* Remove inherited signatures. */ +- VIR_FREE(model->signatures); ++ virCPUx86SignaturesFree(model->signatures); + + model->nsignatures = n; + if (VIR_ALLOC_N(model->signatures, n) < 0) +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Move-and-rename-x86FormatSignatures.patch b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86FormatSignatures.patch new file mode 100644 index 0000000..ea7f7bd --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86FormatSignatures.patch @@ -0,0 +1,97 @@ +From 2b76e3009c224c0d03a4d951e0686aad6f6dc577 Mon Sep 17 00:00:00 2001 +Message-Id: <2b76e3009c224c0d03a4d951e0686aad6f6dc577@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:29 +0200 +Subject: [PATCH] cpu_x86: Move and rename x86FormatSignatures +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Later in this series the function will work on a newly introduced +virCPUx86Signatures structure. Let's move it to the place where all +related functions will be added and rename the function as +virCPUx86SignaturesFormat for easier review of the virCPUx86Signatures +patch. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 7e0d351fa69c468906533b2ac9b24212df13a370) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Conflicts: + src/cpu/cpu_x86.c + - v6.0.0-264-g0a125c7144 which removes the third argument + from virBufferTrim was not backported + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 65a99876a9..9248403eff 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1125,6 +1125,23 @@ virCPUx86SignaturesMatch(virCPUx86ModelPtr model, + } + + ++static char * ++virCPUx86SignaturesFormat(virCPUx86ModelPtr model) ++{ ++ virBuffer buf = VIR_BUFFER_INITIALIZER; ++ size_t i; ++ ++ for (i = 0; i < model->nsignatures; i++) { ++ virBufferAsprintf(&buf, "%06lx,", ++ (unsigned long)model->signatures[i]); ++ } ++ ++ virBufferTrim(&buf, ",", -1); ++ ++ return virBufferContentAndReset(&buf); ++} ++ ++ + static void + x86ModelFree(virCPUx86ModelPtr model) + { +@@ -1890,23 +1907,6 @@ virCPUx86Compare(virCPUDefPtr host, + } + + +-static char * +-x86FormatSignatures(virCPUx86ModelPtr model) +-{ +- virBuffer buf = VIR_BUFFER_INITIALIZER; +- size_t i; +- +- for (i = 0; i < model->nsignatures; i++) { +- virBufferAsprintf(&buf, "%06lx,", +- (unsigned long)model->signatures[i]); +- } +- +- virBufferTrim(&buf, ",", -1); +- +- return virBufferContentAndReset(&buf); +-} +- +- + /* + * Checks whether a candidate model is a better fit for the CPU data than the + * current model. +@@ -2134,7 +2134,7 @@ x86Decode(virCPUDefPtr cpu, + if (vendor) + cpu->vendor = g_strdup(vendor->name); + +- sigs = x86FormatSignatures(model); ++ sigs = virCPUx86SignaturesFormat(model); + + VIR_DEBUG("Using CPU model %s (signatures %s) for CPU with signature %06lx", + model->name, NULLSTR(sigs), (unsigned long)signature); +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelCopySignatures.patch b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelCopySignatures.patch new file mode 100644 index 0000000..bda9331 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelCopySignatures.patch @@ -0,0 +1,100 @@ +From 33cac9bcf27a885febf12e094cb2579f16a421b6 Mon Sep 17 00:00:00 2001 +Message-Id: <33cac9bcf27a885febf12e094cb2579f16a421b6@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:27 +0200 +Subject: [PATCH] cpu_x86: Move and rename x86ModelCopySignatures +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Later in this series the function will work on a newly introduced +virCPUx86Signatures structure. Let's move it to the place were all +related functions will be added and rename the function as +virCPUx86SignaturesCopy for easier review of the virCPUx86Signatures +patch. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit a8ec1d746ed41ac76df2e28cbc5683b3e37b9a60) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <0d4f902805cd5534eadedd2ec61385e9798c8b40.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index b4b1b475d6..16e6aa73d2 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1090,23 +1090,9 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + } + + +-static void +-x86ModelFree(virCPUx86ModelPtr model) +-{ +- if (!model) +- return; +- +- g_free(model->name); +- g_free(model->signatures); +- virCPUx86DataClear(&model->data); +- g_free(model); +-} +-G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Model, x86ModelFree); +- +- + static int +-x86ModelCopySignatures(virCPUx86ModelPtr dst, +- virCPUx86ModelPtr src) ++virCPUx86SignaturesCopy(virCPUx86ModelPtr dst, ++ virCPUx86ModelPtr src) + { + size_t i; + +@@ -1124,6 +1110,20 @@ x86ModelCopySignatures(virCPUx86ModelPtr dst, + } + + ++static void ++x86ModelFree(virCPUx86ModelPtr model) ++{ ++ if (!model) ++ return; ++ ++ g_free(model->name); ++ g_free(model->signatures); ++ virCPUx86DataClear(&model->data); ++ g_free(model); ++} ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Model, x86ModelFree); ++ ++ + static virCPUx86ModelPtr + x86ModelCopy(virCPUx86ModelPtr model) + { +@@ -1132,7 +1132,7 @@ x86ModelCopy(virCPUx86ModelPtr model) + copy = g_new0(virCPUx86Model, 1); + copy->name = g_strdup(model->name); + +- if (x86ModelCopySignatures(copy, model) < 0) { ++ if (virCPUx86SignaturesCopy(copy, model) < 0) { + x86ModelFree(copy); + return NULL; + } +@@ -1360,7 +1360,7 @@ x86ModelParseAncestor(virCPUx86ModelPtr model, + } + + model->vendor = ancestor->vendor; +- if (x86ModelCopySignatures(model, ancestor) < 0) ++ if (virCPUx86SignaturesCopy(model, ancestor) < 0) + return -1; + + x86DataCopy(&model->data, &ancestor->data); +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelHasSignature.patch b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelHasSignature.patch new file mode 100644 index 0000000..5d87091 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Move-and-rename-x86ModelHasSignature.patch @@ -0,0 +1,101 @@ +From 693d01f00b9608a4f4cac3b91e38b5537eff754f Mon Sep 17 00:00:00 2001 +Message-Id: <693d01f00b9608a4f4cac3b91e38b5537eff754f@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:28 +0200 +Subject: [PATCH] cpu_x86: Move and rename x86ModelHasSignature +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Later in this series the function will work on a newly introduced +virCPUx86Signatures structure. Let's move it to the place were all +related functions will be added and rename the function as +virCPUx86SignaturesMatch for easier review of the virCPUx86Signatures +patch. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 782be9f0af2e02e725fca45b7674e8b2f008dc6c) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <7662ee03449ae588a5381c546eb7e8a3b64cadb3.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 16e6aa73d2..65a99876a9 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1110,6 +1110,21 @@ virCPUx86SignaturesCopy(virCPUx86ModelPtr dst, + } + + ++static bool ++virCPUx86SignaturesMatch(virCPUx86ModelPtr model, ++ uint32_t signature) ++{ ++ size_t i; ++ ++ for (i = 0; i < model->nsignatures; i++) { ++ if (model->signatures[i] == signature) ++ return true; ++ } ++ ++ return false; ++} ++ ++ + static void + x86ModelFree(virCPUx86ModelPtr model) + { +@@ -1875,21 +1890,6 @@ virCPUx86Compare(virCPUDefPtr host, + } + + +-static bool +-x86ModelHasSignature(virCPUx86ModelPtr model, +- uint32_t signature) +-{ +- size_t i; +- +- for (i = 0; i < model->nsignatures; i++) { +- if (model->signatures[i] == signature) +- return true; +- } +- +- return false; +-} +- +- + static char * + x86FormatSignatures(virCPUx86ModelPtr model) + { +@@ -1961,8 +1961,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, + * consider candidates with matching family/model. + */ + if (signature && +- x86ModelHasSignature(current, signature) && +- !x86ModelHasSignature(candidate, signature)) { ++ virCPUx86SignaturesMatch(current, signature) && ++ !virCPUx86SignaturesMatch(candidate, signature)) { + VIR_DEBUG("%s differs in signature from matching %s", + cpuCandidate->model, cpuCurrent->model); + return 0; +@@ -1978,8 +1978,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, + * result in longer list of features. + */ + if (signature && +- x86ModelHasSignature(candidate, signature) && +- !x86ModelHasSignature(current, signature)) { ++ virCPUx86SignaturesMatch(candidate, signature) && ++ !virCPUx86SignaturesMatch(current, signature)) { + VIR_DEBUG("%s provides matching signature", cpuCandidate->model); + return 1; + } +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Prepare-virCPUx86UpdateLive-for-easier-extension.patch b/SOURCES/libvirt-cpu_x86-Prepare-virCPUx86UpdateLive-for-easier-extension.patch new file mode 100644 index 0000000..621e1e4 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Prepare-virCPUx86UpdateLive-for-easier-extension.patch @@ -0,0 +1,59 @@ +From 760e248164be819bebc03893ace58e0ddae7e440 Mon Sep 17 00:00:00 2001 +Message-Id: <760e248164be819bebc03893ace58e0ddae7e440@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:52 +0200 +Subject: [PATCH] cpu_x86: Prepare virCPUx86UpdateLive for easier extension +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Adding more checks into the existing if statements would turn them into +an unreadable mess. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 8dc791b5d3b20552cc0b8d6c04e34dd0f3ebe2ff) + +https://bugzilla.redhat.com/show_bug.cgi?id=1839999 + +Signed-off-by: Jiri Denemark +Message-Id: <169ed0334144715b52575ca3f7e67ce3170ba91a.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 9b7981d574..9e686a86d2 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3036,9 +3036,15 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + + for (i = 0; i < map->nfeatures; i++) { + virCPUx86FeaturePtr feature = map->features[i]; ++ virCPUFeaturePolicy expected = VIR_CPU_FEATURE_LAST; + +- if (x86DataIsSubset(&enabled, &feature->data) && +- !x86DataIsSubset(&model->data, &feature->data)) { ++ if (x86DataIsSubset(&model->data, &feature->data)) ++ expected = VIR_CPU_FEATURE_REQUIRE; ++ else ++ expected = VIR_CPU_FEATURE_DISABLE; ++ ++ if (expected == VIR_CPU_FEATURE_DISABLE && ++ x86DataIsSubset(&enabled, &feature->data)) { + VIR_DEBUG("Feature '%s' enabled by the hypervisor", feature->name); + if (cpu->check == VIR_CPU_CHECK_FULL) + virBufferAsprintf(&bufAdded, "%s,", feature->name); +@@ -3048,7 +3054,7 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + } + + if (x86DataIsSubset(&disabled, &feature->data) || +- (x86DataIsSubset(&model->data, &feature->data) && ++ (expected == VIR_CPU_FEATURE_REQUIRE && + !x86DataIsSubset(&enabled, &feature->data))) { + VIR_DEBUG("Feature '%s' disabled by the hypervisor", feature->name); + if (cpu->check == VIR_CPU_CHECK_FULL) +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Replace-32b-signatures-in-virCPUx86Model-with-a-struct.patch b/SOURCES/libvirt-cpu_x86-Replace-32b-signatures-in-virCPUx86Model-with-a-struct.patch new file mode 100644 index 0000000..203914b --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Replace-32b-signatures-in-virCPUx86Model-with-a-struct.patch @@ -0,0 +1,325 @@ +From 22fecd96659495908f37e1c33c1ed52be5fb2d44 Mon Sep 17 00:00:00 2001 +Message-Id: <22fecd96659495908f37e1c33c1ed52be5fb2d44@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:32 +0200 +Subject: [PATCH] cpu_x86: Replace 32b signatures in virCPUx86Model with a + struct +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The CPU models in our cpu_map define their signatures using separate +family and model numbers. Let's store the signatures in the same way in +our runtime representation of the cpu_map. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 22bded201ffc91661e44065203dcb987e51084ca) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Conflicts: + src/cpu/cpu_x86.c + - v6.0.0-264-g0a125c7144 which removes the third argument + from virBufferTrim was not backported + +Signed-off-by: Jiri Denemark +Message-Id: <21c1eee9c7bb3811f43aa044bb97fa373a159e26.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 149 +++++++++++++++++++++++++++++----------------- + 1 file changed, 95 insertions(+), 54 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index dad3bceff0..b87e3753da 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -121,6 +121,19 @@ static virCPUx86Feature x86_kvm_features[] = + KVM_FEATURE(VIR_CPU_x86_HV_STIMER_DIRECT), + }; + ++typedef struct _virCPUx86Signature virCPUx86Signature; ++struct _virCPUx86Signature { ++ unsigned int family; ++ unsigned int model; ++}; ++ ++typedef struct _virCPUx86Signatures virCPUx86Signatures; ++typedef virCPUx86Signatures *virCPUx86SignaturesPtr; ++struct _virCPUx86Signatures { ++ size_t count; ++ virCPUx86Signature *items; ++}; ++ + typedef struct _virCPUx86Model virCPUx86Model; + typedef virCPUx86Model *virCPUx86ModelPtr; + struct _virCPUx86Model { +@@ -128,8 +141,7 @@ struct _virCPUx86Model { + bool decodeHost; + bool decodeGuest; + virCPUx86VendorPtr vendor; +- size_t nsignatures; +- uint32_t *signatures; ++ virCPUx86SignaturesPtr signatures; + virCPUx86Data data; + }; + +@@ -717,6 +729,13 @@ x86MakeSignature(unsigned int family, + } + + ++static uint32_t ++virCPUx86SignatureToCPUID(virCPUx86Signature *sig) ++{ ++ return x86MakeSignature(sig->family, sig->model, 0); ++} ++ ++ + static void + virCPUx86SignatureFromCPUID(uint32_t sig, + unsigned int *family, +@@ -1099,41 +1118,65 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + } + + ++static virCPUx86SignaturesPtr ++virCPUx86SignaturesNew(size_t count) ++{ ++ virCPUx86SignaturesPtr sigs; ++ ++ sigs = g_new0(virCPUx86Signatures, 1); ++ sigs->items = g_new0(virCPUx86Signature, count); ++ sigs->count = count; ++ ++ return sigs; ++} ++ ++ + static void +-virCPUx86SignaturesFree(uint32_t *signatures) ++virCPUx86SignaturesFree(virCPUx86SignaturesPtr sigs) + { +- g_free(signatures); ++ if (!sigs) ++ return; ++ ++ g_free(sigs->items); ++ g_free(sigs); + } + + +-static int +-virCPUx86SignaturesCopy(virCPUx86ModelPtr dst, +- virCPUx86ModelPtr src) ++static virCPUx86SignaturesPtr ++virCPUx86SignaturesCopy(virCPUx86SignaturesPtr src) + { ++ virCPUx86SignaturesPtr dst; + size_t i; + +- if (src->nsignatures == 0) +- return 0; ++ if (!src || src->count == 0) ++ return NULL; + +- if (VIR_ALLOC_N(dst->signatures, src->nsignatures) < 0) +- return -1; ++ dst = virCPUx86SignaturesNew(src->count); + +- dst->nsignatures = src->nsignatures; +- for (i = 0; i < src->nsignatures; i++) +- dst->signatures[i] = src->signatures[i]; ++ for (i = 0; i < src->count; i++) ++ dst->items[i] = src->items[i]; + +- return 0; ++ return dst; + } + + + static bool +-virCPUx86SignaturesMatch(virCPUx86ModelPtr model, ++virCPUx86SignaturesMatch(virCPUx86SignaturesPtr sigs, + uint32_t signature) + { + size_t i; ++ unsigned int family; ++ unsigned int model; ++ unsigned int stepping; + +- for (i = 0; i < model->nsignatures; i++) { +- if (model->signatures[i] == signature) ++ if (!sigs) ++ return false; ++ ++ virCPUx86SignatureFromCPUID(signature, &family, &model, &stepping); ++ ++ for (i = 0; i < sigs->count; i++) { ++ if (sigs->items[i].family == family && ++ sigs->items[i].model == model) + return true; + } + +@@ -1142,17 +1185,21 @@ virCPUx86SignaturesMatch(virCPUx86ModelPtr model, + + + static char * +-virCPUx86SignaturesFormat(virCPUx86ModelPtr model) ++virCPUx86SignaturesFormat(virCPUx86SignaturesPtr sigs) + { + virBuffer buf = VIR_BUFFER_INITIALIZER; + size_t i; + +- for (i = 0; i < model->nsignatures; i++) { +- virBufferAsprintf(&buf, "%06lx,", +- (unsigned long)model->signatures[i]); ++ if (!sigs) ++ return virBufferContentAndReset(&buf); ++ ++ for (i = 0; i < sigs->count; i++) { ++ virBufferAsprintf(&buf, "(%u,%u,0), ", ++ sigs->items[i].family, ++ sigs->items[i].model); + } + +- virBufferTrim(&buf, ",", -1); ++ virBufferTrim(&buf, ", ", -1); + + return virBufferContentAndReset(&buf); + } +@@ -1179,16 +1226,11 @@ x86ModelCopy(virCPUx86ModelPtr model) + + copy = g_new0(virCPUx86Model, 1); + copy->name = g_strdup(model->name); +- +- if (virCPUx86SignaturesCopy(copy, model) < 0) { +- x86ModelFree(copy); +- return NULL; +- } ++ copy->signatures = virCPUx86SignaturesCopy(model->signatures); + x86DataCopy(©->data, &model->data); +- + copy->vendor = model->vendor; + +- return copy; ++ return g_steal_pointer(©); + } + + +@@ -1408,9 +1450,7 @@ x86ModelParseAncestor(virCPUx86ModelPtr model, + } + + model->vendor = ancestor->vendor; +- if (virCPUx86SignaturesCopy(model, ancestor) < 0) +- return -1; +- ++ model->signatures = virCPUx86SignaturesCopy(ancestor->signatures); + x86DataCopy(&model->data, &ancestor->data); + + return 0; +@@ -1432,34 +1472,29 @@ x86ModelParseSignatures(virCPUx86ModelPtr model, + /* Remove inherited signatures. */ + virCPUx86SignaturesFree(model->signatures); + +- model->nsignatures = n; +- if (VIR_ALLOC_N(model->signatures, n) < 0) +- return -1; ++ model->signatures = virCPUx86SignaturesNew(n); + + for (i = 0; i < n; i++) { +- unsigned int sigFamily = 0; +- unsigned int sigModel = 0; ++ virCPUx86Signature *sig = &model->signatures->items[i]; + int rc; + + ctxt->node = nodes[i]; + +- rc = virXPathUInt("string(@family)", ctxt, &sigFamily); +- if (rc < 0 || sigFamily == 0) { ++ rc = virXPathUInt("string(@family)", ctxt, &sig->family); ++ if (rc < 0 || sig->family == 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid CPU signature family in model %s"), + model->name); + return -1; + } + +- rc = virXPathUInt("string(@model)", ctxt, &sigModel); ++ rc = virXPathUInt("string(@model)", ctxt, &sig->model); + if (rc < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid CPU signature model in model %s"), + model->name); + return -1; + } +- +- model->signatures[i] = x86MakeSignature(sigFamily, sigModel, 0); + } + + ctxt->node = root; +@@ -1865,9 +1900,12 @@ x86Compute(virCPUDefPtr host, + &host_model->vendor->data) < 0) + return VIR_CPU_COMPARE_ERROR; + +- if (host_model->signatures && +- x86DataAddSignature(&guest_model->data, *host_model->signatures) < 0) +- return VIR_CPU_COMPARE_ERROR; ++ if (host_model->signatures && host_model->signatures->count > 0) { ++ virCPUx86Signature *sig = &host_model->signatures->items[0]; ++ if (x86DataAddSignature(&guest_model->data, ++ virCPUx86SignatureToCPUID(sig)) < 0) ++ return VIR_CPU_COMPARE_ERROR; ++ } + + if (cpu->type == VIR_CPU_TYPE_GUEST + && cpu->match == VIR_CPU_MATCH_EXACT) +@@ -1977,8 +2015,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, + * consider candidates with matching family/model. + */ + if (signature && +- virCPUx86SignaturesMatch(current, signature) && +- !virCPUx86SignaturesMatch(candidate, signature)) { ++ virCPUx86SignaturesMatch(current->signatures, signature) && ++ !virCPUx86SignaturesMatch(candidate->signatures, signature)) { + VIR_DEBUG("%s differs in signature from matching %s", + cpuCandidate->model, cpuCurrent->model); + return 0; +@@ -1994,8 +2032,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, + * result in longer list of features. + */ + if (signature && +- virCPUx86SignaturesMatch(candidate, signature) && +- !virCPUx86SignaturesMatch(current, signature)) { ++ virCPUx86SignaturesMatch(candidate->signatures, signature) && ++ !virCPUx86SignaturesMatch(current->signatures, signature)) { + VIR_DEBUG("%s provides matching signature", cpuCandidate->model); + return 1; + } +@@ -2150,7 +2188,7 @@ x86Decode(virCPUDefPtr cpu, + if (vendor) + cpu->vendor = g_strdup(vendor->name); + +- sigs = virCPUx86SignaturesFormat(model); ++ sigs = virCPUx86SignaturesFormat(model->signatures); + + VIR_DEBUG("Using CPU model %s (signatures %s) for CPU with signature %06lx", + model->name, NULLSTR(sigs), (unsigned long)signature); +@@ -3046,9 +3084,12 @@ virCPUx86Translate(virCPUDefPtr cpu, + virCPUx86DataAddItem(&model->data, &model->vendor->data) < 0) + return -1; + +- if (model->signatures && +- x86DataAddSignature(&model->data, model->signatures[0]) < 0) +- return -1; ++ if (model->signatures && model->signatures->count > 0) { ++ virCPUx86Signature *sig = &model->signatures->items[0]; ++ if (x86DataAddSignature(&model->data, ++ virCPUx86SignatureToCPUID(sig)) < 0) ++ return -1; ++ } + + if (!(translated = virCPUDefCopyWithoutModel(cpu))) + return -1; +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Baseline.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Baseline.patch new file mode 100644 index 0000000..7eed7c0 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Baseline.patch @@ -0,0 +1,160 @@ +From da1511d57b10d2cc1cb14d78c6911815ec7d9f64 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:20 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86Baseline +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 5efefe7d7eb129b72bcbbebfbba2d5750ffeeeff) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 46 +++++++++++++++++----------------------------- + 1 file changed, 17 insertions(+), 29 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 1ade53a4a8..6e7311694d 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2697,21 +2697,20 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + bool migratable) + { + virCPUx86MapPtr map = NULL; +- virCPUx86ModelPtr base_model = NULL; +- virCPUDefPtr cpu = NULL; ++ g_autoptr(virCPUx86Model) base_model = NULL; ++ g_autoptr(virCPUDef) cpu = NULL; + size_t i; + virCPUx86VendorPtr vendor = NULL; +- virCPUx86ModelPtr model = NULL; + bool outputVendor = true; + const char *modelName; + bool matchingNames = true; +- virCPUDataPtr featData = NULL; ++ g_autoptr(virCPUData) featData = NULL; + + if (!(map = virCPUx86GetMap())) +- goto error; ++ return NULL; + + if (!(base_model = x86ModelFromCPU(cpus[0], map, -1))) +- goto error; ++ return NULL; + + cpu = virCPUDefNew(); + +@@ -2723,11 +2722,12 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + } else if (!(vendor = x86VendorFind(map, cpus[0]->vendor))) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("Unknown CPU vendor %s"), cpus[0]->vendor); +- goto error; ++ return NULL; + } + + modelName = cpus[0]->model; + for (i = 1; i < ncpus; i++) { ++ g_autoptr(virCPUx86Model) model = NULL; + const char *vn = NULL; + + if (matchingNames && cpus[i]->model) { +@@ -2740,14 +2740,14 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + } + + if (!(model = x86ModelFromCPU(cpus[i], map, -1))) +- goto error; ++ return NULL; + + if (cpus[i]->vendor && model->vendor && + STRNEQ(cpus[i]->vendor, model->vendor->name)) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("CPU vendor %s of model %s differs from vendor %s"), + model->vendor->name, model->name, cpus[i]->vendor); +- goto error; ++ return NULL; + } + + if (cpus[i]->vendor) { +@@ -2763,30 +2763,28 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + if (!(vendor = x86VendorFind(map, vn))) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("Unknown CPU vendor %s"), vn); +- goto error; ++ return NULL; + } + } else if (STRNEQ(vendor->name, vn)) { + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("CPU vendors do not match")); +- goto error; ++ return NULL; + } + } + + x86DataIntersect(&base_model->data, &model->data); +- x86ModelFree(model); +- model = NULL; + } + + if (features) { + virCPUx86FeaturePtr feat; + + if (!(featData = virCPUDataNew(archs[0]))) +- goto cleanup; ++ return NULL; + + for (i = 0; features[i]; i++) { + if ((feat = x86FeatureFind(map, features[i])) && + x86DataAdd(&featData->data.x86, &feat->data) < 0) +- goto cleanup; ++ return NULL; + } + + x86DataIntersect(&base_model->data, &featData->data.x86); +@@ -2795,15 +2793,15 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + if (x86DataIsEmpty(&base_model->data)) { + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("CPUs are incompatible")); +- goto error; ++ return NULL; + } + + if (vendor && + virCPUx86DataAddItem(&base_model->data, &vendor->data) < 0) +- goto error; ++ return NULL; + + if (x86Decode(cpu, &base_model->data, models, modelName, migratable) < 0) +- goto error; ++ return NULL; + + if (STREQ_NULLABLE(cpu->model, modelName)) + cpu->fallback = VIR_CPU_FALLBACK_FORBID; +@@ -2811,17 +2809,7 @@ virCPUx86Baseline(virCPUDefPtr *cpus, + if (!outputVendor) + VIR_FREE(cpu->vendor); + +- cleanup: +- x86ModelFree(base_model); +- virCPUx86DataFree(featData); +- +- return cpu; +- +- error: +- x86ModelFree(model); +- virCPUDefFree(cpu); +- cpu = NULL; +- goto cleanup; ++ return g_steal_pointer(&cpu); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CheckFeature.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CheckFeature.patch new file mode 100644 index 0000000..e10e3a4 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CheckFeature.patch @@ -0,0 +1,54 @@ +From 22d4493fd34661f4b93c8d4c885e627d561f2e70 Mon Sep 17 00:00:00 2001 +Message-Id: <22d4493fd34661f4b93c8d4c885e627d561f2e70@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:18 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86CheckFeature +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 3b5f1ca58e8f12bc7b768206cb9c7c2ef237e3ff) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <0834c0debe689b9b8a5f694738edc149856a08fa.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 56081145c0..0aebe534e6 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2278,21 +2278,16 @@ static int + virCPUx86CheckFeature(const virCPUDef *cpu, + const char *name) + { +- int ret = -1; + virCPUx86MapPtr map; +- virCPUx86ModelPtr model = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; + + if (!(map = virCPUx86GetMap())) + return -1; + + if (!(model = x86ModelFromCPU(cpu, map, -1))) +- goto cleanup; +- +- ret = x86FeatureInData(name, &model->data, map); ++ return -1; + +- cleanup: +- x86ModelFree(model); +- return ret; ++ return x86FeatureInData(name, &model->data, map); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Compare.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Compare.patch new file mode 100644 index 0000000..1d15db0 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Compare.patch @@ -0,0 +1,69 @@ +From 2abd91246d3967f62473a9034f5d11f8e8ea8980 Mon Sep 17 00:00:00 2001 +Message-Id: <2abd91246d3967f62473a9034f5d11f8e8ea8980@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:14 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86Compare +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit bc62d7a49141d745b19d066c07599f228020a0b3) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <548eeddbf9eabf5e4a872390189bb0adf746c75f.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 1a1c846383..c111ff45d4 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1847,32 +1847,30 @@ virCPUx86Compare(virCPUDefPtr host, + virCPUDefPtr cpu, + bool failIncompatible) + { +- virCPUCompareResult ret = VIR_CPU_COMPARE_ERROR; +- char *message = NULL; ++ virCPUCompareResult ret; ++ g_autofree char *message = NULL; + + if (!host || !host->model) { + if (failIncompatible) { + virReportError(VIR_ERR_CPU_INCOMPATIBLE, "%s", + _("unknown host CPU")); +- } else { +- VIR_WARN("unknown host CPU"); +- ret = VIR_CPU_COMPARE_INCOMPATIBLE; ++ return VIR_CPU_COMPARE_ERROR; + } +- goto cleanup; ++ ++ VIR_WARN("unknown host CPU"); ++ return VIR_CPU_COMPARE_INCOMPATIBLE; + } + + ret = x86Compute(host, cpu, NULL, &message); + + if (ret == VIR_CPU_COMPARE_INCOMPATIBLE && failIncompatible) { +- ret = VIR_CPU_COMPARE_ERROR; + if (message) + virReportError(VIR_ERR_CPU_INCOMPATIBLE, "%s", message); + else + virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); ++ return VIR_CPU_COMPARE_ERROR; + } + +- cleanup: +- VIR_FREE(message); + return ret; + } + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CopyMigratable.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CopyMigratable.patch new file mode 100644 index 0000000..cd2562e --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86CopyMigratable.patch @@ -0,0 +1,54 @@ +From a96d5bdc7d2d2de7b35820530f0665dda3c66c68 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:26 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86CopyMigratable +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit a32a3e934f5e7769dc9d12a221f344319200b435) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <240a340d63d1c8612e58c2d5c52970291f3e7b6d.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 917cf857a6..b4b1b475d6 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3109,7 +3109,7 @@ x86FeatureFilterMigratable(const char *name, + static virCPUDefPtr + virCPUx86CopyMigratable(virCPUDefPtr cpu) + { +- virCPUDefPtr copy; ++ g_autoptr(virCPUDef) copy = NULL; + virCPUx86MapPtr map; + + if (!(map = virCPUx86GetMap())) +@@ -3120,13 +3120,9 @@ virCPUx86CopyMigratable(virCPUDefPtr cpu) + + if (virCPUDefCopyModelFilter(copy, cpu, false, + x86FeatureFilterMigratable, map) < 0) +- goto error; +- +- return copy; ++ return NULL; + +- error: +- virCPUDefFree(copy); +- return NULL; ++ return g_steal_pointer(©); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86DataParse.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86DataParse.patch new file mode 100644 index 0000000..f9b1904 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86DataParse.patch @@ -0,0 +1,87 @@ +From 45226d208c57719b50152dbec99a75969989208b Mon Sep 17 00:00:00 2001 +Message-Id: <45226d208c57719b50152dbec99a75969989208b@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:12 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86DataParse +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit c1532711dda6db27c7f6fa7d86ab5ec5d2ab2224) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 23 ++++++++--------------- + 1 file changed, 8 insertions(+), 15 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index cb5a2f941e..107fd9227d 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1636,8 +1636,8 @@ virCPUx86DataFormat(const virCPUData *data) + static virCPUDataPtr + virCPUx86DataParse(xmlXPathContextPtr ctxt) + { +- xmlNodePtr *nodes = NULL; +- virCPUDataPtr cpuData = NULL; ++ g_autofree xmlNodePtr *nodes = NULL; ++ g_autoptr(virCPUData) cpuData = NULL; + virCPUx86DataItem item; + size_t i; + int n; +@@ -1646,11 +1646,11 @@ virCPUx86DataParse(xmlXPathContextPtr ctxt) + if (n <= 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("no x86 CPU data found")); +- goto error; ++ return NULL; + } + + if (!(cpuData = virCPUDataNew(VIR_ARCH_X86_64))) +- goto error; ++ return NULL; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; +@@ -1658,28 +1658,21 @@ virCPUx86DataParse(xmlXPathContextPtr ctxt) + if (x86ParseCPUID(ctxt, &item) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse cpuid[%zu]"), i); +- goto error; ++ return NULL; + } + } else { + if (x86ParseMSR(ctxt, &item) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse msr[%zu]"), i); +- goto error; ++ return NULL; + } + } + + if (virCPUx86DataAdd(cpuData, &item) < 0) +- goto error; ++ return NULL; + } + +- cleanup: +- VIR_FREE(nodes); +- return cpuData; +- +- error: +- virCPUx86DataFree(cpuData); +- cpuData = NULL; +- goto cleanup; ++ return g_steal_pointer(&cpuData); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86ExpandFeatures.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86ExpandFeatures.patch new file mode 100644 index 0000000..21fe489 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86ExpandFeatures.patch @@ -0,0 +1,86 @@ +From 5f9b035adcf2813beb6cc82200b745f5e34acd8d Mon Sep 17 00:00:00 2001 +Message-Id: <5f9b035adcf2813beb6cc82200b745f5e34acd8d@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:25 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86ExpandFeatures +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit ff6897c84504a3e663759d710968ad1f72bc9208) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index c4654c8d4c..917cf857a6 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3055,30 +3055,29 @@ static int + virCPUx86ExpandFeatures(virCPUDefPtr cpu) + { + virCPUx86MapPtr map; +- virCPUDefPtr expanded = NULL; +- virCPUx86ModelPtr model = NULL; ++ g_autoptr(virCPUDef) expanded = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; + bool host = cpu->type == VIR_CPU_TYPE_HOST; + size_t i; +- int ret = -1; + + if (!(map = virCPUx86GetMap())) +- goto cleanup; ++ return -1; + + if (!(expanded = virCPUDefCopy(cpu))) +- goto cleanup; ++ return -1; + + virCPUDefFreeFeatures(expanded); + + if (!(model = x86ModelFind(map, cpu->model))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown CPU model %s"), cpu->model); +- goto cleanup; ++ return -1; + } + + if (!(model = x86ModelCopy(model)) || + x86DataToCPUFeatures(expanded, host ? -1 : VIR_CPU_FEATURE_REQUIRE, + &model->data, map) < 0) +- goto cleanup; ++ return -1; + + for (i = 0; i < cpu->nfeatures; i++) { + virCPUFeatureDefPtr f = cpu->features + i; +@@ -3089,17 +3088,12 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu) + continue; + + if (virCPUDefUpdateFeature(expanded, f->name, f->policy) < 0) +- goto cleanup; ++ return -1; + } + + virCPUDefFreeModel(cpu); + +- ret = virCPUDefCopyModel(cpu, expanded, false); +- +- cleanup: +- virCPUDefFree(expanded); +- x86ModelFree(model); +- return ret; ++ return virCPUDefCopyModel(cpu, expanded, false); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86GetHost.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86GetHost.patch new file mode 100644 index 0000000..41ebaa9 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86GetHost.patch @@ -0,0 +1,71 @@ +From 0b64dac1a3a9ef9cdfe3446ebbe114da1ae86e97 Mon Sep 17 00:00:00 2001 +Message-Id: <0b64dac1a3a9ef9cdfe3446ebbe114da1ae86e97@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:19 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86GetHost +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 4a7f6f43a2a6144780d7ab74b8a6f6b008a7aa9d) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <94056710375d491c42d12a46b20f670453c2a1c8.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 0aebe534e6..1ade53a4a8 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2637,18 +2637,18 @@ static int + virCPUx86GetHost(virCPUDefPtr cpu, + virDomainCapsCPUModelsPtr models) + { +- virCPUDataPtr cpuData = NULL; +- int ret = -1; ++ g_autoptr(virCPUData) cpuData = NULL; ++ int ret; + + if (virCPUx86DriverInitialize() < 0) +- goto cleanup; ++ return -1; + + if (!(cpuData = virCPUDataNew(archs[0]))) +- goto cleanup; ++ return -1; + + if (cpuidSet(CPUX86_BASIC, cpuData) < 0 || + cpuidSet(CPUX86_EXTENDED, cpuData) < 0) +- goto cleanup; ++ return -1; + + /* Read the IA32_ARCH_CAPABILITIES MSR (0x10a) if supported. + * This is best effort since there might be no way to read the MSR +@@ -2668,7 +2668,7 @@ virCPUx86GetHost(virCPUDefPtr cpu, + }; + + if (virCPUx86DataAdd(cpuData, &item) < 0) +- goto cleanup; ++ return -1; + } + } + +@@ -2684,8 +2684,6 @@ virCPUx86GetHost(virCPUDefPtr cpu, + VIR_DEBUG("Host CPU does not support invariant TSC"); + } + +- cleanup: +- virCPUx86DataFree(cpuData); + return ret; + } + #endif +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86LoadMap.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86LoadMap.patch new file mode 100644 index 0000000..d07a62e --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86LoadMap.patch @@ -0,0 +1,51 @@ +From 91a87dbe3a25e405ea5fbd87e4444ca77d04a34c Mon Sep 17 00:00:00 2001 +Message-Id: <91a87dbe3a25e405ea5fbd87e4444ca77d04a34c@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:11 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86LoadMap +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 3c650a8f7a89046b925fb5ddc78c4b6669ed76ef) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <63da1b86ef1c4f174234ff34e43d502afe326a2b.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 20cdd24390..cb5a2f941e 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1559,18 +1559,14 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Map, x86MapFree); + static virCPUx86MapPtr + virCPUx86LoadMap(void) + { +- virCPUx86MapPtr map; ++ g_autoptr(virCPUx86Map) map = NULL; + + map = g_new0(virCPUx86Map, 1); + + if (cpuMapLoad("x86", x86VendorParse, x86FeatureParse, x86ModelParse, map) < 0) +- goto error; +- +- return map; ++ return NULL; + +- error: +- x86MapFree(map); +- return NULL; ++ return g_steal_pointer(&map); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Translate.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Translate.patch new file mode 100644 index 0000000..e174de7 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Translate.patch @@ -0,0 +1,85 @@ +From 13d45a3f07d1639250101b037bb65c20aed60763 Mon Sep 17 00:00:00 2001 +Message-Id: <13d45a3f07d1639250101b037bb65c20aed60763@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:24 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86Translate +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit dff59020187c34e3f814c2aa24f3832d1d5b34f9) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <574920457f9fec4bc1938615016278eddd46ba90.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 26 ++++++++++---------------- + 1 file changed, 10 insertions(+), 16 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index e3a83061d0..c4654c8d4c 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3015,45 +3015,39 @@ static int + virCPUx86Translate(virCPUDefPtr cpu, + virDomainCapsCPUModelsPtr models) + { +- virCPUDefPtr translated = NULL; ++ g_autoptr(virCPUDef) translated = NULL; + virCPUx86MapPtr map; +- virCPUx86ModelPtr model = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; + size_t i; +- int ret = -1; + + if (!(map = virCPUx86GetMap())) +- goto cleanup; ++ return -1; + + if (!(model = x86ModelFromCPU(cpu, map, -1))) +- goto cleanup; ++ return -1; + + if (model->vendor && + virCPUx86DataAddItem(&model->data, &model->vendor->data) < 0) +- goto cleanup; ++ return -1; + + if (model->signatures && + x86DataAddSignature(&model->data, model->signatures[0]) < 0) +- goto cleanup; ++ return -1; + + if (!(translated = virCPUDefCopyWithoutModel(cpu))) +- goto cleanup; ++ return -1; + + if (x86Decode(translated, &model->data, models, NULL, false) < 0) +- goto cleanup; ++ return -1; + + for (i = 0; i < cpu->nfeatures; i++) { + virCPUFeatureDefPtr f = cpu->features + i; + if (virCPUDefUpdateFeature(translated, f->name, f->policy) < 0) +- goto cleanup; ++ return -1; + } + + virCPUDefStealModel(cpu, translated, true); +- ret = 0; +- +- cleanup: +- virCPUDefFree(translated); +- x86ModelFree(model); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Update.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Update.patch new file mode 100644 index 0000000..be42132 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86Update.patch @@ -0,0 +1,73 @@ +From 2631931d1dc94aeab384d92bd00866de912c9b7d Mon Sep 17 00:00:00 2001 +Message-Id: <2631931d1dc94aeab384d92bd00866de912c9b7d@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:22 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86Update +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit e0244a786db265647ab6c1c37ca3852876e4b0a3) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <1d8ad3e099081c35a41e1013458fa52d8fb4fae0.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 15 +++++---------- + 1 file changed, 5 insertions(+), 10 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 98f7863b6f..1f7a8802f6 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2853,9 +2853,8 @@ static int + virCPUx86Update(virCPUDefPtr guest, + const virCPUDef *host) + { +- virCPUx86ModelPtr model = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; + virCPUx86MapPtr map; +- int ret = -1; + size_t i; + + if (!host) { +@@ -2868,14 +2867,14 @@ virCPUx86Update(virCPUDefPtr guest, + return -1; + + if (!(model = x86ModelFromCPU(host, map, -1))) +- goto cleanup; ++ return -1; + + for (i = 0; i < guest->nfeatures; i++) { + if (guest->features[i].policy == VIR_CPU_FEATURE_OPTIONAL) { + int supported = x86FeatureInData(guest->features[i].name, + &model->data, map); + if (supported < 0) +- goto cleanup; ++ return -1; + else if (supported) + guest->features[i].policy = VIR_CPU_FEATURE_REQUIRE; + else +@@ -2885,13 +2884,9 @@ virCPUx86Update(virCPUDefPtr guest, + + if (guest->mode == VIR_CPU_MODE_HOST_MODEL || + guest->match == VIR_CPU_MATCH_MINIMUM) +- ret = x86UpdateHostModel(guest, host); +- else +- ret = 0; ++ return x86UpdateHostModel(guest, host); + +- cleanup: +- x86ModelFree(model); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86UpdateLive.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86UpdateLive.patch new file mode 100644 index 0000000..33aba20 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-virCPUx86UpdateLive.patch @@ -0,0 +1,116 @@ +From 7a293db132130fdda7b550d701fdb426de5257e3 Mon Sep 17 00:00:00 2001 +Message-Id: <7a293db132130fdda7b550d701fdb426de5257e3@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:23 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in virCPUx86UpdateLive +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 2748e91c548cbc48a5ea499e06e62de528c10d20) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <5c29b10ead2332033087fc6ed487c9ca53b7e3a4.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 42 +++++++++++++++--------------------------- + 1 file changed, 15 insertions(+), 27 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 1f7a8802f6..e3a83061d0 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2897,26 +2897,25 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + { + bool hostPassthrough = cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH; + virCPUx86MapPtr map; +- virCPUx86ModelPtr model = NULL; +- virCPUx86ModelPtr modelDisabled = NULL; +- virCPUx86Data enabled = VIR_CPU_X86_DATA_INIT; +- virCPUx86Data disabled = VIR_CPU_X86_DATA_INIT; +- virBuffer bufAdded = VIR_BUFFER_INITIALIZER; +- virBuffer bufRemoved = VIR_BUFFER_INITIALIZER; +- char *added = NULL; +- char *removed = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; ++ g_autoptr(virCPUx86Model) modelDisabled = NULL; ++ g_auto(virCPUx86Data) enabled = VIR_CPU_X86_DATA_INIT; ++ g_auto(virCPUx86Data) disabled = VIR_CPU_X86_DATA_INIT; ++ g_auto(virBuffer) bufAdded = VIR_BUFFER_INITIALIZER; ++ g_auto(virBuffer) bufRemoved = VIR_BUFFER_INITIALIZER; ++ g_autofree char *added = NULL; ++ g_autofree char *removed = NULL; + size_t i; +- int ret = -1; + + if (!(map = virCPUx86GetMap())) + return -1; + + if (!(model = x86ModelFromCPU(cpu, map, -1))) +- goto cleanup; ++ return -1; + + if (hostPassthrough && + !(modelDisabled = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE))) +- goto cleanup; ++ return -1; + + if (dataEnabled) + x86DataCopy(&enabled, &dataEnabled->data.x86); +@@ -2941,7 +2940,7 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + virBufferAsprintf(&bufAdded, "%s,", feature->name); + else if (virCPUDefUpdateFeature(cpu, feature->name, + VIR_CPU_FEATURE_REQUIRE) < 0) +- goto cleanup; ++ return -1; + } + + if (x86DataIsSubset(&disabled, &feature->data) || +@@ -2952,7 +2951,7 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + virBufferAsprintf(&bufRemoved, "%s,", feature->name); + else if (virCPUDefUpdateFeature(cpu, feature->name, + VIR_CPU_FEATURE_DISABLE) < 0) +- goto cleanup; ++ return -1; + } + } + +@@ -2978,28 +2977,17 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + _("guest CPU doesn't match specification: " + "missing features: %s"), + removed); +- goto cleanup; ++ return -1; + } + + if (cpu->check == VIR_CPU_CHECK_FULL && + !x86DataIsEmpty(&disabled)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("guest CPU doesn't match specification")); +- goto cleanup; ++ return -1; + } + +- ret = 0; +- +- cleanup: +- x86ModelFree(model); +- x86ModelFree(modelDisabled); +- virCPUx86DataClear(&enabled); +- virCPUx86DataClear(&disabled); +- VIR_FREE(added); +- VIR_FREE(removed); +- virBufferFreeAndReset(&bufAdded); +- virBufferFreeAndReset(&bufRemoved); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Compute.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Compute.patch new file mode 100644 index 0000000..ed0548d --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Compute.patch @@ -0,0 +1,181 @@ +From b8162d4174443babbd260b36ea4645469eca7d67 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:13 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86Compute +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit edf3c9045f1742d6c132066e4ba2da25c9ad7b26) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <6022f3717ce7ab0df25d31f2aaa08cac1c5f82de.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 65 +++++++++++++++++------------------------------ + 1 file changed, 24 insertions(+), 41 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 107fd9227d..1a1c846383 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1680,7 +1680,6 @@ virCPUx86DataParse(xmlXPathContextPtr ctxt) + * redundant code: + * MSG: error message + * CPU_DEF: a virCPUx86Data pointer with flags that are conflicting +- * RET: return code to set + * + * This macro generates the error string outputs it into logs. + */ +@@ -1689,13 +1688,12 @@ virCPUx86DataParse(xmlXPathContextPtr ctxt) + char *flagsStr = NULL; \ + if (!(flagsStr = x86FeatureNames(map, ", ", (CPU_DEF)))) { \ + virReportOOMError(); \ +- goto error; \ ++ return VIR_CPU_COMPARE_ERROR; \ + } \ + if (message) \ + *message = g_strdup_printf("%s: %s", _(MSG), flagsStr); \ + VIR_DEBUG("%s: %s", MSG, flagsStr); \ + VIR_FREE(flagsStr); \ +- ret = VIR_CPU_COMPARE_INCOMPATIBLE; \ + } while (0) + + +@@ -1706,15 +1704,15 @@ x86Compute(virCPUDefPtr host, + char **message) + { + virCPUx86MapPtr map = NULL; +- virCPUx86ModelPtr host_model = NULL; +- virCPUx86ModelPtr cpu_force = NULL; +- virCPUx86ModelPtr cpu_require = NULL; +- virCPUx86ModelPtr cpu_optional = NULL; +- virCPUx86ModelPtr cpu_disable = NULL; +- virCPUx86ModelPtr cpu_forbid = NULL; +- virCPUx86ModelPtr diff = NULL; +- virCPUx86ModelPtr guest_model = NULL; +- virCPUDataPtr guestData = NULL; ++ g_autoptr(virCPUx86Model) host_model = NULL; ++ g_autoptr(virCPUx86Model) cpu_force = NULL; ++ g_autoptr(virCPUx86Model) cpu_require = NULL; ++ g_autoptr(virCPUx86Model) cpu_optional = NULL; ++ g_autoptr(virCPUx86Model) cpu_disable = NULL; ++ g_autoptr(virCPUx86Model) cpu_forbid = NULL; ++ g_autoptr(virCPUx86Model) diff = NULL; ++ g_autoptr(virCPUx86Model) guest_model = NULL; ++ g_autoptr(virCPUData) guestData = NULL; + virCPUCompareResult ret; + virCPUx86CompareResult result; + virArch arch; +@@ -1764,13 +1762,13 @@ x86Compute(virCPUDefPtr host, + !(cpu_optional = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_OPTIONAL)) || + !(cpu_disable = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE)) || + !(cpu_forbid = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_FORBID))) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + x86DataIntersect(&cpu_forbid->data, &host_model->data); + if (!x86DataIsEmpty(&cpu_forbid->data)) { + virX86CpuIncompatible(N_("Host CPU provides forbidden features"), + &cpu_forbid->data); +- goto cleanup; ++ return VIR_CPU_COMPARE_INCOMPATIBLE; + } + + /* first remove features that were inherited from the CPU model and were +@@ -1785,20 +1783,20 @@ x86Compute(virCPUDefPtr host, + virX86CpuIncompatible(N_("Host CPU does not provide required " + "features"), + &cpu_require->data); +- goto cleanup; ++ return VIR_CPU_COMPARE_INCOMPATIBLE; + } + +- ret = VIR_CPU_COMPARE_IDENTICAL; +- + if (!(diff = x86ModelCopy(host_model))) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + x86DataSubtract(&diff->data, &cpu_optional->data); + x86DataSubtract(&diff->data, &cpu_require->data); + x86DataSubtract(&diff->data, &cpu_disable->data); + x86DataSubtract(&diff->data, &cpu_force->data); + +- if (!x86DataIsEmpty(&diff->data)) ++ if (x86DataIsEmpty(&diff->data)) ++ ret = VIR_CPU_COMPARE_IDENTICAL; ++ else + ret = VIR_CPU_COMPARE_SUPERSET; + + if (ret == VIR_CPU_COMPARE_SUPERSET +@@ -1807,54 +1805,39 @@ x86Compute(virCPUDefPtr host, + virX86CpuIncompatible(N_("Host CPU does not strictly match guest CPU: " + "Extra features"), + &diff->data); +- goto cleanup; ++ return VIR_CPU_COMPARE_INCOMPATIBLE; + } + + if (guest) { + if (!(guest_model = x86ModelCopy(host_model))) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + if (cpu->vendor && host_model->vendor && + virCPUx86DataAddItem(&guest_model->data, + &host_model->vendor->data) < 0) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + if (host_model->signatures && + x86DataAddSignature(&guest_model->data, *host_model->signatures) < 0) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + if (cpu->type == VIR_CPU_TYPE_GUEST + && cpu->match == VIR_CPU_MATCH_EXACT) + x86DataSubtract(&guest_model->data, &diff->data); + + if (x86DataAdd(&guest_model->data, &cpu_force->data)) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + + x86DataSubtract(&guest_model->data, &cpu_disable->data); + + if (!(guestData = virCPUDataNew(arch))) +- goto error; ++ return VIR_CPU_COMPARE_ERROR; + x86DataCopy(&guestData->data.x86, &guest_model->data); + +- *guest = guestData; ++ *guest = g_steal_pointer(&guestData); + } + +- cleanup: +- x86ModelFree(host_model); +- x86ModelFree(diff); +- x86ModelFree(cpu_force); +- x86ModelFree(cpu_require); +- x86ModelFree(cpu_optional); +- x86ModelFree(cpu_disable); +- x86ModelFree(cpu_forbid); +- x86ModelFree(guest_model); +- + return ret; +- +- error: +- virCPUx86DataFree(guestData); +- ret = VIR_CPU_COMPARE_ERROR; +- goto cleanup; + } + #undef virX86CpuIncompatible + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86DataToCPU.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86DataToCPU.patch new file mode 100644 index 0000000..563a3f0 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86DataToCPU.patch @@ -0,0 +1,71 @@ +From caedf791f3486b5b3ed1ef54e9c25e7c97b3a39a Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:06 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86DataToCPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 4f2fdad36db2da1aa139470846b3f60f65da8424) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <6f88b9d54c70352f9e4aeadd515cd9f4a599545a.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 20 ++++++-------------- + 1 file changed, 6 insertions(+), 14 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 48f36c2bfc..310dfcbcb3 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -771,9 +771,9 @@ x86DataToCPU(const virCPUx86Data *data, + virCPUx86MapPtr map, + virDomainCapsCPUModelPtr hvModel) + { +- virCPUDefPtr cpu; +- virCPUx86Data copy = VIR_CPU_X86_DATA_INIT; +- virCPUx86Data modelData = VIR_CPU_X86_DATA_INIT; ++ g_autoptr(virCPUDef) cpu = NULL; ++ g_auto(virCPUx86Data) copy = VIR_CPU_X86_DATA_INIT; ++ g_auto(virCPUx86Data) modelData = VIR_CPU_X86_DATA_INIT; + virCPUx86VendorPtr vendor; + + cpu = virCPUDefNew(); +@@ -801,7 +801,7 @@ x86DataToCPU(const virCPUx86Data *data, + if ((feature = x86FeatureFind(map, *blocker)) && + !x86DataIsSubset(©, &feature->data)) + if (x86DataAdd(&modelData, &feature->data) < 0) +- goto error; ++ return NULL; + } + } + +@@ -810,17 +810,9 @@ x86DataToCPU(const virCPUx86Data *data, + + if (x86DataToCPUFeatures(cpu, VIR_CPU_FEATURE_REQUIRE, ©, map) || + x86DataToCPUFeatures(cpu, VIR_CPU_FEATURE_DISABLE, &modelData, map)) +- goto error; +- +- cleanup: +- virCPUx86DataClear(&modelData); +- virCPUx86DataClear(©); +- return cpu; ++ return NULL; + +- error: +- virCPUDefFree(cpu); +- cpu = NULL; +- goto cleanup; ++ return g_steal_pointer(&cpu); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Decode.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Decode.patch new file mode 100644 index 0000000..a98d3e4 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Decode.patch @@ -0,0 +1,99 @@ +From e9b93240af4c391414b301c7a4a20837bc09b109 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:15 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86Decode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 9bb9cbf6761ecf985fe9cf8a18030a8aff9b448b) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <1414d86a79eb63d5600cf494455411814cbf10f7.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 24 +++++++----------------- + 1 file changed, 7 insertions(+), 17 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index c111ff45d4..dba4165527 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2032,15 +2032,12 @@ x86Decode(virCPUDefPtr cpu, + const char *preferred, + bool migratable) + { +- int ret = -1; + virCPUx86MapPtr map; + virCPUx86ModelPtr candidate; + virCPUDefPtr cpuCandidate; + virCPUx86ModelPtr model = NULL; +- virCPUDefPtr cpuModel = NULL; +- virCPUx86Data data = VIR_CPU_X86_DATA_INIT; +- virCPUx86Data copy = VIR_CPU_X86_DATA_INIT; +- virCPUx86Data features = VIR_CPU_X86_DATA_INIT; ++ g_autoptr(virCPUDef) cpuModel = NULL; ++ g_auto(virCPUx86Data) data = VIR_CPU_X86_DATA_INIT; + virCPUx86VendorPtr vendor; + virDomainCapsCPUModelPtr hvModel = NULL; + g_autofree char *sigs = NULL; +@@ -2054,7 +2051,7 @@ x86Decode(virCPUDefPtr cpu, + x86DataCopy(&data, cpuData); + + if (!(map = virCPUx86GetMap())) +- goto cleanup; ++ return -1; + + vendor = x86DataToVendor(&data, map); + signature = x86DataToSignature(&data); +@@ -2073,7 +2070,7 @@ x86Decode(virCPUDefPtr cpu, + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("CPU model %s is not supported by hypervisor"), + preferred); +- goto cleanup; ++ return -1; + } else { + VIR_WARN("Preferred CPU model %s not allowed by" + " hypervisor; closest supported model will be" +@@ -2096,7 +2093,7 @@ x86Decode(virCPUDefPtr cpu, + } + + if (!(cpuCandidate = x86DataToCPU(&data, candidate, map, hvModel))) +- goto cleanup; ++ return -1; + cpuCandidate->type = cpu->type; + + if ((rc = x86DecodeUseCandidate(model, cpuModel, +@@ -2115,7 +2112,7 @@ x86Decode(virCPUDefPtr cpu, + if (!cpuModel) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Cannot find suitable CPU model for given data")); +- goto cleanup; ++ return -1; + } + + /* Remove non-migratable features if requested +@@ -2149,14 +2146,7 @@ x86Decode(virCPUDefPtr cpu, + cpu->nfeatures_max = cpuModel->nfeatures_max; + cpuModel->nfeatures_max = 0; + +- ret = 0; +- +- cleanup: +- virCPUDefFree(cpuModel); +- virCPUx86DataClear(&data); +- virCPUx86DataClear(©); +- virCPUx86DataClear(&features); +- return ret; ++ return 0; + } + + static int +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Encode.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Encode.patch new file mode 100644 index 0000000..bd2ed7e --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86Encode.patch @@ -0,0 +1,141 @@ +From fc8f77c828ada1bfd3ac4957410f9b4efc659ce1 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:17 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86Encode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit e6e54fcebe99f1c07fe905c419cbe5d12f6844b1) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <4729842dcc538cca58a2ccd18fe2bcf9be410bbb.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 51 +++++++++++++++++++---------------------------- + 1 file changed, 21 insertions(+), 30 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index fd410aeafb..56081145c0 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2188,12 +2188,12 @@ x86Encode(virArch arch, + virCPUDataPtr *vendor) + { + virCPUx86MapPtr map = NULL; +- virCPUDataPtr data_forced = NULL; +- virCPUDataPtr data_required = NULL; +- virCPUDataPtr data_optional = NULL; +- virCPUDataPtr data_disabled = NULL; +- virCPUDataPtr data_forbidden = NULL; +- virCPUDataPtr data_vendor = NULL; ++ g_autoptr(virCPUData) data_forced = NULL; ++ g_autoptr(virCPUData) data_required = NULL; ++ g_autoptr(virCPUData) data_optional = NULL; ++ g_autoptr(virCPUData) data_disabled = NULL; ++ g_autoptr(virCPUData) data_forbidden = NULL; ++ g_autoptr(virCPUData) data_vendor = NULL; + + if (forced) + *forced = NULL; +@@ -2209,37 +2209,37 @@ x86Encode(virArch arch, + *vendor = NULL; + + if (!(map = virCPUx86GetMap())) +- goto error; ++ return -1; + + if (forced && + (!(data_forced = virCPUDataNew(arch)) || + x86EncodePolicy(&data_forced->data.x86, cpu, map, + VIR_CPU_FEATURE_FORCE) < 0)) +- goto error; ++ return -1; + + if (required && + (!(data_required = virCPUDataNew(arch)) || + x86EncodePolicy(&data_required->data.x86, cpu, map, + VIR_CPU_FEATURE_REQUIRE) < 0)) +- goto error; ++ return -1; + + if (optional && + (!(data_optional = virCPUDataNew(arch)) || + x86EncodePolicy(&data_optional->data.x86, cpu, map, + VIR_CPU_FEATURE_OPTIONAL) < 0)) +- goto error; ++ return -1; + + if (disabled && + (!(data_disabled = virCPUDataNew(arch)) || + x86EncodePolicy(&data_disabled->data.x86, cpu, map, + VIR_CPU_FEATURE_DISABLE) < 0)) +- goto error; ++ return -1; + + if (forbidden && + (!(data_forbidden = virCPUDataNew(arch)) || + x86EncodePolicy(&data_forbidden->data.x86, cpu, map, + VIR_CPU_FEATURE_FORBID) < 0)) +- goto error; ++ return -1; + + if (vendor) { + virCPUx86VendorPtr v = NULL; +@@ -2247,39 +2247,30 @@ x86Encode(virArch arch, + if (cpu->vendor && !(v = x86VendorFind(map, cpu->vendor))) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("CPU vendor %s not found"), cpu->vendor); +- goto error; ++ return -1; + } + + if (!(data_vendor = virCPUDataNew(arch))) +- goto error; ++ return -1; + + if (v && virCPUx86DataAdd(data_vendor, &v->data) < 0) +- goto error; ++ return -1; + } + + if (forced) +- *forced = data_forced; ++ *forced = g_steal_pointer(&data_forced); + if (required) +- *required = data_required; ++ *required = g_steal_pointer(&data_required); + if (optional) +- *optional = data_optional; ++ *optional = g_steal_pointer(&data_optional); + if (disabled) +- *disabled = data_disabled; ++ *disabled = g_steal_pointer(&data_disabled); + if (forbidden) +- *forbidden = data_forbidden; ++ *forbidden = g_steal_pointer(&data_forbidden); + if (vendor) +- *vendor = data_vendor; ++ *vendor = g_steal_pointer(&data_vendor); + + return 0; +- +- error: +- virCPUx86DataFree(data_forced); +- virCPUx86DataFree(data_required); +- virCPUx86DataFree(data_optional); +- virCPUx86DataFree(data_disabled); +- virCPUx86DataFree(data_forbidden); +- virCPUx86DataFree(data_vendor); +- return -1; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86EncodePolicy.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86EncodePolicy.patch new file mode 100644 index 0000000..ccdbf31 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86EncodePolicy.patch @@ -0,0 +1,46 @@ +From b91ae8a08c0906011e9ff2ed4f8c8fce908603b5 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:16 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86EncodePolicy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 5b45d2cf1ff0d2d972f103a678c01bc0eb7c1e18) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index dba4165527..fd410aeafb 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2164,7 +2164,7 @@ x86EncodePolicy(virCPUx86Data *data, + virCPUx86MapPtr map, + virCPUFeaturePolicy policy) + { +- virCPUx86ModelPtr model; ++ g_autoptr(virCPUx86Model) model = NULL; + + if (!(model = x86ModelFromCPU(cpu, map, policy))) + return -1; +@@ -2172,7 +2172,6 @@ x86EncodePolicy(virCPUx86Data *data, + *data = model->data; + model->data.len = 0; + model->data.items = NULL; +- x86ModelFree(model); + + return 0; + } +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86FeatureParse.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86FeatureParse.patch new file mode 100644 index 0000000..9f24a7b --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86FeatureParse.patch @@ -0,0 +1,115 @@ +From 39dea7f80de53e9f7fb8f298d1f9f7f32f20fc29 Mon Sep 17 00:00:00 2001 +Message-Id: <39dea7f80de53e9f7fb8f298d1f9f7f32f20fc29@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:08 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86FeatureParse +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 3125688f78f6289e51bfdaa196addb230b0de4e1) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <14cf6ca6816ee8bda3e195aa5218162b280715b5.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 31 ++++++++++++------------------- + 1 file changed, 12 insertions(+), 19 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 3ffddf0342..10c5fbacf7 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1023,13 +1023,12 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + void *data) + { + virCPUx86MapPtr map = data; +- xmlNodePtr *nodes = NULL; +- virCPUx86FeaturePtr feature; ++ g_autofree xmlNodePtr *nodes = NULL; ++ g_autoptr(virCPUx86Feature) feature = NULL; + virCPUx86DataItem item; + size_t i; + int n; +- char *str = NULL; +- int ret = -1; ++ g_autofree char *str = NULL; + + feature = g_new0(virCPUx86Feature, 1); + feature->migratable = true; +@@ -1038,7 +1037,7 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + if (x86FeatureFind(map, feature->name)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("CPU feature %s already defined"), feature->name); +- goto cleanup; ++ return -1; + } + + str = virXPathString("string(@migratable)", ctxt); +@@ -1047,13 +1046,13 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + + n = virXPathNodeSet("./cpuid|./msr", ctxt, &nodes); + if (n < 0) +- goto cleanup; ++ return -1; + + if (n == 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Missing cpuid or msr element in feature %s"), + feature->name); +- goto cleanup; ++ return -1; + } + + for (i = 0; i < n; i++) { +@@ -1063,37 +1062,31 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid cpuid[%zu] in %s feature"), + i, feature->name); +- goto cleanup; ++ return -1; + } + } else { + if (x86ParseMSR(ctxt, &item) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid msr[%zu] in %s feature"), + i, feature->name); +- goto cleanup; ++ return -1; + } + } + + if (virCPUx86DataAddItem(&feature->data, &item)) +- goto cleanup; ++ return -1; + } + + if (!feature->migratable && + VIR_APPEND_ELEMENT_COPY(map->migrate_blockers, + map->nblockers, + feature) < 0) +- goto cleanup; ++ return -1; + + if (VIR_APPEND_ELEMENT(map->features, map->nfeatures, feature) < 0) +- goto cleanup; +- +- ret = 0; ++ return -1; + +- cleanup: +- x86FeatureFree(feature); +- VIR_FREE(nodes); +- VIR_FREE(str); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelFromCPU.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelFromCPU.patch new file mode 100644 index 0000000..c152310 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelFromCPU.patch @@ -0,0 +1,74 @@ +From db7c7611aa3f80aca75e557795a12354f6fde82c Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:09 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86ModelFromCPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 93f173adbecee92f9973745a2aca65a27c4aa8a6) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 10c5fbacf7..5215405755 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1173,7 +1173,7 @@ x86ModelFromCPU(const virCPUDef *cpu, + virCPUx86MapPtr map, + int policy) + { +- virCPUx86ModelPtr model = NULL; ++ g_autoptr(virCPUx86Model) model = NULL; + size_t i; + + /* host CPU only contains required features; requesting other features +@@ -1216,7 +1216,7 @@ x86ModelFromCPU(const virCPUDef *cpu, + if (!(feature = x86FeatureFind(map, cpu->features[i].name))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown CPU feature %s"), cpu->features[i].name); +- goto error; ++ return NULL; + } + + if (policy == -1) { +@@ -1224,7 +1224,7 @@ x86ModelFromCPU(const virCPUDef *cpu, + case VIR_CPU_FEATURE_FORCE: + case VIR_CPU_FEATURE_REQUIRE: + if (x86DataAdd(&model->data, &feature->data) < 0) +- goto error; ++ return NULL; + break; + + case VIR_CPU_FEATURE_DISABLE: +@@ -1238,15 +1238,11 @@ x86ModelFromCPU(const virCPUDef *cpu, + break; + } + } else if (x86DataAdd(&model->data, &feature->data) < 0) { +- goto error; ++ return NULL; + } + } + +- return model; +- +- error: +- x86ModelFree(model); +- return NULL; ++ return g_steal_pointer(&model); + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelParse.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelParse.patch new file mode 100644 index 0000000..53b7217 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86ModelParse.patch @@ -0,0 +1,80 @@ +From 3400f296861c822d2b0e6d3b31e878c69187f40e Mon Sep 17 00:00:00 2001 +Message-Id: <3400f296861c822d2b0e6d3b31e878c69187f40e@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:10 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86ModelParse +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit b239a60967cc2979f01e4521d6582b7d6acedd72) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 23 +++++++++-------------- + 1 file changed, 9 insertions(+), 14 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 5215405755..20cdd24390 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1493,41 +1493,36 @@ x86ModelParse(xmlXPathContextPtr ctxt, + void *data) + { + virCPUx86MapPtr map = data; +- virCPUx86ModelPtr model = NULL; +- int ret = -1; ++ g_autoptr(virCPUx86Model) model = NULL; + + if (x86ModelFind(map, name)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Multiple definitions of CPU model '%s'"), name); +- goto cleanup; ++ return -1; + } + + model = g_new0(virCPUx86Model, 1); + model->name = g_strdup(name); + + if (x86ModelParseDecode(model, ctxt) < 0) +- goto cleanup; ++ return -1; + + if (x86ModelParseAncestor(model, ctxt, map) < 0) +- goto cleanup; ++ return -1; + + if (x86ModelParseSignatures(model, ctxt) < 0) +- goto cleanup; ++ return -1; + + if (x86ModelParseVendor(model, ctxt, map) < 0) +- goto cleanup; ++ return -1; + + if (x86ModelParseFeatures(model, ctxt, map) < 0) +- goto cleanup; ++ return -1; + + if (VIR_APPEND_ELEMENT(map->models, map->nmodels, model) < 0) +- goto cleanup; +- +- ret = 0; ++ return -1; + +- cleanup: +- x86ModelFree(model); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86UpdateHostModel.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86UpdateHostModel.patch new file mode 100644 index 0000000..d9f2fa0 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86UpdateHostModel.patch @@ -0,0 +1,71 @@ +From 2545e373c4a5b08836742742960244ece2586545 Mon Sep 17 00:00:00 2001 +Message-Id: <2545e373c4a5b08836742742960244ece2586545@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:21 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86UpdateHostModel +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 2f9d15b495efdd9e63c07cd6fda611701e71ee46) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 6e7311694d..98f7863b6f 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -2817,17 +2817,16 @@ static int + x86UpdateHostModel(virCPUDefPtr guest, + const virCPUDef *host) + { +- virCPUDefPtr updated = NULL; ++ g_autoptr(virCPUDef) updated = NULL; + size_t i; +- int ret = -1; + + if (!(updated = virCPUDefCopyWithoutModel(host))) +- goto cleanup; ++ return -1; + + updated->type = VIR_CPU_TYPE_GUEST; + updated->mode = VIR_CPU_MODE_CUSTOM; + if (virCPUDefCopyModel(updated, host, true) < 0) +- goto cleanup; ++ return -1; + + if (guest->vendor_id) { + VIR_FREE(updated->vendor_id); +@@ -2838,18 +2837,15 @@ x86UpdateHostModel(virCPUDefPtr guest, + if (virCPUDefUpdateFeature(updated, + guest->features[i].name, + guest->features[i].policy) < 0) +- goto cleanup; ++ return -1; + } + + virCPUDefStealModel(guest, updated, + guest->mode == VIR_CPU_MODE_CUSTOM); + guest->mode = VIR_CPU_MODE_CUSTOM; + guest->match = VIR_CPU_MATCH_EXACT; +- ret = 0; + +- cleanup: +- virCPUDefFree(updated); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86VendorParse.patch b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86VendorParse.patch new file mode 100644 index 0000000..05031ea --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-g_auto-in-x86VendorParse.patch @@ -0,0 +1,76 @@ +From 6a7bb46df53af5c1213e3a53a530c8745eb1aa0e Mon Sep 17 00:00:00 2001 +Message-Id: <6a7bb46df53af5c1213e3a53a530c8745eb1aa0e@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:07 +0200 +Subject: [PATCH] cpu_x86: Use g_auto* in x86VendorParse +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 6a0a7db9041cb1d8d92919bb4adf0d19bdd5dd68) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <3d21717ab7a594e301afc7f33ddbb32b57a8c56e.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 310dfcbcb3..3ffddf0342 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -849,9 +849,8 @@ x86VendorParse(xmlXPathContextPtr ctxt, + void *data) + { + virCPUx86MapPtr map = data; +- virCPUx86VendorPtr vendor = NULL; +- char *string = NULL; +- int ret = -1; ++ g_autoptr(virCPUx86Vendor) vendor = NULL; ++ g_autofree char *string = NULL; + + vendor = g_new0(virCPUx86Vendor, 1); + vendor->name = g_strdup(name); +@@ -859,7 +858,7 @@ x86VendorParse(xmlXPathContextPtr ctxt, + if (x86VendorFind(map, vendor->name)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("CPU vendor %s already defined"), vendor->name); +- goto cleanup; ++ return -1; + } + + string = virXPathString("string(@string)", ctxt); +@@ -867,21 +866,16 @@ x86VendorParse(xmlXPathContextPtr ctxt, + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Missing vendor string for CPU vendor %s"), + vendor->name); +- goto cleanup; ++ return -1; + } + + if (virCPUx86VendorToData(string, &vendor->data) < 0) +- goto cleanup; ++ return -1; + + if (VIR_APPEND_ELEMENT(map->vendors, map->nvendors, vendor) < 0) +- goto cleanup; +- +- ret = 0; ++ return -1; + +- cleanup: +- x86VendorFree(vendor); +- VIR_FREE(string); +- return ret; ++ return 0; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPU-x86-Data.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPU-x86-Data.patch new file mode 100644 index 0000000..5e65254 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPU-x86-Data.patch @@ -0,0 +1,149 @@ +From 6fa7baf5345b053e8215b34f721316f6f72f1cf3 Mon Sep 17 00:00:00 2001 +Message-Id: <6fa7baf5345b053e8215b34f721316f6f72f1cf3@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:00 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation for virCPU{, x86}Data +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 800868583012e20fb60eb4be9fb1ccc018677006) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 45 ++++++++++++++++++++++----------------------- + 1 file changed, 22 insertions(+), 23 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 1b388ec1b2..4d82d85746 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -468,8 +468,9 @@ virCPUx86DataClear(virCPUx86Data *data) + if (!data) + return; + +- VIR_FREE(data->items); ++ g_free(data->items); + } ++G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virCPUx86Data, virCPUx86DataClear); + + + static void +@@ -481,21 +482,19 @@ virCPUx86DataFree(virCPUDataPtr data) + virCPUx86DataClear(&data->data.x86); + VIR_FREE(data); + } ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUData, virCPUx86DataFree); + + +-static int ++static void + x86DataCopy(virCPUx86Data *dst, const virCPUx86Data *src) + { + size_t i; + +- if (VIR_ALLOC_N(dst->items, src->len) < 0) +- return -1; +- ++ dst->items = g_new0(virCPUx86DataItem, src->len); + dst->len = src->len; ++ + for (i = 0; i < src->len; i++) + dst->items[i] = src->items[i]; +- +- return 0; + } + + +@@ -781,9 +780,8 @@ x86DataToCPU(const virCPUx86Data *data, + + cpu->model = g_strdup(model->name); + +- if (x86DataCopy(©, data) < 0 || +- x86DataCopy(&modelData, &model->data) < 0) +- goto error; ++ x86DataCopy(©, data); ++ x86DataCopy(&modelData, &model->data); + + if ((vendor = x86DataToVendor(©, map))) + cpu->vendor = g_strdup(vendor->name); +@@ -1183,11 +1181,11 @@ x86ModelCopy(virCPUx86ModelPtr model) + + copy->name = g_strdup(model->name); + +- if (x86ModelCopySignatures(copy, model) < 0 || +- x86DataCopy(©->data, &model->data) < 0) { ++ if (x86ModelCopySignatures(copy, model) < 0) { + x86ModelFree(copy); + return NULL; + } ++ x86DataCopy(©->data, &model->data); + + copy->vendor = model->vendor; + +@@ -1415,10 +1413,11 @@ x86ModelParseAncestor(virCPUx86ModelPtr model, + } + + model->vendor = ancestor->vendor; +- if (x86ModelCopySignatures(model, ancestor) < 0 || +- x86DataCopy(&model->data, &ancestor->data) < 0) ++ if (x86ModelCopySignatures(model, ancestor) < 0) + return -1; + ++ x86DataCopy(&model->data, &ancestor->data); ++ + return 0; + } + +@@ -1904,9 +1903,9 @@ x86Compute(virCPUDefPtr host, + + x86DataSubtract(&guest_model->data, &cpu_disable->data); + +- if (!(guestData = virCPUDataNew(arch)) || +- x86DataCopy(&guestData->data.x86, &guest_model->data) < 0) ++ if (!(guestData = virCPUDataNew(arch))) + goto error; ++ x86DataCopy(&guestData->data.x86, &guest_model->data); + + *guest = guestData; + } +@@ -2139,9 +2138,11 @@ x86Decode(virCPUDefPtr cpu, + ssize_t i; + int rc; + +- if (!cpuData || x86DataCopy(&data, cpuData) < 0) ++ if (!cpuData) + return -1; + ++ x86DataCopy(&data, cpuData); ++ + if (!(map = virCPUx86GetMap())) + goto cleanup; + +@@ -3055,13 +3056,11 @@ virCPUx86UpdateLive(virCPUDefPtr cpu, + !(modelDisabled = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE))) + goto cleanup; + +- if (dataEnabled && +- x86DataCopy(&enabled, &dataEnabled->data.x86) < 0) +- goto cleanup; ++ if (dataEnabled) ++ x86DataCopy(&enabled, &dataEnabled->data.x86); + +- if (dataDisabled && +- x86DataCopy(&disabled, &dataDisabled->data.x86) < 0) +- goto cleanup; ++ if (dataDisabled) ++ x86DataCopy(&disabled, &dataDisabled->data.x86); + + for (i = 0; i < map->nfeatures; i++) { + virCPUx86FeaturePtr feature = map->features[i]; +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Feature.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Feature.patch new file mode 100644 index 0000000..5b84dd1 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Feature.patch @@ -0,0 +1,74 @@ +From 9810efd43b52070c20fe41b41175b0afff6710aa Mon Sep 17 00:00:00 2001 +Message-Id: <9810efd43b52070c20fe41b41175b0afff6710aa@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:02 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation for virCPUx86Feature +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 51b6e9c1000151cc515804134a00ccb0d7b3e44a) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <4c4090765c01f7359c521cb09d247b1694afbe9c.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 22 ++++------------------ + 1 file changed, 4 insertions(+), 18 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index aa66309b21..3a598e35d2 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -893,28 +893,17 @@ x86VendorParse(xmlXPathContextPtr ctxt, + } + + +-static virCPUx86FeaturePtr +-x86FeatureNew(void) +-{ +- virCPUx86FeaturePtr feature; +- +- if (VIR_ALLOC(feature) < 0) +- return NULL; +- +- return feature; +-} +- +- + static void + x86FeatureFree(virCPUx86FeaturePtr feature) + { + if (!feature) + return; + +- VIR_FREE(feature->name); ++ g_free(feature->name); + virCPUx86DataClear(&feature->data); +- VIR_FREE(feature); ++ g_free(feature); + } ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Feature, x86FeatureFree); + + + static int +@@ -1056,11 +1045,8 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + char *str = NULL; + int ret = -1; + +- if (!(feature = x86FeatureNew())) +- goto cleanup; +- ++ feature = g_new0(virCPUx86Feature, 1); + feature->migratable = true; +- + feature->name = g_strdup(name); + + if (x86FeatureFind(map, feature->name)) { +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Map.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Map.patch new file mode 100644 index 0000000..4f33301 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Map.patch @@ -0,0 +1,69 @@ +From 9adc6c8a4450e5eab78d7a8abd14b0e460d23a08 Mon Sep 17 00:00:00 2001 +Message-Id: <9adc6c8a4450e5eab78d7a8abd14b0e460d23a08@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:04 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation for virCPUx86Map +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 247e115e2753bde7957cc07a20d5a48a8a6632b0) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <0e3dc412e6e755f75e39a9ec22b2b5549c82930e.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 373c34a834..3711e03b3f 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1566,23 +1566,24 @@ x86MapFree(virCPUx86MapPtr map) + + for (i = 0; i < map->nfeatures; i++) + x86FeatureFree(map->features[i]); +- VIR_FREE(map->features); ++ g_free(map->features); + + for (i = 0; i < map->nmodels; i++) + x86ModelFree(map->models[i]); +- VIR_FREE(map->models); ++ g_free(map->models); + + for (i = 0; i < map->nvendors; i++) + x86VendorFree(map->vendors[i]); +- VIR_FREE(map->vendors); ++ g_free(map->vendors); + + /* migrate_blockers only points to the features from map->features list, + * which were already freed above + */ +- VIR_FREE(map->migrate_blockers); ++ g_free(map->migrate_blockers); + +- VIR_FREE(map); ++ g_free(map); + } ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Map, x86MapFree); + + + static virCPUx86MapPtr +@@ -1590,8 +1591,7 @@ virCPUx86LoadMap(void) + { + virCPUx86MapPtr map; + +- if (VIR_ALLOC(map) < 0) +- return NULL; ++ map = g_new0(virCPUx86Map, 1); + + if (cpuMapLoad("x86", x86VendorParse, x86FeatureParse, x86ModelParse, map) < 0) + goto error; +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Model.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Model.patch new file mode 100644 index 0000000..5d8ca7a --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Model.patch @@ -0,0 +1,103 @@ +From 18b41d5bb489080b8be3c78d7f8436c9fb13087a Mon Sep 17 00:00:00 2001 +Message-Id: <18b41d5bb489080b8be3c78d7f8436c9fb13087a@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:03 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation for virCPUx86Model +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit ccc0c2e4de58d62308e224076a7aa979ae97b520) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 31 ++++++++----------------------- + 1 file changed, 8 insertions(+), 23 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 3a598e35d2..373c34a834 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -1111,29 +1111,18 @@ x86FeatureParse(xmlXPathContextPtr ctxt, + } + + +-static virCPUx86ModelPtr +-x86ModelNew(void) +-{ +- virCPUx86ModelPtr model; +- +- if (VIR_ALLOC(model) < 0) +- return NULL; +- +- return model; +-} +- +- + static void + x86ModelFree(virCPUx86ModelPtr model) + { + if (!model) + return; + +- VIR_FREE(model->name); +- VIR_FREE(model->signatures); ++ g_free(model->name); ++ g_free(model->signatures); + virCPUx86DataClear(&model->data); +- VIR_FREE(model); ++ g_free(model); + } ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Model, x86ModelFree); + + + static int +@@ -1161,9 +1150,7 @@ x86ModelCopy(virCPUx86ModelPtr model) + { + virCPUx86ModelPtr copy; + +- if (VIR_ALLOC(copy) < 0) +- return NULL; +- ++ copy = g_new0(virCPUx86Model, 1); + copy->name = g_strdup(model->name); + + if (x86ModelCopySignatures(copy, model) < 0) { +@@ -1216,7 +1203,7 @@ x86ModelFromCPU(const virCPUDef *cpu, + if (cpu->type == VIR_CPU_TYPE_HOST && + policy != VIR_CPU_FEATURE_REQUIRE && + policy != -1) +- return x86ModelNew(); ++ return g_new0(virCPUx86Model, 1); + + if (cpu->model && + (policy == VIR_CPU_FEATURE_REQUIRE || policy == -1)) { +@@ -1228,7 +1215,7 @@ x86ModelFromCPU(const virCPUDef *cpu, + + model = x86ModelCopy(model); + } else { +- model = x86ModelNew(); ++ model = g_new0(virCPUx86Model, 1); + } + + if (!model) +@@ -1540,9 +1527,7 @@ x86ModelParse(xmlXPathContextPtr ctxt, + goto cleanup; + } + +- if (!(model = x86ModelNew())) +- goto cleanup; +- ++ model = g_new0(virCPUx86Model, 1); + model->name = g_strdup(name); + + if (x86ModelParseDecode(model, ctxt) < 0) +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Vendor.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Vendor.patch new file mode 100644 index 0000000..31bdeee --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Vendor.patch @@ -0,0 +1,53 @@ +From d151191af331a2127aa6b2126d15e2afd19e548d Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:01 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation for virCPUx86Vendor +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 8a41417b23dda97eb09bcd2921c1ab0d5fbce1b6) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 4d82d85746..aa66309b21 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -830,9 +830,10 @@ x86VendorFree(virCPUx86VendorPtr vendor) + if (!vendor) + return; + +- VIR_FREE(vendor->name); +- VIR_FREE(vendor); ++ g_free(vendor->name); ++ g_free(vendor); + } ++G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUx86Vendor, x86VendorFree); + + + static virCPUx86VendorPtr +@@ -860,9 +861,7 @@ x86VendorParse(xmlXPathContextPtr ctxt, + char *string = NULL; + int ret = -1; + +- if (VIR_ALLOC(vendor) < 0) +- goto cleanup; +- ++ vendor = g_new0(virCPUx86Vendor, 1); + vendor->name = g_strdup(name); + + if (x86VendorFind(map, vendor->name)) { +-- +2.26.2 + diff --git a/SOURCES/libvirt-cpu_x86-Use-glib-allocation-in-virCPUx86GetModels.patch b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-in-virCPUx86GetModels.patch new file mode 100644 index 0000000..ab20050 --- /dev/null +++ b/SOURCES/libvirt-cpu_x86-Use-glib-allocation-in-virCPUx86GetModels.patch @@ -0,0 +1,52 @@ +From a271a6a71073253a7dde518a63d5ee4965ee53d8 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:05 +0200 +Subject: [PATCH] cpu_x86: Use glib allocation in virCPUx86GetModels +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit e43e2ff7f5b629f979e56387c4be46f2be251b75) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <1d1d9c9b60f1ea44a2252cb2fbfbf3886ecd245f.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/cpu/cpu_x86.c | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c +index 3711e03b3f..48f36c2bfc 100644 +--- a/src/cpu/cpu_x86.c ++++ b/src/cpu/cpu_x86.c +@@ -3121,21 +3121,13 @@ virCPUx86GetModels(char ***models) + return -1; + + if (models) { +- if (VIR_ALLOC_N(*models, map->nmodels + 1) < 0) +- goto error; ++ *models = g_new0(char *, map->nmodels + 1); + + for (i = 0; i < map->nmodels; i++) + (*models)[i] = g_strdup(map->models[i]->name); + } + + return map->nmodels; +- +- error: +- if (models) { +- virStringListFree(*models); +- *models = NULL; +- } +- return -1; + } + + +-- +2.26.2 + diff --git a/SOURCES/libvirt-cputest-Add-data-for-Cooperlake-CPU.patch b/SOURCES/libvirt-cputest-Add-data-for-Cooperlake-CPU.patch new file mode 100644 index 0000000..1ed7790 --- /dev/null +++ b/SOURCES/libvirt-cputest-Add-data-for-Cooperlake-CPU.patch @@ -0,0 +1,1869 @@ +From 8efc803f2180f53f935275a88f5709b80022c1b2 Mon Sep 17 00:00:00 2001 +Message-Id: <8efc803f2180f53f935275a88f5709b80022c1b2@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:38 +0200 +Subject: [PATCH] cputest: Add data for Cooperlake CPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Pavel Hrdina +(cherry picked from commit 58691208e2063285d981a620873d48ddf8df8be5) + +https://bugzilla.redhat.com/show_bug.cgi?id=1781878 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/cputest.c | 1 + + .../x86_64-cpuid-Cooperlake-disabled.xml | 7 + + .../x86_64-cpuid-Cooperlake-enabled.xml | 11 + + .../x86_64-cpuid-Cooperlake-guest.xml | 40 + + .../x86_64-cpuid-Cooperlake-host.xml | 41 + + .../x86_64-cpuid-Cooperlake-json.xml | 23 + + .../cputestdata/x86_64-cpuid-Cooperlake.json | 1574 +++++++++++++++++ + tests/cputestdata/x86_64-cpuid-Cooperlake.sig | 4 + + tests/cputestdata/x86_64-cpuid-Cooperlake.xml | 68 + + 9 files changed, 1769 insertions(+) + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake-disabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake-enabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake.json + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake.sig + create mode 100644 tests/cputestdata/x86_64-cpuid-Cooperlake.xml + +diff --git a/tests/cputest.c b/tests/cputest.c +index 869d016ffc..68e8eb0290 100644 +--- a/tests/cputest.c ++++ b/tests/cputest.c +@@ -1272,6 +1272,7 @@ mymain(void) + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-W3520", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-X5460", JSON_NONE); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Ice-Lake-Server", JSON_MODELS); ++ DO_TEST_CPUID(VIR_ARCH_X86_64, "Cooperlake", JSON_MODELS); + + cleanup: + #if WITH_QEMU +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-disabled.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-disabled.xml +new file mode 100644 +index 0000000000..e7c59cef1e +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-disabled.xml +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-enabled.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-enabled.xml +new file mode 100644 +index 0000000000..2d7f83c80f +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-enabled.xml +@@ -0,0 +1,11 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +new file mode 100644 +index 0000000000..b5137e3c03 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-guest.xml +@@ -0,0 +1,40 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +new file mode 100644 +index 0000000000..52b352f4f1 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-host.xml +@@ -0,0 +1,41 @@ ++ ++ x86_64 ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +new file mode 100644 +index 0000000000..e323d6205e +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake-json.xml +@@ -0,0 +1,23 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake.json b/tests/cputestdata/x86_64-cpuid-Cooperlake.json +new file mode 100644 +index 0000000000..fd407affb6 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake.json +@@ -0,0 +1,1574 @@ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "phys-bits": 0, ++ "vmx-entry-load-rtit-ctl": false, ++ "core-id": -1, ++ "xlevel": 2147483656, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": true, ++ "mmx": true, ++ "rdpid": false, ++ "vmx-page-walk-5": false, ++ "vmx-page-walk-4": true, ++ "arat": true, ++ "gfni": false, ++ "vmx-desc-exit": true, ++ "ibrs-all": true, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": true, ++ "hv-frequencies": false, ++ "tsc-frequency": 0, ++ "vmx-rdseed-exit": true, ++ "xd": true, ++ "x-intel-pt-auto-level": true, ++ "hv-vendor-id": "", ++ "vmx-eptp-switching": true, ++ "kvm-asyncpf": true, ++ "kvm_asyncpf": true, ++ "perfctr_core": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "decodeassists": false, ++ "avx512cd": true, ++ "vmx-exit-load-efer": true, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4_1": true, ++ "sse4.1": true, ++ "sse4-1": true, ++ "legacy-cache": true, ++ "family": 6, ++ "vmx-vmwrite-vmexit-fields": true, ++ "vmx-vnmi": true, ++ "vmx-true-ctls": true, ++ "host-phys-bits-limit": 0, ++ "vmx-ept-execonly": true, ++ "vmx-exit-save-efer": true, ++ "vmx-invept-all-context": true, ++ "vmware-cpuid-freq": true, ++ "wbnoinvd": false, ++ "avx512f": true, ++ "hv-runtime": false, ++ "hv-stimer-direct": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "xcrypt": false, ++ "thread-id": -1, ++ "vmx-exit-load-pat": true, ++ "vmx-intr-exit": true, ++ "min-level": 31, ++ "vmx-flexpriority": true, ++ "xgetbv1": true, ++ "cid": false, ++ "hv-relaxed": false, ++ "hv-crash": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": true, ++ "vmx-cr8-load-exit": true, ++ "xsaveopt": true, ++ "vmx-apicv-vid": true, ++ "vmx-exit-save-pat": true, ++ "xtpr": false, ++ "tsx-ctrl": true, ++ "vmx-ple": false, ++ "hv-evmcs": false, ++ "avx512vl": true, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": true, ++ "vmx-vmfunc": true, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "vmx-encls-exit": false, ++ "cr8legacy": false, ++ "vmx-msr-bitmap": true, ++ "stibp": true, ++ "cpuid-0xb": true, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": true, ++ "kvm_pv_eoi": true, ++ "vmx-pml": true, ++ "apic-id": 4294967295, ++ "vmx-nmi-exit": true, ++ "vmx-invept-single-context-noglobals": true, ++ "rsba": false, ++ "pn": false, ++ "dca": false, ++ "hv-ipi": false, ++ "vendor": "GenuineIntel", ++ "vmx-unrestricted-guest": true, ++ "vmx-cr3-store-noexit": true, ++ "pku": true, ++ "smx": false, ++ "cmp_legacy": false, ++ "cmp-legacy": false, ++ "node-id": -1, ++ "avx512-4fmaps": false, ++ "vmcb_clean": false, ++ "vmcb-clean": false, ++ "3dnowext": false, ++ "amd-no-ssb": false, ++ "hle": true, ++ "npt": false, ++ "rdctl-no": true, ++ "vmx-invvpid": true, ++ "memory": "/machine/unattached/system[0]", ++ "clwb": true, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm_lock": false, ++ "svm-lock": false, ++ "pfthreshold": false, ++ "smep": true, ++ "smap": true, ++ "vmx-invpcid-exit": true, ++ "x2apic": true, ++ "avx512vbmi": false, ++ "avx512vnni": true, ++ "vmx-apicv-x2apic": true, ++ "hv-stimer": false, ++ "kvm-pv-sched-yield": true, ++ "x-hv-synic-kvm-only": false, ++ "vmx-invlpg-exit": true, ++ "vmx-invvpid-all-context": true, ++ "i64": true, ++ "vmx-activity-hlt": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "vmx-exit-ack-intr": true, ++ "ace2-en": false, ++ "pat": true, ++ "pae": true, ++ "sse": true, ++ "die-id": -1, ++ "vmx-tsc-offset": true, ++ "phe-en": false, ++ "kvm_nopiodelay": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "vmx-rdtsc-exit": true, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": true, ++ "socket-id": -1, ++ "mds-no": true, ++ "pcommit": false, ++ "vmx-vpid": true, ++ "syscall": true, ++ "level": 31, ++ "x-migrate-smi-count": true, ++ "avx512dq": true, ++ "svm": false, ++ "full-cpuid-auto-level": true, ++ "hv-reset": false, ++ "invtsc": false, ++ "vmx-monitor-exit": true, ++ "sse3": true, ++ "sse2": true, ++ "vmx-wbinvd-exit": true, ++ "ssbd": true, ++ "est": false, ++ "kvm-poll-control": true, ++ "kvm_poll_control": true, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-ipi": true, ++ "kvm-pv-eoi": true, ++ "cx8": true, ++ "vmx-invvpid-single-addr": true, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": true, ++ "hv-reenlightenment": false, ++ "kvm_mmu": false, ++ "kvm-mmu": false, ++ "sse4_2": true, ++ "sse4.2": true, ++ "sse4-2": true, ++ "pge": true, ++ "fill-mtrr-mask": true, ++ "avx512bitalg": false, ++ "nodeid_msr": false, ++ "vmx-entry-load-bndcfgs": false, ++ "pdcm": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "movbe": true, ++ "model": 85, ++ "nrip_save": false, ++ "nrip-save": false, ++ "kvm_pv_unhalt": true, ++ "ssse3": true, ++ "sse4a": false, ++ "vmx-pause-exit": true, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "enforce": false, ++ "stepping": 11, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tce": false, ++ "tsc": true, ++ "fpu": true, ++ "ibs": false, ++ "ds_cpl": false, ++ "ds-cpl": false, ++ "host-phys-bits": false, ++ "vmx-exit-nosave-debugctl": true, ++ "fma4": false, ++ "vmx-invept": true, ++ "la57": false, ++ "osvw": false, ++ "check": true, ++ "hv-spinlocks": 4294967295, ++ "pmu": false, ++ "vmx-eptad": true, ++ "pmm": false, ++ "apic": true, ++ "vmx-entry-noload-debugctl": true, ++ "spec-ctrl": true, ++ "vmx-posted-intr": true, ++ "vmx-apicv-register": true, ++ "min-xlevel2": 0, ++ "tsc-adjust": true, ++ "tsc_adjust": true, ++ "kvm-steal-time": true, ++ "kvm_steal_time": true, ++ "vmx-zero-len-inject": false, ++ "kvmclock": true, ++ "l3-cache": true, ++ "pschange-mc-no": true, ++ "vmx-rdrand-exit": true, ++ "lwp": false, ++ "hv-passthrough": false, ++ "amd-ssbd": true, ++ "ibpb": true, ++ "xop": false, ++ "avx": true, ++ "core-capability": false, ++ "vmx-invept-single-context": true, ++ "movdiri": false, ++ "ace2": false, ++ "avx512bw": true, ++ "acpi": false, ++ "hv-vapic": false, ++ "fsgsbase": true, ++ "vmx-ept-1gb": true, ++ "vmx-ept-2mb": true, ++ "ht": false, ++ "vmx-io-exit": true, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "vaes": false, ++ "popcnt": true, ++ "xsaves": true, ++ "movdir64b": false, ++ "tcg-cpuid": true, ++ "vmx-shadow-vmcs": true, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": true, ++ "vmx-entry-load-pat": true, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": true, ++ "umip": true, ++ "vmx-store-lma": true, ++ "vmx-movdr-exit": true, ++ "pse": true, ++ "avx2": true, ++ "sep": true, ++ "pclmuldq": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": true, ++ "x-hv-max-vps": -1, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "kvm": true, ++ "split-lock-detect": false, ++ "misalignsse": false, ++ "min-xlevel": 2147483656, ++ "realized": false, ++ "kvm-pv-unhalt": true, ++ "bmi2": true, ++ "bmi1": true, ++ "tsc_scale": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "hv-no-nonarch-coresharing": "off", ++ "hv-vpindex": false, ++ "amd-stibp": true, ++ "ucode-rev": 0, ++ "vmx-preemption-timer": true, ++ "xlevel2": 0, ++ "clflushopt": true, ++ "vmx-vnmi-pending": true, ++ "kvm-no-smi-migration": false, ++ "monitor": false, ++ "vmx-vintr-pending": true, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": true, ++ "taa-no": true, ++ "vmx-secondary-ctls": true, ++ "arch-capabilities": true, ++ "vmx-xsaves": true, ++ "clzero": false, ++ "3dnow": false, ++ "erms": true, ++ "x-force-features": false, ++ "vmx-entry-ia32e-mode": true, ++ "lahf-lm": true, ++ "lahf_lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": true, ++ "hv-synic": false, ++ "fxsr-opt": false, ++ "xstore": false, ++ "fxsr_opt": false, ++ "kvm-hint-dedicated": false, ++ "rtm": true, ++ "lmce": true, ++ "hv-time": false, ++ "perfctr-nb": false, ++ "perfctr_nb": false, ++ "hv-tlbflush": false, ++ "ffxsr": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vmx": true, ++ "vme": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": true, ++ "level-func7": 1, ++ "vmx-entry-load-efer": true, ++ "vmx-mtf": true, ++ "pause_filter": false, ++ "sha-ni": false, ++ "model-id": "Genuine Intel(R) CPU 0000%@", ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": true, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "model-expansion" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "qemu64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "qemu32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "alias-of": "phenom-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "pentium3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "pentium2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "pentium-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "n270-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "kvm64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "kvm32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "coreduo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "core2duo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "alias-of": "athlon-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Westmere-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Westmere-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v2", ++ "typename": "Snowridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "alias-of": "Snowridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v3", ++ "typename": "Skylake-Server-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS", ++ "typename": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v3", ++ "typename": "Skylake-Client-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS", ++ "typename": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Client-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Skylake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "SandyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "SandyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Penryn-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G5-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G4-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "alias-of": "Opteron_G3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Opteron_G2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Opteron_G1-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Nehalem-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Nehalem-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "alias-of": "KnightsMill-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "IvyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "IvyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v3", ++ "typename": "Icelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v2", ++ "typename": "Icelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-noTSX", ++ "typename": "Icelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "alias-of": "Icelake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "alias-of": "Icelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v2", ++ "typename": "Icelake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-noTSX", ++ "typename": "Icelake-Client-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "alias-of": "Icelake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "alias-of": "Icelake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Haswell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Haswell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Haswell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Haswell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v3", ++ "typename": "EPYC-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome-v1", ++ "typename": "EPYC-Rome-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdpid", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome", ++ "typename": "EPYC-Rome-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdpid", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-Rome-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Dhyana-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v2", ++ "typename": "Denverton-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v1", ++ "typename": "Denverton-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton", ++ "typename": "Denverton-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni" ++ ], ++ "alias-of": "Denverton-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake-v1", ++ "typename": "Cooperlake-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake", ++ "typename": "Cooperlake-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Cooperlake-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Conroe-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v3", ++ "typename": "Cascadelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX", ++ "typename": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Cascadelake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Cascadelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Broadwell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Broadwell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Broadwell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "Broadwell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [], ++ "alias-of": "486-v1", ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "definitions" ++} +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake.sig b/tests/cputestdata/x86_64-cpuid-Cooperlake.sig +new file mode 100644 +index 0000000000..72a8da4132 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake.sig +@@ -0,0 +1,4 @@ ++05065b ++family: 6 (0x06) ++model: 85 (0x55) ++stepping: 11 (0x0b) +diff --git a/tests/cputestdata/x86_64-cpuid-Cooperlake.xml b/tests/cputestdata/x86_64-cpuid-Cooperlake.xml +new file mode 100644 +index 0000000000..96d364b303 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Cooperlake.xml +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.26.2 + diff --git a/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-8550U-CPU-without-TSX.patch b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-8550U-CPU-without-TSX.patch new file mode 100644 index 0000000..024e53b --- /dev/null +++ b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-8550U-CPU-without-TSX.patch @@ -0,0 +1,2028 @@ +From 1f609088740213d7972a64cab6f7404996a43bf1 Mon Sep 17 00:00:00 2001 +Message-Id: <1f609088740213d7972a64cab6f7404996a43bf1@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:58:54 +0200 +Subject: [PATCH] cputest: Add data for Intel(R) Core(TM) i7-8550U CPU without + TSX +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiri Denemark +Reviewed-by: Christian Ehrhardt +(cherry picked from commit 62a50628ff34cf4c2c95e82bc645a4648b8f0422) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840008 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/cputest.c | 1 + + .../x86_64-cpuid-Core-i7-8550U-disabled.xml | 6 + + .../x86_64-cpuid-Core-i7-8550U-enabled.xml | 9 + + .../x86_64-cpuid-Core-i7-8550U-guest.xml | 31 + + .../x86_64-cpuid-Core-i7-8550U-host.xml | 39 + + .../x86_64-cpuid-Core-i7-8550U-json.xml | 19 + + .../x86_64-cpuid-Core-i7-8550U.json | 1769 +++++++++++++++++ + .../x86_64-cpuid-Core-i7-8550U.sig | 4 + + .../x86_64-cpuid-Core-i7-8550U.xml | 49 + + 9 files changed, 1927 insertions(+) + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U-disabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U.json + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U.sig + create mode 100644 tests/cputestdata/x86_64-cpuid-Core-i7-8550U.xml + +diff --git a/tests/cputest.c b/tests/cputest.c +index 279f788162..1f59f0d3a9 100644 +--- a/tests/cputest.c ++++ b/tests/cputest.c +@@ -1235,6 +1235,7 @@ mymain(void) + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core-i7-5600U-ibrs", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core-i7-7600U", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core-i7-7700", JSON_MODELS); ++ DO_TEST_CPUID(VIR_ARCH_X86_64, "Core-i7-8550U", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core-i7-8700", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core2-E6850", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Core2-Q9500", JSON_NONE); +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-disabled.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-disabled.xml +new file mode 100644 +index 0000000000..436ded22eb +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-disabled.xml +@@ -0,0 +1,6 @@ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml +new file mode 100644 +index 0000000000..6c480eeacf +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-enabled.xml +@@ -0,0 +1,9 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +new file mode 100644 +index 0000000000..92404e4d03 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-guest.xml +@@ -0,0 +1,31 @@ ++ ++ Skylake-Client-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +new file mode 100644 +index 0000000000..808a8ff969 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-host.xml +@@ -0,0 +1,39 @@ ++ ++ x86_64 ++ Broadwell-noTSX-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +new file mode 100644 +index 0000000000..645c0934c2 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U-json.xml +@@ -0,0 +1,19 @@ ++ ++ Skylake-Client-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.json b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.json +new file mode 100644 +index 0000000000..484931896a +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.json +@@ -0,0 +1,1769 @@ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "phys-bits": 0, ++ "core-id": -1, ++ "xlevel": 2147483656, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": true, ++ "mmx": true, ++ "arat": true, ++ "rdpid": false, ++ "vmx-page-walk-5": false, ++ "vmx-page-walk-4": true, ++ "vmx-desc-exit": true, ++ "gfni": false, ++ "ibrs-all": false, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": true, ++ "hv-frequencies": false, ++ "tsc-frequency": 0, ++ "vmx-rdseed-exit": true, ++ "xd": true, ++ "x-intel-pt-auto-level": true, ++ "hv-vendor-id": "", ++ "vmx-eptp-switching": true, ++ "kvm_asyncpf": true, ++ "kvm-asyncpf": true, ++ "perfctr_core": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "avx512cd": false, ++ "pbe": false, ++ "decodeassists": false, ++ "vmx-exit-clear-bndcfgs": false, ++ "vmx-exit-load-efer": true, ++ "sse4_1": true, ++ "sse4-1": true, ++ "sse4.1": true, ++ "family": 6, ++ "legacy-cache": true, ++ "vmx-vmwrite-vmexit-fields": true, ++ "vmx-vnmi": true, ++ "vmx-true-ctls": true, ++ "host-phys-bits-limit": 0, ++ "vmx-ept-execonly": true, ++ "vmx-exit-save-efer": true, ++ "vmx-invept-all-context": true, ++ "vmware-cpuid-freq": true, ++ "wbnoinvd": false, ++ "avx512f": false, ++ "xcrypt": false, ++ "hv-runtime": false, ++ "hv-stimer-direct": false, ++ "mce": true, ++ "mca": true, ++ "msr": true, ++ "thread-id": -1, ++ "vmx-exit-load-pat": true, ++ "vmx-intr-exit": true, ++ "min-level": 22, ++ "vmx-flexpriority": true, ++ "xgetbv1": true, ++ "cid": false, ++ "hv-relaxed": false, ++ "avx512-bf16": false, ++ "ds": false, ++ "hv-crash": false, ++ "fxsr": true, ++ "vmx-cr8-load-exit": true, ++ "xsaveopt": true, ++ "vmx-apicv-vid": false, ++ "vmx-exit-save-pat": true, ++ "tsx-ctrl": false, ++ "xtpr": false, ++ "vmx-ple": false, ++ "hv-evmcs": false, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "avx512vl": false, ++ "extapic": false, ++ "vmx-vmfunc": true, ++ "3dnowprefetch": true, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "cr8legacy": false, ++ "vmx-encls-exit": false, ++ "stibp": true, ++ "vmx-msr-bitmap": true, ++ "cpuid-0xb": true, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": true, ++ "kvm_pv_eoi": true, ++ "vmx-pml": true, ++ "apic-id": 4294967295, ++ "vmx-nmi-exit": true, ++ "vmx-invept-single-context-noglobals": true, ++ "pn": false, ++ "rsba": false, ++ "dca": false, ++ "vmx-unrestricted-guest": true, ++ "vendor": "GenuineIntel", ++ "hv-ipi": false, ++ "vmx-cr3-store-noexit": true, ++ "pku": false, ++ "smx": false, ++ "cmp-legacy": false, ++ "cmp_legacy": false, ++ "node-id": -1, ++ "avx512-4fmaps": false, ++ "vmcb_clean": false, ++ "vmcb-clean": false, ++ "hle": false, ++ "amd-no-ssb": false, ++ "3dnowext": false, ++ "npt": false, ++ "rdctl-no": false, ++ "vmx-invvpid": true, ++ "memory": "/machine/unattached/system[0]", ++ "clwb": false, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm_lock": false, ++ "svm-lock": false, ++ "pfthreshold": false, ++ "smap": true, ++ "smep": true, ++ "vmx-invpcid-exit": true, ++ "x2apic": true, ++ "avx512vnni": false, ++ "avx512vbmi": false, ++ "vmx-apicv-x2apic": true, ++ "hv-stimer": false, ++ "kvm-pv-sched-yield": true, ++ "vmx-invlpg-exit": true, ++ "x-hv-synic-kvm-only": false, ++ "vmx-invvpid-all-context": true, ++ "i64": true, ++ "vmx-activity-hlt": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "vmx-exit-ack-intr": true, ++ "ace2-en": false, ++ "pae": true, ++ "pat": true, ++ "sse": true, ++ "die-id": -1, ++ "vmx-tsc-offset": true, ++ "phe-en": false, ++ "kvm_nopiodelay": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "vmx-rdtsc-exit": true, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": true, ++ "socket-id": -1, ++ "mds-no": false, ++ "pcommit": false, ++ "vmx-vpid": true, ++ "syscall": true, ++ "level": 22, ++ "avx512dq": false, ++ "x-migrate-smi-count": true, ++ "svm": false, ++ "full-cpuid-auto-level": true, ++ "hv-reset": false, ++ "invtsc": false, ++ "vmx-monitor-exit": true, ++ "sse3": true, ++ "sse2": true, ++ "ssbd": true, ++ "vmx-wbinvd-exit": true, ++ "est": false, ++ "kvm-poll-control": true, ++ "kvm_poll_control": true, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-eoi": true, ++ "kvm-pv-ipi": true, ++ "cx8": true, ++ "vmx-invvpid-single-addr": true, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": true, ++ "hv-reenlightenment": false, ++ "kvm_mmu": false, ++ "kvm-mmu": false, ++ "sse4-2": true, ++ "sse4.2": true, ++ "sse4_2": true, ++ "pge": true, ++ "fill-mtrr-mask": true, ++ "avx512bitalg": false, ++ "vmx-entry-load-bndcfgs": false, ++ "nodeid_msr": false, ++ "pdcm": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "model": 142, ++ "movbe": true, ++ "nrip_save": false, ++ "nrip-save": false, ++ "vmx-pause-exit": true, ++ "ssse3": true, ++ "kvm_pv_unhalt": true, ++ "sse4a": false, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "enforce": false, ++ "stepping": 10, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ds-cpl": false, ++ "ds_cpl": false, ++ "ibs": false, ++ "fma4": false, ++ "host-phys-bits": false, ++ "vmx-exit-nosave-debugctl": true, ++ "vmx-invept": true, ++ "la57": false, ++ "osvw": false, ++ "check": true, ++ "hv-spinlocks": 4294967295, ++ "vmx-eptad": true, ++ "pmu": false, ++ "vmx-entry-noload-debugctl": true, ++ "pmm": false, ++ "apic": true, ++ "spec-ctrl": true, ++ "vmx-posted-intr": false, ++ "vmx-apicv-register": false, ++ "min-xlevel2": 0, ++ "tsc-adjust": true, ++ "tsc_adjust": true, ++ "kvm-steal-time": true, ++ "kvm_steal_time": true, ++ "kvmclock": true, ++ "vmx-zero-len-inject": false, ++ "l3-cache": true, ++ "pschange-mc-no": true, ++ "vmx-rdrand-exit": true, ++ "lwp": false, ++ "hv-passthrough": false, ++ "amd-ssbd": false, ++ "ibpb": false, ++ "xop": false, ++ "core-capability": false, ++ "avx": true, ++ "vmx-invept-single-context": true, ++ "movdiri": false, ++ "avx512bw": false, ++ "acpi": false, ++ "ace2": false, ++ "fsgsbase": true, ++ "hv-vapic": false, ++ "vmx-ept-1gb": true, ++ "vmx-ept-2mb": true, ++ "ht": false, ++ "vmx-io-exit": true, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "popcnt": true, ++ "vaes": false, ++ "xsaves": true, ++ "movdir64b": false, ++ "vmx-shadow-vmcs": true, ++ "tcg-cpuid": true, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": true, ++ "vmx-entry-load-pat": true, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": true, ++ "vmx-store-lma": true, ++ "umip": true, ++ "vmx-movdr-exit": true, ++ "avx2": true, ++ "pse": true, ++ "pclmuldq": true, ++ "sep": true, ++ "vmx-cr3-load-noexit": true, ++ "virt-ssbd": false, ++ "x-hv-max-vps": -1, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "split-lock-detect": false, ++ "kvm": true, ++ "misalignsse": false, ++ "min-xlevel": 2147483656, ++ "realized": false, ++ "kvm-pv-unhalt": true, ++ "bmi2": true, ++ "bmi1": true, ++ "tsc_scale": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "hv-vpindex": false, ++ "hv-no-nonarch-coresharing": "off", ++ "vmx-preemption-timer": true, ++ "xlevel2": 0, ++ "clflushopt": true, ++ "vmx-vnmi-pending": true, ++ "kvm-no-smi-migration": false, ++ "monitor": false, ++ "vmx-vintr-pending": true, ++ "avx512er": false, ++ "pmm-en": false, ++ "taa-no": false, ++ "pcid": true, ++ "vmx-secondary-ctls": true, ++ "arch-capabilities": true, ++ "vmx-xsaves": true, ++ "clzero": false, ++ "3dnow": false, ++ "erms": true, ++ "x-force-features": false, ++ "vmx-entry-ia32e-mode": true, ++ "lahf-lm": true, ++ "lahf_lm": true, ++ "vmx-ins-outs": true, ++ "vpclmulqdq": false, ++ "xstore": false, ++ "fxsr-opt": false, ++ "fxsr_opt": false, ++ "hv-synic": false, ++ "rtm": false, ++ "kvm-hint-dedicated": false, ++ "lmce": true, ++ "hv-time": false, ++ "perfctr_nb": false, ++ "perfctr-nb": false, ++ "hv-tlbflush": false, ++ "ffxsr": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vme": true, ++ "vmx": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "vmx-rdpmc-exit": true, ++ "wdt": false, ++ "vmx-entry-load-efer": true, ++ "level-func7": 0, ++ "vmx-mtf": true, ++ "pause_filter": false, ++ "model-id": "Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz", ++ "sha-ni": false, ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": true, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "model-expansion" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "svm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [ ++ "svm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "svm", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "svm", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v2", ++ "typename": "Snowridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v3", ++ "typename": "Skylake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS", ++ "typename": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v3", ++ "typename": "Skylake-Client-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS", ++ "typename": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "svm", ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "svm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [ ++ "svm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "avx512f", ++ "avx512f", ++ "avx512f" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "avx512f", ++ "avx512f", ++ "avx512f" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v2", ++ "typename": "Icelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-noTSX", ++ "typename": "Icelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v2", ++ "typename": "Icelake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-noTSX", ++ "typename": "Icelake-Client-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "svm", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v1", ++ "typename": "Denverton-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdctl-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton", ++ "typename": "Denverton-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdctl-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake-v1", ++ "typename": "Cooperlake-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512-bf16", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake", ++ "typename": "Cooperlake-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512-bf16", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v3", ++ "typename": "Cascadelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX", ++ "typename": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [ ++ "hle", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "definitions" ++} +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.sig b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.sig +new file mode 100644 +index 0000000000..410d0e230c +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.sig +@@ -0,0 +1,4 @@ ++0806ea ++family: 6 (0x06) ++model: 142 (0x8e) ++stepping: 10 (0x0a) +diff --git a/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.xml b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.xml +new file mode 100644 +index 0000000000..d4564b2543 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Core-i7-8550U.xml +@@ -0,0 +1,49 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.26.2 + diff --git a/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Gold-6130-CPU.patch b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Gold-6130-CPU.patch new file mode 100644 index 0000000..60fd572 --- /dev/null +++ b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Gold-6130-CPU.patch @@ -0,0 +1,1463 @@ +From 6d67e39ed491074df0ff8829278d119f4cd7a77d Mon Sep 17 00:00:00 2001 +Message-Id: <6d67e39ed491074df0ff8829278d119f4cd7a77d@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:36 +0200 +Subject: [PATCH] cputest: Add data for Intel(R) Xeon(R) Gold 6130 CPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Skylake-Server with family 6, model 85, stepping 4, which is currently +mis-detected as Cascadelake-Server CPU model. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 3714779b15e594a14de4e6fe49c2e3eafe39b161) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/cputest.c | 1 + + .../x86_64-cpuid-Xeon-Gold-6130-disabled.xml | 7 + + .../x86_64-cpuid-Xeon-Gold-6130-enabled.xml | 9 + + .../x86_64-cpuid-Xeon-Gold-6130-guest.xml | 33 + + .../x86_64-cpuid-Xeon-Gold-6130-host.xml | 35 + + .../x86_64-cpuid-Xeon-Gold-6130-json.xml | 16 + + .../x86_64-cpuid-Xeon-Gold-6130.json | 1201 +++++++++++++++++ + .../x86_64-cpuid-Xeon-Gold-6130.sig | 4 + + .../x86_64-cpuid-Xeon-Gold-6130.xml | 54 + + 9 files changed, 1360 insertions(+) + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-disabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-enabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-host.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.json + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.sig + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.xml + +diff --git a/tests/cputest.c b/tests/cputest.c +index f9f1ca74ff..869d016ffc 100644 +--- a/tests/cputest.c ++++ b/tests/cputest.c +@@ -1265,6 +1265,7 @@ mymain(void) + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E7-8890-v3", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E7540", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Gold-5115", JSON_MODELS); ++ DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Gold-6130", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Gold-6148", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Platinum-8268", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Platinum-9242", JSON_MODELS); +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-disabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-disabled.xml +new file mode 100644 +index 0000000000..e7c59cef1e +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-disabled.xml +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-enabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-enabled.xml +new file mode 100644 +index 0000000000..8610577479 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-enabled.xml +@@ -0,0 +1,9 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml +new file mode 100644 +index 0000000000..cfb0eb982d +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-guest.xml +@@ -0,0 +1,33 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-host.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-host.xml +new file mode 100644 +index 0000000000..207e9e0ee4 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-host.xml +@@ -0,0 +1,35 @@ ++ ++ x86_64 ++ Skylake-Server-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml +new file mode 100644 +index 0000000000..968d904557 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130-json.xml +@@ -0,0 +1,16 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.json b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.json +new file mode 100644 +index 0000000000..1a22387617 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.json +@@ -0,0 +1,1201 @@ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "phys-bits": 0, ++ "core-id": -1, ++ "xlevel": 2147483656, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "mmx": true, ++ "rdpid": false, ++ "arat": true, ++ "gfni": false, ++ "ibrs-all": false, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "hv-frequencies": false, ++ "tsc-frequency": 0, ++ "xd": true, ++ "x-intel-pt-auto-level": false, ++ "hv-vendor-id": "", ++ "kvm-asyncpf": true, ++ "kvm_asyncpf": true, ++ "perfctr_core": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "decodeassists": false, ++ "avx512cd": true, ++ "sse4_1": true, ++ "sse4.1": true, ++ "sse4-1": true, ++ "family": 6, ++ "legacy-cache": true, ++ "host-phys-bits-limit": 48, ++ "vmware-cpuid-freq": true, ++ "wbnoinvd": false, ++ "avx512f": true, ++ "hv-stimer-direct": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "hv-runtime": false, ++ "xcrypt": false, ++ "thread-id": -1, ++ "min-level": 13, ++ "xgetbv1": true, ++ "cid": false, ++ "hv-relaxed": false, ++ "hv-crash": false, ++ "ds": false, ++ "fxsr": true, ++ "xsaveopt": true, ++ "xtpr": false, ++ "hv-evmcs": false, ++ "avx512vl": true, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": true, ++ "avx512vbmi2": false, ++ "cr8legacy": false, ++ "stibp": true, ++ "cpuid-0xb": true, ++ "xcrypt-en": false, ++ "kvm_pv_eoi": true, ++ "apic-id": 4294967295, ++ "rsba": false, ++ "pn": false, ++ "dca": false, ++ "vendor": "GenuineIntel", ++ "hv-ipi": false, ++ "pku": true, ++ "smx": false, ++ "cmp_legacy": false, ++ "cmp-legacy": false, ++ "node-id": -1, ++ "avx512-4fmaps": false, ++ "vmcb_clean": false, ++ "vmcb-clean": false, ++ "3dnowext": false, ++ "amd-no-ssb": false, ++ "hle": true, ++ "npt": false, ++ "rdctl-no": false, ++ "memory": "/machine/unattached/system[0]", ++ "clwb": true, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm_lock": false, ++ "svm-lock": false, ++ "pfthreshold": false, ++ "smep": true, ++ "smap": true, ++ "x2apic": true, ++ "avx512vbmi": false, ++ "avx512vnni": false, ++ "hv-stimer": false, ++ "x-hv-synic-kvm-only": true, ++ "i64": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "ace2-en": false, ++ "pat": true, ++ "pae": true, ++ "sse": true, ++ "die-id": -1, ++ "phe-en": false, ++ "kvm_nopiodelay": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "hypervisor": true, ++ "socket-id": -1, ++ "mds-no": false, ++ "pcommit": false, ++ "syscall": true, ++ "level": 13, ++ "avx512dq": true, ++ "x-migrate-smi-count": false, ++ "svm": false, ++ "full-cpuid-auto-level": true, ++ "hv-reset": false, ++ "invtsc": false, ++ "sse3": true, ++ "sse2": true, ++ "ssbd": true, ++ "est": false, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-ipi": true, ++ "kvm-pv-eoi": true, ++ "cx8": true, ++ "cldemote": false, ++ "hv-reenlightenment": false, ++ "kvm_mmu": false, ++ "kvm-mmu": false, ++ "sse4_2": true, ++ "sse4.2": true, ++ "sse4-2": true, ++ "pge": true, ++ "fill-mtrr-mask": true, ++ "avx512bitalg": false, ++ "nodeid_msr": false, ++ "pdcm": false, ++ "movbe": true, ++ "model": 85, ++ "nrip_save": false, ++ "nrip-save": false, ++ "kvm_pv_unhalt": true, ++ "ssse3": true, ++ "sse4a": false, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "enforce": false, ++ "stepping": 4, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ibs": false, ++ "ds_cpl": false, ++ "ds-cpl": false, ++ "host-phys-bits": true, ++ "fma4": false, ++ "la57": false, ++ "osvw": false, ++ "check": true, ++ "hv-spinlocks": 4294967295, ++ "pmu": false, ++ "pmm": false, ++ "apic": true, ++ "spec-ctrl": true, ++ "min-xlevel2": 0, ++ "tsc-adjust": true, ++ "tsc_adjust": true, ++ "kvm-steal-time": true, ++ "kvm_steal_time": true, ++ "kvmclock": true, ++ "l3-cache": true, ++ "lwp": false, ++ "hv-passthrough": false, ++ "amd-ssbd": false, ++ "ibpb": false, ++ "xop": false, ++ "avx": true, ++ "core-capability": false, ++ "movdiri": false, ++ "ace2": false, ++ "avx512bw": true, ++ "acpi": false, ++ "hv-vapic": false, ++ "fsgsbase": true, ++ "ht": false, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "vaes": false, ++ "popcnt": true, ++ "xsaves": true, ++ "movdir64b": false, ++ "tcg-cpuid": true, ++ "lm": true, ++ "umip": true, ++ "pse": true, ++ "avx2": true, ++ "sep": true, ++ "pclmuldq": true, ++ "virt-ssbd": false, ++ "x-hv-max-vps": -1, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "split-lock-detect": false, ++ "kvm": true, ++ "misalignsse": false, ++ "min-xlevel": 2147483656, ++ "kvm-pv-unhalt": true, ++ "bmi2": true, ++ "bmi1": true, ++ "realized": false, ++ "tsc_scale": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "hv-vpindex": false, ++ "xlevel2": 0, ++ "clflushopt": true, ++ "kvm-no-smi-migration": false, ++ "monitor": false, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": true, ++ "arch-capabilities": true, ++ "3dnow": false, ++ "erms": true, ++ "x-force-features": false, ++ "lahf-lm": true, ++ "lahf_lm": true, ++ "vpclmulqdq": false, ++ "fxsr-opt": false, ++ "hv-synic": false, ++ "xstore": false, ++ "fxsr_opt": false, ++ "kvm-hint-dedicated": false, ++ "rtm": true, ++ "lmce": true, ++ "hv-time": false, ++ "perfctr-nb": false, ++ "perfctr_nb": false, ++ "ffxsr": false, ++ "hv-tlbflush": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vmx": true, ++ "vme": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "tbm": false, ++ "wdt": false, ++ "pause_filter": false, ++ "sha-ni": false, ++ "model-id": "Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz", ++ "abm": true, ++ "avx512pf": false, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "model-expansion" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "cpu64-rhel6-v1", ++ "typename": "cpu64-rhel6-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "cpu64-rhel6", ++ "typename": "cpu64-rhel6-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vnni", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vnni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vnni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "definitions" ++} +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.sig b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.sig +new file mode 100644 +index 0000000000..1a3f3449f0 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.sig +@@ -0,0 +1,4 @@ ++050654 ++family: 6 (0x06) ++model: 85 (0x55) ++stepping: 4 (0x04) +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.xml +new file mode 100644 +index 0000000000..cb9233ee22 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Gold-6130.xml +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.26.2 + diff --git a/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Platinum-9242-CPU.patch b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Platinum-9242-CPU.patch new file mode 100644 index 0000000..4df4203 --- /dev/null +++ b/SOURCES/libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Platinum-9242-CPU.patch @@ -0,0 +1,1695 @@ +From 0bd5ba1097ac8824a4a4a96b654f7ac8374703af Mon Sep 17 00:00:00 2001 +Message-Id: <0bd5ba1097ac8824a4a4a96b654f7ac8374703af@dist-git> +From: Jiri Denemark +Date: Tue, 26 May 2020 10:59:35 +0200 +Subject: [PATCH] cputest: Add data for Intel(R) Xeon(R) Platinum 9242 CPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Cascadelake-Server with family 6, model 85, stepping 7. + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +(cherry picked from commit 8605960389d208936b7f2cf3d2842a22a1aa7e22) + +https://bugzilla.redhat.com/show_bug.cgi?id=1840010 + +Signed-off-by: Jiri Denemark +Message-Id: <72ee1c6054fd300004508dd4fa01fd319dc2b527.1590483392.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/cputest.c | 1 + + ...6_64-cpuid-Xeon-Platinum-9242-disabled.xml | 7 + + ...86_64-cpuid-Xeon-Platinum-9242-enabled.xml | 10 + + .../x86_64-cpuid-Xeon-Platinum-9242-guest.xml | 38 + + .../x86_64-cpuid-Xeon-Platinum-9242-host.xml | 39 + + .../x86_64-cpuid-Xeon-Platinum-9242-json.xml | 21 + + .../x86_64-cpuid-Xeon-Platinum-9242.json | 1405 +++++++++++++++++ + .../x86_64-cpuid-Xeon-Platinum-9242.sig | 4 + + .../x86_64-cpuid-Xeon-Platinum-9242.xml | 68 + + 9 files changed, 1593 insertions(+) + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-disabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-guest.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-host.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.json + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.sig + create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.xml + +diff --git a/tests/cputest.c b/tests/cputest.c +index 1f59f0d3a9..f9f1ca74ff 100644 +--- a/tests/cputest.c ++++ b/tests/cputest.c +@@ -1267,6 +1267,7 @@ mymain(void) + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Gold-5115", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Gold-6148", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Platinum-8268", JSON_HOST); ++ DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Platinum-9242", JSON_MODELS); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-W3520", JSON_HOST); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-X5460", JSON_NONE); + DO_TEST_CPUID(VIR_ARCH_X86_64, "Ice-Lake-Server", JSON_MODELS); +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-disabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-disabled.xml +new file mode 100644 +index 0000000000..e7c59cef1e +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-disabled.xml +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml +new file mode 100644 +index 0000000000..43c3a93a16 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-enabled.xml +@@ -0,0 +1,10 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-guest.xml +new file mode 100644 +index 0000000000..faabdde8a0 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-guest.xml +@@ -0,0 +1,38 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-host.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-host.xml +new file mode 100644 +index 0000000000..01447f3478 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-host.xml +@@ -0,0 +1,39 @@ ++ ++ x86_64 ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml +new file mode 100644 +index 0000000000..36e95029be +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242-json.xml +@@ -0,0 +1,21 @@ ++ ++ Cascadelake-Server ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.json b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.json +new file mode 100644 +index 0000000000..103b094135 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.json +@@ -0,0 +1,1405 @@ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "phys-bits": 0, ++ "core-id": -1, ++ "xlevel": 2147483656, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": true, ++ "mmx": true, ++ "rdpid": false, ++ "vmx-page-walk-4": true, ++ "vmx-page-walk-5": false, ++ "arat": true, ++ "gfni": false, ++ "vmx-desc-exit": true, ++ "ibrs-all": true, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": true, ++ "hv-frequencies": false, ++ "tsc-frequency": 0, ++ "vmx-rdseed-exit": true, ++ "xd": true, ++ "x-intel-pt-auto-level": false, ++ "hv-vendor-id": "", ++ "vmx-eptp-switching": true, ++ "kvm-asyncpf": true, ++ "kvm_asyncpf": true, ++ "perfctr_core": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "decodeassists": false, ++ "avx512cd": true, ++ "vmx-exit-load-efer": true, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4_1": true, ++ "sse4.1": true, ++ "sse4-1": true, ++ "family": 6, ++ "legacy-cache": true, ++ "vmx-vmwrite-vmexit-fields": true, ++ "vmx-vnmi": true, ++ "vmx-true-ctls": true, ++ "host-phys-bits-limit": 48, ++ "vmx-ept-execonly": true, ++ "vmx-exit-save-efer": true, ++ "vmx-invept-all-context": true, ++ "vmware-cpuid-freq": true, ++ "wbnoinvd": false, ++ "avx512f": true, ++ "hv-stimer-direct": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "hv-runtime": false, ++ "xcrypt": false, ++ "thread-id": -1, ++ "vmx-exit-load-pat": true, ++ "vmx-intr-exit": true, ++ "min-level": 31, ++ "vmx-flexpriority": true, ++ "xgetbv1": true, ++ "cid": false, ++ "hv-relaxed": false, ++ "hv-crash": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": false, ++ "vmx-cr8-load-exit": true, ++ "xsaveopt": true, ++ "vmx-apicv-vid": true, ++ "vmx-exit-save-pat": true, ++ "xtpr": false, ++ "tsx-ctrl": true, ++ "vmx-ple": false, ++ "hv-evmcs": false, ++ "avx512vl": true, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": true, ++ "vmx-vmfunc": true, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "vmx-encls-exit": false, ++ "cr8legacy": false, ++ "vmx-msr-bitmap": true, ++ "stibp": true, ++ "cpuid-0xb": true, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": true, ++ "kvm_pv_eoi": true, ++ "vmx-pml": true, ++ "apic-id": 4294967295, ++ "vmx-nmi-exit": true, ++ "vmx-invept-single-context-noglobals": true, ++ "rsba": false, ++ "pn": false, ++ "dca": false, ++ "vendor": "GenuineIntel", ++ "vmx-unrestricted-guest": true, ++ "hv-ipi": false, ++ "vmx-cr3-store-noexit": true, ++ "pku": true, ++ "smx": false, ++ "cmp_legacy": false, ++ "cmp-legacy": false, ++ "node-id": -1, ++ "avx512-4fmaps": false, ++ "vmcb_clean": false, ++ "vmcb-clean": false, ++ "3dnowext": false, ++ "amd-no-ssb": false, ++ "hle": true, ++ "npt": false, ++ "rdctl-no": true, ++ "vmx-invvpid": true, ++ "memory": "/machine/unattached/system[0]", ++ "clwb": true, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm_lock": false, ++ "svm-lock": false, ++ "pfthreshold": false, ++ "smep": true, ++ "smap": true, ++ "vmx-invpcid-exit": true, ++ "x2apic": true, ++ "avx512vbmi": false, ++ "avx512vnni": true, ++ "vmx-apicv-x2apic": true, ++ "kvm-pv-sched-yield": true, ++ "hv-stimer": false, ++ "vmx-invlpg-exit": true, ++ "x-hv-synic-kvm-only": true, ++ "vmx-invvpid-all-context": true, ++ "i64": true, ++ "vmx-activity-hlt": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "vmx-exit-ack-intr": true, ++ "ace2-en": false, ++ "pat": true, ++ "pae": true, ++ "sse": true, ++ "die-id": -1, ++ "vmx-tsc-offset": true, ++ "phe-en": false, ++ "kvm_nopiodelay": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "vmx-rdtsc-exit": true, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": true, ++ "socket-id": -1, ++ "mds-no": true, ++ "pcommit": false, ++ "vmx-vpid": true, ++ "syscall": true, ++ "level": 31, ++ "avx512dq": true, ++ "x-migrate-smi-count": false, ++ "svm": false, ++ "full-cpuid-auto-level": true, ++ "hv-reset": false, ++ "invtsc": false, ++ "vmx-monitor-exit": true, ++ "sse3": true, ++ "sse2": true, ++ "vmx-wbinvd-exit": true, ++ "ssbd": true, ++ "est": false, ++ "kvm-poll-control": true, ++ "kvm_poll_control": true, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-ipi": true, ++ "kvm-pv-eoi": true, ++ "cx8": true, ++ "vmx-invvpid-single-addr": true, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": true, ++ "hv-reenlightenment": false, ++ "kvm_mmu": false, ++ "kvm-mmu": false, ++ "sse4_2": true, ++ "sse4.2": true, ++ "sse4-2": true, ++ "pge": true, ++ "fill-mtrr-mask": true, ++ "avx512bitalg": false, ++ "nodeid_msr": false, ++ "vmx-entry-load-bndcfgs": false, ++ "pdcm": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "movbe": true, ++ "model": 85, ++ "nrip_save": false, ++ "nrip-save": false, ++ "kvm_pv_unhalt": true, ++ "ssse3": true, ++ "sse4a": false, ++ "vmx-pause-exit": true, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "enforce": false, ++ "stepping": 7, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ibs": false, ++ "ds_cpl": false, ++ "ds-cpl": false, ++ "vmx-exit-nosave-debugctl": true, ++ "host-phys-bits": true, ++ "fma4": false, ++ "vmx-invept": true, ++ "la57": false, ++ "osvw": false, ++ "check": true, ++ "hv-spinlocks": 4294967295, ++ "vmx-eptad": true, ++ "pmu": false, ++ "pmm": false, ++ "apic": true, ++ "vmx-entry-noload-debugctl": true, ++ "spec-ctrl": true, ++ "vmx-posted-intr": true, ++ "vmx-apicv-register": true, ++ "min-xlevel2": 0, ++ "tsc-adjust": true, ++ "tsc_adjust": true, ++ "kvm-steal-time": true, ++ "kvm_steal_time": true, ++ "vmx-zero-len-inject": false, ++ "kvmclock": true, ++ "pschange-mc-no": true, ++ "l3-cache": true, ++ "vmx-rdrand-exit": true, ++ "lwp": false, ++ "hv-passthrough": false, ++ "amd-ssbd": true, ++ "ibpb": true, ++ "xop": false, ++ "avx": true, ++ "core-capability": false, ++ "vmx-invept-single-context": true, ++ "movdiri": false, ++ "ace2": false, ++ "avx512bw": true, ++ "acpi": false, ++ "hv-vapic": false, ++ "fsgsbase": true, ++ "vmx-ept-1gb": true, ++ "vmx-ept-2mb": true, ++ "ht": false, ++ "vmx-io-exit": true, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "vaes": false, ++ "popcnt": true, ++ "xsaves": true, ++ "movdir64b": false, ++ "tcg-cpuid": true, ++ "vmx-shadow-vmcs": true, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": true, ++ "vmx-entry-load-pat": true, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": true, ++ "umip": true, ++ "vmx-store-lma": true, ++ "vmx-movdr-exit": true, ++ "pse": true, ++ "avx2": true, ++ "sep": true, ++ "pclmuldq": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": true, ++ "x-hv-max-vps": -1, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "split-lock-detect": false, ++ "kvm": true, ++ "misalignsse": false, ++ "min-xlevel": 2147483656, ++ "kvm-pv-unhalt": true, ++ "bmi2": true, ++ "bmi1": true, ++ "realized": false, ++ "tsc_scale": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "hv-vpindex": false, ++ "hv-no-nonarch-coresharing": "off", ++ "vmx-preemption-timer": true, ++ "ucode-rev": 0, ++ "xlevel2": 0, ++ "clflushopt": true, ++ "vmx-vnmi-pending": true, ++ "kvm-no-smi-migration": false, ++ "monitor": false, ++ "vmx-vintr-pending": true, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": true, ++ "taa-no": false, ++ "vmx-secondary-ctls": true, ++ "arch-capabilities": true, ++ "vmx-xsaves": true, ++ "clzero": false, ++ "3dnow": false, ++ "erms": true, ++ "vmx-entry-ia32e-mode": true, ++ "x-force-features": false, ++ "lahf_lm": true, ++ "lahf-lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": true, ++ "fxsr-opt": false, ++ "hv-synic": false, ++ "xstore": false, ++ "fxsr_opt": false, ++ "kvm-hint-dedicated": false, ++ "rtm": true, ++ "lmce": true, ++ "hv-time": false, ++ "perfctr-nb": false, ++ "perfctr_nb": false, ++ "ffxsr": false, ++ "hv-tlbflush": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vmx": true, ++ "vme": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": true, ++ "level-func7": 0, ++ "vmx-entry-load-efer": true, ++ "vmx-mtf": true, ++ "pause_filter": false, ++ "sha-ni": false, ++ "model-id": "Intel(R) Xeon(R) Platinum 9242 CPU @ 2.30GHz", ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": true, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "model-expansion" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v2", ++ "typename": "Snowridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v3", ++ "typename": "Skylake-Server-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS", ++ "typename": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v3", ++ "typename": "Skylake-Client-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS", ++ "typename": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512pf", ++ "avx512er", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v2", ++ "typename": "Icelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-noTSX", ++ "typename": "Icelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v2", ++ "typename": "Icelake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-noTSX", ++ "typename": "Icelake-Client-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v1", ++ "typename": "Denverton-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton", ++ "typename": "Denverton-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v3", ++ "typename": "Cascadelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX", ++ "typename": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [], ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "definitions" ++} +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.sig b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.sig +new file mode 100644 +index 0000000000..082a25b4ee +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.sig +@@ -0,0 +1,4 @@ ++050657 ++family: 6 (0x06) ++model: 85 (0x55) ++stepping: 7 (0x07) +diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.xml b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.xml +new file mode 100644 +index 0000000000..e3bdd881b6 +--- /dev/null ++++ b/tests/cputestdata/x86_64-cpuid-Xeon-Platinum-9242.xml +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.26.2 + diff --git a/SOURCES/libvirt-docs-Describe-protected-virtualization-guest-setup.patch b/SOURCES/libvirt-docs-Describe-protected-virtualization-guest-setup.patch new file mode 100644 index 0000000..b7e2705 --- /dev/null +++ b/SOURCES/libvirt-docs-Describe-protected-virtualization-guest-setup.patch @@ -0,0 +1,245 @@ +From 026160bc76bab26772c2a80bd50ae55119e3b60b Mon Sep 17 00:00:00 2001 +Message-Id: <026160bc76bab26772c2a80bd50ae55119e3b60b@dist-git> +From: Viktor Mihajlovski +Date: Wed, 24 Jun 2020 13:16:23 +0200 +Subject: [PATCH] docs: Describe protected virtualization guest setup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Protected virtualization/IBM Secure Execution for Linux protects +guest memory and state from the host. + +Add some basic information about technology and a brief guide +on setting up secure guests with libvirt. + +Signed-off-by: Viktor Mihajlovski +Signed-off-by: Boris Fiuczynski +Reviewed-by: Paulo de Rezende Pinatti +Reviewed-by: Erik Skultety +(cherry picked from commit f0d0cd6179709461b026f24569a688065e90d766) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Signed-off-by: Jiri Denemark +Message-Id: +Reviewed-by: Ján Tomko +--- + docs/kbase.html.in | 3 + + docs/kbase/s390_protected_virt.rst | 189 +++++++++++++++++++++++++++++ + 2 files changed, 192 insertions(+) + create mode 100644 docs/kbase/s390_protected_virt.rst + +diff --git a/docs/kbase.html.in b/docs/kbase.html.in +index f2975960f6..05773db16d 100644 +--- a/docs/kbase.html.in ++++ b/docs/kbase.html.in +@@ -14,6 +14,9 @@ +
Secure usage
+
Secure usage of the libvirt APIs
+ ++
Protected virtualization on s390
++
Running secure s390 guests with IBM Secure Execution
++ +
Launch security
+
Securely launching VMs with AMD SEV
+ +diff --git a/docs/kbase/s390_protected_virt.rst b/docs/kbase/s390_protected_virt.rst +new file mode 100644 +index 0000000000..f38d16d743 +--- /dev/null ++++ b/docs/kbase/s390_protected_virt.rst +@@ -0,0 +1,189 @@ ++================================ ++Protected Virtualization on s390 ++================================ ++ ++.. contents:: ++ ++Overview ++======== ++ ++Protected virtualization, also known as IBM Secure Execution is a ++hardware-based privacy protection technology for s390x (IBM Z). ++It allows to execute virtual machines such that the host system ++has no access to a VM's state and memory contents. ++ ++Unlike other similar technologies, the memory of a running guest ++is not encrypted but protected by hardware access controls, which ++may only be manipulated by trusted system firmware, called ++ultravisor. ++ ++For the cases where the host needs access to guest memory (e.g. for ++paging), it can request pages to be exported to it. The exported page ++will be encrypted with a unique key for the running guest by the ++ultravisor. The ultravisor also computes an integrity value for ++the page, and stores it in a special table, together with the page ++index and a counter. This way it can verify the integrity of ++the page content upon re-import into the guest. ++ ++In other cases it may be necessary for a guest to grant the host access ++to dedicated memory regions (e.g. for I/O). The guest can request ++that the ultravisor removes the memory protection from individual ++pages, so that they can be shared with the host. Likewise, the ++guest can undo the sharing. ++ ++A secure guest will initially start in a regular non-protected VM. ++The start-up is controlled by a small bootstrap program loaded ++into memory together with encrypted operating system components and ++a control structure (the PV header). ++The operating system components (e.g. Linux kernel, initial RAM ++file system, kernel parameters) are encrypted and integrity ++protected. The component encryption keys and integrity values are ++stored in the PV header. ++The PV header is wrapped with a public key belonging to a specific ++system (in fact it can be wrapped with multiple such keys). The ++matching private key is only accessible by trusted hardware and ++firmware in that specific system. ++Consequently, such a secure guest boot image can only be run on the ++systems it has been prepared for. Its contents can't be decrypted ++without access to the private key and it can't be modified as ++it is integrity protected. ++ ++Host Requirements ++================= ++ ++IBM Secure Execution for Linux has some hardware and firmware ++requirements. The system hardware must be an IBM z15 (or newer), ++or an IBM LinuxONE III (or newer). ++ ++It is also necessary that the IBM Secure Execution feature is ++enabled for that system. With libvirt >= 6.5.0 you can run ++``libvirt-host--validate`` or otherwise check for facility '158', e.g. ++ ++:: ++ ++ $ grep facilities /proc/cpuinfo | grep 158 ++ ++The kernel must include the protected virtualization support ++which can be verified by checking for the presence of directory ++``/sys/firmware/uv``. It will only be present when both the ++hardware and the kernel support are available. ++ ++Finally, the host operating system must donate some memory to ++the ultravisor needed to store memory security information. ++This is achieved by specifying the following kernel command ++line parameter to the host boot configuration ++ ++:: ++ ++ prot_virt=1 ++ ++ ++Guest Requirements ++================== ++ ++Guest Boot ++---------- ++ ++To start a guest in protected virtualization secure mode, the ++boot image must have been prepared first with the program ++``genprotimg`` using the correct public key for this host. ++``genprotimg`` is part of the package ``s390-tools``, or ++``s390-utils``, depending on the Linux distribution being used. ++It can also be found at ++``_ ++ ++The guests have to be configured to use the host CPU model, which ++must contain the ``unpack`` facility indicating ultravisor guest support. ++ ++With the following command it's possible to check whether the host ++CPU model satisfies the requirement ++ ++:: ++ ++ $ virsh domcapabilities | grep unpack ++ ++which should return ++ ++:: ++ ++ ++ ++Note that on hosts with libvirt < 6.5.0 if the check fails despite ++the host system actually supporting protected virtualization guests, ++this can be caused by a stale libvirt capabilities cache. ++To recover, run the following commands ++ ++:: ++ ++ $ systemctl stop libvirtd ++ $ rm /var/cache/libvirt/qemu/capabilities/*.xml ++ $ systemctl start libvirtd ++ ++ ++Guest I/O ++--------- ++ ++Protected virtualization guests support I/O using virtio devices. ++As the virtio data structures of secure guests are not accessible ++by the host, it is necessary to use shared memory ('bounce buffers'). ++ ++To enable virtio devices to use shared buffers, it is necessary ++to configure them with platform_iommu enabled. This can done by adding ++``iommu='on'`` to the driver element of a virtio device definition in the ++guest's XML, e.g. ++ ++:: ++ ++ ++ ++ ++ ++ ++ ++It is mandatory to define all virtio bus devices in this way to ++prevent the host from attempting to access protected memory. ++Ballooning will not work and is fenced by QEMU. It should be ++disabled by specifying ++ ++:: ++ ++ ++ ++Finally, the guest Linux must be instructed to allocate I/O ++buffers using memory shared between host and guest using SWIOTLB. ++This is done by adding ``swiotlb=nnn`` to the guest's kernel command ++line string, where ``nnn`` stands for the number of statically ++allocated 2K entries. A commonly used value for swiotlb is 262144. ++ ++Example guest definition ++======================== ++ ++Minimal domain XML for a protected virtualization guest, essentially ++it's mostly about the ``iommu`` property ++ ++:: ++ ++ ++ protected ++ 2048000 ++ 2048000 ++ 1 ++ ++ hvm ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +2.27.0 + diff --git a/SOURCES/libvirt-docs-Update-AMD-launch-secure-description.patch b/SOURCES/libvirt-docs-Update-AMD-launch-secure-description.patch new file mode 100644 index 0000000..61b2820 --- /dev/null +++ b/SOURCES/libvirt-docs-Update-AMD-launch-secure-description.patch @@ -0,0 +1,56 @@ +From b89b5b577ae05a9f453a55b8e7cbd81db27e95df Mon Sep 17 00:00:00 2001 +Message-Id: +From: Boris Fiuczynski +Date: Wed, 24 Jun 2020 13:16:22 +0200 +Subject: [PATCH] docs: Update AMD launch secure description +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Update document with changes in qemu capability caching and the added +secure guest support checking for AMD SEV in virt-host-validate. + +Signed-off-by: Boris Fiuczynski +Reviewed-by: Erik Skultety +(cherry picked from commit 2c3ffa37284b9fa3d1e6c369fa2bb71c6f6dd92a) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Signed-off-by: Jiri Denemark +Message-Id: <1229877019008ac6f0135296af502e596c3e30e5.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + docs/kbase/launch_security_sev.rst | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/docs/kbase/launch_security_sev.rst b/docs/kbase/launch_security_sev.rst +index 65f258587d..19b978481a 100644 +--- a/docs/kbase/launch_security_sev.rst ++++ b/docs/kbase/launch_security_sev.rst +@@ -30,8 +30,11 @@ Enabling SEV on the host + ======================== + + Before VMs can make use of the SEV feature you need to make sure your +-AMD CPU does support SEV. You can check whether SEV is among the CPU +-flags with: ++AMD CPU does support SEV. You can run ``libvirt-host-validate`` ++(libvirt >= 6.5.0) to check if your host supports secure guests or you ++can follow the manual checks below. ++ ++You can manually check whether SEV is among the CPU flags with: + + :: + +@@ -109,7 +112,7 @@ following: + + + +-Note that if libvirt was already installed and libvirtd running before ++Note that if libvirt (<6.5.0) was already installed and libvirtd running before + enabling SEV in the kernel followed by the host reboot you need to force + libvirtd to re-probe both the host and QEMU capabilities. First stop + libvirtd: +-- +2.27.0 + diff --git a/SOURCES/libvirt-docs-mention-hotplug-off-in-news.xml.patch b/SOURCES/libvirt-docs-mention-hotplug-off-in-news.xml.patch new file mode 100644 index 0000000..4406351 --- /dev/null +++ b/SOURCES/libvirt-docs-mention-hotplug-off-in-news.xml.patch @@ -0,0 +1,48 @@ +From 3582a1666686111b86e7b06341bb1a113d7e9b84 Mon Sep 17 00:00:00 2001 +Message-Id: <3582a1666686111b86e7b06341bb1a113d7e9b84@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:09 -0400 +Subject: [PATCH] docs: mention hotplug='off' in news.xml + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit 389811d517c270c4f916fce4b3d64f90331244d7) + +Conflicts: + docs/news.xml + upstream this feature is in 6.3.0. downstream is fixed in 6.0.0-whatever + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-7-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + docs/news.xml | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/docs/news.xml b/docs/news.xml +index 408ffc8518..676a427853 100644 +--- a/docs/news.xml ++++ b/docs/news.xml +@@ -65,6 +65,18 @@ + + +
++ ++ ++ qemu: support disabling hotplug/unplug of PCIe devices ++ ++ ++ libvirt can now set the "hotplug" option for pcie-root-ports ++ and pcie-switch-downstream-ports, which can be used to ++ disable hotplug/unplug of devices from these ports (default ++ behavior is for these controllers to accept all ++ hotplug/unplug attempts, but this is often undesireable). ++ ++ + + + support for virtio+hostdev NIC <teaming> +-- +2.26.2 + diff --git a/SOURCES/libvirt-kbase-Add-document-outlining-internals-of-incremental-backup-in-qemu.patch b/SOURCES/libvirt-kbase-Add-document-outlining-internals-of-incremental-backup-in-qemu.patch new file mode 100644 index 0000000..9637db6 --- /dev/null +++ b/SOURCES/libvirt-kbase-Add-document-outlining-internals-of-incremental-backup-in-qemu.patch @@ -0,0 +1,267 @@ +From 02714666a525ea4dd8756f66fae28163fb685d05 Mon Sep 17 00:00:00 2001 +Message-Id: <02714666a525ea4dd8756f66fae28163fb685d05@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:06 +0200 +Subject: [PATCH] kbase: Add document outlining internals of incremental backup + in qemu +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Outline the basics and how to integrate with externally created +overlays. Other topics will continue later. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit da5e5a1e154836abe83077cf477c104b8f98b1d2) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 + +Conflicts: docs/kbase.html.in: real time kvm article not backported +Message-Id: +Reviewed-by: Ján Tomko +--- + docs/kbase.html.in | 3 + + docs/kbase/incrementalbackupinternals.rst | 217 ++++++++++++++++++++++ + 2 files changed, 220 insertions(+) + create mode 100644 docs/kbase/incrementalbackupinternals.rst + +diff --git a/docs/kbase.html.in b/docs/kbase.html.in +index 7d6caf3cb1..f2975960f6 100644 +--- a/docs/kbase.html.in ++++ b/docs/kbase.html.in +@@ -32,6 +32,9 @@ + +
Virtio-FS
+
Share a filesystem between the guest and the host
++ ++
Incremental backup internals
++
Incremental backup implementation details relevant for users
+ + + +diff --git a/docs/kbase/incrementalbackupinternals.rst b/docs/kbase/incrementalbackupinternals.rst +new file mode 100644 +index 0000000000..0c4b4f7486 +--- /dev/null ++++ b/docs/kbase/incrementalbackupinternals.rst +@@ -0,0 +1,217 @@ ++================================================ ++Internals of incremental backup handling in qemu ++================================================ ++ ++.. contents:: ++ ++Libvirt's implementation of incremental backups in the ``qemu`` driver uses ++qemu's ``block-dirty-bitmaps`` under the hood to track the guest visible disk ++state changes corresponding to the points in time described by a libvirt ++checkpoint. ++ ++There are some semantica implications with how libvirt creates and manages the ++bitmaps which de-facto become API as they are written into the disk images, and ++this document will try to summarize them. ++ ++Glossary ++======== ++ ++See the knowledge base article on ++`domain state capture `_ for ++a deeper explanation of some of the concepts. ++ ++Checkpoint ++ ++ A libvirt object which represents a named point in time of the life of the ++ vm where libvirt tracks writes the VM has done, thereby allowing a backup of ++ only the blocks which changed. Note that state of the VM memory is _not_ ++ captured. ++ ++ A checkpoint can be created either explicitly via the corresponding API ++ (although this isn't very useful on its own), or simultaneously with an ++ incremental or full backup of the VM using the ``virDomainBackupBegin`` API ++ which allows a next backup to only copy the differences. ++ ++Backup ++ ++ A copy of either all blocks of selected disks (full backup) or blocks changed ++ since a checkpoint (incremental backup) at the time the backup job was ++ started. (Blocks modified while the backup job is running are not part of the ++ backup!) ++ ++Snapshot ++ ++ Similarly to a checkpoint it's a point in time in the lifecycle of the VM ++ but the state of the VM including memory is captured at that point allowing ++ returning to the state later. ++ ++Blockjob ++ ++ A long running job which modifies the shape and/or location of the disk ++ backing chain (images storing the disk contents). Libvirt supports ++ ``block pull`` where data is moved up the chain towards the active layer, ++ ``block commit`` where data is moved down the chain towards the base/oldest ++ image. These blockjobs always remove images from the backing chain. Lastly ++ ``block copy`` where image is moved to a different location (and possibly ++ collapsed moving all of the data into the new location into the one image). ++ ++block-dirty-bitmap (bitmap) ++ ++ A data structure in qemu tracking which blocks were written by the guest ++ OS since the bitmap was created. ++ ++Relationships of bitmaps, checkpoints and VM disks ++================================================== ++ ++When a checkpoint is created libvirt creates a block-dirty-bitmap for every ++configured VM disk named the same way as the chcheckpoint. The bitmap is ++actively recording which blocks were changed by the guest OS from that point on. ++Other bitmaps are not impacted by any way as they are self-contained: ++ ++:: ++ ++ +----------------+ +----------------+ ++ | disk: vda | | disk: vdb | ++ +--------+-------+ +--------+-------+ ++ | | ++ +--------v-------+ +--------v-------+ ++ | vda-1.qcow2 | | vdb-1.qcow2 | ++ | | | | ++ | bitmaps: chk-a | | bitmaps: chk-a | ++ | chk-b | | chk-b | ++ | | | | ++ +----------------+ +----------------+ ++ ++Bitmaps are created at the same time to track changes to all disks in sync and ++are active and persisted in the QCOW2 image. Other formats currently don't ++support this feature. ++ ++Modification of bitmaps outside of libvirt is not recommended, but when adhering ++to the same semantics which the document will describe it should be safe to do ++so, even if we obviously can't guarantee that. ++ ++ ++Integration with external snapshots ++=================================== ++ ++Handling of bitmaps ++------------------- ++ ++Creating an external snapshot involves adding a new layer to the backing chain ++on top of the previous chain. In this step there are no new bitmaps created by ++default, which would mean that backups become impossible after this step. ++ ++To prevent this from happening we need to re-create the active bitmaps in the ++new top/active layer of the backing chain which allows us to continue tracking ++the changes with same granularity as before and also allows libvirt to stitch ++together all the corresponding bitmaps to do a backup across snapshots. ++ ++After taking a snapshot of the ``vda`` disk from the example above placed into ++``vda-2.qcow2`` the following topology will be created: ++ ++:: ++ ++ +----------------+ ++ | disk: vda | ++ +-------+--------+ ++ | ++ +-------v--------+ +----------------+ ++ | vda-2.qcow2 | | vda-1.qcow2 | ++ | | | | ++ | bitmaps: chk-a +----> bitmaps: chk-a | ++ | chk-b | | chk-b | ++ | | | | ++ +----------------+ +----------------+ ++ ++Checking bitmap health ++---------------------- ++ ++QEMU optimizes disk writes by only updating the bitmaps in certain cases. This ++also can cause problems in cases when e.g. QEMU crashes. ++ ++For a chain of corresponding bitmaps in a backing chain to be considered valid ++and eligible for use with ``virDomainBackupBegin`` it must conform to the ++following rules: ++ ++1) Top image must contain the bitmap ++2) If any of the backing images in the chain contain the bitmap too, all ++ contiguous images must have the bitmap (no gaps) ++3) all of the above bitmaps must be marked as active ++ (``auto`` flag in ``qemu-img`` output, ``recording`` in qemu) ++4) none of the above bitmaps can be inconsistent ++ (``in-use`` flag in ``qemu-img`` provided that it's not used on image which ++ is currently in use by a qemu instance, or ``inconsistent`` in qemu) ++ ++:: ++ ++ # check that image has bitmaps ++ $ qemu-img info vda-1.qcow2 ++ image: vda-1.qcow2 ++ file format: qcow2 ++ virtual size: 100 MiB (104857600 bytes) ++ disk size: 220 KiB ++ cluster_size: 65536 ++ Format specific information: ++ compat: 1.1 ++ compression type: zlib ++ lazy refcounts: false ++ bitmaps: ++ [0]: ++ flags: ++ [0]: in-use ++ [1]: auto ++ name: chk-a ++ granularity: 65536 ++ [1]: ++ flags: ++ [0]: auto ++ name: chk-b ++ granularity: 65536 ++ refcount bits: 16 ++ corrupt: false ++ ++(See also the ``qemuBlockBitmapChainIsValid`` helper method in ++``src/qemu/qemu_block.c``) ++ ++Creating external snapshots manually ++-------------------------------------- ++ ++To create the same topology outside of libvirt (e.g when doing snapshots offline) ++a new ``qemu-img`` which supports the ``bitmap`` subcommand is recommended. The ++following algorithm then ensures that the new image after snapshot will work ++with backups (note that ``jq`` is a JSON processor): ++ ++:: ++ ++ #!/bin/bash ++ ++ # arguments ++ SNAP_IMG="vda-2.qcow2" ++ BACKING_IMG="vda-1.qcow2" ++ ++ # constants - snapshots and bitmaps work only with qcow2 ++ SNAP_FMT="qcow2" ++ BACKING_IMG_FMT="qcow2" ++ ++ # create snapshot overlay ++ qemu-img create -f "$SNAP_FMT" -F "$BACKING_IMG_FMT" -b "$BACKING_IMG" "$SNAP_IMG" ++ ++ BACKING_IMG_INFO=$(qemu-img info --output=json -f "$BACKING_IMG_FMT" "$BACKING_IMG") ++ BACKING_BITMAPS=$(jq '."format-specific".data.bitmaps' <<< "$BACKING_IMG_INFO") ++ ++ if [ "x$BACKING_BITMAPS" = "xnull" ]; then ++ exit 0 ++ fi ++ ++ for BACKING_BITMAP_ in $(jq -c '.[]' <<< "$BACKING_BITMAPS"); do ++ BITMAP_FLAGS=$(jq -c -r '.flags[]' <<< "$BACKING_BITMAP_") ++ BITMAP_NAME=$(jq -r '.name' <<< "$BACKING_BITMAP_") ++ ++ if grep 'in-use' <<< "$BITMAP_FLAGS" || ++ grep -v 'auto' <<< "$BITMAP_FLAGS"; then ++ continue ++ fi ++ ++ qemu-img bitmap -f "$SNAP_FMT" "$SNAP_IMG" --add "$BITMAP_NAME" ++ ++ done +-- +2.27.0 + diff --git a/SOURCES/libvirt-nodedev-fix-race-in-API-usage-vs-initial-device-enumeration.patch b/SOURCES/libvirt-nodedev-fix-race-in-API-usage-vs-initial-device-enumeration.patch new file mode 100644 index 0000000..1ee5791 --- /dev/null +++ b/SOURCES/libvirt-nodedev-fix-race-in-API-usage-vs-initial-device-enumeration.patch @@ -0,0 +1,256 @@ +From b155913f796b313ce969ae318beb66e3e35d13dc Mon Sep 17 00:00:00 2001 +Message-Id: +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Thu, 11 Jun 2020 18:21:26 +0100 +Subject: [PATCH] nodedev: fix race in API usage vs initial device enumeration +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +During startup the udev node device driver impl uses a background thread +to populate the list of devices to avoid blocking the daemon startup +entirely. There is no synchronization to the public APIs, so it is +possible for an application to start calling APIs before the device +initialization is complete. + +This was not a problem in the old approach where libvirtd was started +on boot, as initialization would easily complete before any APIs were +called. + +With the use of socket activation, however, APIs are invoked from the +very moment the daemon starts. This is easily seen by doing a + + 'virsh -c nodedev:///system list' + +the first time it runs it will only show one or two devices. The second +time it runs it will show all devices. The solution is to introduce a +flag and condition variable for APIs to synchronize against before +returning any data. + +Reviewed-by: Michal Privoznik +Signed-off-by: Daniel P. Berrangé +(cherry picked from commit 008abeb03c262149b756ad5a226ff6cbc5e37e2c) + +https://bugzilla.redhat.com/show_bug.cgi?id=1846237 +https://bugzilla.redhat.com/show_bug.cgi?id=1845459 +Message-Id: <20200611172126.269081-2-berrange@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/conf/virnodedeviceobj.h | 2 ++ + src/node_device/node_device_driver.c | 44 ++++++++++++++++++++++++++++ + src/node_device/node_device_hal.c | 15 ++++++++++ + src/node_device/node_device_udev.c | 13 ++++++++ + 4 files changed, 74 insertions(+) + +diff --git a/src/conf/virnodedeviceobj.h b/src/conf/virnodedeviceobj.h +index c4d3c55d73..c9df8dedab 100644 +--- a/src/conf/virnodedeviceobj.h ++++ b/src/conf/virnodedeviceobj.h +@@ -36,6 +36,8 @@ typedef struct _virNodeDeviceDriverState virNodeDeviceDriverState; + typedef virNodeDeviceDriverState *virNodeDeviceDriverStatePtr; + struct _virNodeDeviceDriverState { + virMutex lock; ++ virCond initCond; ++ bool initialized; + + /* pid file FD, ensures two copies of the driver can't use the same root */ + int lockFD; +diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c +index b630be4399..a894f7265f 100644 +--- a/src/node_device/node_device_driver.c ++++ b/src/node_device/node_device_driver.c +@@ -162,6 +162,22 @@ nodeDeviceUnlock(void) + } + + ++static int ++nodeDeviceWaitInit(void) ++{ ++ nodeDeviceLock(); ++ while (!driver->initialized) { ++ if (virCondWait(&driver->initCond, &driver->lock) < 0) { ++ virReportSystemError(errno, "%s", ++ _("failed to wait on condition")); ++ nodeDeviceUnlock(); ++ return -1; ++ } ++ } ++ nodeDeviceUnlock(); ++ return 0; ++} ++ + int + nodeNumOfDevices(virConnectPtr conn, + const char *cap, +@@ -172,6 +188,9 @@ nodeNumOfDevices(virConnectPtr conn, + + virCheckFlags(0, -1); + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + return virNodeDeviceObjListNumOfDevices(driver->devs, conn, cap, + virNodeNumOfDevicesCheckACL); + } +@@ -189,6 +208,9 @@ nodeListDevices(virConnectPtr conn, + + virCheckFlags(0, -1); + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + return virNodeDeviceObjListGetNames(driver->devs, conn, + virNodeListDevicesCheckACL, + cap, names, maxnames); +@@ -205,6 +227,9 @@ nodeConnectListAllNodeDevices(virConnectPtr conn, + if (virConnectListAllNodeDevicesEnsureACL(conn) < 0) + return -1; + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + return virNodeDeviceObjListExport(conn, driver->devs, devices, + virConnectListAllNodeDevicesCheckACL, + flags); +@@ -234,6 +259,9 @@ nodeDeviceLookupByName(virConnectPtr conn, + virNodeDeviceDefPtr def; + virNodeDevicePtr device = NULL; + ++ if (nodeDeviceWaitInit() < 0) ++ return NULL; ++ + if (!(obj = nodeDeviceObjFindByName(name))) + return NULL; + def = virNodeDeviceObjGetDef(obj); +@@ -262,6 +290,9 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn, + + virCheckFlags(0, NULL); + ++ if (nodeDeviceWaitInit() < 0) ++ return NULL; ++ + if (!(obj = virNodeDeviceObjListFindSCSIHostByWWNs(driver->devs, + wwnn, wwpn))) + return NULL; +@@ -475,6 +506,10 @@ nodeDeviceCreateXML(virConnectPtr conn, + const char *virt_type = NULL; + + virCheckFlags(0, NULL); ++ ++ if (nodeDeviceWaitInit() < 0) ++ return NULL; ++ + virt_type = virConnectGetType(conn); + + if (!(def = virNodeDeviceDefParseString(xmlDesc, CREATE_DEVICE, virt_type))) +@@ -519,6 +554,9 @@ nodeDeviceDestroy(virNodeDevicePtr device) + char *wwnn = NULL, *wwpn = NULL; + unsigned int parent_host; + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + if (!(obj = nodeDeviceObjFindByName(device->name))) + return -1; + def = virNodeDeviceObjGetDef(obj); +@@ -574,6 +612,9 @@ nodeConnectNodeDeviceEventRegisterAny(virConnectPtr conn, + if (virConnectNodeDeviceEventRegisterAnyEnsureACL(conn) < 0) + return -1; + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + if (virNodeDeviceEventStateRegisterID(conn, driver->nodeDeviceEventState, + device, eventID, callback, + opaque, freecb, &callbackID) < 0) +@@ -590,6 +631,9 @@ nodeConnectNodeDeviceEventDeregisterAny(virConnectPtr conn, + if (virConnectNodeDeviceEventDeregisterAnyEnsureACL(conn) < 0) + return -1; + ++ if (nodeDeviceWaitInit() < 0) ++ return -1; ++ + if (virObjectEventStateDeregisterID(conn, + driver->nodeDeviceEventState, + callbackID, true) < 0) +diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c +index 4cef7c2c12..0d48895b66 100644 +--- a/src/node_device/node_device_hal.c ++++ b/src/node_device/node_device_hal.c +@@ -603,6 +603,15 @@ nodeStateInitialize(bool privileged G_GNUC_UNUSED, + VIR_FREE(driver); + return VIR_DRV_STATE_INIT_ERROR; + } ++ ++ if (virCondInit(&driver->initCond) < 0) { ++ virReportSystemError(errno, "%s", ++ _("Unable to initialize condition variable")); ++ virMutexDestroy(&driver->lock); ++ VIR_FREE(driver); ++ return VIR_DRV_STATE_INIT_ERROR; ++ } ++ + nodeDeviceLock(); + + if (privileged) { +@@ -693,6 +702,11 @@ nodeStateInitialize(bool privileged G_GNUC_UNUSED, + } + VIR_FREE(udi); + ++ nodeDeviceLock(); ++ driver->initialized = true; ++ nodeDeviceUnlock(); ++ virCondBroadcast(&driver->initCond); ++ + return VIR_DRV_STATE_INIT_COMPLETE; + + failure: +@@ -725,6 +739,7 @@ nodeStateCleanup(void) + + VIR_FREE(driver->stateDir); + nodeDeviceUnlock(); ++ virCondDestroy(&driver->initCond); + virMutexDestroy(&driver->lock); + VIR_FREE(driver); + return 0; +diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c +index 4b33dc25d8..ae3d081e66 100644 +--- a/src/node_device/node_device_udev.c ++++ b/src/node_device/node_device_udev.c +@@ -1476,6 +1476,7 @@ nodeStateCleanup(void) + virPidFileRelease(driver->stateDir, "driver", driver->lockFD); + + VIR_FREE(driver->stateDir); ++ virCondDestroy(&driver->initCond); + virMutexDestroy(&driver->lock); + VIR_FREE(driver); + +@@ -1743,6 +1744,11 @@ nodeStateInitializeEnumerate(void *opaque) + if (udevEnumerateDevices(udev) != 0) + goto error; + ++ nodeDeviceLock(); ++ driver->initialized = true; ++ nodeDeviceUnlock(); ++ virCondBroadcast(&driver->initCond); ++ + return; + + error: +@@ -1798,6 +1804,13 @@ nodeStateInitialize(bool privileged, + VIR_FREE(driver); + return VIR_DRV_STATE_INIT_ERROR; + } ++ if (virCondInit(&driver->initCond) < 0) { ++ virReportSystemError(errno, "%s", ++ _("Unable to initialize condition variable")); ++ virMutexDestroy(&driver->lock); ++ VIR_FREE(driver); ++ return VIR_DRV_STATE_INIT_ERROR; ++ } + + driver->privileged = privileged; + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-Check-if-AMD-secure-guest-support-is-enabled.patch b/SOURCES/libvirt-qemu-Check-if-AMD-secure-guest-support-is-enabled.patch new file mode 100644 index 0000000..a394827 --- /dev/null +++ b/SOURCES/libvirt-qemu-Check-if-AMD-secure-guest-support-is-enabled.patch @@ -0,0 +1,80 @@ +From 71e87f4da22992c5d9f858535a1acaa7201aa7d3 Mon Sep 17 00:00:00 2001 +Message-Id: <71e87f4da22992c5d9f858535a1acaa7201aa7d3@dist-git> +From: Paulo de Rezende Pinatti +Date: Wed, 24 Jun 2020 13:16:19 +0200 +Subject: [PATCH] qemu: Check if AMD secure guest support is enabled +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Implement secure guest check for AMD SEV (Secure Encrypted +Virtualization) in order to invalidate the qemu capabilities +cache in case the availability of the feature changed. + +For AMD SEV the verification consists of: + - checking if /sys/module/kvm_amd/parameters/sev contains the + value '1': meaning SEV is enabled in the host kernel; + - checking if /dev/sev exists + +Signed-off-by: Paulo de Rezende Pinatti +Signed-off-by: Boris Fiuczynski +Reviewed-by: Bjoern Walk +Reviewed-by: Erik Skultety +(cherry picked from commit 657365e74f489b70bfbf2eb014db63046c5e3888) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Signed-off-by: Jiri Denemark +Message-Id: <1c3393cb71b731f5632d150d77f9920b591aa5ee.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_capabilities.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 8a4b43c269..278eaa0009 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -4543,6 +4543,27 @@ virQEMUCapsKVMSupportsSecureGuestS390(void) + } + + ++/* ++ * Check whether AMD Secure Encrypted Virtualization (x86) is enabled ++ */ ++static bool ++virQEMUCapsKVMSupportsSecureGuestAMD(void) ++{ ++ g_autofree char *modValue = NULL; ++ ++ if (virFileReadValueString(&modValue, "/sys/module/kvm_amd/parameters/sev") < 0) ++ return false; ++ ++ if (modValue[0] != '1') ++ return false; ++ ++ if (virFileExists(QEMU_DEV_SEV)) ++ return true; ++ ++ return false; ++} ++ ++ + /* + * Check whether the secure guest functionality is enabled. + * See the specific architecture function for details on the verifications made. +@@ -4554,6 +4575,10 @@ virQEMUCapsKVMSupportsSecureGuest(void) + + if (ARCH_IS_S390(arch)) + return virQEMUCapsKVMSupportsSecureGuestS390(); ++ ++ if (ARCH_IS_X86(arch)) ++ return virQEMUCapsKVMSupportsSecureGuestAMD(); ++ + return false; + } + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-Check-if-s390-secure-guest-support-is-enabled.patch b/SOURCES/libvirt-qemu-Check-if-s390-secure-guest-support-is-enabled.patch new file mode 100644 index 0000000..eed06bf --- /dev/null +++ b/SOURCES/libvirt-qemu-Check-if-s390-secure-guest-support-is-enabled.patch @@ -0,0 +1,166 @@ +From 00ca6e3be3959169559c5bc44dd929d0f313b014 Mon Sep 17 00:00:00 2001 +Message-Id: <00ca6e3be3959169559c5bc44dd929d0f313b014@dist-git> +From: Paulo de Rezende Pinatti +Date: Wed, 24 Jun 2020 13:16:18 +0200 +Subject: [PATCH] qemu: Check if s390 secure guest support is enabled +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch introduces a common function to verify if the +availability of the so-called Secure Guest feature on the host +has changed in order to invalidate the qemu capabilities cache. +It can be used as an entry point for verification on different +architectures. + +For s390 the verification consists of: +- checking if /sys/firmware/uv is available: meaning the HW +facility is available and the host OS supports it; +- checking if the kernel cmdline contains 'prot_virt=1': meaning +the host OS wants to use the feature. + +Whenever the availability of the feature does not match the secure +guest flag in the cache then libvirt will re-build it in order to +pick up the new set of capabilities available. + +Signed-off-by: Paulo de Rezende Pinatti +Signed-off-by: Boris Fiuczynski +Tested-by: Viktor Mihajlovski +Reviewed-by: Bjoern Walk +Reviewed-by: Erik Skultety +(cherry picked from commit b611b620ceaf940017ba4d0b8b0638869c751509) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Signed-off-by: Jiri Denemark +Message-Id: <3b91df0693526810b255db4ddc9af3484d655cbf.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_capabilities.c | 61 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 7609f44efb..8a4b43c269 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -23,6 +23,7 @@ + + #include "qemu_capabilities.h" + #include "viralloc.h" ++#include "virarch.h" + #include "vircrypto.h" + #include "virlog.h" + #include "virerror.h" +@@ -642,6 +643,7 @@ struct _virQEMUCaps { + + bool usedQMP; + bool kvmSupportsNesting; ++ bool kvmSupportsSecureGuest; + + char *binary; + time_t ctime; +@@ -1837,6 +1839,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) + ret->invalidation = qemuCaps->invalidation; + ret->usedQMP = qemuCaps->usedQMP; + ret->kvmSupportsNesting = qemuCaps->kvmSupportsNesting; ++ ret->kvmSupportsSecureGuest = qemuCaps->kvmSupportsSecureGuest; + + ret->ctime = qemuCaps->ctime; + +@@ -4233,6 +4236,9 @@ virQEMUCapsLoadCache(virArch hostArch, + if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0) + qemuCaps->kvmSupportsNesting = true; + ++ if (virXPathBoolean("boolean(./kvmSupportsSecureGuest)", ctxt) > 0) ++ qemuCaps->kvmSupportsSecureGuest = true; ++ + ret = 0; + cleanup: + VIR_FREE(str); +@@ -4467,6 +4473,9 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps) + if (qemuCaps->kvmSupportsNesting) + virBufferAddLit(&buf, "\n"); + ++ if (qemuCaps->kvmSupportsSecureGuest) ++ virBufferAddLit(&buf, "\n"); ++ + virBufferAdjustIndent(&buf, -2); + virBufferAddLit(&buf, "\n"); + +@@ -4506,6 +4515,49 @@ virQEMUCapsSaveFile(void *data, + } + + ++/* ++ * Check whether IBM Secure Execution (S390) is enabled ++ */ ++static bool ++virQEMUCapsKVMSupportsSecureGuestS390(void) ++{ ++ ++ g_autofree char *cmdline = NULL; ++ static const char *kValues[] = {"y", "Y", "on", "ON", "oN", "On", "1"}; ++ ++ if (!virFileIsDir("/sys/firmware/uv")) ++ return false; ++ ++ if (virFileReadValueString(&cmdline, "/proc/cmdline") < 0) ++ return false; ++ ++ /* we're prefix matching rather than equality matching here, because kernel ++ * would treat even something like prot_virt='yFOO' as enabled */ ++ if (virKernelCmdlineMatchParam(cmdline, "prot_virt", kValues, ++ G_N_ELEMENTS(kValues), ++ VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | ++ VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX)) ++ return true; ++ ++ return false; ++} ++ ++ ++/* ++ * Check whether the secure guest functionality is enabled. ++ * See the specific architecture function for details on the verifications made. ++ */ ++static bool ++virQEMUCapsKVMSupportsSecureGuest(void) ++{ ++ virArch arch = virArchFromHost(); ++ ++ if (ARCH_IS_S390(arch)) ++ return virQEMUCapsKVMSupportsSecureGuestS390(); ++ return false; ++} ++ ++ + /* Check the kernel module parameters 'nested' file to determine if enabled + * + * Intel: 'kvm_intel' uses 'Y' +@@ -4685,6 +4737,13 @@ virQEMUCapsIsValid(void *data, + qemuCaps->binary, qemuCaps->kvmSupportsNesting); + return false; + } ++ ++ if (virQEMUCapsKVMSupportsSecureGuest() != qemuCaps->kvmSupportsSecureGuest) { ++ VIR_DEBUG("Outdated capabilities for '%s': kvm kernel secure guest " ++ "value changed from %d", ++ qemuCaps->binary, qemuCaps->kvmSupportsSecureGuest); ++ return false; ++ } + } + + return true; +@@ -5166,6 +5225,8 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, + qemuCaps->kernelVersion = g_strdup(kernelVersion); + + qemuCaps->kvmSupportsNesting = virQEMUCapsKVMSupportsNesting(); ++ ++ qemuCaps->kvmSupportsSecureGuest = virQEMUCapsKVMSupportsSecureGuest(); + } + + return qemuCaps; +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-Refuse-to-use-ps2-on-machines-that-do-not-have-this-bus.patch b/SOURCES/libvirt-qemu-Refuse-to-use-ps2-on-machines-that-do-not-have-this-bus.patch new file mode 100644 index 0000000..13e5204 --- /dev/null +++ b/SOURCES/libvirt-qemu-Refuse-to-use-ps2-on-machines-that-do-not-have-this-bus.patch @@ -0,0 +1,605 @@ +From 171433e306e309374750477328de96f66410d13d Mon Sep 17 00:00:00 2001 +Message-Id: <171433e306e309374750477328de96f66410d13d@dist-git> +From: Thomas Huth +Date: Mon, 8 Jun 2020 13:44:21 +0200 +Subject: [PATCH] qemu: Refuse to use "ps2" on machines that do not have this + bus + +The "ps2" bus is only available on certain machines like x86. On +machines like s390x, we should refuse to add a device to this bus +instead of silently ignoring it. + +Looking at the QEMU sources, PS/2 is only available if the QEMU binary +has the "i8042" device, so let's check for that and only allow "ps2" +devices if this QEMU device is available, or if we're on x86 anyway +(so we don't have to fake the QEMU_CAPS_DEVICE_I8042 capability in +all the tests that use in their xml data). + +Reported-by: Sebastian Mitterle +Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1763191 +Signed-off-by: Thomas Huth +Signed-off-by: Michal Privoznik +Reviewed-by: Michal Privoznik +(cherry picked from commit e7a65484ba7aa51c99ab3405117667a39b37e386) + +Conflicts: +src/qemu/qemu_capabilities.c: Context, because other caps were + backported meanwhile +src/qemu/qemu_capabilities.h: ditto +tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml: ditto +tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml: ditto +tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml: ditto +tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml: ditto +tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml: ditto +tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml: ditto +tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml: ditto +tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml: ditto + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1845055 + +Signed-off-by: Michal Privoznik +Message-Id: <89c778ca322240423dd81945daa165f5d6c803a9.1591616651.git.mprivozn@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 2 ++ + src/qemu/qemu_capabilities.h | 1 + + src/qemu/qemu_domain.c | 10 +++++++++- + tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml | 1 + + .../qemuhotplug-base-ccw-live+ccw-virtio.xml | 6 ------ + ...cw-live-with-2-ccw-virtio+ccw-virtio-1-explicit.xml | 6 ------ + ...ccw-live-with-2-ccw-virtio+ccw-virtio-1-reverse.xml | 6 ------ + .../qemuhotplug-base-ccw-live-with-2-ccw-virtio.xml | 6 ------ + ...-ccw-live-with-ccw-virtio+ccw-virtio-2-explicit.xml | 6 ------ + ...plug-base-ccw-live-with-ccw-virtio+ccw-virtio-2.xml | 6 ------ + .../qemuhotplug-base-ccw-live-with-ccw-virtio.xml | 6 ------ + .../qemuhotplug-base-ccw-live.xml | 6 ------ + 38 files changed, 39 insertions(+), 49 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 5b16796c6b..7609f44efb 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -566,6 +566,7 @@ VIR_ENUM_IMPL(virQEMUCaps, + "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api", + "storage.werror", + "pcie-root-port.hotplug", ++ "i8042", + ); + + +@@ -1281,6 +1282,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { + { "ramfb", QEMU_CAPS_DEVICE_RAMFB }, + { "max-arm-cpu", QEMU_CAPS_ARM_MAX_CPU }, + { "vhost-user-fs-device", QEMU_CAPS_DEVICE_VHOST_USER_FS }, ++ { "i8042", QEMU_CAPS_DEVICE_I8042 }, + }; + + static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioBalloon[] = { +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index aad02fcda5..15ebcb5077 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -547,6 +547,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ + QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API, /* downstream support for blockdev reopen in rhel-av-8.2.0 */ + QEMU_CAPS_STORAGE_WERROR, /* virtio-blk,scsi-hd.werror */ + QEMU_CAPS_PCIE_ROOT_PORT_HOTPLUG, /* pcie-root-port.hotplug */ ++ QEMU_CAPS_DEVICE_I8042, /* PS/2 controller */ + + QEMU_CAPS_LAST /* this must always be the last item */ + } virQEMUCapsFlags; +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index cdf7b3e692..a92183334f 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -8340,13 +8340,21 @@ qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics, + + static int + qemuDomainDeviceDefValidateInput(const virDomainInputDef *input, +- const virDomainDef *def G_GNUC_UNUSED, ++ const virDomainDef *def, + virQEMUCapsPtr qemuCaps) + { + const char *baseName; + int cap; + int ccwCap; + ++ if (input->bus == VIR_DOMAIN_INPUT_BUS_PS2 && !ARCH_IS_X86(def->os.arch) && ++ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_I8042)) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("%s is not supported by this QEMU binary"), ++ virDomainInputBusTypeToString(input->bus)); ++ return -1; ++ } ++ + if (input->bus != VIR_DOMAIN_INPUT_BUS_VIRTIO) + return 0; + +diff --git a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml +index f2257d6bd2..b57cb2ab59 100644 +--- a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml +@@ -84,6 +84,7 @@ + + + ++ + 1005003 + 0 + 43100245 +diff --git a/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml +index 3a70ec8146..5d0a14a5db 100644 +--- a/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml +@@ -89,6 +89,7 @@ + + + ++ + 1006000 + 0 + 43100243 +diff --git a/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml +index cbb29ef2de..c196fe5e45 100644 +--- a/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml +@@ -91,6 +91,7 @@ + + + ++ + 1007000 + 0 + 43100244 +diff --git a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml +index a6d0981224..1edcaa4657 100644 +--- a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml +@@ -107,6 +107,7 @@ + + + ++ + 2001001 + 0 + 43100240 +diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml +index 5a57cb7760..b95a9d42ad 100644 +--- a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml +@@ -139,6 +139,7 @@ + + + ++ + 2010000 + 0 + 42900287 +diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml +index 53872abf2f..7ebe97b6ab 100644 +--- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml +@@ -182,6 +182,7 @@ + + + ++ + 2010000 + 0 + 43100287 +diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml +index f70335db8f..b8eb3abd40 100644 +--- a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.xml +@@ -188,6 +188,7 @@ + + + ++ + 2011000 + 0 + 43100288 +diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml +index 74c80d2fe9..38a3103c4a 100644 +--- a/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.12.0.ppc64.xml +@@ -153,6 +153,7 @@ + + + ++ + 2011090 + 0 + 42900289 +diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml +index b51cee9f28..0c30cc75da 100644 +--- a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.xml +@@ -197,6 +197,7 @@ + + + ++ + 2011090 + 0 + 43100289 +diff --git a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml +index 86d85faa73..9b486effe1 100644 +--- a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml +@@ -133,6 +133,7 @@ + + + ++ + 2004000 + 0 + 43100242 +diff --git a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml +index b217238307..147b179fdb 100644 +--- a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml +@@ -139,6 +139,7 @@ + + + ++ + 2005000 + 0 + 43100243 +diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml +index 862464c2f0..deb5c28790 100644 +--- a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml +@@ -118,6 +118,7 @@ + + + ++ + 2006000 + 0 + 42900244 +diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml +index 6b96e37a16..fc508aba8a 100644 +--- a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml +@@ -151,6 +151,7 @@ + + + ++ + 2006000 + 0 + 43100244 +diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml +index bc1359b0dd..ed199057dc 100644 +--- a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml +@@ -156,6 +156,7 @@ + + + ++ + 2007000 + 0 + 43100245 +diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml +index c7f3be3a1b..489b67f99a 100644 +--- a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml +@@ -159,6 +159,7 @@ + + + ++ + 2008000 + 0 + 43100246 +diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml +index a00d4b3d4c..3bc6ec8dab 100644 +--- a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml +@@ -131,6 +131,7 @@ + + + ++ + 2009000 + 0 + 42900247 +diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml +index 3d96f5f5b3..83fc6cde97 100644 +--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml +@@ -176,6 +176,7 @@ + + + ++ + 2009000 + 0 + 43100247 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml +index 3b5a021dcf..9a0b9c05c2 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.ppc64.xml +@@ -155,6 +155,7 @@ + + + ++ + 2012050 + 0 + 42900239 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +index 575b1c2a43..aa134f7da1 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +@@ -203,6 +203,7 @@ + + + ++ + 3000000 + 0 + 43100239 +diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml +index 591f054193..06bcba57bc 100644 +--- a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml +@@ -160,6 +160,7 @@ + + + ++ + 3000091 + 0 + 42900240 +diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml +index 6e434579ff..aa0219816d 100644 +--- a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml +@@ -206,6 +206,7 @@ + + + ++ + 3000092 + 0 + 43100240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml +index aa22eccc6f..9f7d322d07 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml +@@ -174,6 +174,7 @@ + + + ++ + 4000000 + 0 + 42900240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml +index 3c1baf9560..f54f15b23e 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml +@@ -211,6 +211,7 @@ + + + ++ + 4000000 + 0 + 43100240 +diff --git a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml +index d5f2673fb6..961a13818b 100644 +--- a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml +@@ -217,6 +217,7 @@ + + + ++ + 4001000 + 0 + 43100241 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +index f5121fca94..0dc7503a07 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +@@ -178,6 +178,7 @@ + + + ++ + 4001050 + 0 + 42900242 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +index f6df71ff3e..452753b103 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +@@ -222,6 +222,7 @@ + + + ++ + 4002000 + 0 + 43100242 +diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +index d0b5f18c02..733e6b1eb4 100644 +--- a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +@@ -225,6 +225,7 @@ + + + ++ + 4002091 + 0 + 43100241 +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live+ccw-virtio.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live+ccw-virtio.xml +index f501cde333..59c969e0f2 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live+ccw-virtio.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live+ccw-virtio.xml +@@ -44,12 +44,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-explicit.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-explicit.xml +index 301658178f..d10b29be7e 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-explicit.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-explicit.xml +@@ -54,12 +54,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-reverse.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-reverse.xml +index 223e929ad5..6eadbdcd18 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-reverse.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio+ccw-virtio-1-reverse.xml +@@ -54,12 +54,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio.xml +index c745d48558..68561b50a3 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-2-ccw-virtio.xml +@@ -44,12 +44,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2-explicit.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2-explicit.xml +index 3189294b65..0900f3c8e3 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2-explicit.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2-explicit.xml +@@ -53,12 +53,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2.xml +index 3189294b65..0900f3c8e3 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio+ccw-virtio-2.xml +@@ -53,12 +53,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio.xml +index edf57fcd3f..31979c40f0 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live-with-ccw-virtio.xml +@@ -43,12 +43,6 @@ + +
+ +- +- +- +- +- +- + + + +diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live.xml +index b97bba78c6..844b951940 100644 +--- a/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live.xml ++++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-ccw-live.xml +@@ -34,12 +34,6 @@ + +
+ +- +- +- +- +- +- + + + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-commit.patch b/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-commit.patch new file mode 100644 index 0000000..c8e7974 --- /dev/null +++ b/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-commit.patch @@ -0,0 +1,518 @@ +From ae0be0a7cbfb291c640b25d31013f938745e8c08 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:00 +0200 +Subject: [PATCH] qemu: Rewrite bitmap handling for block commit +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reuse qemuBlockGetBitmapMergeActions which allows removing the ad-hoc +implementation of bitmap merging for block commit. The new approach is +way simpler and more robust and also allows us to get rid of the +disabling of bitmaps done prior to the start as we actually do want to +update the bitmaps in the base. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 20a7abc2d2d8a378103abf105fa0c617218ec023) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <2b1054dbe576d3984c960a42d175edbafa92565a.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_block.c | 203 +----------------- + src/qemu/qemu_block.h | 11 +- + src/qemu/qemu_blockjob.c | 25 ++- + src/qemu/qemu_driver.c | 56 +---- + tests/qemublocktest.c | 18 +- + .../qemublocktestdata/bitmapblockcommit/empty | 1 - + 6 files changed, 42 insertions(+), 272 deletions(-) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index b2296c2b4c..ff9e000461 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -3194,117 +3194,7 @@ qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src, + /** + * @topsrc: virStorageSource representing 'top' of the job + * @basesrc: virStorageSource representing 'base' of the job +- * @blockNamedNodeData: hash table containing data about bitmaps +- * @actions: filled with arguments for a 'transaction' command +- * @disabledBitmapsBase: filled with a list of bitmap names which must be disabled +- * +- * Prepares data for correctly handling bitmaps during the start of a commit +- * job. The bitmaps in the 'base' image must be disabled, so that the writes +- * done by the blockjob don't dirty the enabled bitmaps. +- * +- * @actions and @disabledBitmapsBase are untouched if no bitmaps need +- * to be disabled. +- */ +-int +-qemuBlockBitmapsHandleCommitStart(virStorageSourcePtr topsrc, +- virStorageSourcePtr basesrc, +- virHashTablePtr blockNamedNodeData, +- virJSONValuePtr *actions, +- char ***disabledBitmapsBase) +-{ +- g_autoptr(virJSONValue) act = virJSONValueNewArray(); +- VIR_AUTOSTRINGLIST bitmaplist = NULL; +- size_t curbitmapstr = 0; +- qemuBlockNamedNodeDataPtr entry; +- bool disable_bitmaps = false; +- size_t i; +- +- if (!(entry = virHashLookup(blockNamedNodeData, basesrc->nodeformat))) +- return 0; +- +- bitmaplist = g_new0(char *, entry->nbitmaps + 1); +- +- for (i = 0; i < entry->nbitmaps; i++) { +- qemuBlockNamedNodeDataBitmapPtr bitmap = entry->bitmaps[i]; +- +- if (!bitmap->recording || bitmap->inconsistent || +- !qemuBlockBitmapChainIsValid(topsrc, bitmap->name, blockNamedNodeData)) +- continue; +- +- disable_bitmaps = true; +- +- if (qemuMonitorTransactionBitmapDisable(act, basesrc->nodeformat, +- bitmap->name) < 0) +- return -1; +- +- bitmaplist[curbitmapstr++] = g_strdup(bitmap->name); +- } +- +- if (disable_bitmaps) { +- *actions = g_steal_pointer(&act); +- *disabledBitmapsBase = g_steal_pointer(&bitmaplist); +- } +- +- return 0; +-} +- +- +-struct qemuBlockBitmapsHandleCommitData { +- bool skip; +- bool create; +- bool enable; +- const char *basenode; +- virJSONValuePtr merge; +- unsigned long long granularity; +- bool persistent; +-}; +- +- +-static void +-qemuBlockBitmapsHandleCommitDataFree(void *opaque) +-{ +- struct qemuBlockBitmapsHandleCommitData *data = opaque; +- +- virJSONValueFree(data->merge); +- g_free(data); +-} +- +- +-static int +-qemuBlockBitmapsHandleCommitFinishIterate(void *payload, +- const void *entryname, +- void *opaque) +-{ +- struct qemuBlockBitmapsHandleCommitData *data = payload; +- const char *bitmapname = entryname; +- virJSONValuePtr actions = opaque; +- +- if (data->skip) +- return 0; +- +- if (data->create) { +- if (qemuMonitorTransactionBitmapAdd(actions, data->basenode, bitmapname, +- data->persistent, !data->enable, +- data->granularity) < 0) +- return -1; +- } else { +- if (data->enable && +- qemuMonitorTransactionBitmapEnable(actions, data->basenode, bitmapname) < 0) +- return -1; +- } +- +- if (data->merge && +- qemuMonitorTransactionBitmapMerge(actions, data->basenode, bitmapname, +- &data->merge) < 0) +- return -1; +- +- return 0; +-} +- +- +-/** +- * @topsrc: virStorageSource representing 'top' of the job +- * @basesrc: virStorageSource representing 'base' of the job ++ * @active: commit job is an active layer block-commit + * @blockNamedNodeData: hash table containing data about bitmaps + * @actions: filled with arguments for a 'transaction' command + * @disabledBitmapsBase: bitmap names which were disabled +@@ -3317,95 +3207,20 @@ qemuBlockBitmapsHandleCommitFinishIterate(void *payload, + int + qemuBlockBitmapsHandleCommitFinish(virStorageSourcePtr topsrc, + virStorageSourcePtr basesrc, ++ bool active, + virHashTablePtr blockNamedNodeData, +- virJSONValuePtr *actions, +- char **disabledBitmapsBase) ++ virJSONValuePtr *actions) + { +- g_autoptr(virJSONValue) act = virJSONValueNewArray(); +- virStorageSourcePtr n; +- qemuBlockNamedNodeDataPtr entry; +- g_autoptr(virHashTable) commitdata = NULL; +- struct qemuBlockBitmapsHandleCommitData *bitmapdata; +- size_t i; +- +- commitdata = virHashNew(qemuBlockBitmapsHandleCommitDataFree); +- +- for (n = topsrc; n != basesrc; n = n->backingStore) { +- if (!(entry = virHashLookup(blockNamedNodeData, n->nodeformat))) +- continue; +- +- for (i = 0; i < entry->nbitmaps; i++) { +- qemuBlockNamedNodeDataBitmapPtr bitmap = entry->bitmaps[i]; +- +- if (!(bitmapdata = virHashLookup(commitdata, bitmap->name))) { +- bitmapdata = g_new0(struct qemuBlockBitmapsHandleCommitData, 1); ++ virStorageSourcePtr writebitmapsrc = NULL; + +- /* we must mirror the state of the topmost bitmap and merge +- * everything else */ +- bitmapdata->create = true; +- bitmapdata->enable = bitmap->recording; +- bitmapdata->basenode = basesrc->nodeformat; +- bitmapdata->merge = virJSONValueNewArray(); +- bitmapdata->granularity = bitmap->granularity; +- bitmapdata->persistent = bitmap->persistent; ++ if (active) ++ writebitmapsrc = basesrc; + +- if (virHashAddEntry(commitdata, bitmap->name, bitmapdata) < 0) { +- qemuBlockBitmapsHandleCommitDataFree(bitmapdata); +- return -1; +- } +- } +- +- if (bitmap->inconsistent || +- !qemuBlockBitmapChainIsValid(topsrc, bitmap->name, blockNamedNodeData)) +- bitmapdata->skip = true; +- +- if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(bitmapdata->merge, +- n->nodeformat, +- bitmap->name) < 0) +- return -1; +- } +- } +- +- if ((entry = virHashLookup(blockNamedNodeData, basesrc->nodeformat))) { +- /* note that all bitmaps in 'base' were disabled when commit was started */ +- for (i = 0; i < entry->nbitmaps; i++) { +- qemuBlockNamedNodeDataBitmapPtr bitmap = entry->bitmaps[i]; +- +- if ((bitmapdata = virHashLookup(commitdata, bitmap->name))) { +- bitmapdata->create = false; +- } else { +- if (disabledBitmapsBase) { +- char **disabledbitmaps; +- +- for (disabledbitmaps = disabledBitmapsBase; *disabledbitmaps; disabledbitmaps++) { +- if (STREQ(*disabledbitmaps, bitmap->name)) { +- bitmapdata = g_new0(struct qemuBlockBitmapsHandleCommitData, 1); +- +- bitmapdata->create = false; +- bitmapdata->enable = true; +- bitmapdata->basenode = basesrc->nodeformat; +- bitmapdata->granularity = bitmap->granularity; +- bitmapdata->persistent = bitmap->persistent; +- +- if (virHashAddEntry(commitdata, bitmap->name, bitmapdata) < 0) { +- qemuBlockBitmapsHandleCommitDataFree(bitmapdata); +- return -1; +- } +- +- break; +- } +- } +- } +- } +- } +- } +- +- if (virHashForEach(commitdata, qemuBlockBitmapsHandleCommitFinishIterate, act) < 0) ++ if (qemuBlockGetBitmapMergeActions(topsrc, basesrc, basesrc, NULL, NULL, ++ writebitmapsrc, actions, ++ blockNamedNodeData) < 0) + return -1; + +- if (virJSONValueArraySize(act) > 0) +- *actions = g_steal_pointer(&act); +- + return 0; + } + +diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h +index 2500390734..19d2fc32e0 100644 +--- a/src/qemu/qemu_block.h ++++ b/src/qemu/qemu_block.h +@@ -243,19 +243,12 @@ qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src, + bool shallow, + virJSONValuePtr *actions); + +-int +-qemuBlockBitmapsHandleCommitStart(virStorageSourcePtr topsrc, +- virStorageSourcePtr basesrc, +- virHashTablePtr blockNamedNodeData, +- virJSONValuePtr *actions, +- char ***disabledBitmapsBase); +- + int + qemuBlockBitmapsHandleCommitFinish(virStorageSourcePtr topsrc, + virStorageSourcePtr basesrc, ++ bool active, + virHashTablePtr blockNamedNodeData, +- virJSONValuePtr *actions, +- char **disabledBitmapsBase); ++ virJSONValuePtr *actions); + + int + qemuBlockReopenReadWrite(virDomainObjPtr vm, +diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c +index c80c71295b..c63a691a0e 100644 +--- a/src/qemu/qemu_blockjob.c ++++ b/src/qemu/qemu_blockjob.c +@@ -1063,6 +1063,7 @@ qemuBlockJobProcessEventCompletedCommitBitmaps(virDomainObjPtr vm, + qemuDomainObjPrivatePtr priv = vm->privateData; + g_autoptr(virHashTable) blockNamedNodeData = NULL; + g_autoptr(virJSONValue) actions = NULL; ++ bool active = job->type == QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT; + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) + return 0; +@@ -1072,16 +1073,18 @@ qemuBlockJobProcessEventCompletedCommitBitmaps(virDomainObjPtr vm, + + if (qemuBlockBitmapsHandleCommitFinish(job->data.commit.top, + job->data.commit.base, ++ active, + blockNamedNodeData, +- &actions, +- job->data.commit.disabledBitmapsBase) < 0) ++ &actions) < 0) + return 0; + + if (!actions) + return 0; + +- if (qemuBlockReopenReadWrite(vm, job->data.commit.base, asyncJob) < 0) +- return -1; ++ if (!active) { ++ if (qemuBlockReopenReadWrite(vm, job->data.commit.base, asyncJob) < 0) ++ return -1; ++ } + + if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) + return -1; +@@ -1091,8 +1094,10 @@ qemuBlockJobProcessEventCompletedCommitBitmaps(virDomainObjPtr vm, + if (qemuDomainObjExitMonitor(priv->driver, vm) < 0) + return -1; + +- if (qemuBlockReopenReadOnly(vm, job->data.commit.base, asyncJob) < 0) +- return -1; ++ if (!active) { ++ if (qemuBlockReopenReadOnly(vm, job->data.commit.base, asyncJob) < 0) ++ return -1; ++ } + + return 0; + } +@@ -1262,6 +1267,9 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, + job->disk->src = job->data.commit.base; + job->disk->src->readonly = job->data.commit.top->readonly; + ++ if (qemuBlockJobProcessEventCompletedCommitBitmaps(vm, job, asyncJob) < 0) ++ return; ++ + qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->data.commit.top); + + if (job->data.commit.deleteCommittedImages) +@@ -1333,6 +1341,7 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuBlockJobDataPtr job) + { ++ g_autoptr(virJSONValue) actions = virJSONValueNewArray(); + virDomainDiskDefPtr disk = job->disk; + + VIR_DEBUG("active commit job '%s' on VM '%s' failed", job->name, vm->def->name); +@@ -1340,6 +1349,10 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDriverPtr driver, + if (!disk) + return; + ++ ignore_value(qemuMonitorTransactionBitmapRemove(actions, disk->mirror->nodeformat, ++ "libvirt-tmp-activewrite")); ++ ++ + /* Ideally, we would make the backing chain read only again (yes, SELinux + * can do that using different labels). But that is not implemented yet and + * not leaking security driver metadata is more important. */ +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 9f7d96c0b6..983d4a04a8 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -17594,9 +17594,9 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver, + + case QEMU_BLOCKJOB_TYPE_COPY: + if (blockdev && !job->jobflagsmissing) { +- g_autoptr(virHashTable) blockNamedNodeData = NULL; + bool shallow = job->jobflags & VIR_DOMAIN_BLOCK_COPY_SHALLOW; + bool reuse = job->jobflags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT; ++ g_autoptr(virHashTable) blockNamedNodeData = NULL; + + if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_NONE))) + return -1; +@@ -17634,16 +17634,15 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver, + * the bitmaps if it wasn't present thus must skip this */ + if (blockdev && + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) { +- g_autoptr(virHashTable) blockNamedNodeData = NULL; + +- if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_NONE))) +- return -1; ++ actions = virJSONValueNewArray(); + +- if (qemuBlockBitmapsHandleCommitFinish(job->data.commit.top, +- job->data.commit.base, +- blockNamedNodeData, +- &actions, +- job->data.commit.disabledBitmapsBase) < 0) ++ if (qemuMonitorTransactionBitmapAdd(actions, ++ job->data.commit.base->nodeformat, ++ "libvirt-tmp-activewrite", ++ false, ++ false, ++ 0) < 0) + return -1; + } + +@@ -18758,7 +18757,6 @@ qemuDomainBlockCommit(virDomainPtr dom, + const char *nodebase = NULL; + bool persistjob = false; + bool blockdev = false; +- g_autoptr(virJSONValue) bitmapDisableActions = NULL; + VIR_AUTOSTRINGLIST bitmapDisableList = NULL; + + virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW | +@@ -18920,27 +18918,6 @@ qemuDomainBlockCommit(virDomainPtr dom, + goto endjob; + } + +- if (blockdev && +- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) { +- g_autoptr(virHashTable) blockNamedNodeData = NULL; +- if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_NONE))) +- goto endjob; +- +- if (qemuBlockBitmapsHandleCommitStart(topSource, baseSource, +- blockNamedNodeData, +- &bitmapDisableActions, +- &bitmapDisableList) < 0) +- goto endjob; +- +- /* if we don't have terminator on 'base' we can't reopen it */ +- if (bitmapDisableActions && !baseSource->backingStore) { +- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, +- _("can't handle bitmaps on unterminated backing image '%s'"), +- base); +- goto endjob; +- } +- } +- + if (!(job = qemuBlockJobDiskNewCommit(vm, disk, top_parent, topSource, + baseSource, &bitmapDisableList, + flags & VIR_DOMAIN_BLOCK_COMMIT_DELETE, +@@ -18965,23 +18942,6 @@ qemuDomainBlockCommit(virDomainPtr dom, + !(backingPath = qemuBlockGetBackingStoreString(baseSource, false))) + goto endjob; + +- if (bitmapDisableActions) { +- int rc; +- +- if (qemuBlockReopenReadWrite(vm, baseSource, QEMU_ASYNC_JOB_NONE) < 0) +- goto endjob; +- +- qemuDomainObjEnterMonitor(driver, vm); +- rc = qemuMonitorTransaction(priv->mon, &bitmapDisableActions); +- if (qemuDomainObjExitMonitor(driver, vm) < 0) +- goto endjob; +- +- if (qemuBlockReopenReadOnly(vm, baseSource, QEMU_ASYNC_JOB_NONE) < 0) +- goto endjob; +- +- if (rc < 0) +- goto endjob; +- } + } else { + device = job->name; + } +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 8ce878f15b..f0e80a0738 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -928,12 +928,11 @@ testQemuBlockBitmapBlockcommit(const void *opaque) + + g_autofree char *actual = NULL; + g_autofree char *expectpath = NULL; +- g_autoptr(virJSONValue) actionsDisable = NULL; + g_autoptr(virJSONValue) actionsMerge = NULL; + g_autoptr(virJSONValue) nodedatajson = NULL; + g_autoptr(virHashTable) nodedata = NULL; + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; +- VIR_AUTOSTRINGLIST bitmapsDisable = NULL; ++ bool active = data->top == data->chain; + + expectpath = g_strdup_printf("%s/%s%s", abs_srcdir, + blockcommitPrefix, data->name); +@@ -947,20 +946,10 @@ testQemuBlockBitmapBlockcommit(const void *opaque) + return -1; + } + +- if (qemuBlockBitmapsHandleCommitStart(data->top, data->base, nodedata, +- &actionsDisable, &bitmapsDisable) < 0) +- return -1; +- +- virBufferAddLit(&buf, "pre job bitmap disable:\n"); +- +- if (actionsDisable && +- virJSONValueToBuffer(actionsDisable, &buf, true) < 0) +- return -1; +- + virBufferAddLit(&buf, "merge bitmpas:\n"); + +- if (qemuBlockBitmapsHandleCommitFinish(data->top, data->base, nodedata, +- &actionsMerge, bitmapsDisable) < 0) ++ if (qemuBlockBitmapsHandleCommitFinish(data->top, data->base, active, nodedata, ++ &actionsMerge) < 0) + return -1; + + if (actionsMerge && +@@ -1356,6 +1345,7 @@ mymain(void) + #define TEST_BITMAP_BLOCKCOMMIT(testname, topimg, baseimg, ndf) \ + do {\ + blockbitmapblockcommitdata.name = testname; \ ++ blockbitmapblockcommitdata.chain = bitmapSourceChain; \ + blockbitmapblockcommitdata.top = testQemuBitmapGetFakeChainEntry(bitmapSourceChain, topimg); \ + blockbitmapblockcommitdata.base = testQemuBitmapGetFakeChainEntry(bitmapSourceChain, baseimg); \ + blockbitmapblockcommitdata.nodedatafile = ndf; \ +diff --git a/tests/qemublocktestdata/bitmapblockcommit/empty b/tests/qemublocktestdata/bitmapblockcommit/empty +index bfc58f994e..9260011852 100644 +--- a/tests/qemublocktestdata/bitmapblockcommit/empty ++++ b/tests/qemublocktestdata/bitmapblockcommit/empty +@@ -1,2 +1 @@ +-pre job bitmap disable: + merge bitmpas: +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-copy.patch b/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-copy.patch new file mode 100644 index 0000000..8ad75d7 --- /dev/null +++ b/SOURCES/libvirt-qemu-Rewrite-bitmap-handling-for-block-copy.patch @@ -0,0 +1,281 @@ +From 8d813e074a1bbe7636c487487e661a5e1a713fd1 Mon Sep 17 00:00:00 2001 +Message-Id: <8d813e074a1bbe7636c487487e661a5e1a713fd1@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:04 +0200 +Subject: [PATCH] qemu: Rewrite bitmap handling for block copy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reuse qemuBlockGetBitmapMergeActions which allows the removal of the +ad-hoc implementation of bitmap merging for block copy. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 7bfff40fdfe5410c446c1cd8ec413e00530faf7d) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <6a254120769a0071ef6867e4c15aca7d3760cf3c.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_block.c | 113 ++------------------------------------- + src/qemu/qemu_blockjob.c | 40 ++++++++++++++ + src/qemu/qemu_driver.c | 13 ++--- + tests/qemublocktest.c | 6 ++- + 4 files changed, 57 insertions(+), 115 deletions(-) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index ff9e000461..18c3861a2e 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -3053,38 +3053,6 @@ qemuBlockBitmapChainIsValid(virStorageSourcePtr src, + } + + +-struct qemuBlockBitmapsHandleBlockcopyConcatData { +- virHashTablePtr bitmaps_merge; +- virJSONValuePtr actions; +- const char *mirrornodeformat; +- bool has_bitmaps; +-}; +- +- +-static int +-qemuBlockBitmapsHandleBlockcopyConcatActions(void *payload, +- const void *name, +- void *opaque) +-{ +- struct qemuBlockBitmapsHandleBlockcopyConcatData *data = opaque; +- virJSONValuePtr createactions = payload; +- const char *bitmapname = name; +- g_autoptr(virJSONValue) mergebitmaps = virHashSteal(data->bitmaps_merge, bitmapname); +- +- data->has_bitmaps = true; +- +- virJSONValueArrayConcat(data->actions, createactions); +- +- if (qemuMonitorTransactionBitmapMerge(data->actions, +- data->mirrornodeformat, +- bitmapname, +- &mergebitmaps) < 0) +- return -1; +- +- return 0; +-} +- +- + /** + * qemuBlockBitmapsHandleBlockcopy: + * @src: disk source +@@ -3107,86 +3075,15 @@ qemuBlockBitmapsHandleBlockcopy(virStorageSourcePtr src, + bool shallow, + virJSONValuePtr *actions) + { +- g_autoptr(virHashTable) bitmaps = virHashNew(virJSONValueHashFree); +- g_autoptr(virHashTable) bitmaps_merge = virHashNew(virJSONValueHashFree); +- g_autoptr(virHashTable) bitmaps_skip = virHashNew(NULL); +- g_autoptr(virJSONValue) tmpactions = virJSONValueNewArray(); +- qemuBlockNamedNodeDataPtr entry; +- virStorageSourcePtr n; +- size_t i; +- struct qemuBlockBitmapsHandleBlockcopyConcatData data = { .bitmaps_merge = bitmaps_merge, +- .actions = tmpactions, +- .mirrornodeformat = mirror->nodeformat, +- .has_bitmaps = false, }; +- +- for (n = src; n; n = n->backingStore) { +- if (!(entry = virHashLookup(blockNamedNodeData, n->nodeformat))) +- continue; +- +- for (i = 0; i < entry->nbitmaps; i++) { +- qemuBlockNamedNodeDataBitmapPtr bitmap = entry->bitmaps[i]; +- virJSONValuePtr bitmap_merge; +- +- if (virHashHasEntry(bitmaps_skip, bitmap->name)) +- continue; +- +- if (!(bitmap_merge = virHashLookup(bitmaps_merge, bitmap->name))) { +- g_autoptr(virJSONValue) tmp = NULL; +- bool disabled = !bitmap->recording; +- +- /* disable any non top-layer bitmaps */ +- if (n != src) +- disabled = true; +- +- if (!bitmap->persistent || +- !(qemuBlockBitmapChainIsValid(n, bitmap->name, +- blockNamedNodeData))) { +- ignore_value(virHashAddEntry(bitmaps_skip, bitmap->name, NULL)); +- continue; +- } +- +- /* prepare the data for adding the bitmap to the mirror */ +- tmp = virJSONValueNewArray(); +- +- if (qemuMonitorTransactionBitmapAdd(tmp, +- mirror->nodeformat, +- bitmap->name, +- true, +- disabled, +- bitmap->granularity) < 0) +- return -1; ++ virStorageSourcePtr base = NULL; + +- if (virHashAddEntry(bitmaps, bitmap->name, tmp) < 0) +- return -1; +- +- tmp = NULL; +- +- /* prepare array for merging all the bitmaps from the original chain */ +- tmp = virJSONValueNewArray(); +- +- if (virHashAddEntry(bitmaps_merge, bitmap->name, tmp) < 0) +- return -1; +- +- bitmap_merge = g_steal_pointer(&tmp); +- } ++ if (shallow) ++ base = src->backingStore; + +- if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(bitmap_merge, +- n->nodeformat, +- bitmap->name) < 0) +- return -1; +- } +- +- if (shallow) +- break; +- } +- +- if (virHashForEach(bitmaps, qemuBlockBitmapsHandleBlockcopyConcatActions, +- &data) < 0) ++ if (qemuBlockGetBitmapMergeActions(src, base, mirror, NULL, NULL, mirror, actions, ++ blockNamedNodeData) < 0) + return -1; + +- if (data.has_bitmaps) +- *actions = g_steal_pointer(&tmpactions); +- + return 0; + } + +diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c +index d106165175..6e33f8666c 100644 +--- a/src/qemu/qemu_blockjob.c ++++ b/src/qemu/qemu_blockjob.c +@@ -1281,6 +1281,43 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, + } + + ++static int ++qemuBlockJobProcessEventCompletedCopyBitmaps(virDomainObjPtr vm, ++ qemuBlockJobDataPtr job, ++ qemuDomainAsyncJob asyncJob) ++{ ++ qemuDomainObjPrivatePtr priv = vm->privateData; ++ g_autoptr(virHashTable) blockNamedNodeData = NULL; ++ g_autoptr(virJSONValue) actions = NULL; ++ bool shallow = job->jobflags & VIR_DOMAIN_BLOCK_COPY_SHALLOW; ++ ++ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) ++ return 0; ++ ++ if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, asyncJob))) ++ return -1; ++ ++ if (qemuBlockBitmapsHandleBlockcopy(job->disk->src, ++ job->disk->mirror, ++ blockNamedNodeData, ++ shallow, ++ &actions) < 0) ++ return 0; ++ ++ if (!actions) ++ return 0; ++ ++ if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) ++ return -1; ++ ++ qemuMonitorTransaction(priv->mon, &actions); ++ ++ if (qemuDomainObjExitMonitor(priv->driver, vm) < 0) ++ return -1; ++ ++ return 0; ++} ++ + static void + qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriverPtr driver, + virDomainObjPtr vm, +@@ -1295,6 +1332,8 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriverPtr driver, + !job->disk->mirror) + return; + ++ qemuBlockJobProcessEventCompletedCopyBitmaps(vm, job, asyncJob); ++ + /* for shallow copy without reusing external image the user can either not + * specify the backing chain in which case libvirt will open and use the + * chain the user provided or not specify a chain in which case we'll +@@ -1328,6 +1367,7 @@ qemuBlockJobProcessEventConcludedCopyAbort(virQEMUDriverPtr driver, + !job->disk->mirror) + return; + ++ /* activeWrite bitmap is removed automatically here */ + qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->disk->mirror); + virObjectUnref(job->disk->mirror); + job->disk->mirror = NULL; +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index ed5498d2bc..9e3a455814 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -17596,14 +17596,15 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver, + if (blockdev && !job->jobflagsmissing) { + bool shallow = job->jobflags & VIR_DOMAIN_BLOCK_COPY_SHALLOW; + bool reuse = job->jobflags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT; +- g_autoptr(virHashTable) blockNamedNodeData = NULL; + +- if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_NONE))) +- return -1; ++ actions = virJSONValueNewArray(); + +- if (qemuBlockBitmapsHandleBlockcopy(disk->src, disk->mirror, +- blockNamedNodeData, +- shallow, &actions) < 0) ++ if (qemuMonitorTransactionBitmapAdd(actions, ++ disk->mirror->nodeformat, ++ "libvirt-tmp-activewrite", ++ false, ++ false, ++ 0) < 0) + return -1; + + /* Open and install the backing chain of 'mirror' late if we can use +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index e1468f13fa..193b4aaed0 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -881,6 +881,7 @@ testQemuBlockBitmapBlockcopy(const void *opaque) + g_autoptr(virJSONValue) nodedatajson = NULL; + g_autoptr(virHashTable) nodedata = NULL; + g_autoptr(virStorageSource) fakemirror = virStorageSourceNew(); ++ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + + if (!fakemirror) + return -1; +@@ -903,10 +904,13 @@ testQemuBlockBitmapBlockcopy(const void *opaque) + data->shallow, &actions) < 0) + return -1; + ++ + if (actions && +- !(actual = virJSONValueToString(actions, true))) ++ virJSONValueToBuffer(actions, &buf, true) < 0) + return -1; + ++ actual = virBufferContentAndReset(&buf); ++ + return virTestCompareToFile(actual, expectpath); + } + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-add-QEMU_CAPS_STORAGE_WERROR.patch b/SOURCES/libvirt-qemu-add-QEMU_CAPS_STORAGE_WERROR.patch new file mode 100644 index 0000000..46b44a7 --- /dev/null +++ b/SOURCES/libvirt-qemu-add-QEMU_CAPS_STORAGE_WERROR.patch @@ -0,0 +1,407 @@ +From 3d20773c3ab225449f1977b064d779adf316853c Mon Sep 17 00:00:00 2001 +Message-Id: <3d20773c3ab225449f1977b064d779adf316853c@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Wed, 1 Apr 2020 17:19:26 +0200 +Subject: [PATCH] qemu: add QEMU_CAPS_STORAGE_WERROR +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Detect the werror property on SCSI and virtio disks. +But clear it if the QEMU supports usb-storage device without it +also supporting this option for usb-storage. + +Signed-off-by: Ján Tomko +Reviewed-by: Peter Krempa +(cherry picked from commit 47e84b06ec8181cbdb00c87bcc67f20edd9e949b) +Signed-off-by: Ján Tomko + +https://bugzilla.redhat.com/show_bug.cgi?id=1819250 + +Conflicts: src/qemu/qemu_capabilities.c + tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml + tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml + tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml + tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml + tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml + tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml + tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml + tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml + different capablility sets +Message-Id: <67c670e206dd05aac31b86cac1f42e2f37b366e5.1585754141.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 10 +++++++++- + src/qemu/qemu_capabilities.h | 1 + + tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml | 1 + + tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml | 1 + + tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 + + 26 files changed, 34 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 0b4ed4253c..9d744501b9 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -563,7 +563,8 @@ VIR_ENUM_IMPL(virQEMUCaps, + "blockdev-reopen", + + /* 355 */ +- "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api" ++ "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api", ++ "storage.werror", + ); + + +@@ -1299,6 +1300,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioBlk[] = { + { "iommu_platform", QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM }, + { "ats", QEMU_CAPS_VIRTIO_PCI_ATS }, + { "write-cache", QEMU_CAPS_DISK_WRITE_CACHE }, ++ { "werror", QEMU_CAPS_STORAGE_WERROR }, + }; + + static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioNet[] = { +@@ -1334,6 +1336,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsSCSIDisk[] = { + { "share-rw", QEMU_CAPS_DISK_SHARE_RW }, + { "write-cache", QEMU_CAPS_DISK_WRITE_CACHE }, + { "device_id", QEMU_CAPS_SCSI_DISK_DEVICE_ID }, ++ { "werror", QEMU_CAPS_STORAGE_WERROR }, + }; + + static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsIDEDrive[] = { +@@ -4811,6 +4814,11 @@ virQEMUCapsInitProcessCapsInterlock(virQEMUCapsPtr qemuCaps) + { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) + virQEMUCapsClear(qemuCaps, QEMU_CAPS_INCREMENTAL_BACKUP); ++ ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_STORAGE) && ++ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_STORAGE_WERROR)) { ++ virQEMUCapsClear(qemuCaps, QEMU_CAPS_STORAGE_WERROR); ++ } + } + + +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index 0f7c586703..78bddb3856 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -545,6 +545,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ + + /* 355 */ + QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API, /* downstream support for blockdev reopen in rhel-av-8.2.0 */ ++ QEMU_CAPS_STORAGE_WERROR, /* virtio-blk,scsi-hd.werror */ + + QEMU_CAPS_LAST /* this must always be the last item */ + } virQEMUCapsFlags; +diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml +index aa9027d514..04ac872985 100644 +--- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml +@@ -106,6 +106,7 @@ + + + ++ + 2010000 + 0 + 39100287 +diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml +index db51d461a8..6d36a6e484 100644 +--- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml +@@ -113,6 +113,7 @@ + + + ++ + 2011000 + 0 + 39100288 +diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml +index cbbe24823a..21a168dd3b 100644 +--- a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml +@@ -125,6 +125,7 @@ + + + ++ + 2012000 + 0 + 39100289 +diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml +index 762ce4946e..17351ca6bf 100644 +--- a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml +@@ -90,6 +90,7 @@ + + + ++ + 2007000 + 0 + 39100245 +diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml +index 6000bed682..d204b82030 100644 +--- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml +@@ -95,6 +95,7 @@ + + + ++ + 2007093 + 0 + 39100246 +diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml +index 95251de022..9a6d94d37b 100644 +--- a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml +@@ -100,6 +100,7 @@ + + + ++ + 2009000 + 0 + 39100247 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml b/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml +index 0b507ec80e..6814a2f9c6 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.riscv32.xml +@@ -95,6 +95,7 @@ + + + ++ + 3000000 + 0 + 0 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml +index 0d7c589f71..b81f5825cc 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.riscv64.xml +@@ -95,6 +95,7 @@ + + + ++ + 3000000 + 0 + 0 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml +index da57f8738b..85cda12076 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.s390x.xml +@@ -128,6 +128,7 @@ + + + ++ + 3000000 + 0 + 39100239 +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +index c955994ac0..575b1c2a43 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.xml +@@ -202,6 +202,7 @@ + + + ++ + 3000000 + 0 + 43100239 +diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml +index cab38d442b..591f054193 100644 +--- a/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.1.0.ppc64.xml +@@ -159,6 +159,7 @@ + + + ++ + 3000091 + 0 + 42900240 +diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml +index 3e89d7f933..6e434579ff 100644 +--- a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.xml +@@ -205,6 +205,7 @@ + + + ++ + 3000092 + 0 + 43100240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml +index 757bf193fc..6fd1880ae2 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.xml +@@ -169,6 +169,7 @@ + + + ++ + 4000000 + 0 + 61700240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml +index 4e13888042..aa22eccc6f 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.xml +@@ -173,6 +173,7 @@ + + + ++ + 4000000 + 0 + 42900240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml +index 7d3a1bec6f..6a567239b9 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.xml +@@ -170,6 +170,7 @@ + + + ++ + 4000000 + 0 + 0 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml +index 1732139db8..d6686b7c68 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.xml +@@ -170,6 +170,7 @@ + + + ++ + 4000000 + 0 + 0 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml +index fd124ce0c5..9dc29832f9 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.s390x.xml +@@ -136,6 +136,7 @@ + + + ++ + 4000000 + 0 + 39100240 +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml +index ba32d4c592..3c1baf9560 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.xml +@@ -210,6 +210,7 @@ + + + ++ + 4000000 + 0 + 43100240 +diff --git a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml +index 54b797a86a..d5f2673fb6 100644 +--- a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.xml +@@ -216,6 +216,7 @@ + + + ++ + 4001000 + 0 + 43100241 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml +index 55fa169d89..75f9bc3158 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml +@@ -178,6 +178,7 @@ + + + ++ + 4001050 + 0 + 61700242 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +index 7c62546d74..f5121fca94 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +@@ -177,6 +177,7 @@ + + + ++ + 4001050 + 0 + 42900242 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml +index 49963b7020..59cb9200cb 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml +@@ -137,6 +137,7 @@ + + + ++ + 4001050 + 0 + 39100242 +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +index ed3dea23b3..f6df71ff3e 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +@@ -221,6 +221,7 @@ + + + ++ + 4002000 + 0 + 43100242 +diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml +index 8195da4e27..140a466910 100644 +--- a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml ++++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml +@@ -180,6 +180,7 @@ + + + ++ + 4002050 + 0 + 61700241 +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-avoid-launching-non-x86-guests-with-APIC-EOI-setting.patch b/SOURCES/libvirt-qemu-avoid-launching-non-x86-guests-with-APIC-EOI-setting.patch new file mode 100644 index 0000000..4236c7f --- /dev/null +++ b/SOURCES/libvirt-qemu-avoid-launching-non-x86-guests-with-APIC-EOI-setting.patch @@ -0,0 +1,80 @@ +From a809e7c5200c4089153768a047f85add0205c4bc Mon Sep 17 00:00:00 2001 +Message-Id: +From: Daniel Henrique Barboza +Date: Mon, 30 Mar 2020 17:18:27 -0400 +Subject: [PATCH] qemu: avoid launching non-x86 guests with APIC-EOI setting + +The "" feature, although it's available only for x86 guests, +can be declared in the domain XML of other archs without errors. +But setting its 'eoi' attribute will break QEMU. For "", +in a ppc64 guest: + +qemu-kvm: Expected key=value format, found +kvm_pv_eoi + +A similar error happens with eoi='off'. + +One can argue that it's better to simply forbid launching non-x86 +guests with "" declared in the XML - it is a feature that +the architecture doesn't support and this would make it clearer +about it. This is sensible, but there are non-x86 guests that are +running with "" declared in the domain (and A LOT of guests +running with "" for that matter, probably reminiscent of x86 +templates that were reused for other archs) that will stop working if we +go this route. + +A more subtle approach is to detect if the 'eoi' element is being set +for non-x86 guests and warn the user about it with a better error +message than the one QEMU provides. This is the new error message +when any value is set for the 'eoi' element in a ppc64 XML: + +error: unsupported configuration: The 'eoi' attribute of the 'apic' +feature is not supported for architecture 'ppc64' or machine type +'pseries'. + +https://bugzilla.redhat.com/show_bug.cgi?id=1236440 + +Signed-off-by: Daniel Henrique Barboza +Reviewed-by: Andrea Bolognani +(cherry picked from commit dbda73ff27cf185fb5db498cc4db281b2d76778d) + +https://bugzilla.redhat.com/show_bug.cgi?id=1829729 + +Signed-off-by: Daniel Henrique Barboza +Message-Id: <20200330211827.951474-2-dbarboza@redhat.com> +Reviewed-by: Andrea Bolognani +--- + src/qemu/qemu_domain.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index bb28716ff0..8f746cdf13 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -5279,8 +5279,23 @@ qemuDomainDefValidateFeatures(const virDomainDef *def, + } + break; + +- case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_APIC: ++ /* The kvm_pv_eoi feature is x86-only. */ ++ if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT && ++ def->apic_eoi != VIR_TRISTATE_SWITCH_ABSENT && ++ !ARCH_IS_X86(def->os.arch)) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("The 'eoi' attribute of the '%s' feature " ++ "is not supported for architecture '%s' or " ++ "machine type '%s'"), ++ featureName, ++ virArchToString(def->os.arch), ++ def->os.machine); ++ return -1; ++ } ++ break; ++ ++ case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_HAP: + case VIR_DOMAIN_FEATURE_VIRIDIAN: +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-backup-Fix-backup-of-disk-skipped-in-an-intermediate-checkpoint.patch b/SOURCES/libvirt-qemu-backup-Fix-backup-of-disk-skipped-in-an-intermediate-checkpoint.patch new file mode 100644 index 0000000..2b5aa3d --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Fix-backup-of-disk-skipped-in-an-intermediate-checkpoint.patch @@ -0,0 +1,81 @@ +From 97a6adcb3ac735ff135469aa602c798fbc0b1491 Mon Sep 17 00:00:00 2001 +Message-Id: <97a6adcb3ac735ff135469aa602c798fbc0b1491@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:36 +0200 +Subject: [PATCH] qemu: backup: Fix backup of disk skipped in an intermediate + checkpoint +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If a disk is not captured by one of the intermediate checkpoints the +code would fail, but we can easily calculate the bitmaps to merge +correctly by skipping over checkpoints which don't describe the disk. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit c89a44777fdf89b400878adcb03a3557bcec3f4e) + +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 24 ++++++++++++++++++++++++ + tests/qemublocktest.c | 6 ++++++ + 2 files changed, 30 insertions(+) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 400b711f79..adbf696de6 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -240,6 +240,30 @@ qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental, + for (incridx = 0; incremental[incridx]; incridx++) { + g_autoptr(virJSONValue) tmp = virJSONValueNewArray(); + virStorageSourcePtr tmpsrc = NULL; ++ virDomainCheckpointDefPtr chkdef = (virDomainCheckpointDefPtr) incremental[incridx]; ++ bool checkpoint_has_disk = false; ++ size_t i; ++ ++ for (i = 0; i < chkdef->ndisks; i++) { ++ if (STRNEQ_NULLABLE(diskdst, chkdef->disks[i].name)) ++ continue; ++ ++ if (chkdef->disks[i].type == VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) ++ checkpoint_has_disk = true; ++ ++ break; ++ } ++ ++ if (!checkpoint_has_disk) { ++ if (!incremental[incridx + 1]) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("disk '%s' not found in checkpoint '%s'"), ++ diskdst, incremental[incridx]->name); ++ return NULL; ++ } ++ ++ continue; ++ } + + if (qemuBackupGetBitmapMergeRange(n, incremental[incridx]->name, + &tmp, &tmpsrc, diskdst, +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index e461b3a23d..d15965d9eb 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -727,6 +727,12 @@ testQemuBackupGetIncrementalMoment(const char *name) + if (!(checkpoint = virDomainCheckpointDefNew())) + abort(); + ++ checkpoint->disks = g_new0(virDomainCheckpointDiskDef, 1); ++ checkpoint->ndisks = 1; ++ ++ checkpoint->disks[0].name = g_strdup("testdisk"); ++ checkpoint->disks[0].type = VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP; ++ + checkpoint->parent.name = g_strdup(name); + + return (virDomainMomentDefPtr) checkpoint; +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-backup-Fix-handling-of-backing-store-for-backup-target-images.patch b/SOURCES/libvirt-qemu-backup-Fix-handling-of-backing-store-for-backup-target-images.patch new file mode 100644 index 0000000..58078d1 --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Fix-handling-of-backing-store-for-backup-target-images.patch @@ -0,0 +1,125 @@ +From 14b1e4fc93ba1a87854aa1afaf519cc3accff4c6 Mon Sep 17 00:00:00 2001 +Message-Id: <14b1e4fc93ba1a87854aa1afaf519cc3accff4c6@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:34 +0200 +Subject: [PATCH] qemu: backup: Fix handling of backing store for backup target + images +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We always tried to install backing store for the image even if it didn't +make sense, e.g. for a full backup into a raw image. Additionally we +didn't record the backing file into the qcow2 metadata so the image +itself contained the diff of data but reading from it would be +incomplete as it depends on the backing image. + +This patch fixes both issues by carefully installing the correct backing +file when appropriate and also recording it into the metadata when +creating the image. + +https://bugzilla.redhat.com/show_bug.cgi?id=1813310 + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 4aea6f42fe32175ce0cb9015913db536097130e4) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <8c4ebc06863aac1f75532b6633772944a6b0bd2a.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 9a056fa407..5d18720f53 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -105,6 +105,8 @@ struct qemuBackupDiskData { + virDomainDiskDefPtr domdisk; + qemuBlockJobDataPtr blockjob; + virStorageSourcePtr store; ++ virStorageSourcePtr terminator; ++ virStorageSourcePtr backingStore; + char *incrementalBitmap; + qemuBlockStorageSourceChainDataPtr crdata; + bool labelled; +@@ -146,6 +148,7 @@ qemuBackupDiskDataCleanupOne(virDomainObjPtr vm, + qemuBlockJobStartupFinalize(vm, dd->blockjob); + + qemuBlockStorageSourceChainDataFree(dd->crdata); ++ virObjectUnref(dd->terminator); + } + + +@@ -295,6 +298,7 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + virDomainBackupDiskDefPtr backupdisk, + struct qemuBackupDiskData *dd, + virJSONValuePtr actions, ++ bool pull, + virDomainMomentDefPtr *incremental, + virHashTablePtr blockNamedNodeData, + virQEMUDriverConfigPtr cfg) +@@ -314,6 +318,19 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + if (!dd->store->format) + dd->store->format = VIR_STORAGE_FILE_QCOW2; + ++ /* calculate backing store to use: ++ * push mode: ++ * full backups: no backing store ++ * incremental: original disk if format supports backing store ++ * pull mode: ++ * both: original disk ++ */ ++ if (pull || (incremental && dd->store->format >= VIR_STORAGE_FILE_BACKING)) { ++ dd->backingStore = dd->domdisk->src; ++ } else { ++ dd->backingStore = dd->terminator = virStorageSourceNew(); ++ } ++ + if (qemuDomainStorageFileInit(priv->driver, vm, dd->store, dd->domdisk->src) < 0) + return -1; + +@@ -337,7 +354,7 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + + /* use original disk as backing to prevent opening the backing chain */ + if (!(dd->crdata = qemuBuildStorageSourceChainAttachPrepareBlockdevTop(dd->store, +- dd->domdisk->src, ++ dd->backingStore, + priv->qemuCaps))) + return -1; + +@@ -398,6 +415,7 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm, + struct qemuBackupDiskData *disks = NULL; + ssize_t ndisks = 0; + size_t i; ++ bool pull = def->type == VIR_DOMAIN_BACKUP_TYPE_PULL; + + disks = g_new0(struct qemuBackupDiskData, def->ndisks); + +@@ -410,12 +428,12 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm, + + ndisks++; + +- if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, ++ if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, pull, + incremental, blockNamedNodeData, + cfg) < 0) + goto error; + +- if (def->type == VIR_DOMAIN_BACKUP_TYPE_PULL) { ++ if (pull) { + if (qemuBackupDiskPrepareDataOnePull(actions, dd) < 0) + goto error; + } else { +@@ -480,7 +498,7 @@ qemuBackupDiskPrepareOneStorage(virDomainObjPtr vm, + dd->store, dd->domdisk->src) < 0) + return -1; + +- if (qemuBlockStorageSourceCreate(vm, dd->store, NULL, NULL, ++ if (qemuBlockStorageSourceCreate(vm, dd->store, dd->backingStore, NULL, + dd->crdata->srcdata[0], + QEMU_ASYNC_JOB_BACKUP) < 0) + return -1; +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-backup-Initialize-store-source-properly-and-just-once.patch b/SOURCES/libvirt-qemu-backup-Initialize-store-source-properly-and-just-once.patch new file mode 100644 index 0000000..c758c9d --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Initialize-store-source-properly-and-just-once.patch @@ -0,0 +1,49 @@ +From 7ffdca30e2d5c80e68846df2656efed0e13a81d4 Mon Sep 17 00:00:00 2001 +Message-Id: <7ffdca30e2d5c80e68846df2656efed0e13a81d4@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:08 +0200 +Subject: [PATCH] qemu: backup: Initialize 'store' source properly and just + once +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Two functions called in sequence both initialized the virStorageSource +backing 'store' leading to a memleak. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 2d26f8b710d259a3e164a2bea3c9f9dc0de9b419) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <0e2df46f3a2ffd182e21d54497bafcfc09b26b0d.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index c207d3b7d0..013a82e06d 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -269,9 +269,6 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + dd->backingStore = dd->terminator = virStorageSourceNew(); + } + +- if (qemuDomainStorageFileInit(priv->driver, vm, dd->store, dd->domdisk->src) < 0) +- return -1; +- + if (qemuDomainPrepareStorageSourceBlockdev(NULL, dd->store, priv, cfg) < 0) + return -1; + +@@ -407,7 +404,7 @@ qemuBackupDiskPrepareOneStorage(virDomainObjPtr vm, + return -1; + } + +- if (qemuDomainStorageFileInit(priv->driver, vm, dd->store, NULL) < 0) ++ if (qemuDomainStorageFileInit(priv->driver, vm, dd->store, dd->domdisk->src) < 0) + return -1; + + dd->initialized = true; +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-backup-Move-fetching-of-checkpoint-list-for-incremental-backup.patch b/SOURCES/libvirt-qemu-backup-Move-fetching-of-checkpoint-list-for-incremental-backup.patch new file mode 100644 index 0000000..1000fe4 --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Move-fetching-of-checkpoint-list-for-incremental-backup.patch @@ -0,0 +1,213 @@ +From 7dae651c45df86ce74b304535baf62013d7f527d Mon Sep 17 00:00:00 2001 +Message-Id: <7dae651c45df86ce74b304535baf62013d7f527d@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:38 +0200 +Subject: [PATCH] qemu: backup: Move fetching of checkpoint list for + incremental backup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fetch the checkpoint list for every disk specifically based on the new +per-disk 'incremental' field. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 15c5ed8ba64e26090174d296486eacfa240af53e) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <485f9933893a9890f018889a76fc48654de2c58a.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 109 ++++++++++++++++++++--------------------- + 1 file changed, 53 insertions(+), 56 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index adbf696de6..13e2a7412b 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -173,6 +173,50 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm, + } + + ++/** ++ * qemuBackupBeginCollectIncrementalCheckpoints: ++ * @vm: domain object ++ * @incrFrom: name of checkpoint representing starting point of incremental backup ++ * ++ * Returns a NULL terminated list of pointers to checkpoint definitions in ++ * chronological order starting from the 'current' checkpoint until reaching ++ * @incrFrom. ++ */ ++static virDomainMomentDefPtr * ++qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm, ++ const char *incrFrom) ++{ ++ virDomainMomentObjPtr n = virDomainCheckpointGetCurrent(vm->checkpoints); ++ g_autofree virDomainMomentDefPtr *incr = NULL; ++ size_t nincr = 0; ++ ++ while (n) { ++ virDomainMomentDefPtr def = n->def; ++ ++ if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) ++ return NULL; ++ ++ if (STREQ(def->name, incrFrom)) { ++ def = NULL; ++ if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) ++ return NULL; ++ ++ return g_steal_pointer(&incr); ++ } ++ ++ if (!n->def->parent_name) ++ break; ++ ++ n = virDomainCheckpointFindByName(vm->checkpoints, n->def->parent_name); ++ } ++ ++ virReportError(VIR_ERR_OPERATION_INVALID, ++ _("could not locate checkpoint '%s' for incremental backup"), ++ incrFrom); ++ return NULL; ++} ++ ++ + static int + qemuBackupGetBitmapMergeRange(virStorageSourcePtr from, + const char *bitmapname, +@@ -334,11 +378,11 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + struct qemuBackupDiskData *dd, + virJSONValuePtr actions, + bool pull, +- virDomainMomentDefPtr *incremental, + virHashTablePtr blockNamedNodeData, + virQEMUDriverConfigPtr cfg) + { + qemuDomainObjPrivatePtr priv = vm->privateData; ++ g_autofree virDomainMomentDefPtr *incremental = NULL; + + /* set data structure */ + dd->backupdisk = backupdisk; +@@ -360,7 +404,8 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + * pull mode: + * both: original disk + */ +- if (pull || (incremental && dd->store->format >= VIR_STORAGE_FILE_BACKING)) { ++ if (pull || (dd->backupdisk->incremental && ++ dd->store->format >= VIR_STORAGE_FILE_BACKING)) { + dd->backingStore = dd->domdisk->src; + } else { + dd->backingStore = dd->terminator = virStorageSourceNew(); +@@ -372,7 +417,10 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + if (qemuDomainPrepareStorageSourceBlockdev(NULL, dd->store, priv, cfg) < 0) + return -1; + +- if (incremental) { ++ if (dd->backupdisk->incremental) { ++ if (!(incremental = qemuBackupBeginCollectIncrementalCheckpoints(vm, dd->backupdisk->incremental))) ++ return -1; ++ + if (dd->backupdisk->exportbitmap) + dd->incrementalBitmap = g_strdup(dd->backupdisk->exportbitmap); + else +@@ -441,7 +489,6 @@ qemuBackupDiskPrepareDataOnePull(virJSONValuePtr actions, + static ssize_t + qemuBackupDiskPrepareData(virDomainObjPtr vm, + virDomainBackupDefPtr def, +- virDomainMomentDefPtr *incremental, + virHashTablePtr blockNamedNodeData, + virJSONValuePtr actions, + virQEMUDriverConfigPtr cfg, +@@ -464,8 +511,7 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm, + ndisks++; + + if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, pull, +- incremental, blockNamedNodeData, +- cfg) < 0) ++ blockNamedNodeData, cfg) < 0) + goto error; + + if (pull) { +@@ -622,50 +668,6 @@ qemuBackupBeginPullExportDisks(virDomainObjPtr vm, + } + + +-/** +- * qemuBackupBeginCollectIncrementalCheckpoints: +- * @vm: domain object +- * @incrFrom: name of checkpoint representing starting point of incremental backup +- * +- * Returns a NULL terminated list of pointers to checkpoint definitions in +- * chronological order starting from the 'current' checkpoint until reaching +- * @incrFrom. +- */ +-static virDomainMomentDefPtr * +-qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm, +- const char *incrFrom) +-{ +- virDomainMomentObjPtr n = virDomainCheckpointGetCurrent(vm->checkpoints); +- g_autofree virDomainMomentDefPtr *incr = NULL; +- size_t nincr = 0; +- +- while (n) { +- virDomainMomentDefPtr def = n->def; +- +- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) +- return NULL; +- +- if (STREQ(def->name, incrFrom)) { +- def = NULL; +- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) +- return NULL; +- +- return g_steal_pointer(&incr); +- } +- +- if (!n->def->parent_name) +- break; +- +- n = virDomainCheckpointFindByName(vm->checkpoints, n->def->parent_name); +- } +- +- virReportError(VIR_ERR_OPERATION_INVALID, +- _("could not locate checkpoint '%s' for incremental backup"), +- incrFrom); +- return NULL; +-} +- +- + void + qemuBackupJobTerminate(virDomainObjPtr vm, + qemuDomainJobStatus jobstatus) +@@ -799,7 +801,6 @@ qemuBackupBegin(virDomainObjPtr vm, + bool pull = false; + virDomainMomentObjPtr chk = NULL; + g_autoptr(virDomainCheckpointDef) chkdef = NULL; +- g_autofree virDomainMomentDefPtr *incremental = NULL; + g_autoptr(virJSONValue) actions = NULL; + struct qemuBackupDiskData *dd = NULL; + ssize_t ndd = 0; +@@ -867,10 +868,6 @@ qemuBackupBegin(virDomainObjPtr vm, + if (virDomainBackupAlignDisks(def, vm->def, suffix) < 0) + goto endjob; + +- if (def->incremental && +- !(incremental = qemuBackupBeginCollectIncrementalCheckpoints(vm, def->incremental))) +- goto endjob; +- + actions = virJSONValueNewArray(); + + /* The 'chk' checkpoint must be rolled back if the transaction command +@@ -884,7 +881,7 @@ qemuBackupBegin(virDomainObjPtr vm, + if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_BACKUP))) + goto endjob; + +- if ((ndd = qemuBackupDiskPrepareData(vm, def, incremental, blockNamedNodeData, ++ if ((ndd = qemuBackupDiskPrepareData(vm, def, blockNamedNodeData, + actions, cfg, &dd)) <= 0) { + if (ndd == 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-backup-Rewrite-backup-bitmap-handling-to-the-new-bitmap-semantics.patch b/SOURCES/libvirt-qemu-backup-Rewrite-backup-bitmap-handling-to-the-new-bitmap-semantics.patch new file mode 100644 index 0000000..c8e5883 --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Rewrite-backup-bitmap-handling-to-the-new-bitmap-semantics.patch @@ -0,0 +1,457 @@ +From 1fd01969c2a7c4deefc28363c9748786ca5d7169 Mon Sep 17 00:00:00 2001 +Message-Id: <1fd01969c2a7c4deefc28363c9748786ca5d7169@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:57 +0200 +Subject: [PATCH] qemu: backup: Rewrite backup bitmap handling to the new + bitmap semantics +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reuse qemuBlockGetBitmapMergeActions which allows removal of the ad-hoc +implementation of bitmap merging for backup. The new approach is simpler +and also more robust in case some of the bitmaps break as they remove +the dependency on the whole chain of bitmaps working. + +The new approach also allows backups if a snapshot is created outside of +libvirt. + +Additionally the code is greatly simplified. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit e0d8d989e2bc9024f85b676166da0305c4b4014d) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <468adeee4056441afbf7b452def02179da043030.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 220 +++--------------- + src/qemu/qemu_backup.h | 12 +- + tests/qemublocktest.c | 86 ++----- + .../backupmerge/empty-out.json | 4 +- + 4 files changed, 63 insertions(+), 259 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 13e2a7412b..67d646f477 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -173,199 +173,58 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm, + } + + +-/** +- * qemuBackupBeginCollectIncrementalCheckpoints: +- * @vm: domain object +- * @incrFrom: name of checkpoint representing starting point of incremental backup +- * +- * Returns a NULL terminated list of pointers to checkpoint definitions in +- * chronological order starting from the 'current' checkpoint until reaching +- * @incrFrom. +- */ +-static virDomainMomentDefPtr * +-qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm, +- const char *incrFrom) +-{ +- virDomainMomentObjPtr n = virDomainCheckpointGetCurrent(vm->checkpoints); +- g_autofree virDomainMomentDefPtr *incr = NULL; +- size_t nincr = 0; +- +- while (n) { +- virDomainMomentDefPtr def = n->def; +- +- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) +- return NULL; +- +- if (STREQ(def->name, incrFrom)) { +- def = NULL; +- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) +- return NULL; +- +- return g_steal_pointer(&incr); +- } +- +- if (!n->def->parent_name) +- break; +- +- n = virDomainCheckpointFindByName(vm->checkpoints, n->def->parent_name); +- } +- +- virReportError(VIR_ERR_OPERATION_INVALID, +- _("could not locate checkpoint '%s' for incremental backup"), +- incrFrom); +- return NULL; +-} +- +- +-static int +-qemuBackupGetBitmapMergeRange(virStorageSourcePtr from, +- const char *bitmapname, +- virJSONValuePtr *actions, +- virStorageSourcePtr *to, +- const char *diskdst, +- virHashTablePtr blockNamedNodeData) ++int ++qemuBackupDiskPrepareOneBitmapsChain(virStorageSourcePtr backingChain, ++ virStorageSourcePtr targetsrc, ++ const char *targetbitmap, ++ const char *incremental, ++ virJSONValuePtr actions, ++ virHashTablePtr blockNamedNodeData) + { +- g_autoptr(virJSONValue) act = virJSONValueNewArray(); +- virStorageSourcePtr tmpsrc = NULL; +- virStorageSourcePtr n; +- bool foundbitmap = false; ++ g_autoptr(virJSONValue) tmpactions = NULL; + +- for (n = from; virStorageSourceIsBacking(n); n = n->backingStore) { +- qemuBlockNamedNodeDataBitmapPtr bitmap = NULL; +- +- if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- n, +- bitmapname))) +- break; +- +- foundbitmap = true; +- +- if (bitmap->inconsistent) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("bitmap '%s' for image '%s%u' is inconsistent"), +- bitmap->name, diskdst, n->id); +- return -1; +- } +- +- if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(act, +- n->nodeformat, +- bitmapname) < 0) +- return -1; +- +- tmpsrc = n; +- } +- +- if (!foundbitmap) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("failed to find bitmap '%s' in image '%s%u'"), +- bitmapname, diskdst, from->id); ++ if (qemuBlockGetBitmapMergeActions(backingChain, NULL, targetsrc, ++ incremental, targetbitmap, NULL, ++ &tmpactions, ++ blockNamedNodeData) < 0) + return -1; +- } + +- *actions = g_steal_pointer(&act); +- *to = tmpsrc; ++ if (tmpactions && ++ virJSONValueArrayConcat(actions, tmpactions) < 0) ++ return -1; + + return 0; + } + + +-virJSONValuePtr +-qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental, +- virStorageSourcePtr backingChain, +- virHashTablePtr blockNamedNodeData, +- const char *diskdst) +-{ +- g_autoptr(virJSONValue) ret = NULL; +- size_t incridx = 0; +- virStorageSourcePtr n = backingChain; +- +- ret = virJSONValueNewArray(); +- +- for (incridx = 0; incremental[incridx]; incridx++) { +- g_autoptr(virJSONValue) tmp = virJSONValueNewArray(); +- virStorageSourcePtr tmpsrc = NULL; +- virDomainCheckpointDefPtr chkdef = (virDomainCheckpointDefPtr) incremental[incridx]; +- bool checkpoint_has_disk = false; +- size_t i; +- +- for (i = 0; i < chkdef->ndisks; i++) { +- if (STRNEQ_NULLABLE(diskdst, chkdef->disks[i].name)) +- continue; +- +- if (chkdef->disks[i].type == VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) +- checkpoint_has_disk = true; +- +- break; +- } +- +- if (!checkpoint_has_disk) { +- if (!incremental[incridx + 1]) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("disk '%s' not found in checkpoint '%s'"), +- diskdst, incremental[incridx]->name); +- return NULL; +- } +- +- continue; +- } +- +- if (qemuBackupGetBitmapMergeRange(n, incremental[incridx]->name, +- &tmp, &tmpsrc, diskdst, +- blockNamedNodeData) < 0) +- return NULL; +- +- if (virJSONValueArrayConcat(ret, tmp) < 0) +- return NULL; +- +- n = tmpsrc; +- } +- +- return g_steal_pointer(&ret); +-} +- +- + static int + qemuBackupDiskPrepareOneBitmaps(struct qemuBackupDiskData *dd, + virJSONValuePtr actions, +- virDomainMomentDefPtr *incremental, + virHashTablePtr blockNamedNodeData) + { +- g_autoptr(virJSONValue) mergebitmaps = NULL; +- g_autoptr(virJSONValue) mergebitmapsstore = NULL; +- +- if (!(mergebitmaps = qemuBackupDiskPrepareOneBitmapsChain(incremental, +- dd->domdisk->src, +- blockNamedNodeData, +- dd->domdisk->dst))) +- return -1; +- +- if (!(mergebitmapsstore = virJSONValueCopy(mergebitmaps))) +- return -1; +- +- if (qemuMonitorTransactionBitmapAdd(actions, +- dd->domdisk->src->nodeformat, +- dd->incrementalBitmap, +- false, +- true, 0) < 0) +- return -1; +- +- if (qemuMonitorTransactionBitmapMerge(actions, +- dd->domdisk->src->nodeformat, +- dd->incrementalBitmap, +- &mergebitmaps) < 0) ++ if (!qemuBlockBitmapChainIsValid(dd->domdisk->src, ++ dd->backupdisk->incremental, ++ blockNamedNodeData)) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("missing or broken bitmap '%s' for disk '%s'"), ++ dd->backupdisk->incremental, dd->domdisk->dst); + return -1; ++ } + +- if (qemuMonitorTransactionBitmapAdd(actions, +- dd->store->nodeformat, +- dd->incrementalBitmap, +- false, +- true, 0) < 0) ++ if (qemuBackupDiskPrepareOneBitmapsChain(dd->domdisk->src, ++ dd->domdisk->src, ++ dd->incrementalBitmap, ++ dd->backupdisk->incremental, ++ actions, ++ blockNamedNodeData) < 0) + return -1; + +- if (qemuMonitorTransactionBitmapMerge(actions, +- dd->store->nodeformat, +- dd->incrementalBitmap, +- &mergebitmapsstore) < 0) ++ if (qemuBackupDiskPrepareOneBitmapsChain(dd->domdisk->src, ++ dd->store, ++ dd->incrementalBitmap, ++ dd->backupdisk->incremental, ++ actions, ++ blockNamedNodeData) < 0) + return -1; + + return 0; +@@ -382,7 +241,6 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + virQEMUDriverConfigPtr cfg) + { + qemuDomainObjPrivatePtr priv = vm->privateData; +- g_autofree virDomainMomentDefPtr *incremental = NULL; + + /* set data structure */ + dd->backupdisk = backupdisk; +@@ -418,16 +276,12 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, + return -1; + + if (dd->backupdisk->incremental) { +- if (!(incremental = qemuBackupBeginCollectIncrementalCheckpoints(vm, dd->backupdisk->incremental))) +- return -1; +- + if (dd->backupdisk->exportbitmap) + dd->incrementalBitmap = g_strdup(dd->backupdisk->exportbitmap); + else + dd->incrementalBitmap = g_strdup_printf("backup-%s", dd->domdisk->dst); + +- if (qemuBackupDiskPrepareOneBitmaps(dd, actions, incremental, +- blockNamedNodeData) < 0) ++ if (qemuBackupDiskPrepareOneBitmaps(dd, actions, blockNamedNodeData) < 0) + return -1; + } + +@@ -881,8 +735,8 @@ qemuBackupBegin(virDomainObjPtr vm, + if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_BACKUP))) + goto endjob; + +- if ((ndd = qemuBackupDiskPrepareData(vm, def, blockNamedNodeData, +- actions, cfg, &dd)) <= 0) { ++ if ((ndd = qemuBackupDiskPrepareData(vm, def, blockNamedNodeData, actions, ++ cfg, &dd)) <= 0) { + if (ndd == 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("no disks selected for backup")); +diff --git a/src/qemu/qemu_backup.h b/src/qemu/qemu_backup.h +index 3321ba0b6f..c821baf0ee 100644 +--- a/src/qemu/qemu_backup.h ++++ b/src/qemu/qemu_backup.h +@@ -52,8 +52,10 @@ qemuBackupGetJobInfoStats(virQEMUDriverPtr driver, + qemuDomainJobInfoPtr jobInfo); + + /* exported for testing */ +-virJSONValuePtr +-qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental, +- virStorageSourcePtr backingChain, +- virHashTablePtr blockNamedNodeData, +- const char *diskdst); ++int ++qemuBackupDiskPrepareOneBitmapsChain(virStorageSourcePtr backingChain, ++ virStorageSourcePtr targetsrc, ++ const char *targetbitmap, ++ const char *incremental, ++ virJSONValuePtr actions, ++ virHashTablePtr blockNamedNodeData); +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 7c8f67dd6b..dcdc9eade0 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -716,65 +716,6 @@ testQemuBitmapGetFakeChainEntry(virStorageSourcePtr src, + } + + +-typedef virDomainMomentDefPtr testMomentList; +- +-static void +-testMomentListFree(testMomentList *list) +-{ +- testMomentList *tmp = list; +- +- if (!list) +- return; +- +- while (*tmp) { +- virObjectUnref(*tmp); +- tmp++; +- } +- +- g_free(list); +-} +- +-G_DEFINE_AUTOPTR_CLEANUP_FUNC(testMomentList, testMomentListFree); +- +-static virDomainMomentDefPtr +-testQemuBackupGetIncrementalMoment(const char *name) +-{ +- virDomainCheckpointDefPtr checkpoint = NULL; +- +- if (!(checkpoint = virDomainCheckpointDefNew())) +- abort(); +- +- checkpoint->disks = g_new0(virDomainCheckpointDiskDef, 1); +- checkpoint->ndisks = 1; +- +- checkpoint->disks[0].name = g_strdup("testdisk"); +- checkpoint->disks[0].type = VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP; +- +- checkpoint->parent.name = g_strdup(name); +- +- return (virDomainMomentDefPtr) checkpoint; +-} +- +- +-static virDomainMomentDefPtr * +-testQemuBackupGetIncremental(const char *incFrom) +-{ +- const char *checkpoints[] = {"current", "d", "c", "b", "a"}; +- virDomainMomentDefPtr *incr; +- size_t i; +- +- incr = g_new0(virDomainMomentDefPtr, G_N_ELEMENTS(checkpoints) + 1); +- +- for (i = 0; i < G_N_ELEMENTS(checkpoints); i++) { +- incr[i] = testQemuBackupGetIncrementalMoment(checkpoints[i]); +- +- if (STREQ(incFrom, checkpoints[i])) +- break; +- } +- +- return incr; +-} +- + static const char *backupDataPrefix = "qemublocktestdata/backupmerge/"; + + struct testQemuBackupIncrementalBitmapCalculateData { +@@ -791,10 +732,10 @@ testQemuBackupIncrementalBitmapCalculate(const void *opaque) + const struct testQemuBackupIncrementalBitmapCalculateData *data = opaque; + g_autoptr(virJSONValue) nodedatajson = NULL; + g_autoptr(virHashTable) nodedata = NULL; +- g_autoptr(virJSONValue) mergebitmaps = NULL; +- g_autofree char *actual = NULL; ++ g_autoptr(virJSONValue) actions = virJSONValueNewArray(); + g_autofree char *expectpath = NULL; +- g_autoptr(testMomentList) incremental = NULL; ++ g_autoptr(virStorageSource) target = NULL; ++ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + + expectpath = g_strdup_printf("%s/%s%s-out.json", abs_srcdir, + backupDataPrefix, data->name); +@@ -808,19 +749,24 @@ testQemuBackupIncrementalBitmapCalculate(const void *opaque) + return -1; + } + +- incremental = testQemuBackupGetIncremental(data->incremental); ++ if (!(target = virStorageSourceNew())) ++ return -1; + +- if ((mergebitmaps = qemuBackupDiskPrepareOneBitmapsChain(incremental, +- data->chain, +- nodedata, +- "testdisk"))) { +- if (!(actual = virJSONValueToString(mergebitmaps, true))) ++ target->nodeformat = g_strdup_printf("target_node"); ++ ++ if (qemuBackupDiskPrepareOneBitmapsChain(data->chain, ++ target, ++ "target-bitmap-name", ++ data->incremental, ++ actions, ++ nodedata) >= 0) { ++ if (virJSONValueToBuffer(actions, &buf, true) < 0) + return -1; + } else { +- actual = g_strdup("NULL\n"); ++ virBufferAddLit(&buf, "NULL\n"); + } + +- return virTestCompareToFile(actual, expectpath); ++ return virTestCompareToFile(virBufferCurrentContent(&buf), expectpath); + } + + +diff --git a/tests/qemublocktestdata/backupmerge/empty-out.json b/tests/qemublocktestdata/backupmerge/empty-out.json +index 7951defec1..41b42e677b 100644 +--- a/tests/qemublocktestdata/backupmerge/empty-out.json ++++ b/tests/qemublocktestdata/backupmerge/empty-out.json +@@ -1 +1,3 @@ +-NULL ++[ ++ ++] +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-backup-Split-up-code-traversing-checkpoint-list-looking-for-bitmaps.patch b/SOURCES/libvirt-qemu-backup-Split-up-code-traversing-checkpoint-list-looking-for-bitmaps.patch new file mode 100644 index 0000000..ca1b634 --- /dev/null +++ b/SOURCES/libvirt-qemu-backup-Split-up-code-traversing-checkpoint-list-looking-for-bitmaps.patch @@ -0,0 +1,165 @@ +From d0dc4217142fda8ce8850a30b7d89a344bb55d5e Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:35 +0200 +Subject: [PATCH] qemu: backup: Split up code traversing checkpoint list + looking for bitmaps +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The algorithm is getting quite complex. Split out the lookup of range of +backing chain storage sources and bitmaps contained in them which +correspond to one checkpoint. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 562511afa6cef5948e6339596ba5954cb5ed0565) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 111 ++++++++++++++++++++++------------------- + 1 file changed, 61 insertions(+), 50 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 5d18720f53..400b711f79 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -173,72 +173,83 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm, + } + + ++static int ++qemuBackupGetBitmapMergeRange(virStorageSourcePtr from, ++ const char *bitmapname, ++ virJSONValuePtr *actions, ++ virStorageSourcePtr *to, ++ const char *diskdst, ++ virHashTablePtr blockNamedNodeData) ++{ ++ g_autoptr(virJSONValue) act = virJSONValueNewArray(); ++ virStorageSourcePtr tmpsrc = NULL; ++ virStorageSourcePtr n; ++ bool foundbitmap = false; ++ ++ for (n = from; virStorageSourceIsBacking(n); n = n->backingStore) { ++ qemuBlockNamedNodeDataBitmapPtr bitmap = NULL; ++ ++ if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, ++ n, ++ bitmapname))) ++ break; ++ ++ foundbitmap = true; ++ ++ if (bitmap->inconsistent) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("bitmap '%s' for image '%s%u' is inconsistent"), ++ bitmap->name, diskdst, n->id); ++ return -1; ++ } ++ ++ if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(act, ++ n->nodeformat, ++ bitmapname) < 0) ++ return -1; ++ ++ tmpsrc = n; ++ } ++ ++ if (!foundbitmap) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("failed to find bitmap '%s' in image '%s%u'"), ++ bitmapname, diskdst, from->id); ++ return -1; ++ } ++ ++ *actions = g_steal_pointer(&act); ++ *to = tmpsrc; ++ ++ return 0; ++} ++ ++ + virJSONValuePtr + qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental, + virStorageSourcePtr backingChain, + virHashTablePtr blockNamedNodeData, + const char *diskdst) + { +- qemuBlockNamedNodeDataBitmapPtr bitmap; + g_autoptr(virJSONValue) ret = NULL; + size_t incridx = 0; ++ virStorageSourcePtr n = backingChain; + + ret = virJSONValueNewArray(); + +- if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- backingChain, +- incremental[0]->name))) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("failed to find bitmap '%s' in image '%s%u'"), +- incremental[0]->name, diskdst, backingChain->id); +- return NULL; +- } ++ for (incridx = 0; incremental[incridx]; incridx++) { ++ g_autoptr(virJSONValue) tmp = virJSONValueNewArray(); ++ virStorageSourcePtr tmpsrc = NULL; + +- while (bitmap) { +- if (bitmap->inconsistent) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("bitmap '%s' for image '%s%u' is inconsistent"), +- bitmap->name, diskdst, backingChain->id); ++ if (qemuBackupGetBitmapMergeRange(n, incremental[incridx]->name, ++ &tmp, &tmpsrc, diskdst, ++ blockNamedNodeData) < 0) + return NULL; +- } + +- if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(ret, +- backingChain->nodeformat, +- bitmap->name) < 0) ++ if (virJSONValueArrayConcat(ret, tmp) < 0) + return NULL; + +- if (backingChain->backingStore && +- (bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- backingChain->backingStore, +- incremental[incridx]->name))) { +- backingChain = backingChain->backingStore; +- continue; +- } +- +- if (incremental[incridx + 1]) { +- if ((bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- backingChain, +- incremental[incridx + 1]->name))) { +- incridx++; +- continue; +- } +- +- if (backingChain->backingStore && +- (bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- backingChain->backingStore, +- incremental[incridx + 1]->name))) { +- incridx++; +- backingChain = backingChain->backingStore; +- continue; +- } +- +- virReportError(VIR_ERR_INVALID_ARG, +- _("failed to find bitmap '%s' in image '%s%u'"), +- incremental[incridx]->name, diskdst, backingChain->id); +- return NULL; +- } else { +- break; +- } ++ n = tmpsrc; + } + + return g_steal_pointer(&ret); +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-block-Add-universal-helper-for-merging-dirty-bitmaps-for-all-scenarios.patch b/SOURCES/libvirt-qemu-block-Add-universal-helper-for-merging-dirty-bitmaps-for-all-scenarios.patch new file mode 100644 index 0000000..2195f0d --- /dev/null +++ b/SOURCES/libvirt-qemu-block-Add-universal-helper-for-merging-dirty-bitmaps-for-all-scenarios.patch @@ -0,0 +1,238 @@ +From 629e54cc030235909720da73d6367fc0b703d062 Mon Sep 17 00:00:00 2001 +Message-Id: <629e54cc030235909720da73d6367fc0b703d062@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:56 +0200 +Subject: [PATCH] qemu: block: Add universal helper for merging dirty bitmaps + for all scenarios +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add a function which allows merging bitmaps according to the new +semantics and will allow replacing all the specific ad-hoc functions +currently in use for 'backup', 'block commit', 'block copy' and will +also be usable in the future for 'block pull' and non-shared storage +migration. + +The semantics are a bit quirky for the 'backup' case but these quirks +are documented and will prevent us from having two slightly different +algorithms. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 4fa8654eced8b0362d3f3ff33eebb108fe833869) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <25acdc313844a20a9c884048498c42b9a8105de7.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_block.c | 172 ++++++++++++++++++++++++++++++++++++++++++ + src/qemu/qemu_block.h | 10 +++ + 2 files changed, 182 insertions(+) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index 38c8269721..b2296c2b4c 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -2832,6 +2832,178 @@ qemuBlockGetNamedNodeData(virDomainObjPtr vm, + } + + ++/** ++ * qemuBlockGetBitmapMergeActionsGetBitmaps: ++ * ++ * Collect a list of bitmaps which need to be handled in ++ * qemuBlockGetBitmapMergeActions. The list contains only valid bitmaps in the ++ * sub-chain which is being processed. ++ * ++ * Note that the returned GSList contains bitmap names string pointers borrowed ++ * from @blockNamedNodeData so they must not be freed. ++ */ ++static GSList * ++qemuBlockGetBitmapMergeActionsGetBitmaps(virStorageSourcePtr topsrc, ++ const char *bitmapname, ++ virHashTablePtr blockNamedNodeData) ++{ ++ g_autoptr(GSList) ret = NULL; ++ qemuBlockNamedNodeDataPtr entry; ++ size_t i; ++ ++ /* for now it doesn't make sense to consider bitmaps which are not present ++ * in @topsrc as we can't recreate a bitmap for a layer if it's missing */ ++ ++ if (!(entry = virHashLookup(blockNamedNodeData, topsrc->nodeformat))) ++ return NULL; ++ ++ for (i = 0; i < entry->nbitmaps; i++) { ++ qemuBlockNamedNodeDataBitmapPtr bitmap = entry->bitmaps[i]; ++ ++ if (bitmapname && ++ STRNEQ(bitmapname, bitmap->name)) ++ continue; ++ ++ if (!qemuBlockBitmapChainIsValid(topsrc, bitmap->name, blockNamedNodeData)) ++ continue; ++ ++ ret = g_slist_prepend(ret, bitmap->name); ++ } ++ ++ return g_steal_pointer(&ret); ++} ++ ++ ++/** ++ * qemuBlockGetBitmapMergeActions: ++ * @topsrc: top of the chain to merge bitmaps in ++ * @basesrc: bottom of the chain to merge bitmaps in (NULL for full chain) ++ * @target: destination storage source of the merge (may be part of original chain) ++ * @bitmapname: name of bitmap to perform the merge (NULL for all bitmaps) ++ * @dstbitmapname: name of destination bitmap of the merge (see below for caveats) ++ * @writebitmapsrc: storage source corresponding to the node containing the write temporary bitmap ++ * @actions: returns actions for a 'transaction' QMP command for executing the merge ++ * @blockNamedNodeData: hash table filled with qemuBlockNamedNodeData ++ * ++ * Calculate handling of dirty block bitmaps between @topsrc and @basesrc. If ++ * @basesrc is NULL the end of the chain is considered. @target is the destination ++ * storage source definition of the merge and may or may not be part of the ++ * merged chain. ++ * ++ * Specifically the merging algorithm ensures that each considered bitmap is ++ * merged with the appropriate bitmaps so that it properly describes ++ * the state of dirty blocks when looked at from @topsrc based on the depth ++ * of the backing chain where the bitmap is placed. ++ * ++ * If @bitmapname is non-NULL only bitmaps with that name are handled, otherwise ++ * all bitmaps are considered. ++ * ++ * If @dstbitmap is non-NULL everything is merged into a bitmap with that name, ++ * otherwise each bitmap is merged into a bitmap with the same name into @target. ++ * Additionally if @dstbitmap is non-NULL the target bitmap is created as 'inactive' ++ * and 'transient' as a special case for the backup operation. ++ * ++ * If @writebitmapsrc is non-NULL, the 'libvirt-tmp-activewrite' bitmap from ++ * given node is merged along with others. This bitmap corresponds to the writes ++ * which occurred between an active layer job finished and the rest of the bitmap ++ * merging. ++ * ++ * If the bitmap is not valid somehow (see qemuBlockBitmapChainIsValid) given ++ * bitmap is silently skipped, so callers must ensure that given bitmap is valid ++ * if they care about it. ++ * ++ * The resulting 'transaction' QMP command actions are filled in and returned via ++ * @actions. ++ * ++ * Note that @actions may be NULL if no merging is required. ++ */ ++int ++qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc, ++ virStorageSourcePtr basesrc, ++ virStorageSourcePtr target, ++ const char *bitmapname, ++ const char *dstbitmapname, ++ virStorageSourcePtr writebitmapsrc, ++ virJSONValuePtr *actions, ++ virHashTablePtr blockNamedNodeData) ++{ ++ g_autoptr(virJSONValue) act = virJSONValueNewArray(); ++ virStorageSourcePtr n; ++ ++ g_autoptr(GSList) bitmaps = NULL; ++ GSList *next; ++ ++ if (!(bitmaps = qemuBlockGetBitmapMergeActionsGetBitmaps(topsrc, bitmapname, ++ blockNamedNodeData))) ++ return 0; ++ ++ for (next = bitmaps; next; next = next->next) { ++ const char *curbitmap = next->data; ++ const char *mergebitmapname = dstbitmapname; ++ bool mergebitmappersistent = false; ++ bool mergebitmapdisabled = true; ++ g_autoptr(virJSONValue) merge = virJSONValueNewArray(); ++ unsigned long long granularity = 0; ++ qemuBlockNamedNodeDataBitmapPtr bitmap; ++ ++ /* explicitly named destinations mean that we want a temporary ++ * disabled bitmap only, so undo the default for non-explicit cases */ ++ if (!mergebitmapname) { ++ mergebitmapname = curbitmap; ++ mergebitmappersistent = true; ++ mergebitmapdisabled = false; ++ } ++ ++ for (n = topsrc; virStorageSourceIsBacking(n) && n != basesrc; n = n->backingStore) { ++ if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, ++ n, curbitmap))) ++ continue; ++ ++ if (granularity == 0) ++ granularity = bitmap->granularity; ++ ++ if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(merge, ++ n->nodeformat, ++ bitmap->name) < 0) ++ return -1; ++ } ++ ++ if (dstbitmapname || ++ !(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, ++ target, curbitmap))) { ++ ++ if (qemuMonitorTransactionBitmapAdd(act, ++ target->nodeformat, ++ mergebitmapname, ++ mergebitmappersistent, ++ mergebitmapdisabled, ++ granularity) < 0) ++ return -1; ++ } ++ ++ if (writebitmapsrc && ++ qemuMonitorTransactionBitmapMergeSourceAddBitmap(merge, ++ writebitmapsrc->nodeformat, ++ "libvirt-tmp-activewrite") < 0) ++ return -1; ++ ++ if (qemuMonitorTransactionBitmapMerge(act, target->nodeformat, ++ mergebitmapname, &merge) < 0) ++ return -1; ++ } ++ ++ if (writebitmapsrc && ++ qemuMonitorTransactionBitmapRemove(act, writebitmapsrc->nodeformat, ++ "libvirt-tmp-activewrite") < 0) ++ return -1; ++ ++ if (virJSONValueArraySize(act) > 0) ++ *actions = g_steal_pointer(&act); ++ ++ return 0; ++} ++ ++ + /** + * qemuBlockBitmapChainIsValid: + * +diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h +index 06afa54115..2500390734 100644 +--- a/src/qemu/qemu_block.h ++++ b/src/qemu/qemu_block.h +@@ -221,6 +221,16 @@ virHashTablePtr + qemuBlockGetNamedNodeData(virDomainObjPtr vm, + qemuDomainAsyncJob asyncJob); + ++int ++qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc, ++ virStorageSourcePtr basesrc, ++ virStorageSourcePtr target, ++ const char *bitmapname, ++ const char *dstbitmapname, ++ virStorageSourcePtr writebitmapsrc, ++ virJSONValuePtr *actions, ++ virHashTablePtr blockNamedNodeData); ++ + bool + qemuBlockBitmapChainIsValid(virStorageSourcePtr src, + const char *bitmapname, +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-blockcopy-Allow-copy-of-read-only-disks-with-blockdev.patch b/SOURCES/libvirt-qemu-blockcopy-Allow-copy-of-read-only-disks-with-blockdev.patch new file mode 100644 index 0000000..c2f5b77 --- /dev/null +++ b/SOURCES/libvirt-qemu-blockcopy-Allow-copy-of-read-only-disks-with-blockdev.patch @@ -0,0 +1,71 @@ +From 352140578bbab5afe3f711c88732b24c6332da1a Mon Sep 17 00:00:00 2001 +Message-Id: <352140578bbab5afe3f711c88732b24c6332da1a@dist-git> +From: Peter Krempa +Date: Tue, 12 May 2020 17:24:11 +0200 +Subject: [PATCH] qemu: blockcopy: Allow copy of read-only disks with -blockdev +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +'blockdev-mirror' requires the write permission internally to do the +copy. This means that we have to force the image to be read-write for +the duration of the copy and can fix it after the copy is done. + +https://bugzilla.redhat.com/show_bug.cgi?id=1832204 + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 65a12c467cd683809b4d445b8cf1c3ae250209b2) +Message-Id: <296aeeaa0ab2b90e872c76c6f15eda080b749bdb.1589296861.git.pkrempa@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_blockjob.c | 5 +++++ + src/qemu/qemu_driver.c | 9 +++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c +index 21a043d369..c80c71295b 100644 +--- a/src/qemu/qemu_blockjob.c ++++ b/src/qemu/qemu_blockjob.c +@@ -1281,6 +1281,7 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriverPtr driver, + qemuBlockJobDataPtr job, + qemuDomainAsyncJob asyncJob) + { ++ qemuDomainObjPrivatePtr priv = vm->privateData; + VIR_DEBUG("copy job '%s' on VM '%s' pivoted", job->name, vm->def->name); + + /* mirror may be NULL for copy job corresponding to migration */ +@@ -1296,6 +1297,10 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriverPtr driver, + !virStorageSourceIsBacking(job->disk->mirror->backingStore)) + job->disk->mirror->backingStore = g_steal_pointer(&job->disk->src->backingStore); + ++ if (job->disk->src->readonly && ++ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) ++ ignore_value(qemuBlockReopenReadOnly(vm, job->disk->mirror, asyncJob)); ++ + qemuBlockJobRewriteConfigDiskSource(vm, job->disk, job->disk->mirror); + + qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->disk->src); +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 7ae8641577..9f7d96c0b6 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -18389,6 +18389,15 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, + keepParentLabel) < 0) + goto endjob; + ++ if (mirror->readonly) { ++ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) { ++ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", ++ _("copy of read-only disks is not supported")); ++ goto endjob; ++ } ++ mirror->readonly = false; ++ } ++ + /* we must initialize XML-provided chain prior to detecting to keep semantics + * with VM startup */ + if (blockdev) { +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-blockjob-Remove-disabledBitmapsBase-field-from-commit-job-private-data.patch b/SOURCES/libvirt-qemu-blockjob-Remove-disabledBitmapsBase-field-from-commit-job-private-data.patch new file mode 100644 index 0000000..fcf01f8 --- /dev/null +++ b/SOURCES/libvirt-qemu-blockjob-Remove-disabledBitmapsBase-field-from-commit-job-private-data.patch @@ -0,0 +1,219 @@ +From c23ec1c095a13e1279660ea9b27290c9ae0f3849 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:03 +0200 +Subject: [PATCH] qemu: blockjob: Remove 'disabledBitmapsBase' field from + commit job private data +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +New semantics of the bitmap handling don't need this. Remove the field +and all uses of it including the status XML. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 057e4bc591093a333624acb9ed065f8f796cca1e) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_blockjob.c | 39 ------------------- + src/qemu/qemu_blockjob.h | 3 -- + src/qemu/qemu_domain.c | 22 ----------- + src/qemu/qemu_driver.c | 3 +- + .../blockjob-blockdev-in.xml | 4 -- + 5 files changed, 1 insertion(+), 70 deletions(-) + +diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c +index c63a691a0e..d106165175 100644 +--- a/src/qemu/qemu_blockjob.c ++++ b/src/qemu/qemu_blockjob.c +@@ -285,7 +285,6 @@ qemuBlockJobDiskNewCommit(virDomainObjPtr vm, + virStorageSourcePtr topparent, + virStorageSourcePtr top, + virStorageSourcePtr base, +- char ***disabledBitmapsBase, + bool delete_imgs, + unsigned int jobflags) + { +@@ -311,7 +310,6 @@ qemuBlockJobDiskNewCommit(virDomainObjPtr vm, + job->data.commit.top = top; + job->data.commit.base = base; + job->data.commit.deleteCommittedImages = delete_imgs; +- job->data.commit.disabledBitmapsBase = g_steal_pointer(disabledBitmapsBase); + job->jobflags = jobflags; + + if (qemuBlockJobRegister(job, vm, disk, true) < 0) +@@ -1363,40 +1361,6 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDriverPtr driver, + } + + +-static void +-qemuBlockJobProcessEventFailedCommitCommon(virDomainObjPtr vm, +- qemuBlockJobDataPtr job, +- qemuDomainAsyncJob asyncJob) +-{ +- qemuDomainObjPrivatePtr priv = vm->privateData; +- g_autoptr(virJSONValue) actions = virJSONValueNewArray(); +- char **disabledBitmaps = job->data.commit.disabledBitmapsBase; +- +- if (!disabledBitmaps || !*disabledBitmaps) +- return; +- +- for (; *disabledBitmaps; disabledBitmaps++) { +- qemuMonitorTransactionBitmapEnable(actions, +- job->data.commit.base->nodeformat, +- *disabledBitmaps); +- } +- +- if (qemuBlockReopenReadWrite(vm, job->data.commit.base, asyncJob) < 0) +- return; +- +- if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) +- return; +- +- qemuMonitorTransaction(priv->mon, &actions); +- +- if (qemuDomainObjExitMonitor(priv->driver, vm) < 0) +- return; +- +- if (qemuBlockReopenReadOnly(vm, job->data.commit.base, asyncJob) < 0) +- return; +-} +- +- + static void + qemuBlockJobProcessEventConcludedCreate(virQEMUDriverPtr driver, + virDomainObjPtr vm, +@@ -1504,8 +1468,6 @@ qemuBlockJobEventProcessConcludedTransition(qemuBlockJobDataPtr job, + case QEMU_BLOCKJOB_TYPE_COMMIT: + if (success) + qemuBlockJobProcessEventCompletedCommit(driver, vm, job, asyncJob); +- else +- qemuBlockJobProcessEventFailedCommitCommon(vm, job, asyncJob); + break; + + case QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT: +@@ -1513,7 +1475,6 @@ qemuBlockJobEventProcessConcludedTransition(qemuBlockJobDataPtr job, + qemuBlockJobProcessEventCompletedActiveCommit(driver, vm, job, asyncJob); + } else { + qemuBlockJobProcessEventFailedActiveCommit(driver, vm, job); +- qemuBlockJobProcessEventFailedCommitCommon(vm, job, asyncJob); + } + break; + +diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h +index ee83d318f3..4045878568 100644 +--- a/src/qemu/qemu_blockjob.h ++++ b/src/qemu/qemu_blockjob.h +@@ -88,8 +88,6 @@ struct _qemuBlockJobCommitData { + virStorageSourcePtr top; + virStorageSourcePtr base; + bool deleteCommittedImages; +- char **disabledBitmapsBase; /* a NULL-terminated list of bitmap names which +- were disabled in @base for the commit job */ + }; + + +@@ -187,7 +185,6 @@ qemuBlockJobDiskNewCommit(virDomainObjPtr vm, + virStorageSourcePtr topparent, + virStorageSourcePtr top, + virStorageSourcePtr base, +- char ***disabledBitmapsBase, + bool delete_imgs, + unsigned int jobflags); + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index a92183334f..1e968368ae 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -2594,7 +2594,6 @@ qemuDomainPrivateBlockJobFormatCommit(qemuBlockJobDataPtr job, + virBufferPtr buf) + { + g_auto(virBuffer) disabledBitmapsBuf = VIR_BUFFER_INIT_CHILD(buf); +- char **bitmaps = job->data.commit.disabledBitmapsBase; + + if (job->data.commit.base) + virBufferAsprintf(buf, "\n", job->data.commit.base->nodeformat); +@@ -2608,9 +2607,6 @@ qemuDomainPrivateBlockJobFormatCommit(qemuBlockJobDataPtr job, + if (job->data.commit.deleteCommittedImages) + virBufferAddLit(buf, "\n"); + +- while (bitmaps && *bitmaps) +- virBufferEscapeString(&disabledBitmapsBuf, "\n", *(bitmaps++)); +- + virXMLFormatElement(buf, "disabledBaseBitmaps", NULL, &disabledBitmapsBuf); + } + +@@ -3238,9 +3234,6 @@ static int + qemuDomainObjPrivateXMLParseBlockjobDataCommit(qemuBlockJobDataPtr job, + xmlXPathContextPtr ctxt) + { +- g_autofree xmlNodePtr *nodes = NULL; +- ssize_t nnodes; +- + if (job->type == QEMU_BLOCKJOB_TYPE_COMMIT) { + qemuDomainObjPrivateXMLParseBlockjobNodename(job, + "string(./topparent/@node)", +@@ -3267,21 +3260,6 @@ qemuDomainObjPrivateXMLParseBlockjobDataCommit(qemuBlockJobDataPtr job, + !job->data.commit.base) + return -1; + +- if ((nnodes = virXPathNodeSet("./disabledBaseBitmaps/bitmap", ctxt, &nodes)) > 0) { +- size_t i; +- +- job->data.commit.disabledBitmapsBase = g_new0(char *, nnodes + 1); +- +- for (i = 0; i < nnodes; i++) { +- char *tmp; +- +- if (!(tmp = virXMLPropString(nodes[i], "name"))) +- return -1; +- +- job->data.commit.disabledBitmapsBase[i] = g_steal_pointer(&tmp); +- } +- } +- + return 0; + } + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 983d4a04a8..ed5498d2bc 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -18757,7 +18757,6 @@ qemuDomainBlockCommit(virDomainPtr dom, + const char *nodebase = NULL; + bool persistjob = false; + bool blockdev = false; +- VIR_AUTOSTRINGLIST bitmapDisableList = NULL; + + virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW | + VIR_DOMAIN_BLOCK_COMMIT_ACTIVE | +@@ -18919,7 +18918,7 @@ qemuDomainBlockCommit(virDomainPtr dom, + } + + if (!(job = qemuBlockJobDiskNewCommit(vm, disk, top_parent, topSource, +- baseSource, &bitmapDisableList, ++ baseSource, + flags & VIR_DOMAIN_BLOCK_COMMIT_DELETE, + flags))) + goto endjob; +diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml +index cc17a17ff4..ca6d110179 100644 +--- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml ++++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml +@@ -243,10 +243,6 @@ + + + +- +- +- +- + + + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-checkpoint-Don-t-chain-bitmaps-for-checkpoints.patch b/SOURCES/libvirt-qemu-checkpoint-Don-t-chain-bitmaps-for-checkpoints.patch new file mode 100644 index 0000000..0362acc --- /dev/null +++ b/SOURCES/libvirt-qemu-checkpoint-Don-t-chain-bitmaps-for-checkpoints.patch @@ -0,0 +1,97 @@ +From 6c139a45537d021f6fd4287bd3c74cba06e6a264 Mon Sep 17 00:00:00 2001 +Message-Id: <6c139a45537d021f6fd4287bd3c74cba06e6a264@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:47 +0200 +Subject: [PATCH] qemu: checkpoint: Don't chain bitmaps for checkpoints +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Chaining bitmaps for checkpoints (disabling the active one and creating +a new) severely overcomplicated all operations in regards to bitmaps. + +Specifically it requires us re-matching the on-disk state to the +internal metadata and in case of merging during block jobs it makes it +almost impossible to cover all corner cases. + +Since the checkpoints and incremental backups were not yet enabled, +let's change the design to keep one bitmap per checkpoint. In case of +layered snapshots this will be filled in by using dirty-bitmap-populate. + +Finally the main reason for this unnecessary complexity was the fear +that qemu's performance could degrade. In the end I think that +addressing the performance issue will be better done in qemu (e.g by +keeping an internal bitmap updated with changes and merging it +periodically back to the real bitmaps. QEMU writes out changes to disk +at shutdown so consistency is not a problem). + +Removing the relationships between bitmaps frees us from complex +handling and also makes all the surrounding code more robust as one +broken bitmap doesn't necessarily invalidate whole chains of backups. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 1f92aa454aa3b04ece9f7479d517bf08ba547f0a) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_checkpoint.c | 21 +-------------------- + 1 file changed, 1 insertion(+), 20 deletions(-) + +diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c +index 34cf122eb3..9762a3eb9d 100644 +--- a/src/qemu/qemu_checkpoint.c ++++ b/src/qemu/qemu_checkpoint.c +@@ -460,7 +460,6 @@ qemuCheckpointPrepare(virQEMUDriverPtr driver, + static int + qemuCheckpointAddActions(virDomainObjPtr vm, + virJSONValuePtr actions, +- virDomainMomentObjPtr old_current, + virDomainCheckpointDefPtr def) + { + size_t i; +@@ -468,7 +467,6 @@ qemuCheckpointAddActions(virDomainObjPtr vm, + for (i = 0; i < def->ndisks; i++) { + virDomainCheckpointDiskDef *chkdisk = &def->disks[i]; + virDomainDiskDefPtr domdisk = virDomainDiskByTarget(vm->def, chkdisk->name); +- virDomainCheckpointDiskDef *parentchkdisk = NULL; + + /* checkpoint definition validator mandates that the corresponding + * domdisk should exist */ +@@ -479,23 +477,6 @@ qemuCheckpointAddActions(virDomainObjPtr vm, + if (qemuMonitorTransactionBitmapAdd(actions, domdisk->src->nodeformat, + chkdisk->bitmap, true, false, 0) < 0) + return -1; +- +- /* We only want one active bitmap for a disk along the +- * checkpoint chain, then later differential backups will +- * merge the bitmaps (only one active) between the bounding +- * checkpoint and the leaf checkpoint. If the same disks are +- * involved in each checkpoint, this search terminates in one +- * iteration; but it is also possible to have to search +- * further than the immediate parent to find another +- * checkpoint with a bitmap on the same disk. */ +- if ((parentchkdisk = qemuCheckpointFindActiveDiskInParent(vm, old_current, +- chkdisk->name))) { +- +- if (qemuMonitorTransactionBitmapDisable(actions, +- domdisk->src->nodeformat, +- parentchkdisk->bitmap) < 0) +- return -1; +- } + } + return 0; + } +@@ -544,7 +525,7 @@ qemuCheckpointCreateCommon(virQEMUDriverPtr driver, + + tmpactions = virJSONValueNewArray(); + +- if (qemuCheckpointAddActions(vm, tmpactions, parent, *def) < 0) ++ if (qemuCheckpointAddActions(vm, tmpactions, *def) < 0) + return -1; + + if (!(*chk = virDomainCheckpointAssignDef(vm->checkpoints, *def))) +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-checkpoint-Don-t-merge-checkpoints-during-deletion.patch b/SOURCES/libvirt-qemu-checkpoint-Don-t-merge-checkpoints-during-deletion.patch new file mode 100644 index 0000000..13e9be6 --- /dev/null +++ b/SOURCES/libvirt-qemu-checkpoint-Don-t-merge-checkpoints-during-deletion.patch @@ -0,0 +1,312 @@ +From e7b1604c5848861db0896b3c7869c0ad1d971084 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:53 +0200 +Subject: [PATCH] qemu: checkpoint: Don't merge checkpoints during deletion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Now that we've switched to the simple handling, the first thing that can +be massively simplified is checkpoint deletion. We now need to only go +through the backing chain and find the appropriately named bitmaps and +delete them, no complex lookups or merging. + +Note that compared to other functions this deletes the bitmap in all +layers compared to others where we expect only exactly 1 bitmap of a +name in the backing chain to prevent potential problems. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 4c33c5568c3ee3c5952e5f3b217d78df95683b71) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_checkpoint.c | 153 ++++++------------------------------- + src/qemu/qemu_checkpoint.h | 1 - + tests/qemublocktest.c | 7 +- + 3 files changed, 25 insertions(+), 136 deletions(-) + +diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c +index 9762a3eb9d..b44ff05c32 100644 +--- a/src/qemu/qemu_checkpoint.c ++++ b/src/qemu/qemu_checkpoint.c +@@ -105,140 +105,41 @@ qemuCheckpointWriteMetadata(virDomainObjPtr vm, + } + + +-/** +- * qemuCheckpointFindActiveDiskInParent: +- * @vm: domain object +- * @from: starting moment object +- * @diskname: name (target) of the disk to find +- * +- * Find the first checkpoint starting from @from continuing through parents +- * of the checkpoint which describes disk @diskname. Return the pointer to the +- * definition of the disk. +- */ +-static virDomainCheckpointDiskDef * +-qemuCheckpointFindActiveDiskInParent(virDomainObjPtr vm, +- virDomainMomentObjPtr from, +- const char *diskname) +-{ +- virDomainMomentObjPtr parent = from; +- virDomainCheckpointDefPtr parentdef = NULL; +- size_t i; +- +- while (parent) { +- parentdef = virDomainCheckpointObjGetDef(parent); +- +- for (i = 0; i < parentdef->ndisks; i++) { +- virDomainCheckpointDiskDef *chkdisk = &parentdef->disks[i]; +- +- if (STRNEQ(chkdisk->name, diskname)) +- continue; +- +- /* currently inspected checkpoint doesn't describe the disk, +- * continue into parent checkpoint */ +- if (chkdisk->type != VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) +- break; +- +- return chkdisk; +- } +- +- parent = virDomainCheckpointFindByName(vm->checkpoints, +- parentdef->parent.parent_name); +- } +- +- return NULL; +-} +- +- + int + qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src, + virHashTablePtr blockNamedNodeData, + const char *delbitmap, +- const char *parentbitmap, + virJSONValuePtr actions, + const char *diskdst, + GSList **reopenimages) + { +- virStorageSourcePtr n = src; ++ virStorageSourcePtr n; ++ bool found = false; + + /* find the backing chain entry with bitmap named '@delbitmap' */ +- while (n) { +- qemuBlockNamedNodeDataBitmapPtr tmp; +- +- if ((tmp = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- n, delbitmap))) { +- break; +- } +- +- n = n->backingStore; +- } +- +- if (!n) { +- virReportError(VIR_ERR_INTERNAL_ERROR, +- _("bitmap '%s' not found in backing chain of '%s'"), +- delbitmap, diskdst); +- return -1; +- } +- +- while (n) { +- qemuBlockNamedNodeDataBitmapPtr srcbitmap; +- +- if (!(srcbitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- n, delbitmap))) +- break; +- +- /* For the actual checkpoint deletion we will merge any bitmap into the +- * bitmap of the parent checkpoint (@parentbitmap) or for any image +- * where the parent checkpoint bitmap is not present we must rename +- * the bitmap of the deleted checkpoint into the bitmap of the parent +- * checkpoint as qemu can't currently take the allocation map and turn +- * it into a bitmap and thus we wouldn't be able to do a backup. */ +- if (parentbitmap) { +- qemuBlockNamedNodeDataBitmapPtr dstbitmap; +- g_autoptr(virJSONValue) arr = NULL; +- +- dstbitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, +- n, parentbitmap); +- +- if (dstbitmap) { +- if (srcbitmap->recording && !dstbitmap->recording) { +- if (qemuMonitorTransactionBitmapEnable(actions, +- n->nodeformat, +- dstbitmap->name) < 0) +- return -1; +- } +- +- } else { +- if (qemuMonitorTransactionBitmapAdd(actions, +- n->nodeformat, +- parentbitmap, +- true, +- !srcbitmap->recording, +- srcbitmap->granularity) < 0) +- return -1; +- } ++ for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) { ++ qemuBlockNamedNodeDataBitmapPtr bitmapdata; + +- arr = virJSONValueNewArray(); +- +- if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(arr, +- n->nodeformat, +- srcbitmap->name) < 0) +- return -1; ++ if (!(bitmapdata = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, ++ n, delbitmap))) ++ continue; + +- if (qemuMonitorTransactionBitmapMerge(actions, +- n->nodeformat, +- parentbitmap, &arr) < 0) +- return -1; +- } ++ found = true; + + if (qemuMonitorTransactionBitmapRemove(actions, + n->nodeformat, +- srcbitmap->name) < 0) ++ bitmapdata->name) < 0) + return -1; + + if (n != src) + *reopenimages = g_slist_prepend(*reopenimages, n); ++ } + +- n = n->backingStore; ++ if (!found) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("bitmap '%s' not found in backing chain of '%s'"), ++ delbitmap, diskdst); ++ return -1; + } + + return 0; +@@ -247,8 +148,7 @@ qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src, + + static int + qemuCheckpointDiscardBitmaps(virDomainObjPtr vm, +- virDomainCheckpointDefPtr chkdef, +- virDomainMomentObjPtr parent) ++ virDomainCheckpointDefPtr chkdef) + { + qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverPtr driver = priv->driver; +@@ -270,8 +170,6 @@ qemuCheckpointDiscardBitmaps(virDomainObjPtr vm, + for (i = 0; i < chkdef->ndisks; i++) { + virDomainCheckpointDiskDef *chkdisk = &chkdef->disks[i]; + virDomainDiskDefPtr domdisk = virDomainDiskByTarget(vm->def, chkdisk->name); +- virDomainCheckpointDiskDef *parentchkdisk = NULL; +- const char *parentbitmap = NULL; + + /* domdisk can be missing e.g. when it was unplugged */ + if (!domdisk) +@@ -280,15 +178,8 @@ qemuCheckpointDiscardBitmaps(virDomainObjPtr vm, + if (chkdisk->type != VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) + continue; + +- /* If any ancestor checkpoint has a bitmap for the same +- * disk, then this bitmap must be merged to the +- * ancestor. */ +- if ((parentchkdisk = qemuCheckpointFindActiveDiskInParent(vm, parent, +- chkdisk->name))) +- parentbitmap = parentchkdisk->bitmap; +- + if (qemuCheckpointDiscardDiskBitmaps(domdisk->src, blockNamedNodeData, +- chkdisk->bitmap, parentbitmap, ++ chkdisk->bitmap, + actions, domdisk->dst, + &reopenimages) < 0) + return -1; +@@ -336,7 +227,6 @@ qemuCheckpointDiscard(virQEMUDriverPtr driver, + bool update_parent, + bool metadata_only) + { +- virDomainMomentObjPtr parent = NULL; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + g_autofree char *chkFile = NULL; + bool chkcurrent = chk == virDomainCheckpointGetCurrent(vm->checkpoints); +@@ -352,14 +242,17 @@ qemuCheckpointDiscard(virQEMUDriverPtr driver, + + if (!metadata_only) { + virDomainCheckpointDefPtr chkdef = virDomainCheckpointObjGetDef(chk); +- parent = virDomainCheckpointFindByName(vm->checkpoints, +- chk->def->parent_name); +- if (qemuCheckpointDiscardBitmaps(vm, chkdef, parent) < 0) ++ if (qemuCheckpointDiscardBitmaps(vm, chkdef) < 0) + return -1; + } + + if (chkcurrent) { ++ virDomainMomentObjPtr parent = NULL; ++ + virDomainCheckpointSetCurrent(vm->checkpoints, NULL); ++ parent = virDomainCheckpointFindByName(vm->checkpoints, ++ chk->def->parent_name); ++ + if (update_parent && parent) { + virDomainCheckpointSetCurrent(vm->checkpoints, parent); + if (qemuCheckpointWriteMetadata(vm, parent, +diff --git a/src/qemu/qemu_checkpoint.h b/src/qemu/qemu_checkpoint.h +index cf1e9e46cb..0d267a188c 100644 +--- a/src/qemu/qemu_checkpoint.h ++++ b/src/qemu/qemu_checkpoint.h +@@ -76,7 +76,6 @@ int + qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src, + virHashTablePtr blockNamedNodeData, + const char *delbitmap, +- const char *parentbitmap, + virJSONValuePtr actions, + const char *diskdst, + GSList **reopenimages); +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 2f675d7e03..201e5df6b4 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -830,7 +830,6 @@ struct testQemuCheckpointDeleteMergeData { + const char *name; + virStorageSourcePtr chain; + const char *deletebitmap; +- const char *parentbitmap; + const char *nodedatafile; + }; + +@@ -864,7 +863,6 @@ testQemuCheckpointDeleteMerge(const void *opaque) + if (qemuCheckpointDiscardDiskBitmaps(data->chain, + nodedata, + data->deletebitmap, +- data->parentbitmap, + actions, + "testdisk", + &reopenimages) >= 0) { +@@ -1318,19 +1316,18 @@ mymain(void) + + TEST_BACKUP_BITMAP_CALCULATE("empty", bitmapSourceChain, "a", "empty"); + +-#define TEST_CHECKPOINT_DELETE_MERGE(testname, delbmp, parbmp, named) \ ++#define TEST_CHECKPOINT_DELETE_MERGE(testname, delbmp, named) \ + do { \ + checkpointdeletedata.name = testname; \ + checkpointdeletedata.chain = bitmapSourceChain; \ + checkpointdeletedata.deletebitmap = delbmp; \ +- checkpointdeletedata.parentbitmap = parbmp; \ + checkpointdeletedata.nodedatafile = named; \ + if (virTestRun("checkpoint delete " testname, \ + testQemuCheckpointDeleteMerge, &checkpointdeletedata) < 0) \ + ret = -1; \ + } while (0) + +- TEST_CHECKPOINT_DELETE_MERGE("empty", "a", NULL, "empty"); ++ TEST_CHECKPOINT_DELETE_MERGE("empty", "a", "empty"); + + #define TEST_BITMAP_VALIDATE(testname, bitmap, rc) \ + do { \ +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemu-conf-set-HOTPLUGGABLE-connect-flag-during-PCI-address-set-init.patch b/SOURCES/libvirt-qemu-conf-set-HOTPLUGGABLE-connect-flag-during-PCI-address-set-init.patch new file mode 100644 index 0000000..ae5307f --- /dev/null +++ b/SOURCES/libvirt-qemu-conf-set-HOTPLUGGABLE-connect-flag-during-PCI-address-set-init.patch @@ -0,0 +1,199 @@ +From 351bb3a04c1eb6de11efad54f809a6f3e3a868c8 Mon Sep 17 00:00:00 2001 +Message-Id: <351bb3a04c1eb6de11efad54f809a6f3e3a868c8@dist-git> +From: Laine Stump +Date: Sun, 26 Apr 2020 13:17:01 -0400 +Subject: [PATCH] qemu/conf: set HOTPLUGGABLE connect flag during PCI address + set init + +virDomainPCIAddressBusSetModel() is called for each PCI controller +when building an address set prior to assiging PCI addresses to +devices. + +This patch adds a new argument, allowHotplug, to that function that +can be set to false if we know for certain that a particular +controller won't support hotplug + +The most interesting case is in qemuDomainPCIAddressSetCreate(), where +the config of each existing controller is available while building the +address set, so we can appropriately set allowHotplug = false when the +user has "hotplug='off'" in the config of a controller that normally +would support hotplug. In all other cases, it is set to true or false +in accordance with the capability of the controller model. + +So far we aren't doing anything with this bus flag in the address set. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit aa15e9259f1f246e69fb9742581ced720c88695d) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426171703.18808-1-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/conf/domain_addr.c | 31 +++++++++++++++++++++---------- + src/conf/domain_addr.h | 3 ++- + src/qemu/qemu_domain_address.c | 10 +++++++--- + 3 files changed, 30 insertions(+), 14 deletions(-) + +diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c +index 05f036e3e6..cc45a0bbf1 100644 +--- a/src/conf/domain_addr.c ++++ b/src/conf/domain_addr.c +@@ -495,31 +495,40 @@ virDomainPCIAddressValidate(virDomainPCIAddressSetPtr addrs, + + int + virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, +- virDomainControllerModelPCI model) ++ virDomainControllerModelPCI model, ++ bool allowHotplug) + { + /* set flags for what can be connected *downstream* from each + * bus. + */ ++ virDomainPCIConnectFlags hotplugFlag = 0; ++ ++ if (allowHotplug) ++ hotplugFlag = VIR_PCI_CONNECT_HOTPLUGGABLE; ++ + switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | + VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | +- VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS); ++ VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS | ++ hotplugFlag); + bus->minSlot = 1; + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); ++ VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | ++ hotplugFlag); + bus->minSlot = 1; + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: + bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); ++ VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | ++ hotplugFlag); + bus->minSlot = 0; + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; +@@ -550,7 +559,8 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + * the first of which is not usable because of the SHPC */ + bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCI_DEVICE | +- VIR_PCI_CONNECT_TYPE_PCI_BRIDGE); ++ VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | ++ hotplugFlag); + bus->minSlot = 1; + bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; + break; +@@ -562,7 +572,8 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, + bus->flags = (VIR_PCI_CONNECT_AUTOASSIGN | + VIR_PCI_CONNECT_TYPE_PCIE_DEVICE | + VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_UPSTREAM_PORT | +- VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE); ++ VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE | ++ hotplugFlag); + bus->minSlot = 0; + bus->maxSlot = 0; + break; +@@ -759,7 +770,7 @@ virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs, + * rest are of the requested type + */ + if (virDomainPCIAddressBusSetModel(&addrs->buses[i++], +- VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE) < 0) { ++ VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE, false) < 0) { + return -1; + } + } +@@ -776,20 +787,20 @@ virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs, + * will be allocated for the dummy PCIe device later on. + */ + if (virDomainPCIAddressBusSetModel(&addrs->buses[i], +- VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT) < 0) { ++ VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT, true) < 0) { + return -1; + } + addrs->buses[i].flags = VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE; + i++; + + if (virDomainPCIAddressBusSetModel(&addrs->buses[i++], +- VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE) < 0) { ++ VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE, true) < 0) { + return -1; + } + } + + for (; i < addrs->nbuses; i++) { +- if (virDomainPCIAddressBusSetModel(&addrs->buses[i], model) < 0) ++ if (virDomainPCIAddressBusSetModel(&addrs->buses[i], model, true) < 0) + return -1; + } + +diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h +index 40738ddb72..c1363c1490 100644 +--- a/src/conf/domain_addr.h ++++ b/src/conf/domain_addr.h +@@ -148,7 +148,8 @@ bool virDomainPCIAddressValidate(virDomainPCIAddressSetPtr addrs, + + + int virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, +- virDomainControllerModelPCI model) ++ virDomainControllerModelPCI model, ++ bool allowHotplug) + ATTRIBUTE_NONNULL(1); + + bool virDomainPCIAddressBusIsFullyReserved(virDomainPCIAddressBusPtr bus) +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index e81585bc6c..2ae1724696 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -1645,6 +1645,7 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + for (i = 0; i < def->ncontrollers; i++) { + virDomainControllerDefPtr cont = def->controllers[i]; + size_t idx = cont->idx; ++ bool allowHotplug = false; + + if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_PCI) + continue; +@@ -1656,7 +1657,10 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + goto error; + } + +- if (virDomainPCIAddressBusSetModel(&addrs->buses[idx], cont->model) < 0) ++ if (cont->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_OFF) ++ allowHotplug = true; ++ ++ if (virDomainPCIAddressBusSetModel(&addrs->buses[idx], cont->model, allowHotplug) < 0) + goto error; + + /* Forward the information about isolation groups */ +@@ -1674,7 +1678,7 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + * assigning addresses to devices. + */ + if (virDomainPCIAddressBusSetModel(&addrs->buses[0], +- VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) ++ VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT, true) < 0) + goto error; + } + +@@ -1696,7 +1700,7 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + if (addrs->buses[i].model) + continue; + +- if (virDomainPCIAddressBusSetModel(&addrs->buses[i], defaultModel) < 0) ++ if (virDomainPCIAddressBusSetModel(&addrs->buses[i], defaultModel, true) < 0) + goto error; + + VIR_DEBUG("Auto-adding ", +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-fix-detection-of-vCPU-pids-when-multiple-dies-are-present.patch b/SOURCES/libvirt-qemu-fix-detection-of-vCPU-pids-when-multiple-dies-are-present.patch new file mode 100644 index 0000000..4aa455f --- /dev/null +++ b/SOURCES/libvirt-qemu-fix-detection-of-vCPU-pids-when-multiple-dies-are-present.patch @@ -0,0 +1,136 @@ +From d97b868a9517173a7f805fd3232b3d9fdc2bad89 Mon Sep 17 00:00:00 2001 +Message-Id: +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Tue, 5 May 2020 16:49:12 +0100 +Subject: [PATCH] qemu: fix detection of vCPU pids when multiple dies are + present +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The logic for querying hotpluggable CPUs needs to sort the list +of CPUs returned by QEMU. Unfortunately our sorting method failed +to use the die_id field, so CPUs were not correctly sorted. + +This is seen when configuring a guest with partially populated +CPUs + + 16 + + + + +Then trying to start it would fail: + + # virsh -c qemu:///system start demo + error: Failed to start domain demo + error: internal error: qemu didn't report thread id for vcpu '0' + +Reviewed-by: Peter Krempa +Signed-off-by: Daniel P. Berrangé +(cherry picked from commit 8b789c6574454863acbd2511fc2094d1e63e8154) + +https://bugzilla.redhat.com/show_bug.cgi?id=1813395 +https://bugzilla.redhat.com/show_bug.cgi?id=1821592 + +Message-Id: <20200505154912.950468-2-berrange@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_domain.c | 10 ++++++++-- + src/qemu/qemu_monitor.c | 2 ++ + src/qemu/qemu_monitor.h | 2 ++ + src/qemu/qemu_monitor_json.c | 5 +++++ + 4 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 1509e41021..cdf7b3e692 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -13812,8 +13812,14 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver, + } + + if (validTIDs) +- VIR_DEBUG("vCPU[%zu] PID %llu is valid", +- i, (unsigned long long)info[i].tid); ++ VIR_DEBUG("vCPU[%zu] PID %llu is valid " ++ "(node=%d socket=%d die=%d core=%d thread=%d)", ++ i, (unsigned long long)info[i].tid, ++ info[i].node_id, ++ info[i].socket_id, ++ info[i].die_id, ++ info[i].core_id, ++ info[i].thread_id); + } + + VIR_DEBUG("Extracting vCPU information validTIDs=%d", validTIDs); +diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c +index 5915035589..d8911066ab 100644 +--- a/src/qemu/qemu_monitor.c ++++ b/src/qemu/qemu_monitor.c +@@ -1667,6 +1667,7 @@ qemuMonitorCPUInfoClear(qemuMonitorCPUInfoPtr cpus, + cpus[i].id = 0; + cpus[i].qemu_id = -1; + cpus[i].socket_id = -1; ++ cpus[i].die_id = -1; + cpus[i].core_id = -1; + cpus[i].thread_id = -1; + cpus[i].node_id = -1; +@@ -1822,6 +1823,7 @@ qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotpl + vcpus[mastervcpu].hotpluggable = !!hotplugvcpus[i].alias || + !vcpus[mastervcpu].online; + vcpus[mastervcpu].socket_id = hotplugvcpus[i].socket_id; ++ vcpus[mastervcpu].die_id = hotplugvcpus[i].die_id; + vcpus[mastervcpu].core_id = hotplugvcpus[i].core_id; + vcpus[mastervcpu].thread_id = hotplugvcpus[i].thread_id; + vcpus[mastervcpu].node_id = hotplugvcpus[i].node_id; +diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h +index ca975d084c..6e83f250ed 100644 +--- a/src/qemu/qemu_monitor.h ++++ b/src/qemu/qemu_monitor.h +@@ -567,6 +567,7 @@ struct qemuMonitorQueryHotpluggableCpusEntry { + /* topology information -1 if qemu didn't report given parameter */ + int node_id; + int socket_id; ++ int die_id; + int core_id; + int thread_id; + +@@ -589,6 +590,7 @@ struct _qemuMonitorCPUInfo { + /* topology info for hotplug purposes. Hotplug of given vcpu impossible if + * all entries are -1 */ + int socket_id; ++ int die_id; + int core_id; + int thread_id; + int node_id; +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index 92d7317a82..d445a4904f 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -8576,11 +8576,13 @@ qemuMonitorJSONProcessHotpluggableCpusReply(virJSONValuePtr vcpu, + + entry->node_id = -1; + entry->socket_id = -1; ++ entry->die_id = -1; + entry->core_id = -1; + entry->thread_id = -1; + + ignore_value(virJSONValueObjectGetNumberInt(props, "node-id", &entry->node_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "socket-id", &entry->socket_id)); ++ ignore_value(virJSONValueObjectGetNumberInt(props, "die-id", &entry->die_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "core-id", &entry->core_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "thread-id", &entry->thread_id)); + +@@ -8615,6 +8617,9 @@ qemuMonitorQueryHotpluggableCpusEntrySort(const void *p1, + if (a->socket_id != b->socket_id) + return a->socket_id - b->socket_id; + ++ if (a->die_id != b->die_id) ++ return a->die_id - b->die_id; ++ + if (a->core_id != b->core_id) + return a->core_id - b->core_id; + +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-fixing-auto-detecting-binary-in-domain-capabilities.patch b/SOURCES/libvirt-qemu-fixing-auto-detecting-binary-in-domain-capabilities.patch new file mode 100644 index 0000000..42ec0ef --- /dev/null +++ b/SOURCES/libvirt-qemu-fixing-auto-detecting-binary-in-domain-capabilities.patch @@ -0,0 +1,118 @@ +From 0f8f59eee031729fb17dd9b70285665a44517850 Mon Sep 17 00:00:00 2001 +Message-Id: <0f8f59eee031729fb17dd9b70285665a44517850@dist-git> +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Fri, 15 May 2020 19:18:50 +0200 +Subject: [PATCH] qemu: fixing auto-detecting binary in domain capabilities +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The virConnectGetDomainCapabilities API accepts either a binary path +to the emulator, or desired guest arch. If guest arch is not given, +then the host arch is assumed. + +In the case where the binary is not given, the code tried to find the +emulator binary in the existing list of cached emulator capabilities. +This is not valid since we switched to lazy population of the cache in: + + commit 3dd91af01f30c5bda6328454ef49f3afece755d6 + Author: Daniel P. Berrangé + Date: Mon Dec 2 13:04:26 2019 +0000 + + qemu: stop creating capabilities at driver startup + +As a result of this change, if there are no persistent guests defined +using the requested guest architecture, virConnectGetDomainCapabilities +will fail to find an emulator binary. + +The solution is to stop relying on the cached capabilities to find the +binary and instead use the same logic we use to pick default a binary +per arch when populating capabilities. + +Tested-by: Boris Fiuczynski +Tested-by: Richard W.M. Jones +Reviewed-by: Michal Privoznik +Signed-off-by: Daniel P. Berrangé +(cherry picked from commit 6d786f95a366600e7bbae68c1b324a8131f5e2c5) + +https://bugzilla.redhat.com/show_bug.cgi?id=1836351 + +Signed-off-by: Andrea Bolognani +Message-Id: <20200515171850.135870-2-abologna@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_capabilities.c | 45 ++++++++++++++++++------------------ + 1 file changed, 22 insertions(+), 23 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 3bbfb64c03..5b16796c6b 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -5432,10 +5432,13 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, + const char **retMachine) + { + int virttype = VIR_DOMAIN_VIRT_NONE; +- int arch = virArchFromHost(); ++ virArch hostarch = virArchFromHost(); ++ virArch arch = hostarch; + virDomainVirtType capsType; + virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr ret = NULL; ++ virArch arch_from_caps; ++ g_autofree char *probedbinary = NULL; + + if (virttypeStr && + (virttype = virDomainVirtTypeFromString(virttypeStr)) < 0) { +@@ -5451,31 +5454,27 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, + goto cleanup; + } + +- if (binary) { +- virArch arch_from_caps; ++ if (!binary) { ++ probedbinary = virQEMUCapsGetDefaultEmulator(hostarch, arch); ++ binary = probedbinary; ++ } + +- if (!(qemuCaps = virQEMUCapsCacheLookup(cache, binary))) +- goto cleanup; ++ if (!(qemuCaps = virQEMUCapsCacheLookup(cache, binary))) ++ goto cleanup; + +- arch_from_caps = virQEMUCapsGetArch(qemuCaps); ++ arch_from_caps = virQEMUCapsGetArch(qemuCaps); + +- if (arch_from_caps != arch && +- !((ARCH_IS_X86(arch) && ARCH_IS_X86(arch_from_caps)) || +- (ARCH_IS_PPC(arch) && ARCH_IS_PPC(arch_from_caps)) || +- (ARCH_IS_ARM(arch) && ARCH_IS_ARM(arch_from_caps)) || +- (ARCH_IS_S390(arch) && ARCH_IS_S390(arch_from_caps)))) { +- virReportError(VIR_ERR_INVALID_ARG, +- _("architecture from emulator '%s' doesn't " +- "match given architecture '%s'"), +- virArchToString(arch_from_caps), +- virArchToString(arch)); +- goto cleanup; +- } +- } else { +- if (!(qemuCaps = virQEMUCapsCacheLookupByArch(cache, arch))) +- goto cleanup; +- +- binary = virQEMUCapsGetBinary(qemuCaps); ++ if (arch_from_caps != arch && ++ !((ARCH_IS_X86(arch) && ARCH_IS_X86(arch_from_caps)) || ++ (ARCH_IS_PPC(arch) && ARCH_IS_PPC(arch_from_caps)) || ++ (ARCH_IS_ARM(arch) && ARCH_IS_ARM(arch_from_caps)) || ++ (ARCH_IS_S390(arch) && ARCH_IS_S390(arch_from_caps)))) { ++ virReportError(VIR_ERR_INVALID_ARG, ++ _("architecture from emulator '%s' doesn't " ++ "match given architecture '%s'"), ++ virArchToString(arch_from_caps), ++ virArchToString(arch)); ++ goto cleanup; + } + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-hook-up-pcie-root-port-hotplug-off-option.patch b/SOURCES/libvirt-qemu-hook-up-pcie-root-port-hotplug-off-option.patch new file mode 100644 index 0000000..c8e2c63 --- /dev/null +++ b/SOURCES/libvirt-qemu-hook-up-pcie-root-port-hotplug-off-option.patch @@ -0,0 +1,174 @@ +From c9d4140df5d22a1bfc895eb1049cc714eaadc86c Mon Sep 17 00:00:00 2001 +Message-Id: +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:08 -0400 +Subject: [PATCH] qemu: hook up pcie-root-port hotplug='off' option + +If a pcie-root-port or pcie-downstream-port has hotplug='off' in its + subelement, and if the qemu binary supports the hotplug=false +option, then it will be added to the commandline for the pcie +controller. This controller will then not allow any hotplug/unplug of +devices while the guest is running (and the hotplug capability won't +be advertised to the guest OS, so the guest OS also won't present +unplugging of PCI devices as an option). + + + + + +For any PCI controllers other than pcie-downstream-port and +pcie-root-port, of for qemu binaries that don't support the hotplug +commandline option, an error will be logged during validation. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit 2d3cf60328c138f7a8fd5905eb345d5f48227ff8) + +Conflicts: + src/qemu/qemu_domain.c: + + This file was modified in lieu of modifying qemu_validate.c + upstream - that file has been added upstream (and device + post-parse validation functions moved there) but not downstream. + + tests/qemuxml2argvdata/pcie-root-port-nohotplug.x86_64-latest.args: + + These files had CPU model info upstream, but not downstream. Is + this due to the plain "q35" machinetype data missing from the + caps.replies file? Need to check... + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-6-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/qemu/qemu_command.c | 4 ++ + src/qemu/qemu_domain.c | 31 +++++++++++++ + ...cie-root-port-nohotplug.x86_64-latest.args | 45 +++++++++++++++++++ + tests/qemuxml2argvtest.c | 1 + + 4 files changed, 81 insertions(+) + create mode 100644 tests/qemuxml2argvdata/pcie-root-port-nohotplug.x86_64-latest.args + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index 4653e6ac3c..ed5f60e82e 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -3023,6 +3023,10 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, + virBufferAsprintf(&buf, "%s,port=0x%x,chassis=%d,id=%s", + modelName, pciopts->port, + pciopts->chassis, def->info.alias); ++ if (pciopts->hotplug != VIR_TRISTATE_SWITCH_ABSENT) { ++ virBufferAsprintf(&buf, ",hotplug=%s", ++ virTristateSwitchTypeToString(pciopts->hotplug)); ++ } + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + virBufferAsprintf(&buf, "%s,index=%d,id=%s", +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 8f746cdf13..1509e41021 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -7932,6 +7932,37 @@ qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *cont, + virReportEnumRangeError(virDomainControllerModelPCI, cont->model); + } + ++ /* hotplug */ ++ if (pciopts->hotplug != VIR_TRISTATE_SWITCH_ABSENT) { ++ switch ((virDomainControllerModelPCI) cont->model) { ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: ++ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIE_ROOT_PORT_HOTPLUG)) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("setting the hotplug property on a '%s' device is not supported by this QEMU binary"), ++ modelName); ++ return -1; ++ } ++ break; ++ ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: ++ case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_TO_PCI_BRIDGE: ++ virReportControllerInvalidOption(cont, model, modelName, "hotplug"); ++ return -1; ++ ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: ++ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: ++ default: ++ virReportEnumRangeError(virDomainControllerModelPCI, cont->model); ++ } ++ } ++ + /* QEMU device availability */ + if (cap < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, +diff --git a/tests/qemuxml2argvdata/pcie-root-port-nohotplug.x86_64-latest.args b/tests/qemuxml2argvdata/pcie-root-port-nohotplug.x86_64-latest.args +new file mode 100644 +index 0000000000..73885eec24 +--- /dev/null ++++ b/tests/qemuxml2argvdata/pcie-root-port-nohotplug.x86_64-latest.args +@@ -0,0 +1,45 @@ ++LC_ALL=C \ ++PATH=/bin \ ++HOME=/tmp/lib/domain--1-guest \ ++USER=test \ ++LOGNAME=test \ ++XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ ++XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ ++XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ ++QEMU_AUDIO_DRV=none \ ++/usr/bin/qemu-system-x86_64 \ ++-name guest=guest,debug-threads=on \ ++-S \ ++-object secret,id=masterKey0,format=raw,\ ++file=/tmp/lib/domain--1-guest/master-key.aes \ ++-machine q35,accel=tcg,usb=off,dump-guest-core=off \ ++-m 2048 \ ++-overcommit mem-lock=off \ ++-smp 2,sockets=2,cores=1,threads=1 \ ++-uuid 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 \ ++-display none \ ++-no-user-config \ ++-nodefaults \ ++-chardev socket,id=charmonitor,fd=1729,server,nowait \ ++-mon chardev=charmonitor,id=monitor,mode=control \ ++-rtc base=utc \ ++-no-shutdown \ ++-no-acpi \ ++-boot strict=on \ ++-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\ ++addr=0x1 \ ++-device pcie-root-port,port=0x9,chassis=2,id=pci.2,hotplug=off,bus=pcie.0,\ ++addr=0x1.0x1 \ ++-device ioh3420,port=0xa,chassis=3,id=pci.3,hotplug=off,bus=pcie.0,\ ++addr=0x1.0x2 \ ++-device x3130-upstream,id=pci.4,bus=pci.1,addr=0x0 \ ++-device xio3130-downstream,port=0x0,chassis=5,id=pci.5,hotplug=off,bus=pci.4,\ ++addr=0x0 \ ++-device xio3130-downstream,port=0x1,chassis=6,id=pci.6,hotplug=on,bus=pci.4,\ ++addr=0x1 \ ++-device xio3130-downstream,port=0x2,chassis=7,id=pci.7,bus=pci.4,addr=0x2 \ ++-device xio3130-downstream,port=0x27,chassis=30,id=pci.8,bus=pci.4,addr=0x3 \ ++-device qemu-xhci,id=usb,bus=pci.2,addr=0x0 \ ++-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ ++resourcecontrol=deny \ ++-msg timestamp=on +diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c +index d6c5f436ae..ff92af606d 100644 +--- a/tests/qemuxml2argvtest.c ++++ b/tests/qemuxml2argvtest.c +@@ -2427,6 +2427,7 @@ mymain(void) + QEMU_CAPS_DEVICE_IOH3420); + DO_TEST("pcie-root-port-model-ioh3420", + QEMU_CAPS_DEVICE_IOH3420); ++ DO_TEST_CAPS_LATEST("pcie-root-port-nohotplug"); + + DO_TEST("autoindex", + QEMU_CAPS_DEVICE_PCI_BRIDGE, +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-new-capabilities-flag-pcie-root-port.hotplug.patch b/SOURCES/libvirt-qemu-new-capabilities-flag-pcie-root-port.hotplug.patch new file mode 100644 index 0000000..e402e22 --- /dev/null +++ b/SOURCES/libvirt-qemu-new-capabilities-flag-pcie-root-port.hotplug.patch @@ -0,0 +1,37901 @@ +From bc897af485b8ae39d93dfa974995a8a94ba217cf Mon Sep 17 00:00:00 2001 +Message-Id: +From: Laine Stump +Date: Sun, 26 Apr 2020 13:04:06 -0400 +Subject: [PATCH] qemu: new capabilities flag pcie-root-port.hotplug + +This caps flag is set when the qemu binary supports the option +"hotplug" for pcie-root-port, ioh3420 (Intel pcie-root-port) and +xio3130-downstream (Intel pcie-downstream-port). If it's available, +it's possible to disable hotplugging/unplugging devices on a +particular port by adding ",hotplug=off" to the qemu device +commandline. This option first appears in qemu-5.0.0. + +Signed-off-by: Laine Stump +Reviewed-by: Michal Privoznik +(cherry picked from commit cbd4ab4cc6945e610b0a3061fcf3517755d65dcf) + + Conflicts: + src/qemu/qemu_capabilities.c: + src/qemu/qemu_capabilities.h: + + new capabilities added upstream + + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.replies: + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml: + + files didn't exist upstream (and some new capabilities aren't + included downstream, meaning the .xml is different from upstream) + + tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args: + tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args: + tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args: + tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args: + tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml: + + These files were not modified for this patch upstream, but had to + be modified downstream in order for tests to patch. This was due to + the "latest" qemu for tests switching from 4.2.0.x86_64 to + 5.0.0.x86_64, which removes the deprecated "pc-0.12" and "pc-0.13" + machinetype used in those 5 tests. Upstream these tests were + changed (in commits 30518a3b and 44d32a0a) to use either the + generic "pc" machinetype, or the specific "pc-i440fx-2.12" + machinetype, but backporting those patches (and several others) + seemed overly disruptive, so instead this patch is carrying 5 extra + one-line changes to allow the tests to pass. + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-4-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + src/qemu/qemu_capabilities.c | 8 + + src/qemu/qemu_capabilities.h | 1 + + .../domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 181 + + .../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml | 191 + + tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 181 + + .../caps_2.10.0.aarch64.replies | 142 +- + .../caps_2.10.0.x86_64.replies | 154 +- + .../caps_2.11.0.x86_64.replies | 154 +- + .../caps_2.12.0.aarch64.replies | 158 +- + .../caps_2.12.0.x86_64.replies | 170 +- + .../caps_2.9.0.x86_64.replies | 154 +- + .../caps_3.0.0.x86_64.replies | 170 +- + .../caps_3.1.0.x86_64.replies | 170 +- + .../caps_4.0.0.aarch64.replies | 158 +- + .../caps_4.0.0.ppc64.replies | 150 +- + .../caps_4.0.0.riscv32.replies | 150 +- + .../caps_4.0.0.riscv64.replies | 150 +- + .../caps_4.0.0.x86_64.replies | 170 +- + .../caps_4.1.0.x86_64.replies | 162 +- + .../caps_4.2.0.aarch64.replies | 166 +- + .../caps_4.2.0.ppc64.replies | 150 +- + .../caps_4.2.0.x86_64.replies | 162 +- + .../caps_5.0.0.aarch64.replies | 166 +- + .../caps_5.0.0.x86_64.replies | 28673 ++++++++++++++++ + .../caps_5.0.0.x86_64.xml | 2842 ++ + .../disk-cdrom-tray.x86_64-latest.args | 1 - + .../disk-copy_on_read.x86_64-latest.args | 1 - + .../disk-detect-zeroes.x86_64-latest.args | 1 - + .../vhost-vsock.x86_64-latest.args | 1 - + .../tpm-passthrough.x86_64-latest.xml | 3 - + 30 files changed, 34495 insertions(+), 445 deletions(-) + create mode 100644 tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml + create mode 100644 tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml + create mode 100644 tests/domaincapsdata/qemu_5.0.0.x86_64.xml + create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.x86_64.replies + create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 9d744501b9..3bbfb64c03 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -565,6 +565,7 @@ VIR_ENUM_IMPL(virQEMUCaps, + /* 355 */ + "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api", + "storage.werror", ++ "pcie-root-port.hotplug", + ); + + +@@ -1315,6 +1316,10 @@ static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioNet[] = { + { "failover", QEMU_CAPS_VIRTIO_NET_FAILOVER }, + }; + ++static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsPCIeRootPort[] = { ++ { "hotplug", QEMU_CAPS_PCIE_ROOT_PORT_HOTPLUG }, ++}; ++ + static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsSpaprPCIHostBridge[] = { + { "numa_node", QEMU_CAPS_SPAPR_PCI_HOST_BRIDGE_NUMA_NODE }, + }; +@@ -1556,6 +1561,9 @@ static virQEMUCapsObjectTypeProps virQEMUCapsDeviceProps[] = { + { "nvdimm", virQEMUCapsDevicePropsNVDIMM, + G_N_ELEMENTS(virQEMUCapsDevicePropsNVDIMM), + QEMU_CAPS_DEVICE_NVDIMM }, ++ { "pcie-root-port", virQEMUCapsDevicePropsPCIeRootPort, ++ G_N_ELEMENTS(virQEMUCapsDevicePropsPCIeRootPort), ++ QEMU_CAPS_DEVICE_PCIE_ROOT_PORT }, + }; + + static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsMemoryBackendFile[] = { +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index 78bddb3856..aad02fcda5 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -546,6 +546,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ + /* 355 */ + QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API, /* downstream support for blockdev reopen in rhel-av-8.2.0 */ + QEMU_CAPS_STORAGE_WERROR, /* virtio-blk,scsi-hd.werror */ ++ QEMU_CAPS_PCIE_ROOT_PORT_HOTPLUG, /* pcie-root-port.hotplug */ + + QEMU_CAPS_LAST /* this must always be the last item */ + } virQEMUCapsFlags; +diff --git a/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +new file mode 100644 +index 0000000000..b635d573ef +--- /dev/null ++++ b/tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml +@@ -0,0 +1,181 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-q35-5.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /usr/share/AAVMF/AAVMF_CODE.fd ++ /usr/share/AAVMF/AAVMF32_CODE.fd ++ /usr/share/OVMF/OVMF_CODE.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ yes ++ no ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ qemu64 ++ qemu32 ++ phenom ++ pentium3 ++ pentium2 ++ pentium ++ n270 ++ kvm64 ++ kvm32 ++ coreduo ++ core2duo ++ athlon ++ Westmere-IBRS ++ Westmere ++ Skylake-Server-IBRS ++ Skylake-Server ++ Skylake-Client-IBRS ++ Skylake-Client ++ SandyBridge-IBRS ++ SandyBridge ++ Penryn ++ Opteron_G5 ++ Opteron_G4 ++ Opteron_G3 ++ Opteron_G2 ++ Opteron_G1 ++ Nehalem-IBRS ++ Nehalem ++ IvyBridge-IBRS ++ IvyBridge ++ Icelake-Server ++ Icelake-Client ++ Haswell-noTSX-IBRS ++ Haswell-noTSX ++ Haswell-IBRS ++ Haswell ++ EPYC-IBPB ++ EPYC ++ Dhyana ++ Conroe ++ Cascadelake-Server ++ Broadwell-noTSX-IBRS ++ Broadwell-noTSX ++ Broadwell-IBRS ++ Broadwell ++ 486 ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ spice ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +new file mode 100644 +index 0000000000..0fbc632267 +--- /dev/null ++++ b/tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml +@@ -0,0 +1,191 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ qemu ++ pc-i440fx-5.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /usr/share/AAVMF/AAVMF_CODE.fd ++ /usr/share/AAVMF/AAVMF32_CODE.fd ++ /usr/share/OVMF/OVMF_CODE.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ no ++ ++ ++ ++ ++ ++ ++ EPYC ++ AMD ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ qemu64 ++ qemu32 ++ phenom ++ pentium3 ++ pentium2 ++ pentium ++ n270 ++ kvm64 ++ kvm32 ++ coreduo ++ core2duo ++ athlon ++ Westmere-IBRS ++ Westmere ++ Skylake-Server-IBRS ++ Skylake-Server ++ Skylake-Client-IBRS ++ Skylake-Client ++ SandyBridge-IBRS ++ SandyBridge ++ Penryn ++ Opteron_G5 ++ Opteron_G4 ++ Opteron_G3 ++ Opteron_G2 ++ Opteron_G1 ++ Nehalem-IBRS ++ Nehalem ++ IvyBridge-IBRS ++ IvyBridge ++ Icelake-Server ++ Icelake-Client ++ Haswell-noTSX-IBRS ++ Haswell-noTSX ++ Haswell-IBRS ++ Haswell ++ EPYC-IBPB ++ EPYC ++ Dhyana ++ Conroe ++ Cascadelake-Server ++ Broadwell-noTSX-IBRS ++ Broadwell-noTSX ++ Broadwell-IBRS ++ Broadwell ++ 486 ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ ide ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ spice ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/domaincapsdata/qemu_5.0.0.x86_64.xml b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +new file mode 100644 +index 0000000000..27f76a8a5e +--- /dev/null ++++ b/tests/domaincapsdata/qemu_5.0.0.x86_64.xml +@@ -0,0 +1,181 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ kvm ++ pc-i440fx-5.0 ++ x86_64 ++ ++ ++ ++ ++ bios ++ efi ++ ++ ++ /usr/share/AAVMF/AAVMF_CODE.fd ++ /usr/share/AAVMF/AAVMF32_CODE.fd ++ /usr/share/OVMF/OVMF_CODE.fd ++ ++ rom ++ pflash ++ ++ ++ yes ++ no ++ ++ ++ no ++ ++ ++ ++ ++ ++ ++ Skylake-Client-IBRS ++ Intel ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ qemu64 ++ qemu32 ++ phenom ++ pentium3 ++ pentium2 ++ pentium ++ n270 ++ kvm64 ++ kvm32 ++ coreduo ++ core2duo ++ athlon ++ Westmere-IBRS ++ Westmere ++ Skylake-Server-IBRS ++ Skylake-Server ++ Skylake-Client-IBRS ++ Skylake-Client ++ SandyBridge-IBRS ++ SandyBridge ++ Penryn ++ Opteron_G5 ++ Opteron_G4 ++ Opteron_G3 ++ Opteron_G2 ++ Opteron_G1 ++ Nehalem-IBRS ++ Nehalem ++ IvyBridge-IBRS ++ IvyBridge ++ Icelake-Server ++ Icelake-Client ++ Haswell-noTSX-IBRS ++ Haswell-noTSX ++ Haswell-IBRS ++ Haswell ++ EPYC-IBPB ++ EPYC ++ Dhyana ++ Conroe ++ Cascadelake-Server ++ Broadwell-noTSX-IBRS ++ Broadwell-noTSX ++ Broadwell-IBRS ++ Broadwell ++ 486 ++ ++ ++ ++ ++ ++ disk ++ cdrom ++ floppy ++ lun ++ ++ ++ ide ++ fdc ++ scsi ++ virtio ++ usb ++ sata ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ ++ ++ sdl ++ vnc ++ spice ++ ++ ++ ++ ++ ++ subsystem ++ ++ ++ default ++ mandatory ++ requisite ++ optional ++ ++ ++ usb ++ pci ++ scsi ++ ++ ++ ++ default ++ vfio ++ ++ ++ ++ ++ virtio ++ virtio-transitional ++ virtio-non-transitional ++ ++ ++ random ++ egd ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.replies b/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.replies +index 73a99a36ea..c75d4ab8a7 100644 +--- a/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.10.0.aarch64.replies +@@ -4895,10 +4895,120 @@ + } + + { +- "execute": "query-machines", ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, + "id": "libvirt-29" + } + ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-29" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-30" ++} ++ + { + "return": [ + { +@@ -5163,12 +5273,12 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-29" ++ "id": "libvirt-30" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -5334,34 +5444,34 @@ + "static": false + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { + "return": [ + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "return": [ + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6506,12 +6616,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -6561,12 +6671,12 @@ + "capability": "return-path" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -16289,12 +16399,12 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -16310,7 +16420,7 @@ + "kernel": true + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies +index 8f96b4c567..d5deea9b3c 100644 +--- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.replies +@@ -4448,10 +4448,120 @@ + } + + { +- "execute": "query-machines", ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, + "id": "libvirt-35" + } + ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-36" ++} ++ + { + "return": [ + { +@@ -4638,12 +4748,12 @@ + "alias": "q35" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4978,36 +5088,36 @@ + "migration-safe": true + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + "tpm-tis" + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "return": [ + "passthrough" + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -6286,12 +6396,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -6341,12 +6451,12 @@ + "capability": "return-path" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -16069,7 +16179,7 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -16080,7 +16190,7 @@ + "name": "host" + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -16259,7 +16369,7 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -16440,7 +16550,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -16683,7 +16793,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -16697,7 +16807,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -16876,7 +16986,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -17057,7 +17167,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +@@ -17300,7 +17410,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.replies +index d91f01b55d..75ca78f75e 100644 +--- a/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.11.0.x86_64.replies +@@ -4475,10 +4475,120 @@ + } + + { +- "execute": "query-machines", ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, + "id": "libvirt-35" + } + ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-36" ++} ++ + { + "return": [ + { +@@ -4665,12 +4775,12 @@ + "cpu-max": 288 + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4984,24 +5094,24 @@ + "migration-safe": true + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + "tpm-tis" + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -5009,12 +5119,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -6309,12 +6419,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -6372,12 +6482,12 @@ + "capability": "x-multifd" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -16245,7 +16355,7 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -16256,7 +16366,7 @@ + "name": "host" + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -16436,7 +16546,7 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -16618,7 +16728,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -16863,7 +16973,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -16877,7 +16987,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -17057,7 +17167,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -17239,7 +17349,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +@@ -17484,7 +17594,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.replies b/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.replies +index 87414a9bca..b99913ed37 100644 +--- a/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.12.0.aarch64.replies +@@ -5251,12 +5251,122 @@ + "id": "libvirt-28" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-29" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-29" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-29" ++ "id": "libvirt-30" + } + + { +@@ -5310,7 +5420,7 @@ + "type": "string" + } + ], +- "id": "libvirt-29" ++ "id": "libvirt-30" + } + + { +@@ -5318,7 +5428,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -5372,7 +5482,7 @@ + "type": "string" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -5380,7 +5490,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5495,12 +5605,12 @@ + "type": "child" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { + "execute": "query-machines", +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -5797,7 +5907,7 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -5805,7 +5915,7 @@ + "arguments": { + "typename": "virt-2.12-machine" + }, +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -5935,12 +6045,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -6116,35 +6226,35 @@ + "static": false + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "return": [ + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + "emulator" + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -7309,12 +7419,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -7376,12 +7486,12 @@ + "capability": "dirty-bitmaps" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -18749,12 +18859,12 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -18770,7 +18880,7 @@ + "kernel": false + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.replies +index b4c243096b..1e3ba0885a 100644 +--- a/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.12.0.x86_64.replies +@@ -4641,12 +4641,122 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4700,7 +4810,7 @@ + "type": "string" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4708,7 +4818,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4758,7 +4868,7 @@ + "type": "string" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4766,7 +4876,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -5788,12 +5898,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -5992,12 +6102,12 @@ + "cpu-max": 255 + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -6511,12 +6621,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -6524,12 +6634,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -6537,12 +6647,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -7829,12 +7939,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -7896,12 +8006,12 @@ + "capability": "dirty-bitmaps" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -19269,12 +19379,12 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +@@ -19284,7 +19394,7 @@ + "cert-chain": "AQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAA", + "pdh": "AQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAAAQAAAAAOAAA" + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +@@ -19295,7 +19405,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -19485,7 +19595,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -19677,7 +19787,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -19932,7 +20042,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -19946,7 +20056,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -20136,7 +20246,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -20328,7 +20438,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +@@ -20583,7 +20693,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies +index 8f32313b46..5cff9c485b 100644 +--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies +@@ -3992,10 +3992,120 @@ + } + + { +- "execute": "query-machines", ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, + "id": "libvirt-35" + } + ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-36" ++} ++ + { + "return": [ + { +@@ -4172,12 +4282,12 @@ + "cpu-max": 255 + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4459,36 +4569,36 @@ + "migration-safe": true + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + "tpm-tis" + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "return": [ + "passthrough" + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -5737,12 +5847,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -5784,12 +5894,12 @@ + "capability": "release-ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -15075,7 +15185,7 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -15086,7 +15196,7 @@ + "name": "host" + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -15265,7 +15375,7 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -15446,7 +15556,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -15687,7 +15797,7 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -15701,7 +15811,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -15880,7 +15990,7 @@ + } + } + }, +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -16061,7 +16171,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +@@ -16302,7 +16412,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies +index f25e5deb94..c683f672f7 100644 +--- a/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_3.0.0.x86_64.replies +@@ -4776,12 +4776,122 @@ + } + + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4831,7 +4941,7 @@ + "type": "string" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4839,7 +4949,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4889,7 +4999,7 @@ + "type": "string" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4897,7 +5007,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -5951,12 +6061,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -6165,12 +6275,12 @@ + "cpu-max": 255 + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -6607,12 +6717,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -6620,12 +6730,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -6633,12 +6743,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -7937,12 +8047,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -8012,12 +8122,12 @@ + "capability": "late-block-activate" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -19897,16 +20007,16 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "SEV feature is not available" +@@ -19921,7 +20031,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -20114,7 +20224,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -20309,7 +20419,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -20572,7 +20682,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -20586,7 +20696,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -20779,7 +20889,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -20974,7 +21084,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +@@ -21237,7 +21347,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.replies +index 256fa92af9..e0e1edddf1 100644 +--- a/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_3.1.0.x86_64.replies +@@ -4818,12 +4818,122 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4884,7 +4994,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -4892,7 +5002,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4952,7 +5062,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -4960,7 +5070,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -6062,12 +6172,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -6286,12 +6396,12 @@ + "cpu-max": 255 + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -6810,12 +6920,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -6823,12 +6933,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -6836,12 +6946,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -8115,12 +8225,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -8190,12 +8300,12 @@ + "capability": "late-block-activate" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -20380,16 +20490,16 @@ + "meta-type": "object" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "SEV feature is not available" +@@ -20404,7 +20514,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -20606,7 +20716,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -20810,7 +20920,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -21085,7 +21195,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -21099,7 +21209,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -21301,7 +21411,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -21505,7 +21615,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +@@ -21780,7 +21890,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.replies b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.replies +index 0eca77acca..ddd77ba48a 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.aarch64.replies +@@ -5718,12 +5718,122 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-30" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -5788,7 +5898,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -5796,7 +5906,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5860,7 +5970,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5868,7 +5978,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -5983,12 +6093,12 @@ + "type": "child" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6330,7 +6440,7 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6338,7 +6448,7 @@ + "arguments": { + "typename": "virt-4.0-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -6473,12 +6583,12 @@ + "type": "string" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -6669,34 +6779,34 @@ + "static": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -7844,12 +7954,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -7923,12 +8033,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -20015,12 +20125,12 @@ + ] + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -20036,7 +20146,7 @@ + "kernel": false + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.replies b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.replies +index 84b5f06c5d..356e12aa01 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.ppc64.replies +@@ -5773,12 +5773,122 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5843,7 +5953,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5851,7 +5961,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -5915,12 +6025,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6073,7 +6183,7 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6081,7 +6191,7 @@ + "arguments": { + "typename": "pseries-4.0-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -6280,12 +6390,12 @@ + "type": "string" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -8481,34 +8591,34 @@ + "static": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -9651,12 +9761,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -9730,12 +9840,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -21793,7 +21903,7 @@ + ] + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.replies b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.replies +index 2b1d832c6b..2d63851d3a 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.replies ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv32.replies +@@ -3892,12 +3892,122 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -3962,7 +4072,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -3970,7 +4080,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -4034,12 +4144,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -4076,7 +4186,7 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -4084,7 +4194,7 @@ + "arguments": { + "typename": "virt-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -4189,34 +4299,34 @@ + "type": "bool" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "return": [ + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -5488,12 +5598,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -5567,12 +5677,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -17851,12 +17961,12 @@ + ] + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -17893,5 +18003,5 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.replies b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.replies +index 8fd9646f53..4df475d7c0 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.riscv64.replies +@@ -3892,12 +3892,122 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-31a" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -3962,7 +4072,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -3970,7 +4080,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -4034,12 +4144,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -4076,7 +4186,7 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -4084,7 +4194,7 @@ + "arguments": { + "typename": "virt-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -4189,34 +4299,34 @@ + "type": "bool" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "return": [ + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -5488,12 +5598,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -5567,12 +5677,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -17851,12 +17961,12 @@ + ] + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -17893,5 +18003,5 @@ + "cpu-max": 1 + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } +diff --git a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.replies +index 09112a207f..8ac67e0b75 100644 +--- a/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.0.0.x86_64.replies +@@ -5043,12 +5043,122 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5113,7 +5223,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5121,7 +5231,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5185,7 +5295,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5193,7 +5303,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -6311,12 +6421,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -6535,12 +6645,12 @@ + "alias": "q35" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -7057,12 +7167,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -7070,12 +7180,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -7083,12 +7193,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -8370,12 +8480,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -8449,12 +8559,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -20919,16 +21029,16 @@ + ] + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "SEV feature is not available" +@@ -20943,7 +21053,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -21147,7 +21257,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -21353,7 +21463,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -21632,7 +21742,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -21646,7 +21756,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -21850,7 +21960,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-49" + } + + { +@@ -22056,7 +22166,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +@@ -22335,7 +22445,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-50" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.replies +index c143866dcc..5c3c706651 100644 +--- a/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.1.0.x86_64.replies +@@ -5336,12 +5336,122 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5406,7 +5516,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5414,7 +5524,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5478,7 +5588,7 @@ + "type": "int" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5486,7 +5596,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -6651,12 +6761,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -6980,12 +7090,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -8130,12 +8240,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -8143,12 +8253,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -8156,12 +8266,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -9435,12 +9545,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -9514,12 +9624,12 @@ + "capability": "x-ignore-shared" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -22104,16 +22214,16 @@ + ] + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "SEV feature is not available" +@@ -22128,7 +22238,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -22336,7 +22446,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -22350,7 +22460,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -22558,7 +22668,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.replies b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.replies +index e5d5b53667..4d28047ebe 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.replies +@@ -6090,12 +6090,122 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-30" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -6160,7 +6270,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -6168,7 +6278,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -6232,7 +6342,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -6240,7 +6350,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -6427,12 +6537,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6990,7 +7100,7 @@ + "deprecated": false + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6998,7 +7108,7 @@ + "arguments": { + "typename": "virt-4.2-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -7151,12 +7261,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -7347,34 +7457,34 @@ + "static": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -8542,12 +8652,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -8625,12 +8735,12 @@ + "capability": "validate-uuid" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -21201,12 +21311,12 @@ + ] + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -21222,7 +21332,7 @@ + "kernel": false + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -21233,7 +21343,7 @@ + "name": "host" + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -21263,7 +21373,7 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -21277,11 +21387,11 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +- "id": "libvirt-43", ++ "id": "libvirt-44", + "error": { + "class": "GenericError", + "desc": "Parameter 'migratable' is unexpected" +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.replies b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.replies +index 2414105e25..95ec00a651 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.replies +@@ -5895,12 +5895,122 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5965,7 +6075,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -5973,7 +6083,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -6037,12 +6147,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6304,7 +6414,7 @@ + "deprecated": false + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -6312,7 +6422,7 @@ + "arguments": { + "typename": "pseries-4.2-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -6511,12 +6621,12 @@ + "type": "string" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -8712,34 +8822,34 @@ + "static": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -9878,12 +9988,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -9961,12 +10071,12 @@ + "capability": "validate-uuid" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -22195,7 +22305,7 @@ + ] + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.replies +index b9481b6f85..c09ebb5460 100644 +--- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.replies +@@ -5576,12 +5576,122 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5646,7 +5756,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -5654,7 +5764,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5718,7 +5828,7 @@ + "type": "int" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { +@@ -5726,7 +5836,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { +@@ -7280,12 +7390,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -7677,12 +7787,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -9065,12 +9175,12 @@ + "migration-safe": true + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -9078,12 +9188,12 @@ + "tpm-crb", + "tpm-tis" + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -9091,12 +9201,12 @@ + "passthrough", + "emulator" + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -10382,12 +10492,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +@@ -10465,12 +10575,12 @@ + "capability": "validate-uuid" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { +@@ -23389,16 +23499,16 @@ + ] + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "SEV feature is not available" +@@ -23413,7 +23523,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -23715,7 +23825,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-47" + } + + { +@@ -23729,7 +23839,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +@@ -24031,7 +24141,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-48" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies +index a3136a0966..067cbb7e31 100644 +--- a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies +@@ -6476,12 +6476,122 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "name": "command_serr_enable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "name": "pref32-reserve", ++ "type": "size" ++ }, ++ { ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "name": "io-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-30" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -6546,7 +6656,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-31" + } + + { +@@ -6554,7 +6664,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -6618,7 +6728,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-32" + } + + { +@@ -6626,7 +6736,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { +@@ -6826,12 +6936,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -7411,7 +7521,7 @@ + "deprecated": false + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-34" + } + + { +@@ -7419,7 +7529,7 @@ + "arguments": { + "typename": "virt-5.0-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { +@@ -7557,12 +7667,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { +@@ -7758,34 +7868,34 @@ + "static": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-36" + } + + { + "execute": "query-tpm-models", +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "return": [ + ], +- "id": "libvirt-36" ++ "id": "libvirt-37" + } + + { + "execute": "query-tpm-types", +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "return": [ + ], +- "id": "libvirt-37" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { +@@ -8943,12 +9053,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-39" + } + + { + "execute": "query-migrate-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { +@@ -9026,12 +9136,12 @@ + "capability": "validate-uuid" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-40" + } + + { + "execute": "query-qmp-schema", +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { +@@ -21768,12 +21878,12 @@ + ] + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-41" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -21789,7 +21899,7 @@ + "kernel": false + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-42" + } + + { +@@ -21800,7 +21910,7 @@ + "name": "host" + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -21831,7 +21941,7 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-43" + } + + { +@@ -21845,11 +21955,11 @@ + } + } + }, +- "id": "libvirt-43" ++ "id": "libvirt-44" + } + + { +- "id": "libvirt-43", ++ "id": "libvirt-44", + "error": { + "class": "GenericError", + "desc": "Parameter 'migratable' is unexpected" +diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.replies b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.replies +new file mode 100644 +index 0000000000..af2299a41e +--- /dev/null ++++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.replies +@@ -0,0 +1,28673 @@ ++{ ++ "execute": "qmp_capabilities", ++ "id": "libvirt-1" ++} ++ ++{ ++ "return": { ++ }, ++ "id": "libvirt-1" ++} ++ ++{ ++ "execute": "query-version", ++ "id": "libvirt-2" ++} ++ ++{ ++ "return": { ++ "qemu": { ++ "micro": 91, ++ "minor": 2, ++ "major": 4 ++ }, ++ "package": "v5.0.0-rc1" ++ }, ++ "id": "libvirt-2" ++} ++ ++{ ++ "execute": "query-target", ++ "id": "libvirt-3" ++} ++ ++{ ++ "return": { ++ "arch": "x86_64" ++ }, ++ "id": "libvirt-3" ++} ++ ++{ ++ "execute": "query-commands", ++ "id": "libvirt-4" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "object-add" ++ }, ++ { ++ "name": "device_add" ++ }, ++ { ++ "name": "query-qmp-schema" ++ }, ++ { ++ "name": "query-sev-capabilities" ++ }, ++ { ++ "name": "query-sev-launch-measure" ++ }, ++ { ++ "name": "query-sev" ++ }, ++ { ++ "name": "rtc-reset-reinjection" ++ }, ++ { ++ "name": "query-vm-generation-id" ++ }, ++ { ++ "name": "xen-load-devices-state" ++ }, ++ { ++ "name": "query-acpi-ospm-status" ++ }, ++ { ++ "name": "query-memory-devices" ++ }, ++ { ++ "name": "query-command-line-options" ++ }, ++ { ++ "name": "query-fdsets" ++ }, ++ { ++ "name": "remove-fd" ++ }, ++ { ++ "name": "add-fd" ++ }, ++ { ++ "name": "query-memory-size-summary" ++ }, ++ { ++ "name": "closefd" ++ }, ++ { ++ "name": "getfd" ++ }, ++ { ++ "name": "xen-set-global-dirty-log" ++ }, ++ { ++ "name": "change" ++ }, ++ { ++ "name": "human-monitor-command" ++ }, ++ { ++ "name": "balloon" ++ }, ++ { ++ "name": "inject-nmi" ++ }, ++ { ++ "name": "system_wakeup" ++ }, ++ { ++ "name": "x-exit-preconfig" ++ }, ++ { ++ "name": "cont" ++ }, ++ { ++ "name": "pmemsave" ++ }, ++ { ++ "name": "memsave" ++ }, ++ { ++ "name": "system_powerdown" ++ }, ++ { ++ "name": "system_reset" ++ }, ++ { ++ "name": "stop" ++ }, ++ { ++ "name": "query-pci" ++ }, ++ { ++ "name": "query-balloon" ++ }, ++ { ++ "name": "query-iothreads" ++ }, ++ { ++ "name": "query-uuid" ++ }, ++ { ++ "name": "query-kvm" ++ }, ++ { ++ "name": "query-name" ++ }, ++ { ++ "name": "add_client" ++ }, ++ { ++ "name": "query-cpu-definitions" ++ }, ++ { ++ "name": "query-cpu-model-expansion" ++ }, ++ { ++ "name": "set-numa-node" ++ }, ++ { ++ "name": "query-hotpluggable-cpus" ++ }, ++ { ++ "name": "query-memdev" ++ }, ++ { ++ "name": "query-target" ++ }, ++ { ++ "name": "query-current-machine" ++ }, ++ { ++ "name": "query-machines" ++ }, ++ { ++ "name": "cpu-add" ++ }, ++ { ++ "name": "query-cpus-fast" ++ }, ++ { ++ "name": "query-cpus" ++ }, ++ { ++ "name": "device_del" ++ }, ++ { ++ "name": "device-list-properties" ++ }, ++ { ++ "name": "object-del" ++ }, ++ { ++ "name": "qom-list-properties" ++ }, ++ { ++ "name": "qom-list-types" ++ }, ++ { ++ "name": "qom-set" ++ }, ++ { ++ "name": "qom-get" ++ }, ++ { ++ "name": "qom-list" ++ }, ++ { ++ "name": "quit" ++ }, ++ { ++ "name": "query-events" ++ }, ++ { ++ "name": "query-commands" ++ }, ++ { ++ "name": "query-version" ++ }, ++ { ++ "name": "qmp_capabilities" ++ }, ++ { ++ "name": "trace-event-set-state" ++ }, ++ { ++ "name": "trace-event-get-state" ++ }, ++ { ++ "name": "transaction" ++ }, ++ { ++ "name": "migrate-pause" ++ }, ++ { ++ "name": "migrate-recover" ++ }, ++ { ++ "name": "query-colo-status" ++ }, ++ { ++ "name": "xen-colo-do-checkpoint" ++ }, ++ { ++ "name": "query-xen-replication-status" ++ }, ++ { ++ "name": "xen-set-replication" ++ }, ++ { ++ "name": "xen-save-devices-state" ++ }, ++ { ++ "name": "migrate-incoming" ++ }, ++ { ++ "name": "migrate" ++ }, ++ { ++ "name": "query-migrate-cache-size" ++ }, ++ { ++ "name": "migrate-set-cache-size" ++ }, ++ { ++ "name": "migrate_set_speed" ++ }, ++ { ++ "name": "migrate_set_downtime" ++ }, ++ { ++ "name": "migrate-continue" ++ }, ++ { ++ "name": "migrate_cancel" ++ }, ++ { ++ "name": "x-colo-lost-heartbeat" ++ }, ++ { ++ "name": "migrate-start-postcopy" ++ }, ++ { ++ "name": "client_migrate_info" ++ }, ++ { ++ "name": "query-migrate-parameters" ++ }, ++ { ++ "name": "migrate-set-parameters" ++ }, ++ { ++ "name": "query-migrate-capabilities" ++ }, ++ { ++ "name": "migrate-set-capabilities" ++ }, ++ { ++ "name": "query-migrate" ++ }, ++ { ++ "name": "query-display-options" ++ }, ++ { ++ "name": "input-send-event" ++ }, ++ { ++ "name": "send-key" ++ }, ++ { ++ "name": "query-mice" ++ }, ++ { ++ "name": "change-vnc-password" ++ }, ++ { ++ "name": "query-vnc-servers" ++ }, ++ { ++ "name": "query-vnc" ++ }, ++ { ++ "name": "query-spice" ++ }, ++ { ++ "name": "screendump" ++ }, ++ { ++ "name": "expire_password" ++ }, ++ { ++ "name": "set_password" ++ }, ++ { ++ "name": "query-tpm" ++ }, ++ { ++ "name": "query-tpm-types" ++ }, ++ { ++ "name": "query-tpm-models" ++ }, ++ { ++ "name": "query-rocker-of-dpa-groups" ++ }, ++ { ++ "name": "query-rocker-of-dpa-flows" ++ }, ++ { ++ "name": "query-rocker-ports" ++ }, ++ { ++ "name": "query-rocker" ++ }, ++ { ++ "name": "announce-self" ++ }, ++ { ++ "name": "query-rx-filter" ++ }, ++ { ++ "name": "netdev_del" ++ }, ++ { ++ "name": "netdev_add" ++ }, ++ { ++ "name": "set_link" ++ }, ++ { ++ "name": "query-dump-guest-memory-capability" ++ }, ++ { ++ "name": "query-dump" ++ }, ++ { ++ "name": "dump-guest-memory" ++ }, ++ { ++ "name": "chardev-send-break" ++ }, ++ { ++ "name": "chardev-remove" ++ }, ++ { ++ "name": "chardev-change" ++ }, ++ { ++ "name": "chardev-add" ++ }, ++ { ++ "name": "ringbuf-read" ++ }, ++ { ++ "name": "ringbuf-write" ++ }, ++ { ++ "name": "query-chardev-backends" ++ }, ++ { ++ "name": "query-chardev" ++ }, ++ { ++ "name": "query-jobs" ++ }, ++ { ++ "name": "job-finalize" ++ }, ++ { ++ "name": "job-dismiss" ++ }, ++ { ++ "name": "job-complete" ++ }, ++ { ++ "name": "job-cancel" ++ }, ++ { ++ "name": "job-resume" ++ }, ++ { ++ "name": "job-pause" ++ }, ++ { ++ "name": "blockdev-snapshot-delete-internal-sync" ++ }, ++ { ++ "name": "blockdev-snapshot-internal-sync" ++ }, ++ { ++ "name": "nbd-server-stop" ++ }, ++ { ++ "name": "nbd-server-remove" ++ }, ++ { ++ "name": "nbd-server-add" ++ }, ++ { ++ "name": "nbd-server-start" ++ }, ++ { ++ "name": "x-blockdev-set-iothread" ++ }, ++ { ++ "name": "x-blockdev-change" ++ }, ++ { ++ "name": "block-set-write-threshold" ++ }, ++ { ++ "name": "blockdev-create" ++ }, ++ { ++ "name": "blockdev-del" ++ }, ++ { ++ "name": "x-blockdev-reopen" ++ }, ++ { ++ "name": "blockdev-add" ++ }, ++ { ++ "name": "block-job-finalize" ++ }, ++ { ++ "name": "block-job-dismiss" ++ }, ++ { ++ "name": "block-job-complete" ++ }, ++ { ++ "name": "block-job-resume" ++ }, ++ { ++ "name": "block-job-pause" ++ }, ++ { ++ "name": "block-job-cancel" ++ }, ++ { ++ "name": "block-job-set-speed" ++ }, ++ { ++ "name": "block-stream" ++ }, ++ { ++ "name": "blockdev-mirror" ++ }, ++ { ++ "name": "x-debug-block-dirty-bitmap-sha256" ++ }, ++ { ++ "name": "block-dirty-bitmap-merge" ++ }, ++ { ++ "name": "block-dirty-bitmap-disable" ++ }, ++ { ++ "name": "block-dirty-bitmap-enable" ++ }, ++ { ++ "name": "block-dirty-bitmap-clear" ++ }, ++ { ++ "name": "block-dirty-bitmap-remove" ++ }, ++ { ++ "name": "block-dirty-bitmap-add" ++ }, ++ { ++ "name": "drive-mirror" ++ }, ++ { ++ "name": "x-debug-query-block-graph" ++ }, ++ { ++ "name": "query-named-block-nodes" ++ }, ++ { ++ "name": "blockdev-backup" ++ }, ++ { ++ "name": "drive-backup" ++ }, ++ { ++ "name": "block-commit" ++ }, ++ { ++ "name": "change-backing-file" ++ }, ++ { ++ "name": "blockdev-snapshot" ++ }, ++ { ++ "name": "blockdev-snapshot-sync" ++ }, ++ { ++ "name": "block_resize" ++ }, ++ { ++ "name": "block_passwd" ++ }, ++ { ++ "name": "query-block-jobs" ++ }, ++ { ++ "name": "query-blockstats" ++ }, ++ { ++ "name": "query-block" ++ }, ++ { ++ "name": "block-latency-histogram-set" ++ }, ++ { ++ "name": "block_set_io_throttle" ++ }, ++ { ++ "name": "blockdev-change-medium" ++ }, ++ { ++ "name": "blockdev-insert-medium" ++ }, ++ { ++ "name": "blockdev-remove-medium" ++ }, ++ { ++ "name": "blockdev-close-tray" ++ }, ++ { ++ "name": "blockdev-open-tray" ++ }, ++ { ++ "name": "eject" ++ }, ++ { ++ "name": "query-pr-managers" ++ }, ++ { ++ "name": "watchdog-set-action" ++ }, ++ { ++ "name": "query-status" ++ } ++ ], ++ "id": "libvirt-4" ++} ++ ++{ ++ "execute": "query-kvm", ++ "id": "libvirt-5" ++} ++ ++{ ++ "return": { ++ "enabled": true, ++ "present": true ++ }, ++ "id": "libvirt-5" ++} ++ ++{ ++ "execute": "qom-list-types", ++ "id": "libvirt-6" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "ich9-usb-uhci5", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "pcie-pci-bridge", ++ "parent": "base-pci-bridge" ++ }, ++ { ++ "name": "pc-q35-2.11-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "isa-applesmc", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "Westmere-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-user-input-pci", ++ "parent": "vhost-user-input-pci-base-type" ++ }, ++ { ++ "name": "floppy-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "chardev-stdio", ++ "parent": "chardev-fd" ++ }, ++ { ++ "name": "chardev-testdev", ++ "parent": "chardev" ++ }, ++ { ++ "name": "usb-redir", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "Denverton-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "filter-buffer", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "usb-wacom-tablet", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "pci-bridge", ++ "parent": "base-pci-bridge" ++ }, ++ { ++ "name": "pci-ipmi-bt", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Icelake-Server-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ich9-usb-uhci6", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "secondary-vga", ++ "parent": "pci-vga" ++ }, ++ { ++ "name": "virtio-rng-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "Haswell-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "rtl8139", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "core2duo-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvm-pit", ++ "parent": "pit-common" ++ }, ++ { ++ "name": "pc-i440fx-3.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "sev-guest", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-crypto-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "pcm3680_pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-blk-pci-transitional", ++ "parent": "virtio-blk-pci-base" ++ }, ++ { ++ "name": "pc-q35-2.5-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "max-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vmware-svga", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "tpm-crb", ++ "parent": "device" ++ }, ++ { ++ "name": "kvm-ioapic", ++ "parent": "ioapic-common" ++ }, ++ { ++ "name": "virtio-mmio-bus", ++ "parent": "virtio-bus" ++ }, ++ { ++ "name": "serial", ++ "parent": "device" ++ }, ++ { ++ "name": "ich9-usb-uhci4", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "gus", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "usb-hub", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "ich9-usb-ehci2", ++ "parent": "pci-ehci-usb" ++ }, ++ { ++ "name": "virtio-blk-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "ich9-usb-uhci3", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "Icelake-Client-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "chardev-wctablet", ++ "parent": "chardev" ++ }, ++ { ++ "name": "Westmere-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Opteron_G5-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ich9-usb-uhci2", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "pc-i440fx-2.8-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "chardev-serial", ++ "parent": "chardev-fd" ++ }, ++ { ++ "name": "qtest-accel", ++ "parent": "accel" ++ }, ++ { ++ "name": "chardev-pty", ++ "parent": "chardev" ++ }, ++ { ++ "name": "ich9-usb-uhci1", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "PCIE", ++ "parent": "PCI" ++ }, ++ { ++ "name": "pc-i440fx-5.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "scsi-generic", ++ "parent": "scsi-device" ++ }, ++ { ++ "name": "Icelake-Client-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvmclock", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "x3130-upstream", ++ "parent": "pcie-port" ++ }, ++ { ++ "name": "pxb-host", ++ "parent": "pci-host-bridge" ++ }, ++ { ++ "name": "memory-backend-ram", ++ "parent": "memory-backend" ++ }, ++ { ++ "name": "virtio-serial-pci-transitional", ++ "parent": "virtio-serial-pci-base" ++ }, ++ { ++ "name": "e1000e", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "n270-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Cooperlake-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "scsi-disk", ++ "parent": "scsi-disk-base" ++ }, ++ { ++ "name": "chardev-file", ++ "parent": "chardev-fd" ++ }, ++ { ++ "name": "tpm-passthrough", ++ "parent": "tpm-backend" ++ }, ++ { ++ "name": "pentium3-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "virtio-serial-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "usb-host", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "tulip", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "piix3-ide", ++ "parent": "pci-ide" ++ }, ++ { ++ "name": "filter-rewriter", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "pc-i440fx-4.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pc-1.2-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "vhost-scsi-pci", ++ "parent": "vhost-scsi-pci-base" ++ }, ++ { ++ "name": "isa-ipmi-bt", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "virtio-gpu-pci", ++ "parent": "virtio-gpu-pci-base-type" ++ }, ++ { ++ "name": "pci-ipmi-kcs", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "imx-usdhc", ++ "parent": "generic-sdhci" ++ }, ++ { ++ "name": "xio3130-downstream", ++ "parent": "pcie-slot" ++ }, ++ { ++ "name": "intel-iommu-iommu-memory-region", ++ "parent": "qemu:iommu-memory-region" ++ }, ++ { ++ "name": "pc-i440fx-2.3-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "sdhci-bus", ++ "parent": "sd-bus" ++ }, ++ { ++ "name": "PCI", ++ "parent": "bus" ++ }, ++ { ++ "name": "microvm-machine", ++ "parent": "x86-machine" ++ }, ++ { ++ "name": "ICH9-LPC", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pci-serial-2x", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "igd-passthrough-isa-bridge", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-9p-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "virtio-scsi-pci", ++ "parent": "virtio-scsi-pci-base" ++ }, ++ { ++ "name": "ipmi-bmc-extern", ++ "parent": "ipmi-bmc" ++ }, ++ { ++ "name": "authz-list-file", ++ "parent": "authz" ++ }, ++ { ++ "name": "pc-q35-4.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "usb-audio", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "usb-net", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "EPYC-Rome-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qemu32-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Skylake-Client-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-vsock-pci-non-transitional", ++ "parent": "vhost-vsock-pci-base" ++ }, ++ { ++ "name": "isa-debug-exit", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "KnightsMill-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vfio-pci-nohotplug", ++ "parent": "vfio-pci" ++ }, ++ { ++ "name": "i2c-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "Skylake-Server-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "mch", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "ich9-usb-ehci1", ++ "parent": "pci-ehci-usb" ++ }, ++ { ++ "name": "virtio-input-host-pci", ++ "parent": "virtio-input-host-pci-base-type" ++ }, ++ { ++ "name": "nvdimm", ++ "parent": "pc-dimm" ++ }, ++ { ++ "name": "pc-q35-3.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "virtio-9p-pci-transitional", ++ "parent": "virtio-9p-pci-base" ++ }, ++ { ++ "name": "Opteron_G1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "serial-mm", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "pr-manager-helper", ++ "parent": "pr-manager" ++ }, ++ { ++ "name": "pc-i440fx-2.10-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "i82557c", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pxb-pcie", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Haswell-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "virtio-scsi-device", ++ "parent": "virtio-scsi-common" ++ }, ++ { ++ "name": "input-barrier", ++ "parent": "object" ++ }, ++ { ++ "name": "cpu-cluster", ++ "parent": "device" ++ }, ++ { ++ "name": "i82557b", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "generic-sdhci", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "migration", ++ "parent": "device" ++ }, ++ { ++ "name": "i82557a", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vhost-user-scsi-pci-non-transitional", ++ "parent": "vhost-user-scsi-pci-base" ++ }, ++ { ++ "name": "chardev-udp", ++ "parent": "chardev" ++ }, ++ { ++ "name": "pc-q35-2.8-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "vmmouse", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "usb-tablet", ++ "parent": "usb-hid" ++ }, ++ { ++ "name": "virtio-scsi-pci-non-transitional", ++ "parent": "virtio-scsi-pci-base" ++ }, ++ { ++ "name": "Haswell-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "athlon-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "chardev-memory", ++ "parent": "chardev-ringbuf" ++ }, ++ { ++ "name": "EPYC-Rome-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "virtio-mouse-pci", ++ "parent": "virtio-mouse-pci-base-type" ++ }, ++ { ++ "name": "pc-q35-5.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pc-i440fx-1.6-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "vhost-user-vga", ++ "parent": "vhost-user-vga-base-type" ++ }, ++ { ++ "name": "Opteron_G2-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Broadwell-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "usb-braille", ++ "parent": "usb-serial-dev" ++ }, ++ { ++ "name": "EPYC-IBPB-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ib700", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "amd-iommu", ++ "parent": "x86-iommu" ++ }, ++ { ++ "name": "virtio-9p-pci-non-transitional", ++ "parent": "virtio-9p-pci-base" ++ }, ++ { ++ "name": "Nehalem-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "memory-backend-file", ++ "parent": "memory-backend" ++ }, ++ { ++ "name": "isa-pcspk", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "vhost-vsock-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "sd-card", ++ "parent": "device" ++ }, ++ { ++ "name": "isabus-bridge", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "sysbus-ahci", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "vhost-scsi", ++ "parent": "vhost-scsi-common" ++ }, ++ { ++ "name": "pc-q35-4.0.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "esp", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "virtio-blk-pci-non-transitional", ++ "parent": "virtio-blk-pci-base" ++ }, ++ { ++ "name": "ne2k_pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "IvyBridge-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "usb-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "ide-cd", ++ "parent": "ide-device" ++ }, ++ { ++ "name": "tcg-accel", ++ "parent": "accel" ++ }, ++ { ++ "name": "virtio-balloon-pci", ++ "parent": "virtio-balloon-pci-base" ++ }, ++ { ++ "name": "qemu:memory-region", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-gpu-device", ++ "parent": "virtio-gpu-base" ++ }, ++ { ++ "name": "e1000", ++ "parent": "e1000-base" ++ }, ++ { ++ "name": "Cascadelake-Server-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "athlon-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "nec-usb-xhci", ++ "parent": "base-xhci" ++ }, ++ { ++ "name": "pc-i440fx-2.6-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "i82551", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "isa-ipmi-kcs", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "EPYC-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "SandyBridge-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "piix4-ide", ++ "parent": "pci-ide" ++ }, ++ { ++ "name": "nvme", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vmxnet3", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vhost-user-backend", ++ "parent": "object" ++ }, ++ { ++ "name": "mioe3680_pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "i82550", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Conroe-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ES1370", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "kvm-apic", ++ "parent": "apic-common" ++ }, ++ { ++ "name": "Icelake-Server-noTSX-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "isa-pit", ++ "parent": "pit-common" ++ }, ++ { ++ "name": "kvm64-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Broadwell-v4-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "memory-backend-memfd", ++ "parent": "memory-backend" ++ }, ++ { ++ "name": "smbus-eeprom", ++ "parent": "smbus-device" ++ }, ++ { ++ "name": "virtio-serial-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "Denverton-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-user-gpu-pci", ++ "parent": "vhost-user-gpu-pci-base-type" ++ }, ++ { ++ "name": "virtio-crypto-pci", ++ "parent": "virtio-crypto-pci-base-type" ++ }, ++ { ++ "name": "iothread", ++ "parent": "object" ++ }, ++ { ++ "name": "i8042", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "System", ++ "parent": "bus" ++ }, ++ { ++ "name": "virtio-iommu-pci-transitional", ++ "parent": "virtio-iommu-device-base" ++ }, ++ { ++ "name": "pc-1.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "ati-vga", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pentium3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvm-i8259", ++ "parent": "pic-common" ++ }, ++ { ++ "name": "isa-serial", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "imx.usbphy", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "core2duo-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "cirrus-vga", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "kvm32-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-2.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "Skylake-Client-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "i82559er", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-rng-pci-non-transitional", ++ "parent": "virtio-rng-pci-base" ++ }, ++ { ++ "name": "virtio-serial-pci", ++ "parent": "virtio-serial-pci-base" ++ }, ++ { ++ "name": "Opteron_G3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "am53c974", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "container", ++ "parent": "object" ++ }, ++ { ++ "name": "EPYC-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "scsi-cd", ++ "parent": "scsi-disk-base" ++ }, ++ { ++ "name": "486-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vmport", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "vhost-user-blk-pci-non-transitional", ++ "parent": "vhost-user-blk-pci-base" ++ }, ++ { ++ "name": "isa-ide", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "qemu64-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "e1000-82545em", ++ "parent": "e1000-base" ++ }, ++ { ++ "name": "virtio-serial-pci-non-transitional", ++ "parent": "virtio-serial-pci-base" ++ }, ++ { ++ "name": "ICH9 SMB", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "sdhci-pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pxb-pcie-bus", ++ "parent": "PCIE" ++ }, ++ { ++ "name": "vhost-user-scsi", ++ "parent": "vhost-scsi-common" ++ }, ++ { ++ "name": "PIIX4_PM", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-rng-pci-transitional", ++ "parent": "virtio-rng-pci-base" ++ }, ++ { ++ "name": "EPYC-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "usb-bot", ++ "parent": "usb-storage-dev" ++ }, ++ { ++ "name": "pc-q35-2.12-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "VGA", ++ "parent": "pci-vga" ++ }, ++ { ++ "name": "qio-channel-buffer", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "i440FX", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Penryn-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-vsock-pci-transitional", ++ "parent": "vhost-vsock-pci-base" ++ }, ++ { ++ "name": "hpet", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "Conroe-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-user-fs-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "pc-i440fx-3.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pci-serial-4x", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Icelake-Server-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "apic", ++ "parent": "apic-common" ++ }, ++ { ++ "name": "sga", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "Opteron_G5-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-q35-2.6-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pci-ohci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-tablet-device", ++ "parent": "virtio-input-hid-device" ++ }, ++ { ++ "name": "Haswell-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ccid-card-passthru", ++ "parent": "ccid-card" ++ }, ++ { ++ "name": "pc-i440fx-1.4-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "chardev-parallel", ++ "parent": "chardev" ++ }, ++ { ++ "name": "chardev-vc", ++ "parent": "chardev" ++ }, ++ { ++ "name": "cryptodev-backend", ++ "parent": "object" ++ }, ++ { ++ "name": "isapc-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "ide-drive", ++ "parent": "ide-device" ++ }, ++ { ++ "name": "cryptodev-vhost-user", ++ "parent": "cryptodev-backend" ++ }, ++ { ++ "name": "tpm-emulator", ++ "parent": "tpm-backend" ++ }, ++ { ++ "name": "i8257", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "usb-uas", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "IvyBridge-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "SandyBridge-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-2.9-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "ivshmem-plain", ++ "parent": "ivshmem-common" ++ }, ++ { ++ "name": "virtio-keyboard-pci", ++ "parent": "virtio-keyboard-pci-base-type" ++ }, ++ { ++ "name": "pcnet", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Dhyana-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "sysbus-fdc", ++ "parent": "base-sysbus-fdc" ++ }, ++ { ++ "name": "i82559c", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "AMDVI-PCI", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "filter-redirector", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "virtserialport", ++ "parent": "virtio-serial-port" ++ }, ++ { ++ "name": "ipoctal232", ++ "parent": "ipack-device" ++ }, ++ { ++ "name": "usb-mouse", ++ "parent": "usb-hid" ++ }, ++ { ++ "name": "Nehalem-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "i82559b", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "ccid-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "ide-hd", ++ "parent": "ide-device" ++ }, ++ { ++ "name": "Broadwell-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Snowridge-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvaser_pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vhost-user-scsi-pci", ++ "parent": "vhost-user-scsi-pci-base" ++ }, ++ { ++ "name": "i82559a", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "dbus-vmstate", ++ "parent": "object" ++ }, ++ { ++ "name": "pc-i440fx-4.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pc-1.3-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "chardev-spiceport", ++ "parent": "chardev-spice" ++ }, ++ { ++ "name": "e1000-82544gc", ++ "parent": "e1000-base" ++ }, ++ { ++ "name": "qio-channel-command", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "Opteron_G3-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "usb-ccid", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "tls-creds-x509", ++ "parent": "tls-creds" ++ }, ++ { ++ "name": "virtio-blk-pci", ++ "parent": "virtio-blk-pci-base" ++ }, ++ { ++ "name": "pc-i440fx-2.4-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "port92", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "isa-cirrus-vga", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "qemu64-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Skylake-Server-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qio-net-listener", ++ "parent": "object" ++ }, ++ { ++ "name": "pc-q35-4.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "mc146818rtc", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "vfio-pci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "bochs-display", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Broadwell-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qio-channel-websock", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "edu", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pc-testdev", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "SUNW,fdtwo", ++ "parent": "base-sysbus-fdc" ++ }, ++ { ++ "name": "megasas", ++ "parent": "megasas-base" ++ }, ++ { ++ "name": "vmcoreinfo", ++ "parent": "device" ++ }, ++ { ++ "name": "virtio-iommu-pci", ++ "parent": "virtio-iommu-device-base" ++ }, ++ { ++ "name": "Icelake-Client-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "tpci200", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "chardev-braille", ++ "parent": "chardev" ++ }, ++ { ++ "name": "rocker", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "qio-channel-file", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "gpio_i2c", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "qio-channel-socket", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "filter-mirror", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "coreduo-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-q35-3.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "Icelake-Server-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qemu-console", ++ "parent": "object" ++ }, ++ { ++ "name": "input-linux", ++ "parent": "object" ++ }, ++ { ++ "name": "Haswell-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pxb", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "usb-ehci", ++ "parent": "pci-ehci-usb" ++ }, ++ { ++ "name": "host-x86_64-cpu", ++ "parent": "max-x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-2.11-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "AC97", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vmgenid", ++ "parent": "device" ++ }, ++ { ++ "name": "serial-io", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "secret", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-net-pci-non-transitional", ++ "parent": "virtio-net-pci-base" ++ }, ++ { ++ "name": "cs4231a", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "chardev-socket", ++ "parent": "chardev" ++ }, ++ { ++ "name": "scsi-hd", ++ "parent": "scsi-disk-base" ++ }, ++ { ++ "name": "usb-kbd", ++ "parent": "usb-hid" ++ }, ++ { ++ "name": "lsi53c810", ++ "parent": "lsi53c895a" ++ }, ++ { ++ "name": "isa-fdc", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "usb-mtp", ++ "parent": "usb-device" ++ }, ++ { ++ "name": "filter-replay", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "virtio-net-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "pc-q35-2.9-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "tpm-tis", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "Skylake-Server-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "hyperv-testdev", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "s3c-sdhci", ++ "parent": "generic-sdhci" ++ }, ++ { ++ "name": "fw_cfg_mem", ++ "parent": "fw_cfg" ++ }, ++ { ++ "name": "virtio-iommu-pci-non-transitional", ++ "parent": "virtio-iommu-device-base" ++ }, ++ { ++ "name": "ccid-card-emulated", ++ "parent": "ccid-card" ++ }, ++ { ++ "name": "Westmere-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-1.7-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "virtio-pmem", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "virtio-mouse-device", ++ "parent": "virtio-input-hid-device" ++ }, ++ { ++ "name": "virtconsole", ++ "parent": "virtserialport" ++ }, ++ { ++ "name": "ioh3420", ++ "parent": "pcie-root-port-base" ++ }, ++ { ++ "name": "Skylake-Client-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "throttle-group", ++ "parent": "object" ++ }, ++ { ++ "name": "piix4-usb-uhci", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "pc-q35-2.10-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "virtio-rng-pci", ++ "parent": "virtio-rng-pci-base" ++ }, ++ { ++ "name": "chardev-gdb", ++ "parent": "chardev" ++ }, ++ { ++ "name": "virtio-scsi-pci-transitional", ++ "parent": "virtio-scsi-pci-base" ++ }, ++ { ++ "name": "Skylake-Client-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Cascadelake-Server-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pci-testdev", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vhost-user-input", ++ "parent": "virtio-input-device" ++ }, ++ { ++ "name": "vt82c686b-usb-uhci", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "ich9-intel-hda", ++ "parent": "intel-hda-generic" ++ }, ++ { ++ "name": "PIIX3", ++ "parent": "pci-piix3" ++ }, ++ { ++ "name": "Icelake-Client-noTSX-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-q35-2.4-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "virtio-9p-pci", ++ "parent": "virtio-9p-pci-base" ++ }, ++ { ++ "name": "ISA", ++ "parent": "bus" ++ }, ++ { ++ "name": "phenom-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-vsock-pci", ++ "parent": "vhost-vsock-pci-base" ++ }, ++ { ++ "name": "pc-dimm", ++ "parent": "device" ++ }, ++ { ++ "name": "virtio-balloon-pci-non-transitional", ++ "parent": "virtio-balloon-pci-base" ++ }, ++ { ++ "name": "virtio-net-pci-transitional", ++ "parent": "virtio-net-pci-base" ++ }, ++ { ++ "name": "ipmi-bmc-sim", ++ "parent": "ipmi-bmc" ++ }, ++ { ++ "name": "IvyBridge-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "irq", ++ "parent": "object" ++ }, ++ { ++ "name": "tls-creds-psk", ++ "parent": "tls-creds" ++ }, ++ { ++ "name": "coreduo-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "usb-storage", ++ "parent": "usb-storage-dev" ++ }, ++ { ++ "name": "vhost-user-blk-pci-transitional", ++ "parent": "vhost-user-blk-pci-base" ++ }, ++ { ++ "name": "chardev-msmouse", ++ "parent": "chardev" ++ }, ++ { ++ "name": "pc-i440fx-2.7-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "vhost-scsi-pci-transitional", ++ "parent": "vhost-scsi-pci-base" ++ }, ++ { ++ "name": "isa-i8259", ++ "parent": "pic-common" ++ }, ++ { ++ "name": "Skylake-Client-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "colo-compare", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-mmio", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "pxb-bus", ++ "parent": "PCI" ++ }, ++ { ++ "name": "pentium2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Broadwell-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qemu-xhci", ++ "parent": "base-xhci" ++ }, ++ { ++ "name": "n270-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pvpanic", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "rng-random", ++ "parent": "rng-backend" ++ }, ++ { ++ "name": "KnightsMill-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvmvapic", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "Nehalem-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Opteron_G2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "megasas-gen2", ++ "parent": "megasas-base" ++ }, ++ { ++ "name": "vhost-user-blk-pci", ++ "parent": "vhost-user-blk-pci-base" ++ }, ++ { ++ "name": "authz-simple", ++ "parent": "authz" ++ }, ++ { ++ "name": "fw_cfg_io", ++ "parent": "fw_cfg" ++ }, ++ { ++ "name": "intel-iommu", ++ "parent": "x86-iommu" ++ }, ++ { ++ "name": "none-machine", ++ "parent": "machine" ++ }, ++ { ++ "name": "HDA", ++ "parent": "bus" ++ }, ++ { ++ "name": "Broadwell-noTSX-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-1.1-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "Snowridge-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "IvyBridge-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qxl", ++ "parent": "pci-qxl" ++ }, ++ { ++ "name": "cryptodev-backend-builtin", ++ "parent": "cryptodev-backend" ++ }, ++ { ++ "name": "vfio-pci-igd-lpc-bridge", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-2.2-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "qio-dns-resolver", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-balloon-pci-transitional", ++ "parent": "virtio-balloon-pci-base" ++ }, ++ { ++ "name": "Haswell-v4-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "i82801b11-bridge", ++ "parent": "base-pci-bridge" ++ }, ++ { ++ "name": "virtio-keyboard-device", ++ "parent": "virtio-input-hid-device" ++ }, ++ { ++ "name": "ramfb", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "hda-output", ++ "parent": "hda-audio" ++ }, ++ { ++ "name": "virtio-input-host-device", ++ "parent": "virtio-input-device" ++ }, ++ { ++ "name": "IndustryPack", ++ "parent": "bus" ++ }, ++ { ++ "name": "Broadwell-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ioapic", ++ "parent": "ioapic-common" ++ }, ++ { ++ "name": "pentium-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qemu32-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Haswell-noTSX-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pci-serial", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "sysbus-ohci", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "kvm-accel", ++ "parent": "accel" ++ }, ++ { ++ "name": "vhost-scsi-pci-non-transitional", ++ "parent": "vhost-scsi-pci-base" ++ }, ++ { ++ "name": "Denverton-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "piix3-usb-uhci", ++ "parent": "pci-uhci-usb" ++ }, ++ { ++ "name": "Opteron_G4-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "ne2k_isa", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "virtio-iommu-memory-region", ++ "parent": "qemu:iommu-memory-region" ++ }, ++ { ++ "name": "phenom-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "adlib", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "vhost-user-gpu", ++ "parent": "virtio-gpu-base" ++ }, ++ { ++ "name": "hda-duplex", ++ "parent": "hda-audio" ++ }, ++ { ++ "name": "pentium-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "amd-iommu-iommu-memory-region", ++ "parent": "qemu:iommu-memory-region" ++ }, ++ { ++ "name": "can-bus", ++ "parent": "object" ++ }, ++ { ++ "name": "Nehalem-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Cascadelake-Server-v3-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "cfi.pflash01", ++ "parent": "sys-bus-device" ++ }, ++ { ++ "name": "virtio-balloon-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "Skylake-Server-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Cooperlake-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-q35-2.7-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "isa-parallel", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "pentium2-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "chardev-null", ++ "parent": "chardev" ++ }, ++ { ++ "name": "isa-vga", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "EPYC-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pc-i440fx-1.5-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "i440FX-pcihost", ++ "parent": "pci-host-bridge" ++ }, ++ { ++ "name": "isa-debugcon", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "tls-creds-anon", ++ "parent": "tls-creds" ++ }, ++ { ++ "name": "rng-egd", ++ "parent": "rng-backend" ++ }, ++ { ++ "name": "ivshmem-doorbell", ++ "parent": "ivshmem-common" ++ }, ++ { ++ "name": "i82558b", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "Cascadelake-Server-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qxl-vga", ++ "parent": "pci-qxl" ++ }, ++ { ++ "name": "virtio-iommu-device", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "PIIX3-xen", ++ "parent": "pci-piix3" ++ }, ++ { ++ "name": "virtio-net-pci", ++ "parent": "virtio-net-pci-base" ++ }, ++ { ++ "name": "i82558a", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "usb-serial", ++ "parent": "usb-serial-dev" ++ }, ++ { ++ "name": "loader", ++ "parent": "device" ++ }, ++ { ++ "name": "pvscsi", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "i82801", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "virtio-pmem-pci", ++ "parent": "virtio-pmem-pci-base" ++ }, ++ { ++ "name": "accel", ++ "parent": "object" ++ }, ++ { ++ "name": "virtio-tablet-pci", ++ "parent": "virtio-tablet-pci-base-type" ++ }, ++ { ++ "name": "dc390", ++ "parent": "am53c974" ++ }, ++ { ++ "name": "i6300esb", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "floppy", ++ "parent": "device" ++ }, ++ { ++ "name": "authz-list", ++ "parent": "authz" ++ }, ++ { ++ "name": "pc-i440fx-4.2-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "Opteron_G4-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "mptsas1068", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "vhost-user-fs-pci", ++ "parent": "vhost-user-fs-pci-base" ++ }, ++ { ++ "name": "sb16", ++ "parent": "isa-device" ++ }, ++ { ++ "name": "ich9-ahci", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pc-i440fx-2.5-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "Westmere-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-user-scsi-pci-transitional", ++ "parent": "vhost-user-scsi-pci-base" ++ }, ++ { ++ "name": "chardev-pipe", ++ "parent": "chardev-fd" ++ }, ++ { ++ "name": "i2c-ddc", ++ "parent": "i2c-slave" ++ }, ++ { ++ "name": "can-host-socketcan", ++ "parent": "can-host" ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "i82562", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "pc-q35-4.2-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pci-bridge-seat", ++ "parent": "pci-bridge" ++ }, ++ { ++ "name": "lsi53c895a", ++ "parent": "pci-device" ++ }, ++ { ++ "name": "kvm32-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "SandyBridge-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "intel-hda", ++ "parent": "intel-hda-generic" ++ }, ++ { ++ "name": "scsi-block", ++ "parent": "scsi-disk-base" ++ }, ++ { ++ "name": "hyperv-synic", ++ "parent": "device" ++ }, ++ { ++ "name": "chardev-mux", ++ "parent": "chardev" ++ }, ++ { ++ "name": "Opteron_G1-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "IDE", ++ "parent": "bus" ++ }, ++ { ++ "name": "486-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "pcie-root-port", ++ "parent": "pcie-root-port-base" ++ }, ++ { ++ "name": "base-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "kvm64-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Snowridge-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "chardev-spicevmc", ++ "parent": "chardev-spice" ++ }, ++ { ++ "name": "q35-pcihost", ++ "parent": "pcie-host-bridge" ++ }, ++ { ++ "name": "pc-i440fx-2.0-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "pc-i440fx-2.12-machine", ++ "parent": "generic-pc-machine" ++ }, ++ { ++ "name": "SCSI", ++ "parent": "bus" ++ }, ++ { ++ "name": "hda-micro", ++ "parent": "hda-audio" ++ }, ++ { ++ "name": "Penryn-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "Dhyana-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "piix3-ide-xen", ++ "parent": "pci-ide" ++ }, ++ { ++ "name": "rng-builtin", ++ "parent": "rng-backend" ++ }, ++ { ++ "name": "sd-bus", ++ "parent": "bus" ++ }, ++ { ++ "name": "filter-dump", ++ "parent": "netfilter" ++ }, ++ { ++ "name": "virtio-pci-bus", ++ "parent": "virtio-bus" ++ }, ++ { ++ "name": "smbus-ipmi", ++ "parent": "smbus-device" ++ }, ++ { ++ "name": "chardev-ringbuf", ++ "parent": "chardev" ++ }, ++ { ++ "name": "Skylake-Server-v1-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "vhost-user-blk", ++ "parent": "virtio-device" ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "SandyBridge-v2-x86_64-cpu", ++ "parent": "x86_64-cpu" ++ }, ++ { ++ "name": "qio-channel-tls", ++ "parent": "qio-channel" ++ }, ++ { ++ "name": "virtio-vga", ++ "parent": "virtio-vga-base-type" ++ }, ++ { ++ "name": "authz-pam", ++ "parent": "authz" ++ } ++ ], ++ "id": "libvirt-6" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-blk-pci" ++ }, ++ "id": "libvirt-7" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "ats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-ignore-backend-features", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-pm-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-flr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnkctl-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "page-per-vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-deverr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "virtio-pci-bus-master-bug-migration", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "modern-pio-notify", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-disable-pcie", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "vectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "ioeventfd", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "class", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "disable-legacy", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-modern", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "share-rw", ++ "type": "bool" ++ }, ++ { ++ "default-value": 256, ++ "name": "queue-size", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "lcyls", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "lsecs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "heads", ++ "type": "uint32" ++ }, ++ { ++ "name": "iothread", ++ "type": "link" ++ }, ++ { ++ "default-value": 0, ++ "name": "lheads", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 1, ++ "name": "num-queues", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "cyls", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "secs", ++ "type": "uint32" ++ }, ++ { ++ "name": "virtio-backend", ++ "type": "child" ++ }, ++ { ++ "default-value": 0, ++ "name": "min_io_size", ++ "type": "uint16" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ }, ++ { ++ "default-value": true, ++ "name": "config-wce", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "seg-max-adjust", ++ "type": "bool" ++ }, ++ { ++ "name": "drive", ++ "description": "Node name or ID of a block device to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": "auto", ++ "name": "werror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": "auto", ++ "name": "rerror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": "auto", ++ "name": "write-cache", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "physical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": false, ++ "name": "scsi", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "opt_io_size", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "logical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 4194303, ++ "name": "max-discard-sectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "discard", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "discard_granularity", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "request-merging", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "write-zeroes", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4194303, ++ "name": "max-write-zeroes-sectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-enable-wce-if-config-wce", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "serial", ++ "type": "str" ++ } ++ ], ++ "id": "libvirt-7" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-net-pci" ++ }, ++ "id": "libvirt-8" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "ats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-ignore-backend-features", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-pm-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-flr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnkctl-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "page-per-vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-deverr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "virtio-pci-bus-master-bug-migration", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "modern-pio-notify", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-disable-pcie", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 3, ++ "name": "vectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "ioeventfd", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "disable-legacy", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-modern", ++ "type": "bool" ++ }, ++ { ++ "name": "mac", ++ "description": "Ethernet 6-byte MAC Address, example: 52:54:00:12:34:56", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "gso", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 150000, ++ "name": "x-txtimer", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "mq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "mrg_rxbuf", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 256, ++ "name": "x-txburst", ++ "type": "int32" ++ }, ++ { ++ "default-value": 0, ++ "name": "host_mtu", ++ "type": "uint16" ++ }, ++ { ++ "name": "tx", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "status", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "failover", ++ "type": "bool" ++ }, ++ { ++ "name": "virtio-backend", ++ "type": "child" ++ }, ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_mac_addr", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 256, ++ "name": "tx_queue_size", ++ "type": "uint16" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_tso4", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "host_tso6", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_guest_offloads", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_ufo", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_ecn", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "host_ufo", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "host_ecn", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "guest_rsc_ext", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "duplex", ++ "type": "str" ++ }, ++ { ++ "default-value": 300000, ++ "name": "rsc_interval", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_announce", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "netdev", ++ "description": "ID of a netdev to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "host_tso4", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-mtu-bypass-backend", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_rx_extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_csum", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 256, ++ "name": "rx_queue_size", ++ "type": "uint16" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_vlan", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "guest_tso6", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": -1, ++ "name": "speed", ++ "type": "int32" ++ }, ++ { ++ "default-value": true, ++ "name": "csum", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "ctrl_rx", ++ "description": "on/off", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-8" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-scsi-pci" ++ }, ++ "id": "libvirt-9" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "ats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-ignore-backend-features", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-pm-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-flr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnkctl-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "page-per-vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-deverr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "virtio-pci-bus-master-bug-migration", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "modern-pio-notify", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-disable-pcie", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "vectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "ioeventfd", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "disable-legacy", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-modern", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "hotplug", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "num_queues", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 65535, ++ "name": "max_sectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "iothread", ++ "type": "link" ++ }, ++ { ++ "default-value": true, ++ "name": "param_change", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": 256, ++ "name": "virtqueue_size", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "seg_max_adjust", ++ "type": "bool" ++ }, ++ { ++ "default-value": 128, ++ "name": "cmd_per_lun", ++ "type": "uint32" ++ }, ++ { ++ "name": "virtio-backend", ++ "type": "child" ++ } ++ ], ++ "id": "libvirt-9" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-net-ccw" ++ }, ++ "id": "libvirt-10" ++} ++ ++{ ++ "id": "libvirt-10", ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "Device 'virtio-net-ccw' not found" ++ } ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-scsi-ccw" ++ }, ++ "id": "libvirt-11" ++} ++ ++{ ++ "id": "libvirt-11", ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "Device 'virtio-scsi-ccw' not found" ++ } ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-net-s390" ++ }, ++ "id": "libvirt-12" ++} ++ ++{ ++ "id": "libvirt-12", ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "Device 'virtio-net-s390' not found" ++ } ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "vfio-pci" ++ }, ++ "id": "libvirt-13" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-kvm-msix", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-mmap", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "yres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "x-vga", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": "off", ++ "name": "x-msix-relocation", ++ "description": "off/auto/bar0/bar1/bar2/bar3/bar4/bar5", ++ "type": "OffAutoPCIBAR" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-vfio-ioeventfd", ++ "type": "bool" ++ }, ++ { ++ "name": "sysfsdev", ++ "type": "str" ++ }, ++ { ++ "name": "host", ++ "description": "Address (bus/device/function) of the host device, example: 04:10.0", ++ "type": "str" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "x-pci-device-id", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-kvm-msi", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "x-pci-sub-vendor-id", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-geforce-quirks", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-req", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "x-igd-gms", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 1100, ++ "name": "x-intx-mmap-timeout-ms", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-kvm-intx", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-no-kvm-ioeventfd", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "x-pci-sub-device-id", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "off", ++ "name": "display", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "x-igd-opregion", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "x-nv-gpudirect-clique", ++ "description": "NVIDIA GPUDirect Clique ID (0 - 15)", ++ "type": "uint4" ++ }, ++ { ++ "default-value": 0, ++ "name": "xres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "x-pci-vendor-id", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "x-balloon-allowed", ++ "type": "bool" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ } ++ ], ++ "id": "libvirt-13" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-hd" ++ }, ++ "id": "libvirt-14" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": 4294967295, ++ "name": "scsi-id", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "lun", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "channel", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "lsecs", ++ "type": "uint32" ++ }, ++ { ++ "name": "device_id", ++ "type": "str" ++ }, ++ { ++ "default-value": 0, ++ "name": "logical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 2147483647, ++ "name": "max_io_size", ++ "type": "uint64" ++ }, ++ { ++ "default-value": false, ++ "name": "dpofua", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "drive", ++ "description": "Node name or ID of a block device to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": 0, ++ "name": "lheads", ++ "type": "uint32" ++ }, ++ { ++ "name": "serial", ++ "type": "str" ++ }, ++ { ++ "name": "ver", ++ "type": "str" ++ }, ++ { ++ "default-value": "auto", ++ "name": "write-cache", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "share-rw", ++ "type": "bool" ++ }, ++ { ++ "default-value": 5, ++ "name": "scsi_version", ++ "type": "int32" ++ }, ++ { ++ "default-value": false, ++ "name": "removable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "wwn", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "discard_granularity", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "heads", ++ "type": "uint32" ++ }, ++ { ++ "name": "vendor", ++ "type": "str" ++ }, ++ { ++ "default-value": 1073741824, ++ "name": "max_unmap_size", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 0, ++ "name": "cyls", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "lcyls", ++ "type": "uint32" ++ }, ++ { ++ "name": "product", ++ "type": "str" ++ }, ++ { ++ "default-value": 0, ++ "name": "opt_io_size", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "rerror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": 0, ++ "name": "secs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "rotation_rate", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "min_io_size", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "physical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "port_wwn", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 0, ++ "name": "port_index", ++ "type": "uint16" ++ }, ++ { ++ "default-value": "auto", ++ "name": "werror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ } ++ ], ++ "id": "libvirt-14" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "ide-hd" ++ }, ++ "id": "libvirt-15" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": 4294967295, ++ "name": "unit", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "logical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "lsecs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "rotation_rate", ++ "type": "uint16" ++ }, ++ { ++ "name": "drive", ++ "description": "Node name or ID of a block device to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": 0, ++ "name": "lheads", ++ "type": "uint32" ++ }, ++ { ++ "name": "serial", ++ "type": "str" ++ }, ++ { ++ "name": "ver", ++ "type": "str" ++ }, ++ { ++ "default-value": false, ++ "name": "share-rw", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "write-cache", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": 0, ++ "name": "wwn", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "discard_granularity", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "heads", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "cyls", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "lcyls", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "opt_io_size", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "rerror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": "auto", ++ "name": "bios-chs-trans", ++ "description": "Logical CHS translation algorithm, auto/none/lba/large/rechs", ++ "type": "BiosAtaTranslation" ++ }, ++ { ++ "name": "model", ++ "type": "str" ++ }, ++ { ++ "default-value": 0, ++ "name": "min_io_size", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "physical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "secs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "werror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ } ++ ], ++ "id": "libvirt-15" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "PIIX4_PM" ++ }, ++ "id": "libvirt-16" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "acpi-pci-hotplug-with-bridge-support", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "smb_io_base", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 2, ++ "name": "s4_val", ++ "type": "uint8" ++ }, ++ { ++ "default-value": 0, ++ "name": "disable_s3", ++ "type": "uint8" ++ }, ++ { ++ "default-value": true, ++ "name": "memory-hotplug-support", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "disable_s4", ++ "type": "uint8" ++ } ++ ], ++ "id": "libvirt-16" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "usb-redir" ++ }, ++ "id": "libvirt-17" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": true, ++ "name": "full-path", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "msos-desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "serial", ++ "type": "str" ++ }, ++ { ++ "name": "filter", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "streams", ++ "type": "bool" ++ }, ++ { ++ "name": "chardev", ++ "description": "ID of a chardev to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": 2, ++ "name": "debug", ++ "type": "uint8" ++ }, ++ { ++ "default-value": true, ++ "name": "suppress-remote-wake", ++ "type": "bool" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ }, ++ { ++ "name": "attached", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-17" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "i440FX-pcihost" ++ }, ++ "id": "libvirt-18" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": 2147483648, ++ "name": "pci-hole64-size", ++ "type": "size" ++ }, ++ { ++ "default-value": 0, ++ "name": "short_root_bus", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pci-hole64-fix", ++ "type": "bool" ++ }, ++ { ++ "name": "pci-hole-end", ++ "type": "uint32" ++ }, ++ { ++ "name": "pci-hole64-start", ++ "type": "uint64" ++ }, ++ { ++ "name": "pci-hole64-end", ++ "type": "uint64" ++ }, ++ { ++ "name": "pci-conf-idx[0]", ++ "type": "child" ++ }, ++ { ++ "name": "pci-conf-data[0]", ++ "type": "child" ++ }, ++ { ++ "name": "pci-hole-start", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-18" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "q35-pcihost" ++ }, ++ "id": "libvirt-19" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": 34359738368, ++ "name": "pci-hole64-size", ++ "type": "size" ++ }, ++ { ++ "default-value": 0, ++ "name": "below-4g-mem-size", ++ "type": "size" ++ }, ++ { ++ "default-value": 0, ++ "name": "short_root_bus", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pci-hole64-fix", ++ "type": "bool" ++ }, ++ { ++ "default-value": 2952790016, ++ "name": "MCFG", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 0, ++ "name": "above-4g-mem-size", ++ "type": "size" ++ }, ++ { ++ "name": "mcfg_size", ++ "type": "uint64" ++ }, ++ { ++ "name": "pci-hole64-end", ++ "type": "uint64" ++ }, ++ { ++ "name": "pci-mem", ++ "type": "link" ++ }, ++ { ++ "name": "pci-conf-data[0]", ++ "type": "child" ++ }, ++ { ++ "name": "pci-hole-start", ++ "type": "uint32" ++ }, ++ { ++ "name": "system-mem", ++ "type": "link" ++ }, ++ { ++ "name": "io-mem", ++ "type": "link" ++ }, ++ { ++ "name": "mch", ++ "type": "child" ++ }, ++ { ++ "name": "pci-hole-end", ++ "type": "uint32" ++ }, ++ { ++ "name": "pci-conf-idx[0]", ++ "type": "child" ++ }, ++ { ++ "name": "pci-hole64-start", ++ "type": "uint64" ++ }, ++ { ++ "name": "ram-mem", ++ "type": "link" ++ }, ++ { ++ "name": "pcie-mmcfg-mmio[0]", ++ "type": "child" ++ } ++ ], ++ "id": "libvirt-19" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "usb-storage" ++ }, ++ "id": "libvirt-20" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": true, ++ "name": "full-path", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "msos-desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "serial", ++ "type": "str" ++ }, ++ { ++ "default-value": "auto", ++ "name": "rerror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": 0, ++ "name": "min_io_size", ++ "type": "uint16" ++ }, ++ { ++ "default-value": false, ++ "name": "removable", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "share-rw", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "logical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": "auto", ++ "name": "write-cache", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": 0, ++ "name": "opt_io_size", ++ "type": "uint32" ++ }, ++ { ++ "name": "drive", ++ "description": "Node name or ID of a block device to use as a backend", ++ "type": "str" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "discard_granularity", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "physical_block_size", ++ "description": "A power of two between 512 and 32768", ++ "type": "uint16" ++ }, ++ { ++ "default-value": "auto", ++ "name": "werror", ++ "description": "Error handling policy, report/ignore/enospc/stop/auto", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ }, ++ { ++ "name": "attached", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-20" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "kvm-pit" ++ }, ++ "id": "libvirt-21" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": "delay", ++ "name": "lost_tick_policy", ++ "type": "LostTickPolicy" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "iobase", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-21" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "VGA" ++ }, ++ "id": "libvirt-22" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "global-vmstate", ++ "type": "bool" ++ }, ++ { ++ "default-value": 16, ++ "name": "vgamem_mb", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "qemu-extended-regs", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "mmio", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "ymax", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "yres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "xmax", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "edid", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "xres", ++ "type": "uint32" ++ }, ++ { ++ "name": "big-endian-framebuffer", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-22" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "vmware-svga" ++ }, ++ "id": "libvirt-23" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "global-vmstate", ++ "type": "bool" ++ }, ++ { ++ "default-value": 16, ++ "name": "vgamem_mb", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-23" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "qxl" ++ }, ++ "id": "libvirt-24" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "global-vmstate", ++ "type": "bool" ++ }, ++ { ++ "default-value": 16, ++ "name": "vgamem_mb", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "vram64_size_mb", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "vram_size_mb", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "debug", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "max_outputs", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 5, ++ "name": "revision", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "cmdlog", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "yres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "ram_size_mb", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 67108864, ++ "name": "ram_size", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 67108864, ++ "name": "vram_size", ++ "type": "uint64" ++ }, ++ { ++ "default-value": 0, ++ "name": "guestdebug", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "xres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 1024, ++ "name": "surfaces", ++ "type": "int32" ++ } ++ ], ++ "id": "libvirt-24" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-gpu-pci" ++ }, ++ "id": "libvirt-25" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "ats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-ignore-backend-features", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-pm-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-flr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnkctl-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "page-per-vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-deverr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "virtio-pci-bus-master-bug-migration", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "modern-pio-notify", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-disable-pcie", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 3, ++ "name": "vectors", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "ioeventfd", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "disable-legacy", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-modern", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 768, ++ "name": "yres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "stats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "edid", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 268435456, ++ "name": "max_hostmem", ++ "type": "size" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "max_outputs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "virgl", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1024, ++ "name": "xres", ++ "type": "uint32" ++ }, ++ { ++ "name": "virtio-backend", ++ "type": "child" ++ } ++ ], ++ "id": "libvirt-25" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-gpu-device" ++ }, ++ "id": "libvirt-26" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1024, ++ "name": "xres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": false, ++ "name": "stats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "edid", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 768, ++ "name": "yres", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 1, ++ "name": "max_outputs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 268435456, ++ "name": "max_hostmem", ++ "type": "size" ++ }, ++ { ++ "default-value": true, ++ "name": "virgl", ++ "description": "on/off", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-26" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "ICH9-LPC" ++ }, ++ "id": "libvirt-27" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "noreboot", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-smi-broadcast", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "enable_tco", ++ "type": "bool" ++ }, ++ { ++ "name": "cpu-hotplug-legacy", ++ "type": "bool" ++ }, ++ { ++ "name": "acpi_enable_cmd", ++ "type": "uint8" ++ }, ++ { ++ "name": "disable_s3", ++ "type": "uint8" ++ }, ++ { ++ "name": "disable_s4", ++ "type": "uint8" ++ }, ++ { ++ "name": "acpi_disable_cmd", ++ "type": "uint8" ++ }, ++ { ++ "name": "memory-hotplug-support", ++ "type": "bool" ++ }, ++ { ++ "name": "gpe0_blk_len", ++ "type": "uint32" ++ }, ++ { ++ "name": "sci_int", ++ "type": "uint8" ++ }, ++ { ++ "name": "gpe0_blk", ++ "type": "uint32" ++ }, ++ { ++ "name": "s4_val", ++ "type": "uint8" ++ }, ++ { ++ "name": "pm_io_base", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-27" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-balloon-pci" ++ }, ++ "id": "libvirt-28" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-extra", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "ats", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-ignore-backend-features", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-pm-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-flr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnkctl-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "page-per-vq", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-deverr-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "virtio-pci-bus-master-bug-migration", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "modern-pio-notify", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-disable-pcie", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "class", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "disable-legacy", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-modern", ++ "type": "bool" ++ }, ++ { ++ "name": "guest-stats", ++ "type": "guest statistics" ++ }, ++ { ++ "name": "guest-stats-polling-interval", ++ "type": "int" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "iothread", ++ "type": "link" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "virtio-backend", ++ "type": "child" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "free-page-hint", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "qemu-4-0-config-size", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "deflate-on-oom", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-28" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-balloon-ccw" ++ }, ++ "id": "libvirt-29" ++} ++ ++{ ++ "id": "libvirt-29", ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "Device 'virtio-balloon-ccw' not found" ++ } ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "virtio-balloon-device" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": false, ++ "name": "packed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-disabled-flag", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "iommu_platform", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "event_idx", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "notify_on_empty", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "any_layout", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "use-started", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "indirect_desc", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "iothread", ++ "type": "link" ++ }, ++ { ++ "default-value": false, ++ "name": "deflate-on-oom", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "free-page-hint", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "qemu-4-0-config-size", ++ "type": "bool" ++ }, ++ { ++ "name": "guest-stats-polling-interval", ++ "type": "int" ++ }, ++ { ++ "name": "guest-stats", ++ "type": "guest statistics" ++ } ++ ], ++ "id": "libvirt-30" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "nec-usb-xhci" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4, ++ "name": "p3", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "streams", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 4, ++ "name": "p2", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "auto", ++ "name": "msi", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": "auto", ++ "name": "msix", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": false, ++ "name": "force-pcie-endcap", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "superspeed-ports-first", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 16, ++ "name": "intrs", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 64, ++ "name": "slots", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "intel-iommu" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "return": [ ++ { ++ "default-value": true, ++ "name": "pt", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "device-iotlb", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "intremap", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": true, ++ "name": "dma-drain", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "caching-mode", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-buggy-eim", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "x-scalable-mode", ++ "type": "bool" ++ }, ++ { ++ "default-value": 39, ++ "name": "aw-bits", ++ "type": "uint8" ++ }, ++ { ++ "default-value": "auto", ++ "name": "eim", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "default-value": 0, ++ "name": "version", ++ "type": "uint32" ++ } ++ ], ++ "id": "libvirt-32" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "mch" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "smbase-smram", ++ "type": "bool" ++ }, ++ { ++ "default-value": 16, ++ "name": "extended-tseg-mbytes", ++ "type": "uint16" ++ } ++ ], ++ "id": "libvirt-33" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "nvdimm" ++ }, ++ "id": "libvirt-34" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "memdev", ++ "type": "link" ++ }, ++ { ++ "default-value": 0, ++ "name": "node", ++ "type": "uint32" ++ }, ++ { ++ "default-value": 0, ++ "name": "addr", ++ "type": "uint64" ++ }, ++ { ++ "default-value": -1, ++ "name": "slot", ++ "type": "int32" ++ }, ++ { ++ "default-value": false, ++ "name": "unarmed", ++ "type": "bool" ++ }, ++ { ++ "name": "uuid", ++ "type": "QemuUUID" ++ }, ++ { ++ "name": "label-size", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "uint64" ++ } ++ ], ++ "id": "libvirt-34" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "pcie-root-port" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "romfile", ++ "type": "str" ++ }, ++ { ++ "default-value": -1, ++ "name": "addr", ++ "description": "Slot and optional function number, example: 06.0 or 06", ++ "type": "int32" ++ }, ++ { ++ "name": "failover_pair_id", ++ "type": "str" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-lnksta-dllla", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 1, ++ "name": "rombar", ++ "type": "uint32" ++ }, ++ { ++ "default-value": true, ++ "name": "x-pcie-extcap-init", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "multifunction", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "port", ++ "type": "uint8" ++ }, ++ { ++ "default-value": 8, ++ "name": "aer_log_max", ++ "type": "uint16" ++ }, ++ { ++ "default-value": true, ++ "name": "hotplug", ++ "type": "bool" ++ }, ++ { ++ "default-value": 0, ++ "name": "slot", ++ "type": "uint16" ++ }, ++ { ++ "default-value": 0, ++ "name": "chassis", ++ "type": "uint8" ++ }, ++ { ++ "default-value": true, ++ "name": "power_controller_present", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": false, ++ "name": "disable-acs", ++ "type": "bool" ++ }, ++ { ++ "default-value": 18446744073709551615, ++ "name": "mem-reserve", ++ "type": "size" ++ }, ++ { ++ "default-value": 18446744073709551615, ++ "name": "pref64-reserve", ++ "type": "size" ++ }, ++ { ++ "default-value": 4294967295, ++ "name": "bus-reserve", ++ "type": "uint32" ++ }, ++ { ++ "default-value": "32", ++ "name": "x-width", ++ "description": "1/2/4/8/12/16/32", ++ "type": "PCIELinkWidth" ++ }, ++ { ++ "default-value": true, ++ "name": "x-migrate-msix", ++ "type": "bool" ++ }, ++ { ++ "default-value": 18446744073709551615, ++ "name": "io-reserve", ++ "type": "size" ++ }, ++ { ++ "default-value": "16", ++ "name": "x-speed", ++ "description": "2_5/5/8/16", ++ "type": "PCIELinkSpeed" ++ }, ++ { ++ "default-value": 18446744073709551615, ++ "name": "pref32-reserve", ++ "type": "size" ++ } ++ ], ++ "id": "libvirt-35" ++} ++ ++{ ++ "execute": "qom-list-properties", ++ "arguments": { ++ "typename": "memory-backend-file" ++ }, ++ "id": "libvirt-36" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "type", ++ "type": "string" ++ }, ++ { ++ "name": "share", ++ "description": "Mark the memory as private to QEMU or shared", ++ "type": "bool" ++ }, ++ { ++ "name": "dump", ++ "description": "Set to 'off' to exclude from core dump", ++ "type": "bool" ++ }, ++ { ++ "name": "prealloc-threads", ++ "description": "Number of CPU threads to use for prealloc", ++ "type": "int" ++ }, ++ { ++ "name": "x-use-canonical-path-for-ramblock-id", ++ "type": "bool" ++ }, ++ { ++ "name": "policy", ++ "description": "Set the NUMA policy", ++ "type": "HostMemPolicy" ++ }, ++ { ++ "name": "size", ++ "description": "Size of the memory region (ex: 500M)", ++ "type": "int" ++ }, ++ { ++ "name": "prealloc", ++ "description": "Preallocate memory", ++ "type": "bool" ++ }, ++ { ++ "name": "host-nodes", ++ "description": "Binds memory to the list of NUMA host nodes", ++ "type": "int" ++ }, ++ { ++ "name": "merge", ++ "description": "Mark memory as mergeable", ++ "type": "bool" ++ }, ++ { ++ "name": "align", ++ "type": "int" ++ }, ++ { ++ "name": "pmem", ++ "type": "bool" ++ }, ++ { ++ "name": "mem-path", ++ "type": "string" ++ }, ++ { ++ "name": "discard-data", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-36" ++} ++ ++{ ++ "execute": "qom-list-properties", ++ "arguments": { ++ "typename": "memory-backend-memfd" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "type", ++ "type": "string" ++ }, ++ { ++ "name": "share", ++ "description": "Mark the memory as private to QEMU or shared", ++ "type": "bool" ++ }, ++ { ++ "name": "dump", ++ "description": "Set to 'off' to exclude from core dump", ++ "type": "bool" ++ }, ++ { ++ "name": "prealloc-threads", ++ "description": "Number of CPU threads to use for prealloc", ++ "type": "int" ++ }, ++ { ++ "name": "x-use-canonical-path-for-ramblock-id", ++ "type": "bool" ++ }, ++ { ++ "name": "policy", ++ "description": "Set the NUMA policy", ++ "type": "HostMemPolicy" ++ }, ++ { ++ "name": "size", ++ "description": "Size of the memory region (ex: 500M)", ++ "type": "int" ++ }, ++ { ++ "name": "prealloc", ++ "description": "Preallocate memory", ++ "type": "bool" ++ }, ++ { ++ "name": "host-nodes", ++ "description": "Binds memory to the list of NUMA host nodes", ++ "type": "int" ++ }, ++ { ++ "name": "merge", ++ "description": "Mark memory as mergeable", ++ "type": "bool" ++ }, ++ { ++ "name": "hugetlb", ++ "description": "Use huge pages", ++ "type": "bool" ++ }, ++ { ++ "name": "seal", ++ "description": "Seal growing & shrinking", ++ "type": "bool" ++ }, ++ { ++ "name": "hugetlbsize", ++ "description": "Huge pages size (ex: 2M, 1G)", ++ "type": "int" ++ } ++ ], ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "qom-list-properties", ++ "arguments": { ++ "typename": "max-x86_64-cpu" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "type", ++ "type": "string" ++ }, ++ { ++ "name": "parent_bus", ++ "type": "link" ++ }, ++ { ++ "name": "realized", ++ "type": "bool" ++ }, ++ { ++ "name": "hotplugged", ++ "type": "bool" ++ }, ++ { ++ "name": "hotpluggable", ++ "type": "bool" ++ }, ++ { ++ "name": "memory", ++ "type": "link" ++ }, ++ { ++ "name": "legacy-memory", ++ "type": "str" ++ }, ++ { ++ "name": "fill-mtrr-mask", ++ "type": "bool" ++ }, ++ { ++ "name": "host-phys-bits-limit", ++ "type": "uint8" ++ }, ++ { ++ "name": "x-force-features", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-vpindex", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm", ++ "type": "bool" ++ }, ++ { ++ "name": "apic-id", ++ "type": "uint32" ++ }, ++ { ++ "name": "min-xlevel", ++ "type": "uint32" ++ }, ++ { ++ "name": "enforce", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-runtime", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "level", ++ "type": "uint32" ++ }, ++ { ++ "name": "hv-tlbflush", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "core-id", ++ "type": "int32" ++ }, ++ { ++ "name": "hv-crash", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-reset", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-no-nonarch-coresharing", ++ "description": "on/off/auto", ++ "type": "OnOffAuto" ++ }, ++ { ++ "name": "hv-spinlocks", ++ "type": "uint32" ++ }, ++ { ++ "name": "pmu", ++ "type": "bool" ++ }, ++ { ++ "name": "socket-id", ++ "type": "int32" ++ }, ++ { ++ "name": "hv-relaxed", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "thread-id", ++ "type": "int32" ++ }, ++ { ++ "name": "tcg-cpuid", ++ "type": "bool" ++ }, ++ { ++ "name": "die-id", ++ "type": "int32" ++ }, ++ { ++ "name": "node-id", ++ "type": "int32" ++ }, ++ { ++ "name": "vmware-cpuid-freq", ++ "type": "bool" ++ }, ++ { ++ "name": "min-xlevel2", ++ "type": "uint32" ++ }, ++ { ++ "name": "hv-stimer", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "x-hv-max-vps", ++ "type": "int32" ++ }, ++ { ++ "name": "legacy-cache", ++ "type": "bool" ++ }, ++ { ++ "name": "x-migrate-smi-count", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-reenlightenment", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-vendor-id", ++ "type": "str" ++ }, ++ { ++ "name": "x-hv-synic-kvm-only", ++ "type": "bool" ++ }, ++ { ++ "name": "min-level", ++ "type": "uint32" ++ }, ++ { ++ "name": "phys-bits", ++ "type": "uint32" ++ }, ++ { ++ "name": "l3-cache", ++ "type": "bool" ++ }, ++ { ++ "name": "level-func7", ++ "type": "uint32" ++ }, ++ { ++ "name": "lmce", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-passthrough", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-no-smi-migration", ++ "type": "bool" ++ }, ++ { ++ "name": "xlevel2", ++ "type": "uint32" ++ }, ++ { ++ "name": "hv-stimer-direct", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "ucode-rev", ++ "type": "uint64" ++ }, ++ { ++ "name": "xlevel", ++ "type": "uint32" ++ }, ++ { ++ "name": "host-phys-bits", ++ "type": "bool" ++ }, ++ { ++ "name": "check", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-time", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "full-cpuid-auto-level", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-synic", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-evmcs", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-ipi", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-vapic", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "cpuid-0xb", ++ "type": "bool" ++ }, ++ { ++ "name": "hv-frequencies", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "name": "x-intel-pt-auto-level", ++ "type": "bool" ++ }, ++ { ++ "name": "host-cache-info", ++ "type": "bool" ++ }, ++ { ++ "name": "migratable", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invept-single-context", ++ "type": "bool" ++ }, ++ { ++ "name": "core-capability", ++ "type": "bool" ++ }, ++ { ++ "name": "popcnt", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_mmu", ++ "type": "bool" ++ }, ++ { ++ "name": "dtes64", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4_1", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invvpid-single-addr", ++ "type": "bool" ++ }, ++ { ++ "name": "xstore", ++ "type": "bool" ++ }, ++ { ++ "name": "stepping", ++ "type": "int" ++ }, ++ { ++ "name": "vmx-vmfunc", ++ "type": "bool" ++ }, ++ { ++ "name": "pse36", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512-4vnniw", ++ "type": "bool" ++ }, ++ { ++ "name": "fma4", ++ "type": "bool" ++ }, ++ { ++ "name": "avx2", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-poll-control", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_nopiodelay", ++ "type": "bool" ++ }, ++ { ++ "name": "amd-stibp", ++ "type": "bool" ++ }, ++ { ++ "name": "family", ++ "type": "int" ++ }, ++ { ++ "name": "pclmuldq", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-store-lma", ++ "type": "bool" ++ }, ++ { ++ "name": "erms", ++ "type": "bool" ++ }, ++ { ++ "name": "vaes", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-activity-wait-sipi", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-flexpriority", ++ "type": "bool" ++ }, ++ { ++ "name": "rdrand", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ept-advanced-exitinfo", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-pause-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-shadow-vmcs", ++ "type": "bool" ++ }, ++ { ++ "name": "model", ++ "type": "int" ++ }, ++ { ++ "name": "avx512-vpopcntdq", ++ "type": "bool" ++ }, ++ { ++ "name": "tbm", ++ "type": "bool" ++ }, ++ { ++ "name": "xcrypt", ++ "type": "bool" ++ }, ++ { ++ "name": "lm", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-pv-eoi", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-monitor-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-eptad", ++ "type": "bool" ++ }, ++ { ++ "name": "pae", ++ "type": "bool" ++ }, ++ { ++ "name": "ssse3", ++ "type": "bool" ++ }, ++ { ++ "name": "phe", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-unrestricted-guest", ++ "type": "bool" ++ }, ++ { ++ "name": "movdiri", ++ "type": "bool" ++ }, ++ { ++ "name": "taa-no", ++ "type": "bool" ++ }, ++ { ++ "name": "perfctr_nb", ++ "type": "bool" ++ }, ++ { ++ "name": "arat", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512vbmi2", ++ "type": "bool" ++ }, ++ { ++ "name": "perfctr_core", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_asyncpf", ++ "type": "bool" ++ }, ++ { ++ "name": "x2apic", ++ "type": "bool" ++ }, ++ { ++ "name": "npt", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512ifma", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_poll_control", ++ "type": "bool" ++ }, ++ { ++ "name": "model-id", ++ "type": "string" ++ }, ++ { ++ "name": "vmx-vnmi-pending", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invpcid-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-io-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "pmm-en", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ins-outs", ++ "type": "bool" ++ }, ++ { ++ "name": "dca", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-apicv-x2apic", ++ "type": "bool" ++ }, ++ { ++ "name": "ia64", ++ "type": "bool" ++ }, ++ { ++ "name": "perfctr-core", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-cr3-load-noexit", ++ "type": "bool" ++ }, ++ { ++ "name": "kvmclock", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-noload-debugctl", ++ "type": "bool" ++ }, ++ { ++ "name": "invtsc", ++ "type": "bool" ++ }, ++ { ++ "name": "pn", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512cd", ++ "type": "bool" ++ }, ++ { ++ "name": "md-clear", ++ "type": "bool" ++ }, ++ { ++ "name": "cmp-legacy", ++ "type": "bool" ++ }, ++ { ++ "name": "cx16", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512dq", ++ "type": "bool" ++ }, ++ { ++ "name": "abm", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-activity-shutdown", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-pv-ipi", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-apicv-register", ++ "type": "bool" ++ }, ++ { ++ "name": "fxsr-opt", ++ "type": "bool" ++ }, ++ { ++ "name": "skip-l1dfl-vmentry", ++ "type": "bool" ++ }, ++ { ++ "name": "pcid", ++ "type": "bool" ++ }, ++ { ++ "name": "rdpid", ++ "type": "bool" ++ }, ++ { ++ "name": "wbnoinvd", ++ "type": "bool" ++ }, ++ { ++ "name": "filtered-features", ++ "type": "X86CPUFeatureWordInfo" ++ }, ++ { ++ "name": "syscall", ++ "type": "bool" ++ }, ++ { ++ "name": "pse", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc_scale", ++ "type": "bool" ++ }, ++ { ++ "name": "mce", ++ "type": "bool" ++ }, ++ { ++ "name": "xsaves", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-load-pat", ++ "type": "bool" ++ }, ++ { ++ "name": "ibpb", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-apicv-xapic", ++ "type": "bool" ++ }, ++ { ++ "name": "cldemote", ++ "type": "bool" ++ }, ++ { ++ "name": "rtm", ++ "type": "bool" ++ }, ++ { ++ "name": "lwp", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-steal-time", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-hlt-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-load-efer", ++ "type": "bool" ++ }, ++ { ++ "name": "nrip_save", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invlpg-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-save-efer", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-eptp-switching", ++ "type": "bool" ++ }, ++ { ++ "name": "vme", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-pv-unhalt", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-desc-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_pv_unhalt", ++ "type": "bool" ++ }, ++ { ++ "name": "svm", ++ "type": "bool" ++ }, ++ { ++ "name": "lahf-lm", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invvpid", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-hint-dedicated", ++ "type": "bool" ++ }, ++ { ++ "name": "mca", ++ "type": "bool" ++ }, ++ { ++ "name": "mtrr", ++ "type": "bool" ++ }, ++ { ++ "name": "cid", ++ "type": "bool" ++ }, ++ { ++ "name": "vmcb_clean", ++ "type": "bool" ++ }, ++ { ++ "name": "pfthreshold", ++ "type": "bool" ++ }, ++ { ++ "name": "pmm", ++ "type": "bool" ++ }, ++ { ++ "name": "tm", ++ "type": "bool" ++ }, ++ { ++ "name": "pbe", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-ia32e-mode", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-rdpmc-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "split-lock-detect", ++ "type": "bool" ++ }, ++ { ++ "name": "fpu", ++ "type": "bool" ++ }, ++ { ++ "name": "skinit", ++ "type": "bool" ++ }, ++ { ++ "name": "sep", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512-bf16", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-rdtscp-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "nx", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invvpid-all-context", ++ "type": "bool" ++ }, ++ { ++ "name": "ds-cpl", ++ "type": "bool" ++ }, ++ { ++ "name": "pause-filter", ++ "type": "bool" ++ }, ++ { ++ "name": "pause_filter", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-vmwrite-vmexit-fields", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ept", ++ "type": "bool" ++ }, ++ { ++ "name": "nodeid-msr", ++ "type": "bool" ++ }, ++ { ++ "name": "smap", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-io-bitmap", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-intr-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "fxsr_opt", ++ "type": "bool" ++ }, ++ { ++ "name": "cr8legacy", ++ "type": "bool" ++ }, ++ { ++ "name": "cmp_legacy", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-zero-len-inject", ++ "type": "bool" ++ }, ++ { ++ "name": "virt-ssbd", ++ "type": "bool" ++ }, ++ { ++ "name": "pschange-mc-no", ++ "type": "bool" ++ }, ++ { ++ "name": "umip", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512er", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-vpid", ++ "type": "bool" ++ }, ++ { ++ "name": "xstore-en", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512vl", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invept-single-context-noglobals", ++ "type": "bool" ++ }, ++ { ++ "name": "cmov", ++ "type": "bool" ++ }, ++ { ++ "name": "rsba", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-posted-intr", ++ "type": "bool" ++ }, ++ { ++ "name": "xcrypt-en", ++ "type": "bool" ++ }, ++ { ++ "name": "tm2", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-clear-bndcfgs", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ept-execonly", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-load-efer", ++ "type": "bool" ++ }, ++ { ++ "name": "xsaveerptr", ++ "type": "bool" ++ }, ++ { ++ "name": "fsgsbase", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512bw", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-vintr-pending", ++ "type": "bool" ++ }, ++ { ++ "name": "smx", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-secondary-ctls", ++ "type": "bool" ++ }, ++ { ++ "name": "lbrv", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc-frequency", ++ "type": "int" ++ }, ++ { ++ "name": "hle", ++ "type": "bool" ++ }, ++ { ++ "name": "monitor", ++ "type": "bool" ++ }, ++ { ++ "name": "tce", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4a", ++ "type": "bool" ++ }, ++ { ++ "name": "vpclmulqdq", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc-scale", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-pv-tlb-flush", ++ "type": "bool" ++ }, ++ { ++ "name": "mds-no", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-cr8-load-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-activity-hlt", ++ "type": "bool" ++ }, ++ { ++ "name": "i64", ++ "type": "bool" ++ }, ++ { ++ "name": "adx", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invept-all-context", ++ "type": "bool" ++ }, ++ { ++ "name": "ffxsr", ++ "type": "bool" ++ }, ++ { ++ "name": "amd-no-ssb", ++ "type": "bool" ++ }, ++ { ++ "name": "crash-information", ++ "type": "GuestPanicInformation" ++ }, ++ { ++ "name": "vmx-entry-load-bndcfgs", ++ "type": "bool" ++ }, ++ { ++ "name": "svm_lock", ++ "type": "bool" ++ }, ++ { ++ "name": "msr", ++ "type": "bool" ++ }, ++ { ++ "name": "pclmulqdq", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-preemption-timer", ++ "type": "bool" ++ }, ++ { ++ "name": "clflush", ++ "type": "bool" ++ }, ++ { ++ "name": "ssb-no", ++ "type": "bool" ++ }, ++ { ++ "name": "mpx", ++ "type": "bool" ++ }, ++ { ++ "name": "extapic", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-vnmi", ++ "type": "bool" ++ }, ++ { ++ "name": "xop", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-rdseed-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "smep", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-mwait-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-rdtsc-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "cx8", ++ "type": "bool" ++ }, ++ { ++ "name": "xsavec", ++ "type": "bool" ++ }, ++ { ++ "name": "pku", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4-2", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-mtf", ++ "type": "bool" ++ }, ++ { ++ "name": "vmcb-clean", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-load-pat", ++ "type": "bool" ++ }, ++ { ++ "name": "stibp", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-cr3-store-noexit", ++ "type": "bool" ++ }, ++ { ++ "name": "tsx-ctrl", ++ "type": "bool" ++ }, ++ { ++ "name": "svm-lock", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4-1", ++ "type": "bool" ++ }, ++ { ++ "name": "lahf_lm", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_pv_eoi", ++ "type": "bool" ++ }, ++ { ++ "name": "sse", ++ "type": "bool" ++ }, ++ { ++ "name": "clzero", ++ "type": "bool" ++ }, ++ { ++ "name": "ds", ++ "type": "bool" ++ }, ++ { ++ "name": "osvw", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm_steal_time", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-true-ctls", ++ "type": "bool" ++ }, ++ { ++ "name": "movdir64b", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-invept", ++ "type": "bool" ++ }, ++ { ++ "name": "acpi", ++ "type": "bool" ++ }, ++ { ++ "name": "xd", ++ "type": "bool" ++ }, ++ { ++ "name": "nodeid_msr", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ept-1gb", ++ "type": "bool" ++ }, ++ { ++ "name": "nrip-save", ++ "type": "bool" ++ }, ++ { ++ "name": "gfni", ++ "type": "bool" ++ }, ++ { ++ "name": "ds_cpl", ++ "type": "bool" ++ }, ++ { ++ "name": "sse3", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-mmu", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512bitalg", ++ "type": "bool" ++ }, ++ { ++ "name": "rdseed", ++ "type": "bool" ++ }, ++ { ++ "name": "sha-ni", ++ "type": "bool" ++ }, ++ { ++ "name": "ace2", ++ "type": "bool" ++ }, ++ { ++ "name": "waitpkg", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-rdrand-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "f16c", ++ "type": "bool" ++ }, ++ { ++ "name": "3dnowprefetch", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-encls-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "avx", ++ "type": "bool" ++ }, ++ { ++ "name": "topoext", ++ "type": "bool" ++ }, ++ { ++ "name": "sse2", ++ "type": "bool" ++ }, ++ { ++ "name": "rdctl-no", ++ "type": "bool" ++ }, ++ { ++ "name": "mmx", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512-4fmaps", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-cr8-store-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512vnni", ++ "type": "bool" ++ }, ++ { ++ "name": "pni", ++ "type": "bool" ++ }, ++ { ++ "name": "movbe", ++ "type": "bool" ++ }, ++ { ++ "name": "mmxext", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ple", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-apicv-vid", ++ "type": "bool" ++ }, ++ { ++ "name": "flushbyasid", ++ "type": "bool" ++ }, ++ { ++ "name": "rdtscp", ++ "type": "bool" ++ }, ++ { ++ "name": "clwb", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-asyncpf", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-pv-sched-yield", ++ "type": "bool" ++ }, ++ { ++ "name": "decodeassists", ++ "type": "bool" ++ }, ++ { ++ "name": "pat", ++ "type": "bool" ++ }, ++ { ++ "name": "invpcid", ++ "type": "bool" ++ }, ++ { ++ "name": "pdpe1gb", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-save-pat", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc-adjust", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-load-rtit-ctl", ++ "type": "bool" ++ }, ++ { ++ "name": "ht", ++ "type": "bool" ++ }, ++ { ++ "name": "clflushopt", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc_adjust", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-tsc-offset", ++ "type": "bool" ++ }, ++ { ++ "name": "ssbd", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-clear-rtit-ctl", ++ "type": "bool" ++ }, ++ { ++ "name": "3dnowext", ++ "type": "bool" ++ }, ++ { ++ "name": "xtpr", ++ "type": "bool" ++ }, ++ { ++ "name": "pdcm", ++ "type": "bool" ++ }, ++ { ++ "name": "xsave", ++ "type": "bool" ++ }, ++ { ++ "name": "unavailable-features", ++ "type": "strList" ++ }, ++ { ++ "name": "est", ++ "type": "bool" ++ }, ++ { ++ "name": "pge", ++ "type": "bool" ++ }, ++ { ++ "name": "vendor", ++ "type": "string" ++ }, ++ { ++ "name": "pcommit", ++ "type": "bool" ++ }, ++ { ++ "name": "ibs", ++ "type": "bool" ++ }, ++ { ++ "name": "tsc-deadline", ++ "type": "bool" ++ }, ++ { ++ "name": "kvmclock-stable-bit", ++ "type": "bool" ++ }, ++ { ++ "name": "misalignsse", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-msr-bitmap", ++ "type": "bool" ++ }, ++ { ++ "name": "perfctr-nb", ++ "type": "bool" ++ }, ++ { ++ "name": "feature-words", ++ "type": "X86CPUFeatureWordInfo" ++ }, ++ { ++ "name": "apic", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512vbmi", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-nosave-debugctl", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512f", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-save-preemption-timer", ++ "type": "bool" ++ }, ++ { ++ "name": "arch-capabilities", ++ "type": "bool" ++ }, ++ { ++ "name": "bmi2", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-pml", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-nmi-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "intel-pt", ++ "type": "bool" ++ }, ++ { ++ "name": "wdt", ++ "type": "bool" ++ }, ++ { ++ "name": "ace2-en", ++ "type": "bool" ++ }, ++ { ++ "name": "avx512pf", ++ "type": "bool" ++ }, ++ { ++ "name": "bmi1", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-page-walk-5", ++ "type": "bool" ++ }, ++ { ++ "name": "kvm-nopiodelay", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4.2", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-ept-2mb", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-load-perf-global-ctrl", ++ "type": "bool" ++ }, ++ { ++ "name": "3dnow", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-wbinvd-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "la57", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-page-walk-4", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4.1", ++ "type": "bool" ++ }, ++ { ++ "name": "ibrs-all", ++ "type": "bool" ++ }, ++ { ++ "name": "xgetbv1", ++ "type": "bool" ++ }, ++ { ++ "name": "xsaveopt", ++ "type": "bool" ++ }, ++ { ++ "name": "spec-ctrl", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-entry-load-perf-global-ctrl", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-exit-ack-intr", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-xsaves", ++ "type": "bool" ++ }, ++ { ++ "name": "phe-en", ++ "type": "bool" ++ }, ++ { ++ "name": "fxsr", ++ "type": "bool" ++ }, ++ { ++ "name": "hypervisor", ++ "type": "bool" ++ }, ++ { ++ "name": "aes", ++ "type": "bool" ++ }, ++ { ++ "name": "amd-ssbd", ++ "type": "bool" ++ }, ++ { ++ "name": "sse4_2", ++ "type": "bool" ++ }, ++ { ++ "name": "de", ++ "type": "bool" ++ }, ++ { ++ "name": "ss", ++ "type": "bool" ++ }, ++ { ++ "name": "vmx-movdr-exit", ++ "type": "bool" ++ }, ++ { ++ "name": "fma", ++ "type": "bool" ++ } ++ ], ++ "id": "libvirt-38" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-39" ++} ++ ++{ ++ "return": [ ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.12", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": false, ++ "name": "none", ++ "numa-mem-supported": false, ++ "cpu-max": 1, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.10", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.9", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.11", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-3.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.3", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.9", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "isapc", ++ "numa-mem-supported": true, ++ "default-cpu-type": "486-x86_64-cpu", ++ "cpu-max": 1, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-3.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.12", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.0.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-5.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false, ++ "alias": "q35" ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.8", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.10", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-3.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": false, ++ "name": "microvm", ++ "numa-mem-supported": false, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.3", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-5.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "is-default": true, ++ "cpu-max": 255, ++ "deprecated": false, ++ "alias": "pc" ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.8", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-3.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.11", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ } ++ ], ++ "id": "libvirt-39" ++} ++ ++{ ++ "execute": "query-cpu-definitions", ++ "id": "libvirt-40" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "qemu64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "qemu32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "3dnowext", ++ "3dnow", ++ "sse4a", ++ "npt" ++ ], ++ "alias-of": "phenom-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "n270-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "kvm64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "kvm32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "coreduo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "core2duo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "3dnowext", ++ "3dnow" ++ ], ++ "alias-of": "athlon-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Westmere-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Westmere-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v2", ++ "typename": "Snowridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "core-capability", ++ "split-lock-detect" ++ ], ++ "alias-of": "Snowridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v3", ++ "typename": "Skylake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS", ++ "typename": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Skylake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Skylake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Skylake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v3", ++ "typename": "Skylake-Client-v3-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS", ++ "typename": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Skylake-Client-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Skylake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Skylake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "SandyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "SandyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Penryn-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "tbm", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G5-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse", ++ "xop", ++ "fma4", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G4-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "sse4a", ++ "misalignsse" ++ ], ++ "alias-of": "Opteron_G3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Opteron_G2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Opteron_G1-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Nehalem-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Nehalem-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "avx512f", ++ "avx512f", ++ "avx512f" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "avx512f", ++ "avx512f", ++ "avx512f" ++ ], ++ "alias-of": "KnightsMill-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "IvyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "IvyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v2", ++ "typename": "Icelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-noTSX", ++ "typename": "Icelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Icelake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "la57", ++ "wbnoinvd", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Icelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v2", ++ "typename": "Icelake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-noTSX", ++ "typename": "Icelake-Client-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "alias-of": "Icelake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512vbmi", ++ "pku", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "wbnoinvd", ++ "pku" ++ ], ++ "alias-of": "Icelake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Haswell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Haswell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Haswell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Haswell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v3", ++ "typename": "EPYC-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome-v1", ++ "typename": "EPYC-Rome-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "rdpid", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "ibpb", ++ "amd-stibp", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome", ++ "typename": "EPYC-Rome-x86_64-cpu", ++ "unavailable-features": [ ++ "clwb", ++ "sha-ni", ++ "rdpid", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "ibpb", ++ "amd-stibp", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-Rome-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "EPYC-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "mmxext", ++ "fxsr-opt", ++ "cr8legacy", ++ "sse4a", ++ "misalignsse", ++ "osvw", ++ "ibpb", ++ "npt", ++ "nrip-save" ++ ], ++ "alias-of": "Dhyana-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v2", ++ "typename": "Denverton-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdctl-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v1", ++ "typename": "Denverton-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdctl-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton", ++ "typename": "Denverton-x86_64-cpu", ++ "unavailable-features": [ ++ "sha-ni", ++ "rdctl-no" ++ ], ++ "alias-of": "Denverton-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake-v1", ++ "typename": "Cooperlake-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512-bf16", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no", ++ "taa-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake", ++ "typename": "Cooperlake-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512-bf16", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no", ++ "taa-no" ++ ], ++ "alias-of": "Cooperlake-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Conroe-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v3", ++ "typename": "Cascadelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX", ++ "typename": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku", ++ "rdctl-no", ++ "ibrs-all", ++ "mds-no" ++ ], ++ "alias-of": "Cascadelake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "avx512f", ++ "avx512dq", ++ "clwb", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "pku", ++ "avx512vnni", ++ "avx512f", ++ "avx512f", ++ "avx512f", ++ "pku" ++ ], ++ "alias-of": "Cascadelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Broadwell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Broadwell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Broadwell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Broadwell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "486-v1", ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "libvirt-40" ++} ++ ++{ ++ "execute": "query-tpm-models", ++ "id": "libvirt-41" ++} ++ ++{ ++ "return": [ ++ "tpm-crb", ++ "tpm-tis" ++ ], ++ "id": "libvirt-41" ++} ++ ++{ ++ "execute": "query-tpm-types", ++ "id": "libvirt-42" ++} ++ ++{ ++ "return": [ ++ "passthrough", ++ "emulator" ++ ], ++ "id": "libvirt-42" ++} ++ ++{ ++ "execute": "query-command-line-options", ++ "id": "libvirt-43" ++} ++ ++{ ++ "return": [ ++ { ++ "parameters": [ ++ { ++ "name": "timeout", ++ "help": "Request timeout in seconds (default 0 = no timeout)", ++ "type": "number" ++ }, ++ { ++ "name": "initiator-name", ++ "help": "Initiator iqn name to use when connecting", ++ "type": "string" ++ }, ++ { ++ "name": "header-digest", ++ "help": "HeaderDigest setting. {CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}", ++ "type": "string" ++ }, ++ { ++ "name": "password-secret", ++ "help": "ID of the secret providing password for CHAP authentication to target", ++ "type": "string" ++ }, ++ { ++ "name": "password", ++ "help": "password for CHAP authentication to target", ++ "type": "string" ++ }, ++ { ++ "name": "user", ++ "help": "username for CHAP authentication to target", ++ "type": "string" ++ } ++ ], ++ "option": "iscsi" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "audiodev", ++ "type": "string" ++ }, ++ { ++ "name": "non-adaptive", ++ "type": "boolean" ++ }, ++ { ++ "name": "lossy", ++ "type": "boolean" ++ }, ++ { ++ "name": "sasl-authz", ++ "type": "string" ++ }, ++ { ++ "name": "tls-authz", ++ "type": "string" ++ }, ++ { ++ "name": "acl", ++ "type": "boolean" ++ }, ++ { ++ "name": "sasl", ++ "type": "boolean" ++ }, ++ { ++ "name": "key-delay-ms", ++ "type": "number" ++ }, ++ { ++ "name": "lock-key-sync", ++ "type": "boolean" ++ }, ++ { ++ "name": "reverse", ++ "type": "boolean" ++ }, ++ { ++ "name": "password", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv6", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv4", ++ "type": "boolean" ++ }, ++ { ++ "name": "to", ++ "type": "number" ++ }, ++ { ++ "name": "connections", ++ "type": "number" ++ }, ++ { ++ "name": "head", ++ "type": "number" ++ }, ++ { ++ "name": "display", ++ "type": "string" ++ }, ++ { ++ "name": "share", ++ "type": "string" ++ }, ++ { ++ "name": "tls-creds", ++ "type": "string" ++ }, ++ { ++ "name": "websocket", ++ "type": "string" ++ }, ++ { ++ "name": "vnc", ++ "type": "string" ++ } ++ ], ++ "option": "vnc" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "rendernode", ++ "type": "string" ++ }, ++ { ++ "name": "gl", ++ "type": "boolean" ++ }, ++ { ++ "name": "head", ++ "type": "number" ++ }, ++ { ++ "name": "display", ++ "type": "string" ++ }, ++ { ++ "name": "seamless-migration", ++ "type": "boolean" ++ }, ++ { ++ "name": "playback-compression", ++ "type": "boolean" ++ }, ++ { ++ "name": "agent-mouse", ++ "type": "boolean" ++ }, ++ { ++ "name": "streaming-video", ++ "type": "string" ++ }, ++ { ++ "name": "zlib-glz-wan-compression", ++ "type": "string" ++ }, ++ { ++ "name": "jpeg-wan-compression", ++ "type": "string" ++ }, ++ { ++ "name": "image-compression", ++ "type": "string" ++ }, ++ { ++ "name": "plaintext-channel", ++ "type": "string" ++ }, ++ { ++ "name": "tls-channel", ++ "type": "string" ++ }, ++ { ++ "name": "tls-ciphers", ++ "type": "string" ++ }, ++ { ++ "name": "x509-dh-key-file", ++ "type": "string" ++ }, ++ { ++ "name": "x509-cacert-file", ++ "type": "string" ++ }, ++ { ++ "name": "x509-cert-file", ++ "type": "string" ++ }, ++ { ++ "name": "x509-key-password", ++ "type": "string" ++ }, ++ { ++ "name": "x509-key-file", ++ "type": "string" ++ }, ++ { ++ "name": "x509-dir", ++ "type": "string" ++ }, ++ { ++ "name": "sasl", ++ "type": "boolean" ++ }, ++ { ++ "name": "disable-agent-file-xfer", ++ "type": "boolean" ++ }, ++ { ++ "name": "disable-copy-paste", ++ "type": "boolean" ++ }, ++ { ++ "name": "disable-ticketing", ++ "type": "boolean" ++ }, ++ { ++ "name": "password", ++ "type": "string" ++ }, ++ { ++ "name": "unix", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv6", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv4", ++ "type": "boolean" ++ }, ++ { ++ "name": "addr", ++ "type": "string" ++ }, ++ { ++ "name": "tls-port", ++ "type": "number" ++ }, ++ { ++ "name": "port", ++ "type": "number" ++ } ++ ], ++ "option": "spice" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "smbios" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "acpi" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "dmode", ++ "type": "number" ++ }, ++ { ++ "name": "fmode", ++ "type": "number" ++ }, ++ { ++ "name": "sock_fd", ++ "type": "number" ++ }, ++ { ++ "name": "socket", ++ "type": "string" ++ }, ++ { ++ "name": "multidevs", ++ "type": "string" ++ }, ++ { ++ "name": "readonly", ++ "type": "boolean" ++ }, ++ { ++ "name": "writeout", ++ "type": "string" ++ }, ++ { ++ "name": "security_model", ++ "type": "string" ++ }, ++ { ++ "name": "mount_tag", ++ "type": "string" ++ }, ++ { ++ "name": "path", ++ "type": "string" ++ }, ++ { ++ "name": "fsdriver", ++ "type": "string" ++ } ++ ], ++ "option": "virtfs" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "throttling.iops-size", ++ "help": "when limiting by iops max size of an I/O in bytes", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write-max-length", ++ "help": "length of the bps-write-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read-max-length", ++ "help": "length of the bps-read-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total-max-length", ++ "help": "length of the bps-total-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write-max-length", ++ "help": "length of the iops-write-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read-max-length", ++ "help": "length of the iops-read-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total-max-length", ++ "help": "length of the iops-total-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write-max", ++ "help": "total bytes write burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read-max", ++ "help": "total bytes read burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total-max", ++ "help": "total bytes burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write-max", ++ "help": "I/O operations write burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read-max", ++ "help": "I/O operations read burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total-max", ++ "help": "I/O operations burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write", ++ "help": "limit write bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read", ++ "help": "limit read bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total", ++ "help": "limit total bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write", ++ "help": "limit write operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read", ++ "help": "limit read operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total", ++ "help": "limit total I/O operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "dmode", ++ "type": "number" ++ }, ++ { ++ "name": "fmode", ++ "type": "number" ++ }, ++ { ++ "name": "sock_fd", ++ "type": "number" ++ }, ++ { ++ "name": "socket", ++ "type": "string" ++ }, ++ { ++ "name": "multidevs", ++ "type": "string" ++ }, ++ { ++ "name": "readonly", ++ "type": "boolean" ++ }, ++ { ++ "name": "writeout", ++ "type": "string" ++ }, ++ { ++ "name": "security_model", ++ "type": "string" ++ }, ++ { ++ "name": "path", ++ "type": "string" ++ }, ++ { ++ "name": "fsdriver", ++ "type": "string" ++ } ++ ], ++ "option": "fsdev" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "resourcecontrol", ++ "type": "string" ++ }, ++ { ++ "name": "spawn", ++ "type": "string" ++ }, ++ { ++ "name": "elevateprivileges", ++ "type": "string" ++ }, ++ { ++ "name": "obsolete", ++ "type": "string" ++ }, ++ { ++ "name": "enable", ++ "type": "boolean" ++ } ++ ], ++ "option": "sandbox" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "string", ++ "help": "Sets content of the blob to be inserted from a string", ++ "type": "string" ++ }, ++ { ++ "name": "file", ++ "help": "Sets the name of the file from which the fw_cfg blob will be loaded", ++ "type": "string" ++ }, ++ { ++ "name": "name", ++ "help": "Sets the fw_cfg name of the blob to be inserted", ++ "type": "string" ++ } ++ ], ++ "option": "fw_cfg" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "rrsnapshot", ++ "type": "string" ++ }, ++ { ++ "name": "rrfile", ++ "type": "string" ++ }, ++ { ++ "name": "rr", ++ "type": "string" ++ }, ++ { ++ "name": "sleep", ++ "type": "boolean" ++ }, ++ { ++ "name": "align", ++ "type": "boolean" ++ }, ++ { ++ "name": "shift", ++ "type": "string" ++ } ++ ], ++ "option": "icount" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "numa" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "debug-threads", ++ "help": "When enabled, name the individual threads; defaults off.\nNOTE: The thread names are for debugging and not a\nstable API.", ++ "type": "boolean" ++ }, ++ { ++ "name": "process", ++ "help": "Sets the name of the QEMU process, as shown in top etc", ++ "type": "string" ++ }, ++ { ++ "name": "guest", ++ "help": "Sets the name of the guest.\nThis name will be displayed in the SDL window caption.\nThe name will also be used for the VNC server", ++ "type": "string" ++ } ++ ], ++ "option": "name" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "timestamp", ++ "type": "boolean" ++ } ++ ], ++ "option": "msg" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "cpu-pm", ++ "type": "boolean" ++ }, ++ { ++ "name": "mem-lock", ++ "type": "boolean" ++ } ++ ], ++ "option": "overcommit" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "mlock", ++ "type": "boolean" ++ } ++ ], ++ "option": "realtime" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "tpmdev" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "object" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "opaque", ++ "help": "free-form string used to describe fd", ++ "type": "string" ++ }, ++ { ++ "name": "set", ++ "help": "ID of the fd set to add fd to", ++ "type": "number" ++ }, ++ { ++ "name": "fd", ++ "help": "file descriptor of which a duplicate is added to fd set", ++ "type": "number" ++ } ++ ], ++ "option": "add-fd" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "strict", ++ "type": "boolean" ++ }, ++ { ++ "name": "reboot-timeout", ++ "type": "number" ++ }, ++ { ++ "name": "splash-time", ++ "type": "number" ++ }, ++ { ++ "name": "splash", ++ "type": "string" ++ }, ++ { ++ "name": "menu", ++ "type": "boolean" ++ }, ++ { ++ "name": "once", ++ "type": "string" ++ }, ++ { ++ "name": "order", ++ "type": "string" ++ } ++ ], ++ "option": "boot-opts" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "maxcpus", ++ "type": "number" ++ }, ++ { ++ "name": "threads", ++ "type": "number" ++ }, ++ { ++ "name": "cores", ++ "type": "number" ++ }, ++ { ++ "name": "dies", ++ "type": "number" ++ }, ++ { ++ "name": "sockets", ++ "type": "number" ++ }, ++ { ++ "name": "cpus", ++ "type": "number" ++ } ++ ], ++ "option": "smp-opts" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "maxmem", ++ "type": "size" ++ }, ++ { ++ "name": "slots", ++ "type": "number" ++ }, ++ { ++ "name": "size", ++ "type": "size" ++ } ++ ], ++ "option": "memory" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "accel" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "loadparm", ++ "help": "Up to 8 chars in set of [A-Za-z0-9. ](lower case chars converted to upper case) to pass to machine loader, boot manager, and guest kernel", ++ "type": "string" ++ }, ++ { ++ "name": "dea-key-wrap", ++ "help": "enable/disable DEA key wrapping using the CPACF wrapping key", ++ "type": "boolean" ++ }, ++ { ++ "name": "aes-key-wrap", ++ "help": "enable/disable AES key wrapping using the CPACF wrapping key", ++ "type": "boolean" ++ }, ++ { ++ "name": "suppress-vmdesc", ++ "help": "Set on to disable self-describing migration", ++ "type": "boolean" ++ }, ++ { ++ "name": "iommu", ++ "help": "Set on/off to enable/disable Intel IOMMU (VT-d)", ++ "type": "boolean" ++ }, ++ { ++ "name": "firmware", ++ "help": "firmware image", ++ "type": "string" ++ }, ++ { ++ "name": "usb", ++ "help": "Set on/off to enable/disable usb", ++ "type": "boolean" ++ }, ++ { ++ "name": "mem-merge", ++ "help": "enable/disable memory merge support", ++ "type": "boolean" ++ }, ++ { ++ "name": "dump-guest-core", ++ "help": "Include guest memory in a core dump", ++ "type": "boolean" ++ }, ++ { ++ "name": "dt_compatible", ++ "help": "Overrides the \"compatible\" property of the dt root node", ++ "type": "string" ++ }, ++ { ++ "name": "phandle_start", ++ "help": "The first phandle ID we may generate dynamically", ++ "type": "number" ++ }, ++ { ++ "name": "dumpdtb", ++ "help": "Dump current dtb to a file and quit", ++ "type": "string" ++ }, ++ { ++ "name": "dtb", ++ "help": "Linux kernel device tree file", ++ "type": "string" ++ }, ++ { ++ "name": "append", ++ "help": "Linux kernel command line", ++ "type": "string" ++ }, ++ { ++ "name": "initrd", ++ "help": "Linux initial ramdisk file", ++ "type": "string" ++ }, ++ { ++ "name": "kernel", ++ "help": "Linux kernel image file", ++ "type": "string" ++ }, ++ { ++ "name": "kvm_shadow_mem", ++ "help": "KVM shadow MMU size", ++ "type": "size" ++ }, ++ { ++ "name": "kernel_irqchip", ++ "help": "use KVM in-kernel irqchip", ++ "type": "boolean" ++ }, ++ { ++ "name": "accel", ++ "help": "accelerator list", ++ "type": "string" ++ }, ++ { ++ "name": "type", ++ "help": "emulated machine", ++ "type": "string" ++ } ++ ], ++ "option": "machine" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "romfile", ++ "type": "string" ++ }, ++ { ++ "name": "bootindex", ++ "type": "number" ++ } ++ ], ++ "option": "option-rom" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "file", ++ "type": "string" ++ }, ++ { ++ "name": "events", ++ "type": "string" ++ }, ++ { ++ "name": "enable", ++ "type": "string" ++ } ++ ], ++ "option": "trace" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "pretty", ++ "type": "boolean" ++ }, ++ { ++ "name": "chardev", ++ "type": "string" ++ }, ++ { ++ "name": "mode", ++ "type": "string" ++ } ++ ], ++ "option": "mon" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "value", ++ "type": "string" ++ }, ++ { ++ "name": "property", ++ "type": "string" ++ }, ++ { ++ "name": "driver", ++ "type": "string" ++ } ++ ], ++ "option": "global" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "driftfix", ++ "type": "string" ++ }, ++ { ++ "name": "clock", ++ "type": "string" ++ }, ++ { ++ "name": "base", ++ "type": "string" ++ } ++ ], ++ "option": "rtc" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "net" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "nic" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "netdev" ++ }, ++ { ++ "parameters": [ ++ ], ++ "option": "device" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "logappend", ++ "type": "boolean" ++ }, ++ { ++ "name": "logfile", ++ "type": "string" ++ }, ++ { ++ "name": "append", ++ "type": "boolean" ++ }, ++ { ++ "name": "chardev", ++ "type": "string" ++ }, ++ { ++ "name": "size", ++ "type": "size" ++ }, ++ { ++ "name": "debug", ++ "type": "number" ++ }, ++ { ++ "name": "name", ++ "type": "string" ++ }, ++ { ++ "name": "signal", ++ "type": "boolean" ++ }, ++ { ++ "name": "mux", ++ "type": "boolean" ++ }, ++ { ++ "name": "rows", ++ "type": "number" ++ }, ++ { ++ "name": "cols", ++ "type": "number" ++ }, ++ { ++ "name": "height", ++ "type": "number" ++ }, ++ { ++ "name": "width", ++ "type": "number" ++ }, ++ { ++ "name": "websocket", ++ "type": "boolean" ++ }, ++ { ++ "name": "tls-authz", ++ "type": "string" ++ }, ++ { ++ "name": "tls-creds", ++ "type": "string" ++ }, ++ { ++ "name": "tn3270", ++ "type": "boolean" ++ }, ++ { ++ "name": "telnet", ++ "type": "boolean" ++ }, ++ { ++ "name": "reconnect", ++ "type": "number" ++ }, ++ { ++ "name": "delay", ++ "type": "boolean" ++ }, ++ { ++ "name": "server", ++ "type": "boolean" ++ }, ++ { ++ "name": "wait", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv6", ++ "type": "boolean" ++ }, ++ { ++ "name": "ipv4", ++ "type": "boolean" ++ }, ++ { ++ "name": "to", ++ "type": "number" ++ }, ++ { ++ "name": "localport", ++ "type": "string" ++ }, ++ { ++ "name": "localaddr", ++ "type": "string" ++ }, ++ { ++ "name": "fd", ++ "type": "string" ++ }, ++ { ++ "name": "port", ++ "type": "string" ++ }, ++ { ++ "name": "host", ++ "type": "string" ++ }, ++ { ++ "name": "path", ++ "type": "string" ++ }, ++ { ++ "name": "backend", ++ "type": "string" ++ } ++ ], ++ "option": "chardev" ++ }, ++ { ++ "parameters": [ ++ { ++ "name": "copy-on-read", ++ "help": "copy read data from backing file into image file", ++ "type": "boolean" ++ }, ++ { ++ "name": "werror", ++ "help": "write error action", ++ "type": "string" ++ }, ++ { ++ "name": "rerror", ++ "help": "read error action", ++ "type": "string" ++ }, ++ { ++ "name": "read-only", ++ "help": "open drive file as read-only", ++ "type": "boolean" ++ }, ++ { ++ "name": "file", ++ "help": "file name", ++ "type": "string" ++ }, ++ { ++ "name": "if", ++ "help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)", ++ "type": "string" ++ }, ++ { ++ "name": "media", ++ "help": "media type (disk, cdrom)", ++ "type": "string" ++ }, ++ { ++ "name": "index", ++ "help": "index number", ++ "type": "number" ++ }, ++ { ++ "name": "unit", ++ "help": "unit number (i.e. lun for scsi)", ++ "type": "number" ++ }, ++ { ++ "name": "bus", ++ "help": "bus number", ++ "type": "number" ++ }, ++ { ++ "name": "stats-account-failed", ++ "help": "whether to account for failed I/O operations in the statistics", ++ "type": "boolean" ++ }, ++ { ++ "name": "stats-account-invalid", ++ "help": "whether to account for invalid I/O operations in the statistics", ++ "type": "boolean" ++ }, ++ { ++ "name": "detect-zeroes", ++ "help": "try to optimize zero writes (off, on, unmap)", ++ "type": "string" ++ }, ++ { ++ "name": "throttling.group", ++ "help": "name of the block throttling group", ++ "type": "string" ++ }, ++ { ++ "name": "throttling.iops-size", ++ "help": "when limiting by iops max size of an I/O in bytes", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write-max-length", ++ "help": "length of the bps-write-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read-max-length", ++ "help": "length of the bps-read-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total-max-length", ++ "help": "length of the bps-total-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write-max-length", ++ "help": "length of the iops-write-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read-max-length", ++ "help": "length of the iops-read-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total-max-length", ++ "help": "length of the iops-total-max burst period, in seconds", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write-max", ++ "help": "total bytes write burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read-max", ++ "help": "total bytes read burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total-max", ++ "help": "total bytes burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write-max", ++ "help": "I/O operations write burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read-max", ++ "help": "I/O operations read burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total-max", ++ "help": "I/O operations burst", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-write", ++ "help": "limit write bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-read", ++ "help": "limit read bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.bps-total", ++ "help": "limit total bytes per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-write", ++ "help": "limit write operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-read", ++ "help": "limit read operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "throttling.iops-total", ++ "help": "limit total I/O operations per second", ++ "type": "number" ++ }, ++ { ++ "name": "werror", ++ "help": "write error action", ++ "type": "string" ++ }, ++ { ++ "name": "format", ++ "help": "disk format (raw, qcow2, ...)", ++ "type": "string" ++ }, ++ { ++ "name": "cache.writeback", ++ "help": "Enable writeback mode", ++ "type": "boolean" ++ }, ++ { ++ "name": "aio", ++ "help": "host AIO implementation (threads, native, io_uring)", ++ "type": "string" ++ }, ++ { ++ "name": "snapshot", ++ "help": "enable/disable snapshot mode", ++ "type": "boolean" ++ }, ++ { ++ "name": "force-share", ++ "help": "always accept other writers (default: off)", ++ "type": "boolean" ++ }, ++ { ++ "name": "discard", ++ "help": "discard operation (ignore/off, unmap/on)", ++ "type": "string" ++ }, ++ { ++ "name": "auto-read-only", ++ "help": "Node can become read-only if opening read-write fails", ++ "type": "boolean" ++ }, ++ { ++ "name": "cache.no-flush", ++ "help": "Ignore flush requests", ++ "type": "boolean" ++ }, ++ { ++ "name": "cache.direct", ++ "help": "Bypass software writeback cache on the host", ++ "type": "boolean" ++ }, ++ { ++ "name": "driver", ++ "help": "Block driver to use for the node", ++ "type": "string" ++ }, ++ { ++ "name": "node-name", ++ "help": "Node name of the block device node", ++ "type": "string" ++ } ++ ], ++ "option": "drive" ++ } ++ ], ++ "id": "libvirt-43" ++} ++ ++{ ++ "execute": "query-migrate-capabilities", ++ "id": "libvirt-44" ++} ++ ++{ ++ "return": [ ++ { ++ "state": false, ++ "capability": "xbzrle" ++ }, ++ { ++ "state": false, ++ "capability": "rdma-pin-all" ++ }, ++ { ++ "state": false, ++ "capability": "auto-converge" ++ }, ++ { ++ "state": false, ++ "capability": "zero-blocks" ++ }, ++ { ++ "state": false, ++ "capability": "compress" ++ }, ++ { ++ "state": false, ++ "capability": "events" ++ }, ++ { ++ "state": false, ++ "capability": "postcopy-ram" ++ }, ++ { ++ "state": false, ++ "capability": "x-colo" ++ }, ++ { ++ "state": false, ++ "capability": "release-ram" ++ }, ++ { ++ "state": false, ++ "capability": "block" ++ }, ++ { ++ "state": false, ++ "capability": "return-path" ++ }, ++ { ++ "state": false, ++ "capability": "pause-before-switchover" ++ }, ++ { ++ "state": false, ++ "capability": "multifd" ++ }, ++ { ++ "state": false, ++ "capability": "dirty-bitmaps" ++ }, ++ { ++ "state": false, ++ "capability": "postcopy-blocktime" ++ }, ++ { ++ "state": false, ++ "capability": "late-block-activate" ++ }, ++ { ++ "state": false, ++ "capability": "x-ignore-shared" ++ }, ++ { ++ "state": false, ++ "capability": "validate-uuid" ++ } ++ ], ++ "id": "libvirt-44" ++} ++ ++{ ++ "execute": "query-qmp-schema", ++ "id": "libvirt-45" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "query-status", ++ "ret-type": "1", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "SHUTDOWN", ++ "meta-type": "event", ++ "arg-type": "2" ++ }, ++ { ++ "name": "POWERDOWN", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "RESET", ++ "meta-type": "event", ++ "arg-type": "3" ++ }, ++ { ++ "name": "STOP", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "RESUME", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "SUSPEND", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "SUSPEND_DISK", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "WAKEUP", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "WATCHDOG", ++ "meta-type": "event", ++ "arg-type": "4" ++ }, ++ { ++ "name": "watchdog-set-action", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "5" ++ }, ++ { ++ "name": "GUEST_PANICKED", ++ "meta-type": "event", ++ "arg-type": "6" ++ }, ++ { ++ "name": "GUEST_CRASHLOADED", ++ "meta-type": "event", ++ "arg-type": "7" ++ }, ++ { ++ "name": "query-pr-managers", ++ "ret-type": "[8]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "eject", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "9" ++ }, ++ { ++ "name": "blockdev-open-tray", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "10" ++ }, ++ { ++ "name": "blockdev-close-tray", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "11" ++ }, ++ { ++ "name": "blockdev-remove-medium", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "12" ++ }, ++ { ++ "name": "blockdev-insert-medium", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "13" ++ }, ++ { ++ "name": "blockdev-change-medium", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "14" ++ }, ++ { ++ "name": "DEVICE_TRAY_MOVED", ++ "meta-type": "event", ++ "arg-type": "15" ++ }, ++ { ++ "name": "PR_MANAGER_STATUS_CHANGED", ++ "meta-type": "event", ++ "arg-type": "16" ++ }, ++ { ++ "name": "block_set_io_throttle", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "17" ++ }, ++ { ++ "name": "block-latency-histogram-set", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "18" ++ }, ++ { ++ "name": "query-block", ++ "ret-type": "[19]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-blockstats", ++ "ret-type": "[21]", ++ "meta-type": "command", ++ "arg-type": "20" ++ }, ++ { ++ "name": "query-block-jobs", ++ "ret-type": "[22]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "block_passwd", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "23" ++ }, ++ { ++ "name": "block_resize", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "24" ++ }, ++ { ++ "name": "blockdev-snapshot-sync", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "25" ++ }, ++ { ++ "name": "blockdev-snapshot", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "26", ++ "features": [ ++ "allow-write-only-overlay" ++ ] ++ }, ++ { ++ "name": "change-backing-file", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "27" ++ }, ++ { ++ "name": "block-commit", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "28" ++ }, ++ { ++ "name": "drive-backup", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "29" ++ }, ++ { ++ "name": "blockdev-backup", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "30" ++ }, ++ { ++ "name": "query-named-block-nodes", ++ "ret-type": "[32]", ++ "meta-type": "command", ++ "arg-type": "31" ++ }, ++ { ++ "name": "x-debug-query-block-graph", ++ "ret-type": "33", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "drive-mirror", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "34" ++ }, ++ { ++ "name": "block-dirty-bitmap-add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "35" ++ }, ++ { ++ "name": "block-dirty-bitmap-remove", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "36" ++ }, ++ { ++ "name": "block-dirty-bitmap-clear", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "36" ++ }, ++ { ++ "name": "block-dirty-bitmap-enable", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "36" ++ }, ++ { ++ "name": "block-dirty-bitmap-disable", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "36" ++ }, ++ { ++ "name": "block-dirty-bitmap-merge", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "37" ++ }, ++ { ++ "name": "x-debug-block-dirty-bitmap-sha256", ++ "ret-type": "38", ++ "meta-type": "command", ++ "arg-type": "36" ++ }, ++ { ++ "name": "blockdev-mirror", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "39" ++ }, ++ { ++ "name": "block-stream", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "40" ++ }, ++ { ++ "name": "block-job-set-speed", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "41" ++ }, ++ { ++ "name": "block-job-cancel", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "42" ++ }, ++ { ++ "name": "block-job-pause", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "43" ++ }, ++ { ++ "name": "block-job-resume", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "44" ++ }, ++ { ++ "name": "block-job-complete", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "45" ++ }, ++ { ++ "name": "block-job-dismiss", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "46" ++ }, ++ { ++ "name": "block-job-finalize", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "47" ++ }, ++ { ++ "name": "blockdev-add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "48" ++ }, ++ { ++ "name": "x-blockdev-reopen", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "48" ++ }, ++ { ++ "name": "blockdev-del", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "49" ++ }, ++ { ++ "name": "blockdev-create", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "50" ++ }, ++ { ++ "name": "BLOCK_IMAGE_CORRUPTED", ++ "meta-type": "event", ++ "arg-type": "51" ++ }, ++ { ++ "name": "BLOCK_IO_ERROR", ++ "meta-type": "event", ++ "arg-type": "52" ++ }, ++ { ++ "name": "BLOCK_JOB_COMPLETED", ++ "meta-type": "event", ++ "arg-type": "53" ++ }, ++ { ++ "name": "BLOCK_JOB_CANCELLED", ++ "meta-type": "event", ++ "arg-type": "54" ++ }, ++ { ++ "name": "BLOCK_JOB_ERROR", ++ "meta-type": "event", ++ "arg-type": "55" ++ }, ++ { ++ "name": "BLOCK_JOB_READY", ++ "meta-type": "event", ++ "arg-type": "56" ++ }, ++ { ++ "name": "BLOCK_JOB_PENDING", ++ "meta-type": "event", ++ "arg-type": "57" ++ }, ++ { ++ "name": "BLOCK_WRITE_THRESHOLD", ++ "meta-type": "event", ++ "arg-type": "58" ++ }, ++ { ++ "name": "block-set-write-threshold", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "59" ++ }, ++ { ++ "name": "x-blockdev-change", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "60" ++ }, ++ { ++ "name": "x-blockdev-set-iothread", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "61" ++ }, ++ { ++ "name": "nbd-server-start", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "62" ++ }, ++ { ++ "name": "nbd-server-add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "63" ++ }, ++ { ++ "name": "nbd-server-remove", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "64" ++ }, ++ { ++ "name": "nbd-server-stop", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "QUORUM_FAILURE", ++ "meta-type": "event", ++ "arg-type": "65" ++ }, ++ { ++ "name": "QUORUM_REPORT_BAD", ++ "meta-type": "event", ++ "arg-type": "66" ++ }, ++ { ++ "name": "blockdev-snapshot-internal-sync", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "67" ++ }, ++ { ++ "name": "blockdev-snapshot-delete-internal-sync", ++ "ret-type": "69", ++ "meta-type": "command", ++ "arg-type": "68" ++ }, ++ { ++ "name": "JOB_STATUS_CHANGE", ++ "meta-type": "event", ++ "arg-type": "70" ++ }, ++ { ++ "name": "job-pause", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "71" ++ }, ++ { ++ "name": "job-resume", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "72" ++ }, ++ { ++ "name": "job-cancel", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "73" ++ }, ++ { ++ "name": "job-complete", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "74" ++ }, ++ { ++ "name": "job-dismiss", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "75" ++ }, ++ { ++ "name": "job-finalize", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "76" ++ }, ++ { ++ "name": "query-jobs", ++ "ret-type": "[77]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-chardev", ++ "ret-type": "[78]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-chardev-backends", ++ "ret-type": "[79]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "ringbuf-write", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "80" ++ }, ++ { ++ "name": "ringbuf-read", ++ "ret-type": "str", ++ "meta-type": "command", ++ "arg-type": "81" ++ }, ++ { ++ "name": "chardev-add", ++ "ret-type": "83", ++ "meta-type": "command", ++ "arg-type": "82" ++ }, ++ { ++ "name": "chardev-change", ++ "ret-type": "83", ++ "meta-type": "command", ++ "arg-type": "84" ++ }, ++ { ++ "name": "chardev-remove", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "85" ++ }, ++ { ++ "name": "chardev-send-break", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "86" ++ }, ++ { ++ "name": "VSERPORT_CHANGE", ++ "meta-type": "event", ++ "arg-type": "87" ++ }, ++ { ++ "name": "dump-guest-memory", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "88" ++ }, ++ { ++ "name": "query-dump", ++ "ret-type": "89", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "DUMP_COMPLETED", ++ "meta-type": "event", ++ "arg-type": "90" ++ }, ++ { ++ "name": "query-dump-guest-memory-capability", ++ "ret-type": "91", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "set_link", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "92" ++ }, ++ { ++ "name": "netdev_add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "93" ++ }, ++ { ++ "name": "netdev_del", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "94" ++ }, ++ { ++ "name": "query-rx-filter", ++ "ret-type": "[96]", ++ "meta-type": "command", ++ "arg-type": "95" ++ }, ++ { ++ "name": "NIC_RX_FILTER_CHANGED", ++ "meta-type": "event", ++ "arg-type": "97" ++ }, ++ { ++ "name": "announce-self", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "98" ++ }, ++ { ++ "name": "FAILOVER_NEGOTIATED", ++ "meta-type": "event", ++ "arg-type": "99" ++ }, ++ { ++ "name": "RDMA_GID_STATUS_CHANGED", ++ "meta-type": "event", ++ "arg-type": "100" ++ }, ++ { ++ "name": "query-rocker", ++ "ret-type": "102", ++ "meta-type": "command", ++ "arg-type": "101" ++ }, ++ { ++ "name": "query-rocker-ports", ++ "ret-type": "[104]", ++ "meta-type": "command", ++ "arg-type": "103" ++ }, ++ { ++ "name": "query-rocker-of-dpa-flows", ++ "ret-type": "[106]", ++ "meta-type": "command", ++ "arg-type": "105" ++ }, ++ { ++ "name": "query-rocker-of-dpa-groups", ++ "ret-type": "[108]", ++ "meta-type": "command", ++ "arg-type": "107" ++ }, ++ { ++ "name": "query-tpm-models", ++ "ret-type": "[109]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-tpm-types", ++ "ret-type": "[110]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-tpm", ++ "ret-type": "[111]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "set_password", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "112" ++ }, ++ { ++ "name": "expire_password", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "113" ++ }, ++ { ++ "name": "screendump", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "114" ++ }, ++ { ++ "name": "query-spice", ++ "ret-type": "115", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "SPICE_CONNECTED", ++ "meta-type": "event", ++ "arg-type": "116" ++ }, ++ { ++ "name": "SPICE_INITIALIZED", ++ "meta-type": "event", ++ "arg-type": "117" ++ }, ++ { ++ "name": "SPICE_DISCONNECTED", ++ "meta-type": "event", ++ "arg-type": "118" ++ }, ++ { ++ "name": "SPICE_MIGRATE_COMPLETED", ++ "meta-type": "event", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-vnc", ++ "ret-type": "119", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-vnc-servers", ++ "ret-type": "[120]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "change-vnc-password", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "121" ++ }, ++ { ++ "name": "VNC_CONNECTED", ++ "meta-type": "event", ++ "arg-type": "122" ++ }, ++ { ++ "name": "VNC_INITIALIZED", ++ "meta-type": "event", ++ "arg-type": "123" ++ }, ++ { ++ "name": "VNC_DISCONNECTED", ++ "meta-type": "event", ++ "arg-type": "124" ++ }, ++ { ++ "name": "query-mice", ++ "ret-type": "[125]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "send-key", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "126" ++ }, ++ { ++ "name": "input-send-event", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "127" ++ }, ++ { ++ "name": "query-display-options", ++ "ret-type": "128", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-migrate", ++ "ret-type": "129", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "migrate-set-capabilities", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "130" ++ }, ++ { ++ "name": "query-migrate-capabilities", ++ "ret-type": "[131]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "migrate-set-parameters", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "132" ++ }, ++ { ++ "name": "query-migrate-parameters", ++ "ret-type": "133", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "client_migrate_info", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "134" ++ }, ++ { ++ "name": "migrate-start-postcopy", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "MIGRATION", ++ "meta-type": "event", ++ "arg-type": "135" ++ }, ++ { ++ "name": "MIGRATION_PASS", ++ "meta-type": "event", ++ "arg-type": "136" ++ }, ++ { ++ "name": "COLO_EXIT", ++ "meta-type": "event", ++ "arg-type": "137" ++ }, ++ { ++ "name": "x-colo-lost-heartbeat", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "migrate_cancel", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "migrate-continue", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "138" ++ }, ++ { ++ "name": "migrate_set_downtime", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "139", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "migrate_set_speed", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "140", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "migrate-set-cache-size", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "141", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "query-migrate-cache-size", ++ "ret-type": "int", ++ "meta-type": "command", ++ "arg-type": "0", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "migrate", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "142" ++ }, ++ { ++ "name": "migrate-incoming", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "143" ++ }, ++ { ++ "name": "xen-save-devices-state", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "144" ++ }, ++ { ++ "name": "xen-set-replication", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "145" ++ }, ++ { ++ "name": "query-xen-replication-status", ++ "ret-type": "146", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "xen-colo-do-checkpoint", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-colo-status", ++ "ret-type": "147", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "migrate-recover", ++ "ret-type": "0", ++ "allow-oob": true, ++ "meta-type": "command", ++ "arg-type": "148" ++ }, ++ { ++ "name": "migrate-pause", ++ "ret-type": "0", ++ "allow-oob": true, ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "UNPLUG_PRIMARY", ++ "meta-type": "event", ++ "arg-type": "149" ++ }, ++ { ++ "name": "transaction", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "150" ++ }, ++ { ++ "name": "trace-event-get-state", ++ "ret-type": "[152]", ++ "meta-type": "command", ++ "arg-type": "151" ++ }, ++ { ++ "name": "trace-event-set-state", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "153" ++ }, ++ { ++ "name": "qmp_capabilities", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "154" ++ }, ++ { ++ "name": "query-version", ++ "ret-type": "155", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-commands", ++ "ret-type": "[156]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-events", ++ "ret-type": "[157]", ++ "meta-type": "command", ++ "arg-type": "0", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "quit", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-qmp-schema", ++ "ret-type": "[158]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "qom-list", ++ "ret-type": "[160]", ++ "meta-type": "command", ++ "arg-type": "159" ++ }, ++ { ++ "name": "qom-get", ++ "ret-type": "any", ++ "meta-type": "command", ++ "arg-type": "161" ++ }, ++ { ++ "name": "qom-set", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "162" ++ }, ++ { ++ "name": "qom-list-types", ++ "ret-type": "[164]", ++ "meta-type": "command", ++ "arg-type": "163" ++ }, ++ { ++ "name": "qom-list-properties", ++ "ret-type": "[160]", ++ "meta-type": "command", ++ "arg-type": "165" ++ }, ++ { ++ "name": "object-add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "166" ++ }, ++ { ++ "name": "object-del", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "167" ++ }, ++ { ++ "name": "device-list-properties", ++ "ret-type": "[160]", ++ "meta-type": "command", ++ "arg-type": "168" ++ }, ++ { ++ "name": "device_add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "169" ++ }, ++ { ++ "name": "device_del", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "170" ++ }, ++ { ++ "name": "DEVICE_DELETED", ++ "meta-type": "event", ++ "arg-type": "171" ++ }, ++ { ++ "name": "query-cpus", ++ "ret-type": "[172]", ++ "meta-type": "command", ++ "arg-type": "0", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "query-cpus-fast", ++ "ret-type": "[173]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "cpu-add", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "174", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "query-machines", ++ "ret-type": "[175]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-current-machine", ++ "ret-type": "176", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-target", ++ "ret-type": "177", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-memdev", ++ "ret-type": "[178]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-hotpluggable-cpus", ++ "ret-type": "[179]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "set-numa-node", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "180" ++ }, ++ { ++ "name": "query-cpu-model-expansion", ++ "ret-type": "186", ++ "meta-type": "command", ++ "arg-type": "185" ++ }, ++ { ++ "name": "query-cpu-definitions", ++ "ret-type": "[187]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "add_client", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "188" ++ }, ++ { ++ "name": "query-name", ++ "ret-type": "189", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-kvm", ++ "ret-type": "190", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-uuid", ++ "ret-type": "191", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-iothreads", ++ "ret-type": "[192]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-balloon", ++ "ret-type": "193", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "BALLOON_CHANGE", ++ "meta-type": "event", ++ "arg-type": "194" ++ }, ++ { ++ "name": "query-pci", ++ "ret-type": "[195]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "stop", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "system_reset", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "system_powerdown", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "memsave", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "196" ++ }, ++ { ++ "name": "pmemsave", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "197" ++ }, ++ { ++ "name": "cont", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "x-exit-preconfig", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "system_wakeup", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "inject-nmi", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "balloon", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "198" ++ }, ++ { ++ "name": "human-monitor-command", ++ "ret-type": "str", ++ "meta-type": "command", ++ "arg-type": "199", ++ "features": [ ++ "savevm-monitor-nodes" ++ ] ++ }, ++ { ++ "name": "change", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "200", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "xen-set-global-dirty-log", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "201" ++ }, ++ { ++ "name": "getfd", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "202" ++ }, ++ { ++ "name": "closefd", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "203" ++ }, ++ { ++ "name": "query-memory-size-summary", ++ "ret-type": "204", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "add-fd", ++ "ret-type": "206", ++ "meta-type": "command", ++ "arg-type": "205" ++ }, ++ { ++ "name": "remove-fd", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "207" ++ }, ++ { ++ "name": "query-fdsets", ++ "ret-type": "[208]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-command-line-options", ++ "ret-type": "[210]", ++ "meta-type": "command", ++ "arg-type": "209" ++ }, ++ { ++ "name": "query-memory-devices", ++ "ret-type": "[211]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "MEM_UNPLUG_ERROR", ++ "meta-type": "event", ++ "arg-type": "212" ++ }, ++ { ++ "name": "query-acpi-ospm-status", ++ "ret-type": "[213]", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "ACPI_DEVICE_OST", ++ "meta-type": "event", ++ "arg-type": "214" ++ }, ++ { ++ "name": "xen-load-devices-state", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "215" ++ }, ++ { ++ "name": "query-vm-generation-id", ++ "ret-type": "216", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "RTC_CHANGE", ++ "meta-type": "event", ++ "arg-type": "217" ++ }, ++ { ++ "name": "rtc-reset-reinjection", ++ "ret-type": "0", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-sev", ++ "ret-type": "218", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-sev-launch-measure", ++ "ret-type": "219", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "query-sev-capabilities", ++ "ret-type": "220", ++ "meta-type": "command", ++ "arg-type": "0" ++ }, ++ { ++ "name": "0", ++ "members": [ ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "1", ++ "members": [ ++ { ++ "name": "running", ++ "type": "bool" ++ }, ++ { ++ "name": "singlestep", ++ "type": "bool" ++ }, ++ { ++ "name": "status", ++ "type": "223" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "2", ++ "members": [ ++ { ++ "name": "guest", ++ "type": "bool" ++ }, ++ { ++ "name": "reason", ++ "type": "224" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "3", ++ "members": [ ++ { ++ "name": "guest", ++ "type": "bool" ++ }, ++ { ++ "name": "reason", ++ "type": "224" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "4", ++ "members": [ ++ { ++ "name": "action", ++ "type": "225" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "5", ++ "members": [ ++ { ++ "name": "action", ++ "type": "225" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "6", ++ "members": [ ++ { ++ "name": "action", ++ "type": "226" ++ }, ++ { ++ "name": "info", ++ "default": null, ++ "type": "227" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "7", ++ "members": [ ++ { ++ "name": "action", ++ "type": "226" ++ }, ++ { ++ "name": "info", ++ "default": null, ++ "type": "227" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[8]", ++ "element-type": "8", ++ "meta-type": "array" ++ }, ++ { ++ "name": "8", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "connected", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "9", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "force", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "10", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "force", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "11", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "12", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "13", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "14", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "read-only-mode", ++ "default": null, ++ "type": "228" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "15", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "tray-open", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "16", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "connected", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "17", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "bps", ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd", ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr", ++ "type": "int" ++ }, ++ { ++ "name": "iops", ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd", ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr", ++ "type": "int" ++ }, ++ { ++ "name": "bps_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "18", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "boundaries", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "boundaries-read", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "boundaries-write", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "boundaries-flush", ++ "default": null, ++ "type": "[int]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[19]", ++ "element-type": "19", ++ "meta-type": "array" ++ }, ++ { ++ "name": "19", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "qdev", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "removable", ++ "type": "bool" ++ }, ++ { ++ "name": "locked", ++ "type": "bool" ++ }, ++ { ++ "name": "inserted", ++ "default": null, ++ "type": "32" ++ }, ++ { ++ "name": "tray_open", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "io-status", ++ "default": null, ++ "type": "229" ++ }, ++ { ++ "name": "dirty-bitmaps", ++ "default": null, ++ "type": "[230]", ++ "features": [ ++ "deprecated" ++ ] ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "20", ++ "members": [ ++ { ++ "name": "query-nodes", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[21]", ++ "element-type": "21", ++ "meta-type": "array" ++ }, ++ { ++ "name": "21", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "qdev", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "stats", ++ "type": "231" ++ }, ++ { ++ "name": "driver-specific", ++ "default": null, ++ "type": "232" ++ }, ++ { ++ "name": "parent", ++ "default": null, ++ "type": "21" ++ }, ++ { ++ "name": "backing", ++ "default": null, ++ "type": "21" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[22]", ++ "element-type": "22", ++ "meta-type": "array" ++ }, ++ { ++ "name": "22", ++ "members": [ ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "len", ++ "type": "int" ++ }, ++ { ++ "name": "offset", ++ "type": "int" ++ }, ++ { ++ "name": "busy", ++ "type": "bool" ++ }, ++ { ++ "name": "paused", ++ "type": "bool" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ }, ++ { ++ "name": "io-status", ++ "type": "229" ++ }, ++ { ++ "name": "ready", ++ "type": "bool" ++ }, ++ { ++ "name": "status", ++ "type": "233" ++ }, ++ { ++ "name": "auto-finalize", ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "type": "bool" ++ }, ++ { ++ "name": "error", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "23", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "24", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "25", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "snapshot-file", ++ "type": "str" ++ }, ++ { ++ "name": "snapshot-node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "mode", ++ "default": null, ++ "type": "234" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "26", ++ "members": [ ++ { ++ "name": "node", ++ "type": "str" ++ }, ++ { ++ "name": "overlay", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "27", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "image-node-name", ++ "type": "str" ++ }, ++ { ++ "name": "backing-file", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "28", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "base-node", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "base", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "top-node", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "top", ++ "default": null, ++ "type": "str", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "on-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "filter-node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "29", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "sync", ++ "type": "236" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bitmap", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "bitmap-mode", ++ "default": null, ++ "type": "237" ++ }, ++ { ++ "name": "compress", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "on-source-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "on-target-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "filter-node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "mode", ++ "default": null, ++ "type": "234" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "30", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "sync", ++ "type": "236" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bitmap", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "bitmap-mode", ++ "default": null, ++ "type": "237" ++ }, ++ { ++ "name": "compress", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "on-source-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "on-target-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "filter-node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "31", ++ "members": [ ++ { ++ "name": "flat", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[32]", ++ "element-type": "32", ++ "meta-type": "array" ++ }, ++ { ++ "name": "32", ++ "members": [ ++ { ++ "name": "file", ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ro", ++ "type": "bool" ++ }, ++ { ++ "name": "drv", ++ "type": "str" ++ }, ++ { ++ "name": "backing_file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "backing_file_depth", ++ "type": "int" ++ }, ++ { ++ "name": "encrypted", ++ "type": "bool" ++ }, ++ { ++ "name": "encryption_key_missing", ++ "type": "bool", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "detect_zeroes", ++ "type": "238" ++ }, ++ { ++ "name": "bps", ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd", ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr", ++ "type": "int" ++ }, ++ { ++ "name": "iops", ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd", ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr", ++ "type": "int" ++ }, ++ { ++ "name": "image", ++ "type": "239" ++ }, ++ { ++ "name": "bps_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr_max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_rd_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bps_wr_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_rd_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_wr_max_length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iops_size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cache", ++ "type": "240" ++ }, ++ { ++ "name": "write_threshold", ++ "type": "int" ++ }, ++ { ++ "name": "dirty-bitmaps", ++ "default": null, ++ "type": "[230]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "33", ++ "members": [ ++ { ++ "name": "nodes", ++ "type": "[241]" ++ }, ++ { ++ "name": "edges", ++ "type": "[242]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "34", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "replaces", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sync", ++ "type": "236" ++ }, ++ { ++ "name": "mode", ++ "default": null, ++ "type": "234" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "granularity", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "buf-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "on-source-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "on-target-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "unmap", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "copy-mode", ++ "default": null, ++ "type": "243" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "35", ++ "members": [ ++ { ++ "name": "node", ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "granularity", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "persistent", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "disabled", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "36", ++ "members": [ ++ { ++ "name": "node", ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "37", ++ "members": [ ++ { ++ "name": "node", ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "bitmaps", ++ "type": "[244]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "38", ++ "members": [ ++ { ++ "name": "sha256", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "39", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "replaces", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sync", ++ "type": "236" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "granularity", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "buf-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "on-source-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "on-target-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "filter-node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "copy-mode", ++ "default": null, ++ "type": "243" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "40", ++ "members": [ ++ { ++ "name": "job-id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "base", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "base-node", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "speed", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "on-error", ++ "default": null, ++ "type": "235" ++ }, ++ { ++ "name": "auto-finalize", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-dismiss", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "41", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "42", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "force", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "43", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "44", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "45", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "46", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "47", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "48", ++ "tag": "driver", ++ "variants": [ ++ { ++ "case": "blkdebug", ++ "type": "248" ++ }, ++ { ++ "case": "blklogwrites", ++ "type": "249" ++ }, ++ { ++ "case": "blkverify", ++ "type": "250" ++ }, ++ { ++ "case": "blkreplay", ++ "type": "251" ++ }, ++ { ++ "case": "bochs", ++ "type": "252" ++ }, ++ { ++ "case": "cloop", ++ "type": "252" ++ }, ++ { ++ "case": "compress", ++ "type": "252" ++ }, ++ { ++ "case": "copy-on-read", ++ "type": "252" ++ }, ++ { ++ "case": "dmg", ++ "type": "252" ++ }, ++ { ++ "case": "file", ++ "type": "253" ++ }, ++ { ++ "case": "ftp", ++ "type": "254" ++ }, ++ { ++ "case": "ftps", ++ "type": "255" ++ }, ++ { ++ "case": "gluster", ++ "type": "256" ++ }, ++ { ++ "case": "host_cdrom", ++ "type": "253" ++ }, ++ { ++ "case": "host_device", ++ "type": "253" ++ }, ++ { ++ "case": "http", ++ "type": "257" ++ }, ++ { ++ "case": "https", ++ "type": "258" ++ }, ++ { ++ "case": "iscsi", ++ "type": "259" ++ }, ++ { ++ "case": "luks", ++ "type": "260" ++ }, ++ { ++ "case": "nbd", ++ "type": "261" ++ }, ++ { ++ "case": "nfs", ++ "type": "262" ++ }, ++ { ++ "case": "null-aio", ++ "type": "263" ++ }, ++ { ++ "case": "null-co", ++ "type": "263" ++ }, ++ { ++ "case": "nvme", ++ "type": "264" ++ }, ++ { ++ "case": "parallels", ++ "type": "252" ++ }, ++ { ++ "case": "qcow2", ++ "type": "265" ++ }, ++ { ++ "case": "qcow", ++ "type": "266" ++ }, ++ { ++ "case": "qed", ++ "type": "267" ++ }, ++ { ++ "case": "quorum", ++ "type": "268" ++ }, ++ { ++ "case": "raw", ++ "type": "269" ++ }, ++ { ++ "case": "rbd", ++ "type": "270" ++ }, ++ { ++ "case": "replication", ++ "type": "271" ++ }, ++ { ++ "case": "sheepdog", ++ "type": "272" ++ }, ++ { ++ "case": "ssh", ++ "type": "273" ++ }, ++ { ++ "case": "throttle", ++ "type": "274" ++ }, ++ { ++ "case": "vdi", ++ "type": "252" ++ }, ++ { ++ "case": "vhdx", ++ "type": "252" ++ }, ++ { ++ "case": "vmdk", ++ "type": "267" ++ }, ++ { ++ "case": "vpc", ++ "type": "252" ++ }, ++ { ++ "case": "vvfat", ++ "type": "275" ++ }, ++ { ++ "case": "vxhs", ++ "type": "276" ++ } ++ ], ++ "members": [ ++ { ++ "name": "driver", ++ "type": "245" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "discard", ++ "default": null, ++ "type": "246" ++ }, ++ { ++ "name": "cache", ++ "default": null, ++ "type": "247" ++ }, ++ { ++ "name": "read-only", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "auto-read-only", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "force-share", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "detect-zeroes", ++ "default": null, ++ "type": "238" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "49", ++ "members": [ ++ { ++ "name": "node-name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "50", ++ "members": [ ++ { ++ "name": "job-id", ++ "type": "str" ++ }, ++ { ++ "name": "options", ++ "type": "277" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "51", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "msg", ++ "type": "str" ++ }, ++ { ++ "name": "offset", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "fatal", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "52", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "operation", ++ "type": "278" ++ }, ++ { ++ "name": "action", ++ "type": "279" ++ }, ++ { ++ "name": "nospace", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "reason", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "53", ++ "members": [ ++ { ++ "name": "type", ++ "type": "280" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "len", ++ "type": "int" ++ }, ++ { ++ "name": "offset", ++ "type": "int" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ }, ++ { ++ "name": "error", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "54", ++ "members": [ ++ { ++ "name": "type", ++ "type": "280" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "len", ++ "type": "int" ++ }, ++ { ++ "name": "offset", ++ "type": "int" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "55", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "operation", ++ "type": "278" ++ }, ++ { ++ "name": "action", ++ "type": "279" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "56", ++ "members": [ ++ { ++ "name": "type", ++ "type": "280" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "len", ++ "type": "int" ++ }, ++ { ++ "name": "offset", ++ "type": "int" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "57", ++ "members": [ ++ { ++ "name": "type", ++ "type": "280" ++ }, ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "58", ++ "members": [ ++ { ++ "name": "node-name", ++ "type": "str" ++ }, ++ { ++ "name": "amount-exceeded", ++ "type": "int" ++ }, ++ { ++ "name": "write-threshold", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "59", ++ "members": [ ++ { ++ "name": "node-name", ++ "type": "str" ++ }, ++ { ++ "name": "write-threshold", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "60", ++ "members": [ ++ { ++ "name": "parent", ++ "type": "str" ++ }, ++ { ++ "name": "child", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "61", ++ "members": [ ++ { ++ "name": "node-name", ++ "type": "str" ++ }, ++ { ++ "name": "iothread", ++ "type": "281" ++ }, ++ { ++ "name": "force", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "62", ++ "members": [ ++ { ++ "name": "addr", ++ "type": "282" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tls-authz", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "63", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "description", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "writable", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "bitmap", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "64", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "mode", ++ "default": null, ++ "type": "283" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "65", ++ "members": [ ++ { ++ "name": "reference", ++ "type": "str" ++ }, ++ { ++ "name": "sector-num", ++ "type": "int" ++ }, ++ { ++ "name": "sectors-count", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "66", ++ "members": [ ++ { ++ "name": "type", ++ "type": "284" ++ }, ++ { ++ "name": "error", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "node-name", ++ "type": "str" ++ }, ++ { ++ "name": "sector-num", ++ "type": "int" ++ }, ++ { ++ "name": "sectors-count", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "67", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "68", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "69", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "vm-state-size", ++ "type": "int" ++ }, ++ { ++ "name": "date-sec", ++ "type": "int" ++ }, ++ { ++ "name": "date-nsec", ++ "type": "int" ++ }, ++ { ++ "name": "vm-clock-sec", ++ "type": "int" ++ }, ++ { ++ "name": "vm-clock-nsec", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "70", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "status", ++ "type": "233" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "71", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "72", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "73", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "74", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "75", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "76", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[77]", ++ "element-type": "77", ++ "meta-type": "array" ++ }, ++ { ++ "name": "77", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "280" ++ }, ++ { ++ "name": "status", ++ "type": "233" ++ }, ++ { ++ "name": "current-progress", ++ "type": "int" ++ }, ++ { ++ "name": "total-progress", ++ "type": "int" ++ }, ++ { ++ "name": "error", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[78]", ++ "element-type": "78", ++ "meta-type": "array" ++ }, ++ { ++ "name": "78", ++ "members": [ ++ { ++ "name": "label", ++ "type": "str" ++ }, ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "frontend-open", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[79]", ++ "element-type": "79", ++ "meta-type": "array" ++ }, ++ { ++ "name": "79", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "80", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "data", ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "285" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "81", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "285" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "str", ++ "json-type": "string", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "82", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "backend", ++ "type": "286" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "83", ++ "members": [ ++ { ++ "name": "pty", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "84", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "backend", ++ "type": "286" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "85", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "86", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "87", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "open", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "88", ++ "members": [ ++ { ++ "name": "paging", ++ "type": "bool" ++ }, ++ { ++ "name": "protocol", ++ "type": "str" ++ }, ++ { ++ "name": "detach", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "begin", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "length", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "format", ++ "default": null, ++ "type": "287" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "89", ++ "members": [ ++ { ++ "name": "status", ++ "type": "288" ++ }, ++ { ++ "name": "completed", ++ "type": "int" ++ }, ++ { ++ "name": "total", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "90", ++ "members": [ ++ { ++ "name": "result", ++ "type": "89" ++ }, ++ { ++ "name": "error", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "91", ++ "members": [ ++ { ++ "name": "formats", ++ "type": "[287]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "92", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "up", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "93", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "nic", ++ "type": "290" ++ }, ++ { ++ "case": "user", ++ "type": "291" ++ }, ++ { ++ "case": "tap", ++ "type": "292" ++ }, ++ { ++ "case": "l2tpv3", ++ "type": "293" ++ }, ++ { ++ "case": "socket", ++ "type": "294" ++ }, ++ { ++ "case": "vde", ++ "type": "295" ++ }, ++ { ++ "case": "bridge", ++ "type": "296" ++ }, ++ { ++ "case": "hubport", ++ "type": "297" ++ }, ++ { ++ "case": "netmap", ++ "type": "298" ++ }, ++ { ++ "case": "vhost-user", ++ "type": "299" ++ }, ++ { ++ "case": "none", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "289" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "94", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "95", ++ "members": [ ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[96]", ++ "element-type": "96", ++ "meta-type": "array" ++ }, ++ { ++ "name": "96", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "promiscuous", ++ "type": "bool" ++ }, ++ { ++ "name": "multicast", ++ "type": "300" ++ }, ++ { ++ "name": "unicast", ++ "type": "300" ++ }, ++ { ++ "name": "vlan", ++ "type": "300" ++ }, ++ { ++ "name": "broadcast-allowed", ++ "type": "bool" ++ }, ++ { ++ "name": "multicast-overflow", ++ "type": "bool" ++ }, ++ { ++ "name": "unicast-overflow", ++ "type": "bool" ++ }, ++ { ++ "name": "main-mac", ++ "type": "str" ++ }, ++ { ++ "name": "vlan-table", ++ "type": "[int]" ++ }, ++ { ++ "name": "unicast-table", ++ "type": "[str]" ++ }, ++ { ++ "name": "multicast-table", ++ "type": "[str]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "97", ++ "members": [ ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "path", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "98", ++ "members": [ ++ { ++ "name": "initial", ++ "type": "int" ++ }, ++ { ++ "name": "max", ++ "type": "int" ++ }, ++ { ++ "name": "rounds", ++ "type": "int" ++ }, ++ { ++ "name": "step", ++ "type": "int" ++ }, ++ { ++ "name": "interfaces", ++ "default": null, ++ "type": "[str]" ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "99", ++ "members": [ ++ { ++ "name": "device-id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "100", ++ "members": [ ++ { ++ "name": "netdev", ++ "type": "str" ++ }, ++ { ++ "name": "gid-status", ++ "type": "bool" ++ }, ++ { ++ "name": "subnet-prefix", ++ "type": "int" ++ }, ++ { ++ "name": "interface-id", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "101", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "102", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "id", ++ "type": "int" ++ }, ++ { ++ "name": "ports", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "103", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[104]", ++ "element-type": "104", ++ "meta-type": "array" ++ }, ++ { ++ "name": "104", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "enabled", ++ "type": "bool" ++ }, ++ { ++ "name": "link-up", ++ "type": "bool" ++ }, ++ { ++ "name": "speed", ++ "type": "int" ++ }, ++ { ++ "name": "duplex", ++ "type": "301" ++ }, ++ { ++ "name": "autoneg", ++ "type": "302" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "105", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "tbl-id", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[106]", ++ "element-type": "106", ++ "meta-type": "array" ++ }, ++ { ++ "name": "106", ++ "members": [ ++ { ++ "name": "cookie", ++ "type": "int" ++ }, ++ { ++ "name": "hits", ++ "type": "int" ++ }, ++ { ++ "name": "key", ++ "type": "303" ++ }, ++ { ++ "name": "mask", ++ "type": "304" ++ }, ++ { ++ "name": "action", ++ "type": "305" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "107", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[108]", ++ "element-type": "108", ++ "meta-type": "array" ++ }, ++ { ++ "name": "108", ++ "members": [ ++ { ++ "name": "id", ++ "type": "int" ++ }, ++ { ++ "name": "type", ++ "type": "int" ++ }, ++ { ++ "name": "vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "pport", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "index", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "out-pport", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "set-vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "pop-vlan", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group-ids", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "set-eth-src", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "set-eth-dst", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ttl-check", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[109]", ++ "element-type": "109", ++ "meta-type": "array" ++ }, ++ { ++ "name": "109", ++ "meta-type": "enum", ++ "values": [ ++ "tpm-tis", ++ "tpm-crb", ++ "tpm-spapr" ++ ] ++ }, ++ { ++ "name": "[110]", ++ "element-type": "110", ++ "meta-type": "array" ++ }, ++ { ++ "name": "110", ++ "meta-type": "enum", ++ "values": [ ++ "passthrough", ++ "emulator" ++ ] ++ }, ++ { ++ "name": "[111]", ++ "element-type": "111", ++ "meta-type": "array" ++ }, ++ { ++ "name": "111", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "model", ++ "type": "109" ++ }, ++ { ++ "name": "options", ++ "type": "306" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "112", ++ "members": [ ++ { ++ "name": "protocol", ++ "type": "str" ++ }, ++ { ++ "name": "password", ++ "type": "str" ++ }, ++ { ++ "name": "connected", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "113", ++ "members": [ ++ { ++ "name": "protocol", ++ "type": "str" ++ }, ++ { ++ "name": "time", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "114", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "head", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "115", ++ "members": [ ++ { ++ "name": "enabled", ++ "type": "bool" ++ }, ++ { ++ "name": "migrated", ++ "type": "bool" ++ }, ++ { ++ "name": "host", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tls-port", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "auth", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "compiled-version", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "mouse-mode", ++ "type": "307" ++ }, ++ { ++ "name": "channels", ++ "default": null, ++ "type": "[308]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "116", ++ "members": [ ++ { ++ "name": "server", ++ "type": "309" ++ }, ++ { ++ "name": "client", ++ "type": "309" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "117", ++ "members": [ ++ { ++ "name": "server", ++ "type": "310" ++ }, ++ { ++ "name": "client", ++ "type": "308" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "118", ++ "members": [ ++ { ++ "name": "server", ++ "type": "309" ++ }, ++ { ++ "name": "client", ++ "type": "309" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "119", ++ "members": [ ++ { ++ "name": "enabled", ++ "type": "bool" ++ }, ++ { ++ "name": "host", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "default": null, ++ "type": "311" ++ }, ++ { ++ "name": "service", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "auth", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "clients", ++ "default": null, ++ "type": "[312]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[120]", ++ "element-type": "120", ++ "meta-type": "array" ++ }, ++ { ++ "name": "120", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "server", ++ "type": "[313]" ++ }, ++ { ++ "name": "clients", ++ "type": "[312]" ++ }, ++ { ++ "name": "auth", ++ "type": "314" ++ }, ++ { ++ "name": "vencrypt", ++ "default": null, ++ "type": "315" ++ }, ++ { ++ "name": "display", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "121", ++ "members": [ ++ { ++ "name": "password", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "122", ++ "members": [ ++ { ++ "name": "server", ++ "type": "316" ++ }, ++ { ++ "name": "client", ++ "type": "317" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "123", ++ "members": [ ++ { ++ "name": "server", ++ "type": "316" ++ }, ++ { ++ "name": "client", ++ "type": "312" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "124", ++ "members": [ ++ { ++ "name": "server", ++ "type": "316" ++ }, ++ { ++ "name": "client", ++ "type": "312" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[125]", ++ "element-type": "125", ++ "meta-type": "array" ++ }, ++ { ++ "name": "125", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "index", ++ "type": "int" ++ }, ++ { ++ "name": "current", ++ "type": "bool" ++ }, ++ { ++ "name": "absolute", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "126", ++ "members": [ ++ { ++ "name": "keys", ++ "type": "[318]" ++ }, ++ { ++ "name": "hold-time", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "127", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "head", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "events", ++ "type": "[319]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "128", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "gtk", ++ "type": "322" ++ }, ++ { ++ "case": "curses", ++ "type": "323" ++ }, ++ { ++ "case": "egl-headless", ++ "type": "324" ++ }, ++ { ++ "case": "default", ++ "type": "0" ++ }, ++ { ++ "case": "none", ++ "type": "0" ++ }, ++ { ++ "case": "sdl", ++ "type": "0" ++ }, ++ { ++ "case": "cocoa", ++ "type": "0" ++ }, ++ { ++ "case": "spice-app", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "320" ++ }, ++ { ++ "name": "full-screen", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "window-close", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "show-cursor", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "gl", ++ "default": null, ++ "type": "321" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "129", ++ "members": [ ++ { ++ "name": "status", ++ "default": null, ++ "type": "325" ++ }, ++ { ++ "name": "ram", ++ "default": null, ++ "type": "326" ++ }, ++ { ++ "name": "disk", ++ "default": null, ++ "type": "326" ++ }, ++ { ++ "name": "xbzrle-cache", ++ "default": null, ++ "type": "327" ++ }, ++ { ++ "name": "total-time", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "expected-downtime", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "downtime", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "setup-time", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpu-throttle-percentage", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "error-desc", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "postcopy-blocktime", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "postcopy-vcpu-blocktime", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "compression", ++ "default": null, ++ "type": "328" ++ }, ++ { ++ "name": "socket-address", ++ "default": null, ++ "type": "[329]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "130", ++ "members": [ ++ { ++ "name": "capabilities", ++ "type": "[131]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[131]", ++ "element-type": "131", ++ "meta-type": "array" ++ }, ++ { ++ "name": "131", ++ "members": [ ++ { ++ "name": "capability", ++ "type": "330" ++ }, ++ { ++ "name": "state", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "132", ++ "members": [ ++ { ++ "name": "announce-initial", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-rounds", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-step", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-level", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-threads", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-wait-thread", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "decompress-threads", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "throttle-trigger-threshold", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpu-throttle-initial", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpu-throttle-increment", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "281" ++ }, ++ { ++ "name": "tls-hostname", ++ "default": null, ++ "type": "281" ++ }, ++ { ++ "name": "tls-authz", ++ "default": null, ++ "type": "281" ++ }, ++ { ++ "name": "max-bandwidth", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "downtime-limit", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "x-checkpoint-delay", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "block-incremental", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "multifd-channels", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "xbzrle-cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-postcopy-bandwidth", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-cpu-throttle", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "multifd-compression", ++ "default": null, ++ "type": "331" ++ }, ++ { ++ "name": "multifd-zlib-level", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "multifd-zstd-level", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "133", ++ "members": [ ++ { ++ "name": "announce-initial", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-max", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-rounds", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "announce-step", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-level", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-threads", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "compress-wait-thread", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "decompress-threads", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "throttle-trigger-threshold", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpu-throttle-initial", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpu-throttle-increment", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tls-hostname", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tls-authz", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "max-bandwidth", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "downtime-limit", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "x-checkpoint-delay", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "block-incremental", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "multifd-channels", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "xbzrle-cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-postcopy-bandwidth", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-cpu-throttle", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "multifd-compression", ++ "default": null, ++ "type": "331" ++ }, ++ { ++ "name": "multifd-zlib-level", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "multifd-zstd-level", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "134", ++ "members": [ ++ { ++ "name": "protocol", ++ "type": "str" ++ }, ++ { ++ "name": "hostname", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tls-port", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cert-subject", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "135", ++ "members": [ ++ { ++ "name": "status", ++ "type": "325" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "136", ++ "members": [ ++ { ++ "name": "pass", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "137", ++ "members": [ ++ { ++ "name": "mode", ++ "type": "332" ++ }, ++ { ++ "name": "reason", ++ "type": "333" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "138", ++ "members": [ ++ { ++ "name": "state", ++ "type": "325" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "139", ++ "members": [ ++ { ++ "name": "value", ++ "type": "number" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "140", ++ "members": [ ++ { ++ "name": "value", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "141", ++ "members": [ ++ { ++ "name": "value", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "int", ++ "json-type": "int", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "142", ++ "members": [ ++ { ++ "name": "uri", ++ "type": "str" ++ }, ++ { ++ "name": "blk", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "inc", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "detach", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "resume", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "143", ++ "members": [ ++ { ++ "name": "uri", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "144", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "live", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "145", ++ "members": [ ++ { ++ "name": "enable", ++ "type": "bool" ++ }, ++ { ++ "name": "primary", ++ "type": "bool" ++ }, ++ { ++ "name": "failover", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "146", ++ "members": [ ++ { ++ "name": "error", ++ "type": "bool" ++ }, ++ { ++ "name": "desc", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "147", ++ "members": [ ++ { ++ "name": "mode", ++ "type": "332" ++ }, ++ { ++ "name": "last-mode", ++ "type": "332" ++ }, ++ { ++ "name": "reason", ++ "type": "333" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "148", ++ "members": [ ++ { ++ "name": "uri", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "149", ++ "members": [ ++ { ++ "name": "device-id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "150", ++ "members": [ ++ { ++ "name": "actions", ++ "type": "[334]" ++ }, ++ { ++ "name": "properties", ++ "default": null, ++ "type": "335" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "151", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "vcpu", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[152]", ++ "element-type": "152", ++ "meta-type": "array" ++ }, ++ { ++ "name": "152", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "state", ++ "type": "336" ++ }, ++ { ++ "name": "vcpu", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "153", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "enable", ++ "type": "bool" ++ }, ++ { ++ "name": "ignore-unavailable", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "vcpu", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "154", ++ "members": [ ++ { ++ "name": "enable", ++ "default": null, ++ "type": "[337]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "155", ++ "members": [ ++ { ++ "name": "qemu", ++ "type": "338" ++ }, ++ { ++ "name": "package", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[156]", ++ "element-type": "156", ++ "meta-type": "array" ++ }, ++ { ++ "name": "156", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[157]", ++ "element-type": "157", ++ "meta-type": "array" ++ }, ++ { ++ "name": "157", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[158]", ++ "element-type": "158", ++ "meta-type": "array" ++ }, ++ { ++ "name": "158", ++ "tag": "meta-type", ++ "variants": [ ++ { ++ "case": "builtin", ++ "type": "340" ++ }, ++ { ++ "case": "enum", ++ "type": "341" ++ }, ++ { ++ "case": "array", ++ "type": "342" ++ }, ++ { ++ "case": "object", ++ "type": "343" ++ }, ++ { ++ "case": "alternate", ++ "type": "344" ++ }, ++ { ++ "case": "command", ++ "type": "345" ++ }, ++ { ++ "case": "event", ++ "type": "346" ++ } ++ ], ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "meta-type", ++ "type": "339" ++ }, ++ { ++ "name": "features", ++ "default": null, ++ "type": "[str]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "159", ++ "members": [ ++ { ++ "name": "path", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[160]", ++ "element-type": "160", ++ "meta-type": "array" ++ }, ++ { ++ "name": "160", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "description", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "default-value", ++ "default": null, ++ "type": "any" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "161", ++ "members": [ ++ { ++ "name": "path", ++ "type": "str" ++ }, ++ { ++ "name": "property", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "any", ++ "json-type": "value", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "162", ++ "members": [ ++ { ++ "name": "path", ++ "type": "str" ++ }, ++ { ++ "name": "property", ++ "type": "str" ++ }, ++ { ++ "name": "value", ++ "type": "any" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "163", ++ "members": [ ++ { ++ "name": "implements", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "abstract", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[164]", ++ "element-type": "164", ++ "meta-type": "array" ++ }, ++ { ++ "name": "164", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "abstract", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "parent", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "165", ++ "members": [ ++ { ++ "name": "typename", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "166", ++ "members": [ ++ { ++ "name": "qom-type", ++ "type": "str" ++ }, ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "props", ++ "default": null, ++ "type": "any" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "167", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "168", ++ "members": [ ++ { ++ "name": "typename", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "169", ++ "members": [ ++ { ++ "name": "driver", ++ "type": "str" ++ }, ++ { ++ "name": "bus", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "170", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "171", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "path", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[172]", ++ "element-type": "172", ++ "meta-type": "array" ++ }, ++ { ++ "name": "172", ++ "tag": "arch", ++ "variants": [ ++ { ++ "case": "x86", ++ "type": "349" ++ }, ++ { ++ "case": "sparc", ++ "type": "350" ++ }, ++ { ++ "case": "ppc", ++ "type": "351" ++ }, ++ { ++ "case": "mips", ++ "type": "352" ++ }, ++ { ++ "case": "tricore", ++ "type": "353" ++ }, ++ { ++ "case": "s390", ++ "type": "354" ++ }, ++ { ++ "case": "riscv", ++ "type": "355" ++ }, ++ { ++ "case": "other", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "CPU", ++ "type": "int" ++ }, ++ { ++ "name": "current", ++ "type": "bool" ++ }, ++ { ++ "name": "halted", ++ "type": "bool" ++ }, ++ { ++ "name": "qom_path", ++ "type": "str" ++ }, ++ { ++ "name": "thread_id", ++ "type": "int" ++ }, ++ { ++ "name": "props", ++ "default": null, ++ "type": "347" ++ }, ++ { ++ "name": "arch", ++ "type": "348" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[173]", ++ "element-type": "173", ++ "meta-type": "array" ++ }, ++ { ++ "name": "173", ++ "tag": "target", ++ "variants": [ ++ { ++ "case": "s390x", ++ "type": "354" ++ }, ++ { ++ "case": "aarch64", ++ "type": "0" ++ }, ++ { ++ "case": "alpha", ++ "type": "0" ++ }, ++ { ++ "case": "arm", ++ "type": "0" ++ }, ++ { ++ "case": "cris", ++ "type": "0" ++ }, ++ { ++ "case": "hppa", ++ "type": "0" ++ }, ++ { ++ "case": "i386", ++ "type": "0" ++ }, ++ { ++ "case": "lm32", ++ "type": "0" ++ }, ++ { ++ "case": "m68k", ++ "type": "0" ++ }, ++ { ++ "case": "microblaze", ++ "type": "0" ++ }, ++ { ++ "case": "microblazeel", ++ "type": "0" ++ }, ++ { ++ "case": "mips", ++ "type": "0" ++ }, ++ { ++ "case": "mips64", ++ "type": "0" ++ }, ++ { ++ "case": "mips64el", ++ "type": "0" ++ }, ++ { ++ "case": "mipsel", ++ "type": "0" ++ }, ++ { ++ "case": "moxie", ++ "type": "0" ++ }, ++ { ++ "case": "nios2", ++ "type": "0" ++ }, ++ { ++ "case": "or1k", ++ "type": "0" ++ }, ++ { ++ "case": "ppc", ++ "type": "0" ++ }, ++ { ++ "case": "ppc64", ++ "type": "0" ++ }, ++ { ++ "case": "riscv32", ++ "type": "0" ++ }, ++ { ++ "case": "riscv64", ++ "type": "0" ++ }, ++ { ++ "case": "rx", ++ "type": "0" ++ }, ++ { ++ "case": "sh4", ++ "type": "0" ++ }, ++ { ++ "case": "sh4eb", ++ "type": "0" ++ }, ++ { ++ "case": "sparc", ++ "type": "0" ++ }, ++ { ++ "case": "sparc64", ++ "type": "0" ++ }, ++ { ++ "case": "tricore", ++ "type": "0" ++ }, ++ { ++ "case": "unicore32", ++ "type": "0" ++ }, ++ { ++ "case": "x86_64", ++ "type": "0" ++ }, ++ { ++ "case": "xtensa", ++ "type": "0" ++ }, ++ { ++ "case": "xtensaeb", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "cpu-index", ++ "type": "int" ++ }, ++ { ++ "name": "qom-path", ++ "type": "str" ++ }, ++ { ++ "name": "thread-id", ++ "type": "int" ++ }, ++ { ++ "name": "props", ++ "default": null, ++ "type": "347" ++ }, ++ { ++ "name": "arch", ++ "type": "348", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "target", ++ "type": "356" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "174", ++ "members": [ ++ { ++ "name": "id", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[175]", ++ "element-type": "175", ++ "meta-type": "array" ++ }, ++ { ++ "name": "175", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "alias", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "is-default", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "cpu-max", ++ "type": "int" ++ }, ++ { ++ "name": "hotpluggable-cpus", ++ "type": "bool" ++ }, ++ { ++ "name": "numa-mem-supported", ++ "type": "bool" ++ }, ++ { ++ "name": "deprecated", ++ "type": "bool" ++ }, ++ { ++ "name": "default-cpu-type", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "176", ++ "members": [ ++ { ++ "name": "wakeup-suspend-support", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "177", ++ "members": [ ++ { ++ "name": "arch", ++ "type": "356" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[178]", ++ "element-type": "178", ++ "meta-type": "array" ++ }, ++ { ++ "name": "178", ++ "members": [ ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "merge", ++ "type": "bool" ++ }, ++ { ++ "name": "dump", ++ "type": "bool" ++ }, ++ { ++ "name": "prealloc", ++ "type": "bool" ++ }, ++ { ++ "name": "host-nodes", ++ "type": "[int]" ++ }, ++ { ++ "name": "policy", ++ "type": "357" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[179]", ++ "element-type": "179", ++ "meta-type": "array" ++ }, ++ { ++ "name": "179", ++ "members": [ ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "vcpus-count", ++ "type": "int" ++ }, ++ { ++ "name": "props", ++ "type": "347" ++ }, ++ { ++ "name": "qom-path", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "180", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "node", ++ "type": "359" ++ }, ++ { ++ "case": "dist", ++ "type": "360" ++ }, ++ { ++ "case": "cpu", ++ "type": "361" ++ }, ++ { ++ "case": "hmat-lb", ++ "type": "362" ++ }, ++ { ++ "case": "hmat-cache", ++ "type": "363" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "358" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "185", ++ "members": [ ++ { ++ "name": "type", ++ "type": "366" ++ }, ++ { ++ "name": "model", ++ "type": "364" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "186", ++ "members": [ ++ { ++ "name": "model", ++ "type": "364" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[187]", ++ "element-type": "187", ++ "meta-type": "array" ++ }, ++ { ++ "name": "187", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "migration-safe", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "static", ++ "type": "bool" ++ }, ++ { ++ "name": "unavailable-features", ++ "default": null, ++ "type": "[str]" ++ }, ++ { ++ "name": "typename", ++ "type": "str" ++ }, ++ { ++ "name": "alias-of", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "188", ++ "members": [ ++ { ++ "name": "protocol", ++ "type": "str" ++ }, ++ { ++ "name": "fdname", ++ "type": "str" ++ }, ++ { ++ "name": "skipauth", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "tls", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "189", ++ "members": [ ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "190", ++ "members": [ ++ { ++ "name": "enabled", ++ "type": "bool" ++ }, ++ { ++ "name": "present", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "191", ++ "members": [ ++ { ++ "name": "UUID", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[192]", ++ "element-type": "192", ++ "meta-type": "array" ++ }, ++ { ++ "name": "192", ++ "members": [ ++ { ++ "name": "id", ++ "type": "str" ++ }, ++ { ++ "name": "thread-id", ++ "type": "int" ++ }, ++ { ++ "name": "poll-max-ns", ++ "type": "int" ++ }, ++ { ++ "name": "poll-grow", ++ "type": "int" ++ }, ++ { ++ "name": "poll-shrink", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "193", ++ "members": [ ++ { ++ "name": "actual", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "194", ++ "members": [ ++ { ++ "name": "actual", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[195]", ++ "element-type": "195", ++ "meta-type": "array" ++ }, ++ { ++ "name": "195", ++ "members": [ ++ { ++ "name": "bus", ++ "type": "int" ++ }, ++ { ++ "name": "devices", ++ "type": "[367]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "196", ++ "members": [ ++ { ++ "name": "val", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "cpu-index", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "197", ++ "members": [ ++ { ++ "name": "val", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "filename", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "198", ++ "members": [ ++ { ++ "name": "value", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "199", ++ "members": [ ++ { ++ "name": "command-line", ++ "type": "str" ++ }, ++ { ++ "name": "cpu-index", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "200", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "arg", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "201", ++ "members": [ ++ { ++ "name": "enable", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "202", ++ "members": [ ++ { ++ "name": "fdname", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "203", ++ "members": [ ++ { ++ "name": "fdname", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "204", ++ "members": [ ++ { ++ "name": "base-memory", ++ "type": "int" ++ }, ++ { ++ "name": "plugged-memory", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "205", ++ "members": [ ++ { ++ "name": "fdset-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "opaque", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "206", ++ "members": [ ++ { ++ "name": "fdset-id", ++ "type": "int" ++ }, ++ { ++ "name": "fd", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "207", ++ "members": [ ++ { ++ "name": "fdset-id", ++ "type": "int" ++ }, ++ { ++ "name": "fd", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[208]", ++ "element-type": "208", ++ "meta-type": "array" ++ }, ++ { ++ "name": "208", ++ "members": [ ++ { ++ "name": "fdset-id", ++ "type": "int" ++ }, ++ { ++ "name": "fds", ++ "type": "[368]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "209", ++ "members": [ ++ { ++ "name": "option", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[210]", ++ "element-type": "210", ++ "meta-type": "array" ++ }, ++ { ++ "name": "210", ++ "members": [ ++ { ++ "name": "option", ++ "type": "str" ++ }, ++ { ++ "name": "parameters", ++ "type": "[369]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[211]", ++ "element-type": "211", ++ "meta-type": "array" ++ }, ++ { ++ "name": "211", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "dimm", ++ "type": "371" ++ }, ++ { ++ "case": "nvdimm", ++ "type": "371" ++ }, ++ { ++ "case": "virtio-pmem", ++ "type": "372" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "370" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "212", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "msg", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[213]", ++ "element-type": "213", ++ "meta-type": "array" ++ }, ++ { ++ "name": "213", ++ "members": [ ++ { ++ "name": "device", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "slot", ++ "type": "str" ++ }, ++ { ++ "name": "slot-type", ++ "type": "373" ++ }, ++ { ++ "name": "source", ++ "type": "int" ++ }, ++ { ++ "name": "status", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "214", ++ "members": [ ++ { ++ "name": "info", ++ "type": "213" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "215", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "216", ++ "members": [ ++ { ++ "name": "guid", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "217", ++ "members": [ ++ { ++ "name": "offset", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "218", ++ "members": [ ++ { ++ "name": "enabled", ++ "type": "bool" ++ }, ++ { ++ "name": "api-major", ++ "type": "int" ++ }, ++ { ++ "name": "api-minor", ++ "type": "int" ++ }, ++ { ++ "name": "build-id", ++ "type": "int" ++ }, ++ { ++ "name": "policy", ++ "type": "int" ++ }, ++ { ++ "name": "state", ++ "type": "374" ++ }, ++ { ++ "name": "handle", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "219", ++ "members": [ ++ { ++ "name": "data", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "220", ++ "members": [ ++ { ++ "name": "pdh", ++ "type": "str" ++ }, ++ { ++ "name": "cert-chain", ++ "type": "str" ++ }, ++ { ++ "name": "cbitpos", ++ "type": "int" ++ }, ++ { ++ "name": "reduced-phys-bits", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "bool", ++ "json-type": "boolean", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "223", ++ "meta-type": "enum", ++ "values": [ ++ "debug", ++ "inmigrate", ++ "internal-error", ++ "io-error", ++ "paused", ++ "postmigrate", ++ "prelaunch", ++ "finish-migrate", ++ "restore-vm", ++ "running", ++ "save-vm", ++ "shutdown", ++ "suspended", ++ "watchdog", ++ "guest-panicked", ++ "colo", ++ "preconfig" ++ ] ++ }, ++ { ++ "name": "224", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "host-error", ++ "host-qmp-quit", ++ "host-qmp-system-reset", ++ "host-signal", ++ "host-ui", ++ "guest-shutdown", ++ "guest-reset", ++ "guest-panic", ++ "subsystem-reset" ++ ] ++ }, ++ { ++ "name": "225", ++ "meta-type": "enum", ++ "values": [ ++ "reset", ++ "shutdown", ++ "poweroff", ++ "pause", ++ "debug", ++ "none", ++ "inject-nmi" ++ ] ++ }, ++ { ++ "name": "226", ++ "meta-type": "enum", ++ "values": [ ++ "pause", ++ "poweroff", ++ "run" ++ ] ++ }, ++ { ++ "name": "227", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "hyper-v", ++ "type": "376" ++ }, ++ { ++ "case": "s390", ++ "type": "377" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "375" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "228", ++ "meta-type": "enum", ++ "values": [ ++ "retain", ++ "read-only", ++ "read-write" ++ ] ++ }, ++ { ++ "name": "[int]", ++ "element-type": "int", ++ "meta-type": "array" ++ }, ++ { ++ "name": "229", ++ "meta-type": "enum", ++ "values": [ ++ "ok", ++ "failed", ++ "nospace" ++ ] ++ }, ++ { ++ "name": "[230]", ++ "element-type": "230", ++ "meta-type": "array" ++ }, ++ { ++ "name": "230", ++ "members": [ ++ { ++ "name": "name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "count", ++ "type": "int" ++ }, ++ { ++ "name": "granularity", ++ "type": "int" ++ }, ++ { ++ "name": "recording", ++ "type": "bool" ++ }, ++ { ++ "name": "busy", ++ "type": "bool" ++ }, ++ { ++ "name": "status", ++ "type": "378", ++ "features": [ ++ "deprecated" ++ ] ++ }, ++ { ++ "name": "persistent", ++ "type": "bool" ++ }, ++ { ++ "name": "inconsistent", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "231", ++ "members": [ ++ { ++ "name": "rd_bytes", ++ "type": "int" ++ }, ++ { ++ "name": "wr_bytes", ++ "type": "int" ++ }, ++ { ++ "name": "unmap_bytes", ++ "type": "int" ++ }, ++ { ++ "name": "rd_operations", ++ "type": "int" ++ }, ++ { ++ "name": "wr_operations", ++ "type": "int" ++ }, ++ { ++ "name": "flush_operations", ++ "type": "int" ++ }, ++ { ++ "name": "unmap_operations", ++ "type": "int" ++ }, ++ { ++ "name": "rd_total_time_ns", ++ "type": "int" ++ }, ++ { ++ "name": "wr_total_time_ns", ++ "type": "int" ++ }, ++ { ++ "name": "flush_total_time_ns", ++ "type": "int" ++ }, ++ { ++ "name": "unmap_total_time_ns", ++ "type": "int" ++ }, ++ { ++ "name": "wr_highest_offset", ++ "type": "int" ++ }, ++ { ++ "name": "rd_merged", ++ "type": "int" ++ }, ++ { ++ "name": "wr_merged", ++ "type": "int" ++ }, ++ { ++ "name": "unmap_merged", ++ "type": "int" ++ }, ++ { ++ "name": "idle_time_ns", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "failed_rd_operations", ++ "type": "int" ++ }, ++ { ++ "name": "failed_wr_operations", ++ "type": "int" ++ }, ++ { ++ "name": "failed_flush_operations", ++ "type": "int" ++ }, ++ { ++ "name": "failed_unmap_operations", ++ "type": "int" ++ }, ++ { ++ "name": "invalid_rd_operations", ++ "type": "int" ++ }, ++ { ++ "name": "invalid_wr_operations", ++ "type": "int" ++ }, ++ { ++ "name": "invalid_flush_operations", ++ "type": "int" ++ }, ++ { ++ "name": "invalid_unmap_operations", ++ "type": "int" ++ }, ++ { ++ "name": "account_invalid", ++ "type": "bool" ++ }, ++ { ++ "name": "account_failed", ++ "type": "bool" ++ }, ++ { ++ "name": "timed_stats", ++ "type": "[379]" ++ }, ++ { ++ "name": "rd_latency_histogram", ++ "default": null, ++ "type": "380" ++ }, ++ { ++ "name": "wr_latency_histogram", ++ "default": null, ++ "type": "380" ++ }, ++ { ++ "name": "flush_latency_histogram", ++ "default": null, ++ "type": "380" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "232", ++ "tag": "driver", ++ "variants": [ ++ { ++ "case": "file", ++ "type": "381" ++ }, ++ { ++ "case": "host_device", ++ "type": "381" ++ }, ++ { ++ "case": "blkdebug", ++ "type": "0" ++ }, ++ { ++ "case": "blklogwrites", ++ "type": "0" ++ }, ++ { ++ "case": "blkreplay", ++ "type": "0" ++ }, ++ { ++ "case": "blkverify", ++ "type": "0" ++ }, ++ { ++ "case": "bochs", ++ "type": "0" ++ }, ++ { ++ "case": "cloop", ++ "type": "0" ++ }, ++ { ++ "case": "compress", ++ "type": "0" ++ }, ++ { ++ "case": "copy-on-read", ++ "type": "0" ++ }, ++ { ++ "case": "dmg", ++ "type": "0" ++ }, ++ { ++ "case": "ftp", ++ "type": "0" ++ }, ++ { ++ "case": "ftps", ++ "type": "0" ++ }, ++ { ++ "case": "gluster", ++ "type": "0" ++ }, ++ { ++ "case": "host_cdrom", ++ "type": "0" ++ }, ++ { ++ "case": "http", ++ "type": "0" ++ }, ++ { ++ "case": "https", ++ "type": "0" ++ }, ++ { ++ "case": "iscsi", ++ "type": "0" ++ }, ++ { ++ "case": "luks", ++ "type": "0" ++ }, ++ { ++ "case": "nbd", ++ "type": "0" ++ }, ++ { ++ "case": "nfs", ++ "type": "0" ++ }, ++ { ++ "case": "null-aio", ++ "type": "0" ++ }, ++ { ++ "case": "null-co", ++ "type": "0" ++ }, ++ { ++ "case": "nvme", ++ "type": "0" ++ }, ++ { ++ "case": "parallels", ++ "type": "0" ++ }, ++ { ++ "case": "qcow", ++ "type": "0" ++ }, ++ { ++ "case": "qcow2", ++ "type": "0" ++ }, ++ { ++ "case": "qed", ++ "type": "0" ++ }, ++ { ++ "case": "quorum", ++ "type": "0" ++ }, ++ { ++ "case": "raw", ++ "type": "0" ++ }, ++ { ++ "case": "rbd", ++ "type": "0" ++ }, ++ { ++ "case": "replication", ++ "type": "0" ++ }, ++ { ++ "case": "sheepdog", ++ "type": "0" ++ }, ++ { ++ "case": "ssh", ++ "type": "0" ++ }, ++ { ++ "case": "throttle", ++ "type": "0" ++ }, ++ { ++ "case": "vdi", ++ "type": "0" ++ }, ++ { ++ "case": "vhdx", ++ "type": "0" ++ }, ++ { ++ "case": "vmdk", ++ "type": "0" ++ }, ++ { ++ "case": "vpc", ++ "type": "0" ++ }, ++ { ++ "case": "vvfat", ++ "type": "0" ++ }, ++ { ++ "case": "vxhs", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "driver", ++ "type": "245" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "233", ++ "meta-type": "enum", ++ "values": [ ++ "undefined", ++ "created", ++ "running", ++ "paused", ++ "ready", ++ "standby", ++ "waiting", ++ "pending", ++ "aborting", ++ "concluded", ++ "null" ++ ] ++ }, ++ { ++ "name": "234", ++ "meta-type": "enum", ++ "values": [ ++ "existing", ++ "absolute-paths" ++ ] ++ }, ++ { ++ "name": "235", ++ "meta-type": "enum", ++ "values": [ ++ "report", ++ "ignore", ++ "enospc", ++ "stop", ++ "auto" ++ ] ++ }, ++ { ++ "name": "236", ++ "meta-type": "enum", ++ "values": [ ++ "top", ++ "full", ++ "none", ++ "incremental", ++ "bitmap" ++ ] ++ }, ++ { ++ "name": "237", ++ "meta-type": "enum", ++ "values": [ ++ "on-success", ++ "never", ++ "always" ++ ] ++ }, ++ { ++ "name": "238", ++ "meta-type": "enum", ++ "values": [ ++ "off", ++ "on", ++ "unmap" ++ ] ++ }, ++ { ++ "name": "239", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "format", ++ "type": "str" ++ }, ++ { ++ "name": "dirty-flag", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "actual-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "virtual-size", ++ "type": "int" ++ }, ++ { ++ "name": "cluster-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "encrypted", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "compressed", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "backing-filename", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "full-backing-filename", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "backing-filename-format", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "snapshots", ++ "default": null, ++ "type": "[69]" ++ }, ++ { ++ "name": "backing-image", ++ "default": null, ++ "type": "239" ++ }, ++ { ++ "name": "format-specific", ++ "default": null, ++ "type": "382" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "240", ++ "members": [ ++ { ++ "name": "writeback", ++ "type": "bool" ++ }, ++ { ++ "name": "direct", ++ "type": "bool" ++ }, ++ { ++ "name": "no-flush", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[241]", ++ "element-type": "241", ++ "meta-type": "array" ++ }, ++ { ++ "name": "241", ++ "members": [ ++ { ++ "name": "id", ++ "type": "int" ++ }, ++ { ++ "name": "type", ++ "type": "383" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[242]", ++ "element-type": "242", ++ "meta-type": "array" ++ }, ++ { ++ "name": "242", ++ "members": [ ++ { ++ "name": "parent", ++ "type": "int" ++ }, ++ { ++ "name": "child", ++ "type": "int" ++ }, ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "perm", ++ "type": "[384]" ++ }, ++ { ++ "name": "shared-perm", ++ "type": "[384]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "243", ++ "meta-type": "enum", ++ "values": [ ++ "background", ++ "write-blocking" ++ ] ++ }, ++ { ++ "name": "[244]", ++ "element-type": "244", ++ "meta-type": "array" ++ }, ++ { ++ "name": "244", ++ "members": [ ++ { ++ "type": "str" ++ }, ++ { ++ "type": "36" ++ } ++ ], ++ "meta-type": "alternate" ++ }, ++ { ++ "name": "245", ++ "meta-type": "enum", ++ "values": [ ++ "blkdebug", ++ "blklogwrites", ++ "blkreplay", ++ "blkverify", ++ "bochs", ++ "cloop", ++ "compress", ++ "copy-on-read", ++ "dmg", ++ "file", ++ "ftp", ++ "ftps", ++ "gluster", ++ "host_cdrom", ++ "host_device", ++ "http", ++ "https", ++ "iscsi", ++ "luks", ++ "nbd", ++ "nfs", ++ "null-aio", ++ "null-co", ++ "nvme", ++ "parallels", ++ "qcow", ++ "qcow2", ++ "qed", ++ "quorum", ++ "raw", ++ "rbd", ++ "replication", ++ "sheepdog", ++ "ssh", ++ "throttle", ++ "vdi", ++ "vhdx", ++ "vmdk", ++ "vpc", ++ "vvfat", ++ "vxhs" ++ ] ++ }, ++ { ++ "name": "246", ++ "meta-type": "enum", ++ "values": [ ++ "ignore", ++ "unmap" ++ ] ++ }, ++ { ++ "name": "247", ++ "members": [ ++ { ++ "name": "direct", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "no-flush", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "248", ++ "members": [ ++ { ++ "name": "image", ++ "type": "385" ++ }, ++ { ++ "name": "config", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "align", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-transfer", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "opt-write-zero", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-write-zero", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "opt-discard", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "max-discard", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "inject-error", ++ "default": null, ++ "type": "[386]" ++ }, ++ { ++ "name": "set-state", ++ "default": null, ++ "type": "[387]" ++ }, ++ { ++ "name": "take-child-perms", ++ "default": null, ++ "type": "[384]" ++ }, ++ { ++ "name": "unshare-child-perms", ++ "default": null, ++ "type": "[384]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "249", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "log", ++ "type": "385" ++ }, ++ { ++ "name": "log-sector-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "log-append", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "log-super-update-interval", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "250", ++ "members": [ ++ { ++ "name": "test", ++ "type": "385" ++ }, ++ { ++ "name": "raw", ++ "type": "385" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "251", ++ "members": [ ++ { ++ "name": "image", ++ "type": "385" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "252", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "253", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "pr-manager", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "locking", ++ "default": null, ++ "type": "388" ++ }, ++ { ++ "name": "aio", ++ "default": null, ++ "type": "389" ++ }, ++ { ++ "name": "drop-cache", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "x-check-cache-dropped", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object", ++ "features": [ ++ "dynamic-auto-read-only" ++ ] ++ }, ++ { ++ "name": "254", ++ "members": [ ++ { ++ "name": "url", ++ "type": "str" ++ }, ++ { ++ "name": "readahead", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "timeout", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-password-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "255", ++ "members": [ ++ { ++ "name": "url", ++ "type": "str" ++ }, ++ { ++ "name": "readahead", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "timeout", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sslverify", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "256", ++ "members": [ ++ { ++ "name": "volume", ++ "type": "str" ++ }, ++ { ++ "name": "path", ++ "type": "str" ++ }, ++ { ++ "name": "server", ++ "type": "[329]" ++ }, ++ { ++ "name": "debug", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "257", ++ "members": [ ++ { ++ "name": "url", ++ "type": "str" ++ }, ++ { ++ "name": "readahead", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "timeout", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cookie", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cookie-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "258", ++ "members": [ ++ { ++ "name": "url", ++ "type": "str" ++ }, ++ { ++ "name": "readahead", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "timeout", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-username", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "proxy-password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cookie", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sslverify", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "cookie-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "259", ++ "members": [ ++ { ++ "name": "transport", ++ "type": "390" ++ }, ++ { ++ "name": "portal", ++ "type": "str" ++ }, ++ { ++ "name": "target", ++ "type": "str" ++ }, ++ { ++ "name": "lun", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "user", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "password-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "initiator-name", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "header-digest", ++ "default": null, ++ "type": "391" ++ }, ++ { ++ "name": "timeout", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "260", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "261", ++ "members": [ ++ { ++ "name": "server", ++ "type": "329" ++ }, ++ { ++ "name": "export", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "x-dirty-bitmap", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "reconnect-delay", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "262", ++ "members": [ ++ { ++ "name": "server", ++ "type": "392" ++ }, ++ { ++ "name": "path", ++ "type": "str" ++ }, ++ { ++ "name": "user", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tcp-syn-count", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "readahead-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "page-cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "debug", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "263", ++ "members": [ ++ { ++ "name": "size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "latency-ns", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "read-zeroes", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "264", ++ "members": [ ++ { ++ "name": "device", ++ "type": "str" ++ }, ++ { ++ "name": "namespace", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "265", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "backing", ++ "default": null, ++ "type": "393" ++ }, ++ { ++ "name": "lazy-refcounts", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "pass-discard-request", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "pass-discard-snapshot", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "pass-discard-other", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "overlap-check", ++ "default": null, ++ "type": "394" ++ }, ++ { ++ "name": "cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "l2-cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "l2-cache-entry-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "refcount-cache-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cache-clean-interval", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "encrypt", ++ "default": null, ++ "type": "395" ++ }, ++ { ++ "name": "data-file", ++ "default": null, ++ "type": "385" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "266", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "backing", ++ "default": null, ++ "type": "393" ++ }, ++ { ++ "name": "encrypt", ++ "default": null, ++ "type": "396" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "267", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "backing", ++ "default": null, ++ "type": "393" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "268", ++ "members": [ ++ { ++ "name": "blkverify", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "children", ++ "type": "[385]" ++ }, ++ { ++ "name": "vote-threshold", ++ "type": "int" ++ }, ++ { ++ "name": "rewrite-corrupted", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "read-pattern", ++ "default": null, ++ "type": "397" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "269", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "offset", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "270", ++ "members": [ ++ { ++ "name": "pool", ++ "type": "str" ++ }, ++ { ++ "name": "namespace", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "image", ++ "type": "str" ++ }, ++ { ++ "name": "conf", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "snapshot", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "user", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "auth-client-required", ++ "default": null, ++ "type": "[398]" ++ }, ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "server", ++ "default": null, ++ "type": "[399]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "271", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "mode", ++ "type": "400" ++ }, ++ { ++ "name": "top-id", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "272", ++ "members": [ ++ { ++ "name": "server", ++ "type": "329" ++ }, ++ { ++ "name": "vdi", ++ "type": "str" ++ }, ++ { ++ "name": "snap-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tag", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "273", ++ "members": [ ++ { ++ "name": "server", ++ "type": "401" ++ }, ++ { ++ "name": "path", ++ "type": "str" ++ }, ++ { ++ "name": "user", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "host-key-check", ++ "default": null, ++ "type": "402" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "274", ++ "members": [ ++ { ++ "name": "throttle-group", ++ "type": "str" ++ }, ++ { ++ "name": "file", ++ "type": "385" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "275", ++ "members": [ ++ { ++ "name": "dir", ++ "type": "str" ++ }, ++ { ++ "name": "fat-type", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "floppy", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "label", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "rw", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "276", ++ "members": [ ++ { ++ "name": "vdisk-id", ++ "type": "str" ++ }, ++ { ++ "name": "server", ++ "type": "399" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "277", ++ "tag": "driver", ++ "variants": [ ++ { ++ "case": "file", ++ "type": "403" ++ }, ++ { ++ "case": "gluster", ++ "type": "404" ++ }, ++ { ++ "case": "luks", ++ "type": "405" ++ }, ++ { ++ "case": "nfs", ++ "type": "406" ++ }, ++ { ++ "case": "parallels", ++ "type": "407" ++ }, ++ { ++ "case": "qcow", ++ "type": "408" ++ }, ++ { ++ "case": "qcow2", ++ "type": "409" ++ }, ++ { ++ "case": "qed", ++ "type": "410" ++ }, ++ { ++ "case": "rbd", ++ "type": "411" ++ }, ++ { ++ "case": "sheepdog", ++ "type": "412" ++ }, ++ { ++ "case": "ssh", ++ "type": "413" ++ }, ++ { ++ "case": "vdi", ++ "type": "414" ++ }, ++ { ++ "case": "vhdx", ++ "type": "415" ++ }, ++ { ++ "case": "vmdk", ++ "type": "416" ++ }, ++ { ++ "case": "vpc", ++ "type": "417" ++ }, ++ { ++ "case": "blkdebug", ++ "type": "0" ++ }, ++ { ++ "case": "blklogwrites", ++ "type": "0" ++ }, ++ { ++ "case": "blkreplay", ++ "type": "0" ++ }, ++ { ++ "case": "blkverify", ++ "type": "0" ++ }, ++ { ++ "case": "bochs", ++ "type": "0" ++ }, ++ { ++ "case": "cloop", ++ "type": "0" ++ }, ++ { ++ "case": "compress", ++ "type": "0" ++ }, ++ { ++ "case": "copy-on-read", ++ "type": "0" ++ }, ++ { ++ "case": "dmg", ++ "type": "0" ++ }, ++ { ++ "case": "ftp", ++ "type": "0" ++ }, ++ { ++ "case": "ftps", ++ "type": "0" ++ }, ++ { ++ "case": "host_cdrom", ++ "type": "0" ++ }, ++ { ++ "case": "host_device", ++ "type": "0" ++ }, ++ { ++ "case": "http", ++ "type": "0" ++ }, ++ { ++ "case": "https", ++ "type": "0" ++ }, ++ { ++ "case": "iscsi", ++ "type": "0" ++ }, ++ { ++ "case": "nbd", ++ "type": "0" ++ }, ++ { ++ "case": "null-aio", ++ "type": "0" ++ }, ++ { ++ "case": "null-co", ++ "type": "0" ++ }, ++ { ++ "case": "nvme", ++ "type": "0" ++ }, ++ { ++ "case": "quorum", ++ "type": "0" ++ }, ++ { ++ "case": "raw", ++ "type": "0" ++ }, ++ { ++ "case": "replication", ++ "type": "0" ++ }, ++ { ++ "case": "throttle", ++ "type": "0" ++ }, ++ { ++ "case": "vvfat", ++ "type": "0" ++ }, ++ { ++ "case": "vxhs", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "driver", ++ "type": "245" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "278", ++ "meta-type": "enum", ++ "values": [ ++ "read", ++ "write" ++ ] ++ }, ++ { ++ "name": "279", ++ "meta-type": "enum", ++ "values": [ ++ "ignore", ++ "report", ++ "stop" ++ ] ++ }, ++ { ++ "name": "280", ++ "meta-type": "enum", ++ "values": [ ++ "commit", ++ "stream", ++ "mirror", ++ "backup", ++ "create" ++ ] ++ }, ++ { ++ "name": "281", ++ "members": [ ++ { ++ "type": "str" ++ }, ++ { ++ "type": "null" ++ } ++ ], ++ "meta-type": "alternate" ++ }, ++ { ++ "name": "282", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "inet", ++ "type": "419" ++ }, ++ { ++ "case": "unix", ++ "type": "420" ++ }, ++ { ++ "case": "vsock", ++ "type": "421" ++ }, ++ { ++ "case": "fd", ++ "type": "422" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "418" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "283", ++ "meta-type": "enum", ++ "values": [ ++ "safe", ++ "hard" ++ ] ++ }, ++ { ++ "name": "284", ++ "meta-type": "enum", ++ "values": [ ++ "read", ++ "write", ++ "flush" ++ ] ++ }, ++ { ++ "name": "285", ++ "meta-type": "enum", ++ "values": [ ++ "utf8", ++ "base64" ++ ] ++ }, ++ { ++ "name": "286", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "file", ++ "type": "424" ++ }, ++ { ++ "case": "serial", ++ "type": "425" ++ }, ++ { ++ "case": "parallel", ++ "type": "425" ++ }, ++ { ++ "case": "pipe", ++ "type": "425" ++ }, ++ { ++ "case": "socket", ++ "type": "426" ++ }, ++ { ++ "case": "udp", ++ "type": "427" ++ }, ++ { ++ "case": "pty", ++ "type": "428" ++ }, ++ { ++ "case": "null", ++ "type": "428" ++ }, ++ { ++ "case": "mux", ++ "type": "429" ++ }, ++ { ++ "case": "msmouse", ++ "type": "428" ++ }, ++ { ++ "case": "wctablet", ++ "type": "428" ++ }, ++ { ++ "case": "braille", ++ "type": "428" ++ }, ++ { ++ "case": "testdev", ++ "type": "428" ++ }, ++ { ++ "case": "stdio", ++ "type": "430" ++ }, ++ { ++ "case": "console", ++ "type": "428" ++ }, ++ { ++ "case": "spicevmc", ++ "type": "431" ++ }, ++ { ++ "case": "spiceport", ++ "type": "432" ++ }, ++ { ++ "case": "vc", ++ "type": "433" ++ }, ++ { ++ "case": "ringbuf", ++ "type": "434" ++ }, ++ { ++ "case": "memory", ++ "type": "434" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "423" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "287", ++ "meta-type": "enum", ++ "values": [ ++ "elf", ++ "kdump-zlib", ++ "kdump-lzo", ++ "kdump-snappy", ++ "win-dmp" ++ ] ++ }, ++ { ++ "name": "288", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "active", ++ "completed", ++ "failed" ++ ] ++ }, ++ { ++ "name": "[287]", ++ "element-type": "287", ++ "meta-type": "array" ++ }, ++ { ++ "name": "289", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "nic", ++ "user", ++ "tap", ++ "l2tpv3", ++ "socket", ++ "vde", ++ "bridge", ++ "hubport", ++ "netmap", ++ "vhost-user" ++ ] ++ }, ++ { ++ "name": "290", ++ "members": [ ++ { ++ "name": "netdev", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "macaddr", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "model", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "addr", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "vectors", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "291", ++ "members": [ ++ { ++ "name": "hostname", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "restrict", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "ipv4", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "ipv6", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "ip", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "net", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "host", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tftp", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "bootfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "dhcpstart", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "dns", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "dnssearch", ++ "default": null, ++ "type": "[435]" ++ }, ++ { ++ "name": "domainname", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ipv6-prefix", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ipv6-prefixlen", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "ipv6-host", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ipv6-dns", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "smb", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "smbserver", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "hostfwd", ++ "default": null, ++ "type": "[435]" ++ }, ++ { ++ "name": "guestfwd", ++ "default": null, ++ "type": "[435]" ++ }, ++ { ++ "name": "tftp-server-name", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "292", ++ "members": [ ++ { ++ "name": "ifname", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "fd", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "fds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "script", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "downscript", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "br", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "helper", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sndbuf", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "vnet_hdr", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "vhost", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "vhostfd", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "vhostfds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "vhostforce", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "queues", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "poll-us", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "293", ++ "members": [ ++ { ++ "name": "src", ++ "type": "str" ++ }, ++ { ++ "name": "dst", ++ "type": "str" ++ }, ++ { ++ "name": "srcport", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "dstport", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ipv6", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "udp", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "cookie64", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "counter", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "pincounter", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "txcookie", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "rxcookie", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "txsession", ++ "type": "int" ++ }, ++ { ++ "name": "rxsession", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "offset", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "294", ++ "members": [ ++ { ++ "name": "fd", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "listen", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "connect", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "mcast", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "localaddr", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "udp", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "295", ++ "members": [ ++ { ++ "name": "sock", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "mode", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "296", ++ "members": [ ++ { ++ "name": "br", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "helper", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "297", ++ "members": [ ++ { ++ "name": "hubid", ++ "type": "int" ++ }, ++ { ++ "name": "netdev", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "298", ++ "members": [ ++ { ++ "name": "ifname", ++ "type": "str" ++ }, ++ { ++ "name": "devname", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "299", ++ "members": [ ++ { ++ "name": "chardev", ++ "type": "str" ++ }, ++ { ++ "name": "vhostforce", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "queues", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "300", ++ "meta-type": "enum", ++ "values": [ ++ "normal", ++ "none", ++ "all" ++ ] ++ }, ++ { ++ "name": "[str]", ++ "element-type": "str", ++ "meta-type": "array" ++ }, ++ { ++ "name": "301", ++ "meta-type": "enum", ++ "values": [ ++ "half", ++ "full" ++ ] ++ }, ++ { ++ "name": "302", ++ "meta-type": "enum", ++ "values": [ ++ "off", ++ "on" ++ ] ++ }, ++ { ++ "name": "303", ++ "members": [ ++ { ++ "name": "priority", ++ "type": "int" ++ }, ++ { ++ "name": "tbl-id", ++ "type": "int" ++ }, ++ { ++ "name": "in-pport", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tunnel-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "eth-type", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "eth-src", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "eth-dst", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ip-proto", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "ip-tos", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "ip-dst", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "304", ++ "members": [ ++ { ++ "name": "in-pport", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tunnel-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "eth-src", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "eth-dst", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "ip-proto", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "ip-tos", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "305", ++ "members": [ ++ { ++ "name": "goto-tbl", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "group-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "tunnel-lport", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "new-vlan-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "out-pport", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "306", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "passthrough", ++ "type": "437" ++ }, ++ { ++ "case": "emulator", ++ "type": "438" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "436" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "307", ++ "meta-type": "enum", ++ "values": [ ++ "client", ++ "server", ++ "unknown" ++ ] ++ }, ++ { ++ "name": "[308]", ++ "element-type": "308", ++ "meta-type": "array" ++ }, ++ { ++ "name": "308", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "connection-id", ++ "type": "int" ++ }, ++ { ++ "name": "channel-type", ++ "type": "int" ++ }, ++ { ++ "name": "channel-id", ++ "type": "int" ++ }, ++ { ++ "name": "tls", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "309", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "310", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "auth", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "311", ++ "meta-type": "enum", ++ "values": [ ++ "ipv4", ++ "ipv6", ++ "unix", ++ "vsock", ++ "unknown" ++ ] ++ }, ++ { ++ "name": "[312]", ++ "element-type": "312", ++ "meta-type": "array" ++ }, ++ { ++ "name": "312", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "service", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "websocket", ++ "type": "bool" ++ }, ++ { ++ "name": "x509_dname", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "sasl_username", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[313]", ++ "element-type": "313", ++ "meta-type": "array" ++ }, ++ { ++ "name": "313", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "service", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "websocket", ++ "type": "bool" ++ }, ++ { ++ "name": "auth", ++ "type": "314" ++ }, ++ { ++ "name": "vencrypt", ++ "default": null, ++ "type": "315" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "314", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "vnc", ++ "ra2", ++ "ra2ne", ++ "tight", ++ "ultra", ++ "tls", ++ "vencrypt", ++ "sasl" ++ ] ++ }, ++ { ++ "name": "315", ++ "meta-type": "enum", ++ "values": [ ++ "plain", ++ "tls-none", ++ "x509-none", ++ "tls-vnc", ++ "x509-vnc", ++ "tls-plain", ++ "x509-plain", ++ "tls-sasl", ++ "x509-sasl" ++ ] ++ }, ++ { ++ "name": "316", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "service", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "websocket", ++ "type": "bool" ++ }, ++ { ++ "name": "auth", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "317", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "service", ++ "type": "str" ++ }, ++ { ++ "name": "family", ++ "type": "311" ++ }, ++ { ++ "name": "websocket", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[318]", ++ "element-type": "318", ++ "meta-type": "array" ++ }, ++ { ++ "name": "318", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "number", ++ "type": "440" ++ }, ++ { ++ "case": "qcode", ++ "type": "441" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "439" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[319]", ++ "element-type": "319", ++ "meta-type": "array" ++ }, ++ { ++ "name": "319", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "key", ++ "type": "443" ++ }, ++ { ++ "case": "btn", ++ "type": "444" ++ }, ++ { ++ "case": "rel", ++ "type": "445" ++ }, ++ { ++ "case": "abs", ++ "type": "445" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "442" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "320", ++ "meta-type": "enum", ++ "values": [ ++ "default", ++ "none", ++ "gtk", ++ "sdl", ++ "egl-headless", ++ "curses", ++ "cocoa", ++ "spice-app" ++ ] ++ }, ++ { ++ "name": "321", ++ "meta-type": "enum", ++ "values": [ ++ "off", ++ "on", ++ "core", ++ "es" ++ ] ++ }, ++ { ++ "name": "322", ++ "members": [ ++ { ++ "name": "grab-on-hover", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "zoom-to-fit", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "323", ++ "members": [ ++ { ++ "name": "charset", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "324", ++ "members": [ ++ { ++ "name": "rendernode", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "325", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "setup", ++ "cancelling", ++ "cancelled", ++ "active", ++ "postcopy-active", ++ "postcopy-paused", ++ "postcopy-recover", ++ "completed", ++ "failed", ++ "colo", ++ "pre-switchover", ++ "device", ++ "wait-unplug" ++ ] ++ }, ++ { ++ "name": "326", ++ "members": [ ++ { ++ "name": "transferred", ++ "type": "int" ++ }, ++ { ++ "name": "remaining", ++ "type": "int" ++ }, ++ { ++ "name": "total", ++ "type": "int" ++ }, ++ { ++ "name": "duplicate", ++ "type": "int" ++ }, ++ { ++ "name": "skipped", ++ "type": "int" ++ }, ++ { ++ "name": "normal", ++ "type": "int" ++ }, ++ { ++ "name": "normal-bytes", ++ "type": "int" ++ }, ++ { ++ "name": "dirty-pages-rate", ++ "type": "int" ++ }, ++ { ++ "name": "mbps", ++ "type": "number" ++ }, ++ { ++ "name": "dirty-sync-count", ++ "type": "int" ++ }, ++ { ++ "name": "postcopy-requests", ++ "type": "int" ++ }, ++ { ++ "name": "page-size", ++ "type": "int" ++ }, ++ { ++ "name": "multifd-bytes", ++ "type": "int" ++ }, ++ { ++ "name": "pages-per-second", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "327", ++ "members": [ ++ { ++ "name": "cache-size", ++ "type": "int" ++ }, ++ { ++ "name": "bytes", ++ "type": "int" ++ }, ++ { ++ "name": "pages", ++ "type": "int" ++ }, ++ { ++ "name": "cache-miss", ++ "type": "int" ++ }, ++ { ++ "name": "cache-miss-rate", ++ "type": "number" ++ }, ++ { ++ "name": "overflow", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "328", ++ "members": [ ++ { ++ "name": "pages", ++ "type": "int" ++ }, ++ { ++ "name": "busy", ++ "type": "int" ++ }, ++ { ++ "name": "busy-rate", ++ "type": "number" ++ }, ++ { ++ "name": "compressed-size", ++ "type": "int" ++ }, ++ { ++ "name": "compression-rate", ++ "type": "number" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[329]", ++ "element-type": "329", ++ "meta-type": "array" ++ }, ++ { ++ "name": "329", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "inet", ++ "type": "401" ++ }, ++ { ++ "case": "unix", ++ "type": "447" ++ }, ++ { ++ "case": "vsock", ++ "type": "448" ++ }, ++ { ++ "case": "fd", ++ "type": "435" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "446" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "330", ++ "meta-type": "enum", ++ "values": [ ++ "xbzrle", ++ "rdma-pin-all", ++ "auto-converge", ++ "zero-blocks", ++ "compress", ++ "events", ++ "postcopy-ram", ++ "x-colo", ++ "release-ram", ++ "block", ++ "return-path", ++ "pause-before-switchover", ++ "multifd", ++ "dirty-bitmaps", ++ "postcopy-blocktime", ++ "late-block-activate", ++ "x-ignore-shared", ++ "validate-uuid" ++ ] ++ }, ++ { ++ "name": "331", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "zlib" ++ ] ++ }, ++ { ++ "name": "332", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "primary", ++ "secondary" ++ ] ++ }, ++ { ++ "name": "333", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "request", ++ "error", ++ "processing" ++ ] ++ }, ++ { ++ "name": "number", ++ "json-type": "number", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "[334]", ++ "element-type": "334", ++ "meta-type": "array" ++ }, ++ { ++ "name": "334", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "abort", ++ "type": "450" ++ }, ++ { ++ "case": "block-dirty-bitmap-add", ++ "type": "451" ++ }, ++ { ++ "case": "block-dirty-bitmap-remove", ++ "type": "452" ++ }, ++ { ++ "case": "block-dirty-bitmap-clear", ++ "type": "452" ++ }, ++ { ++ "case": "block-dirty-bitmap-enable", ++ "type": "452" ++ }, ++ { ++ "case": "block-dirty-bitmap-disable", ++ "type": "452" ++ }, ++ { ++ "case": "block-dirty-bitmap-merge", ++ "type": "453" ++ }, ++ { ++ "case": "blockdev-backup", ++ "type": "454" ++ }, ++ { ++ "case": "blockdev-snapshot", ++ "type": "455" ++ }, ++ { ++ "case": "blockdev-snapshot-internal-sync", ++ "type": "456" ++ }, ++ { ++ "case": "blockdev-snapshot-sync", ++ "type": "457" ++ }, ++ { ++ "case": "drive-backup", ++ "type": "458" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "449" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "335", ++ "members": [ ++ { ++ "name": "completion-mode", ++ "default": null, ++ "type": "459" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "336", ++ "meta-type": "enum", ++ "values": [ ++ "unavailable", ++ "disabled", ++ "enabled" ++ ] ++ }, ++ { ++ "name": "[337]", ++ "element-type": "337", ++ "meta-type": "array" ++ }, ++ { ++ "name": "337", ++ "meta-type": "enum", ++ "values": [ ++ "oob" ++ ] ++ }, ++ { ++ "name": "338", ++ "members": [ ++ { ++ "name": "major", ++ "type": "int" ++ }, ++ { ++ "name": "minor", ++ "type": "int" ++ }, ++ { ++ "name": "micro", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "339", ++ "meta-type": "enum", ++ "values": [ ++ "builtin", ++ "enum", ++ "array", ++ "object", ++ "alternate", ++ "command", ++ "event" ++ ] ++ }, ++ { ++ "name": "340", ++ "members": [ ++ { ++ "name": "json-type", ++ "type": "460" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "341", ++ "members": [ ++ { ++ "name": "values", ++ "type": "[str]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "342", ++ "members": [ ++ { ++ "name": "element-type", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "343", ++ "members": [ ++ { ++ "name": "members", ++ "type": "[461]" ++ }, ++ { ++ "name": "tag", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "variants", ++ "default": null, ++ "type": "[462]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "344", ++ "members": [ ++ { ++ "name": "members", ++ "type": "[463]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "345", ++ "members": [ ++ { ++ "name": "arg-type", ++ "type": "str" ++ }, ++ { ++ "name": "ret-type", ++ "type": "str" ++ }, ++ { ++ "name": "allow-oob", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "346", ++ "members": [ ++ { ++ "name": "arg-type", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "347", ++ "members": [ ++ { ++ "name": "node-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "socket-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "die-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "core-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "thread-id", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "348", ++ "meta-type": "enum", ++ "values": [ ++ "x86", ++ "sparc", ++ "ppc", ++ "mips", ++ "tricore", ++ "s390", ++ "riscv", ++ "other" ++ ] ++ }, ++ { ++ "name": "349", ++ "members": [ ++ { ++ "name": "pc", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "350", ++ "members": [ ++ { ++ "name": "pc", ++ "type": "int" ++ }, ++ { ++ "name": "npc", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "351", ++ "members": [ ++ { ++ "name": "nip", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "352", ++ "members": [ ++ { ++ "name": "PC", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "353", ++ "members": [ ++ { ++ "name": "PC", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "354", ++ "members": [ ++ { ++ "name": "cpu-state", ++ "type": "464" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "355", ++ "members": [ ++ { ++ "name": "pc", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "356", ++ "meta-type": "enum", ++ "values": [ ++ "aarch64", ++ "alpha", ++ "arm", ++ "cris", ++ "hppa", ++ "i386", ++ "lm32", ++ "m68k", ++ "microblaze", ++ "microblazeel", ++ "mips", ++ "mips64", ++ "mips64el", ++ "mipsel", ++ "moxie", ++ "nios2", ++ "or1k", ++ "ppc", ++ "ppc64", ++ "riscv32", ++ "riscv64", ++ "rx", ++ "s390x", ++ "sh4", ++ "sh4eb", ++ "sparc", ++ "sparc64", ++ "tricore", ++ "unicore32", ++ "x86_64", ++ "xtensa", ++ "xtensaeb" ++ ] ++ }, ++ { ++ "name": "357", ++ "meta-type": "enum", ++ "values": [ ++ "default", ++ "preferred", ++ "bind", ++ "interleave" ++ ] ++ }, ++ { ++ "name": "358", ++ "meta-type": "enum", ++ "values": [ ++ "node", ++ "dist", ++ "cpu", ++ "hmat-lb", ++ "hmat-cache" ++ ] ++ }, ++ { ++ "name": "359", ++ "members": [ ++ { ++ "name": "nodeid", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cpus", ++ "default": null, ++ "type": "[int]" ++ }, ++ { ++ "name": "mem", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "memdev", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "initiator", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "360", ++ "members": [ ++ { ++ "name": "src", ++ "type": "int" ++ }, ++ { ++ "name": "dst", ++ "type": "int" ++ }, ++ { ++ "name": "val", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "361", ++ "members": [ ++ { ++ "name": "node-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "socket-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "die-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "core-id", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "thread-id", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "362", ++ "members": [ ++ { ++ "name": "initiator", ++ "type": "int" ++ }, ++ { ++ "name": "target", ++ "type": "int" ++ }, ++ { ++ "name": "hierarchy", ++ "type": "465" ++ }, ++ { ++ "name": "data-type", ++ "type": "466" ++ }, ++ { ++ "name": "latency", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "bandwidth", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "363", ++ "members": [ ++ { ++ "name": "node-id", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "level", ++ "type": "int" ++ }, ++ { ++ "name": "associativity", ++ "type": "467" ++ }, ++ { ++ "name": "policy", ++ "type": "468" ++ }, ++ { ++ "name": "line", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "364", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "props", ++ "default": null, ++ "type": "any" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "365", ++ "meta-type": "enum", ++ "values": [ ++ "incompatible", ++ "identical", ++ "superset", ++ "subset" ++ ] ++ }, ++ { ++ "name": "366", ++ "meta-type": "enum", ++ "values": [ ++ "static", ++ "full" ++ ] ++ }, ++ { ++ "name": "[367]", ++ "element-type": "367", ++ "meta-type": "array" ++ }, ++ { ++ "name": "367", ++ "members": [ ++ { ++ "name": "bus", ++ "type": "int" ++ }, ++ { ++ "name": "slot", ++ "type": "int" ++ }, ++ { ++ "name": "function", ++ "type": "int" ++ }, ++ { ++ "name": "class_info", ++ "type": "469" ++ }, ++ { ++ "name": "id", ++ "type": "470" ++ }, ++ { ++ "name": "irq", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "qdev_id", ++ "type": "str" ++ }, ++ { ++ "name": "pci_bridge", ++ "default": null, ++ "type": "471" ++ }, ++ { ++ "name": "regions", ++ "type": "[472]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[368]", ++ "element-type": "368", ++ "meta-type": "array" ++ }, ++ { ++ "name": "368", ++ "members": [ ++ { ++ "name": "fd", ++ "type": "int" ++ }, ++ { ++ "name": "opaque", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[369]", ++ "element-type": "369", ++ "meta-type": "array" ++ }, ++ { ++ "name": "369", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "473" ++ }, ++ { ++ "name": "help", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "default", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "370", ++ "meta-type": "enum", ++ "values": [ ++ "dimm", ++ "nvdimm", ++ "virtio-pmem" ++ ] ++ }, ++ { ++ "name": "371", ++ "members": [ ++ { ++ "name": "data", ++ "type": "474" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "372", ++ "members": [ ++ { ++ "name": "data", ++ "type": "475" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "373", ++ "meta-type": "enum", ++ "values": [ ++ "DIMM", ++ "CPU" ++ ] ++ }, ++ { ++ "name": "374", ++ "meta-type": "enum", ++ "values": [ ++ "uninit", ++ "launch-update", ++ "launch-secret", ++ "running", ++ "send-update", ++ "receive-update" ++ ] ++ }, ++ { ++ "name": "375", ++ "meta-type": "enum", ++ "values": [ ++ "hyper-v", ++ "s390" ++ ] ++ }, ++ { ++ "name": "376", ++ "members": [ ++ { ++ "name": "arg1", ++ "type": "int" ++ }, ++ { ++ "name": "arg2", ++ "type": "int" ++ }, ++ { ++ "name": "arg3", ++ "type": "int" ++ }, ++ { ++ "name": "arg4", ++ "type": "int" ++ }, ++ { ++ "name": "arg5", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "377", ++ "members": [ ++ { ++ "name": "core", ++ "type": "int" ++ }, ++ { ++ "name": "psw-mask", ++ "type": "int" ++ }, ++ { ++ "name": "psw-addr", ++ "type": "int" ++ }, ++ { ++ "name": "reason", ++ "type": "476" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "378", ++ "meta-type": "enum", ++ "values": [ ++ "active", ++ "disabled", ++ "frozen", ++ "locked", ++ "inconsistent" ++ ] ++ }, ++ { ++ "name": "[379]", ++ "element-type": "379", ++ "meta-type": "array" ++ }, ++ { ++ "name": "379", ++ "members": [ ++ { ++ "name": "interval_length", ++ "type": "int" ++ }, ++ { ++ "name": "min_rd_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "max_rd_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "avg_rd_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "min_wr_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "max_wr_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "avg_wr_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "min_flush_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "max_flush_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "avg_flush_latency_ns", ++ "type": "int" ++ }, ++ { ++ "name": "avg_rd_queue_depth", ++ "type": "number" ++ }, ++ { ++ "name": "avg_wr_queue_depth", ++ "type": "number" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "380", ++ "members": [ ++ { ++ "name": "boundaries", ++ "type": "[int]" ++ }, ++ { ++ "name": "bins", ++ "type": "[int]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "381", ++ "members": [ ++ { ++ "name": "discard-nb-ok", ++ "type": "int" ++ }, ++ { ++ "name": "discard-nb-failed", ++ "type": "int" ++ }, ++ { ++ "name": "discard-bytes-ok", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[69]", ++ "element-type": "69", ++ "meta-type": "array" ++ }, ++ { ++ "name": "382", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "qcow2", ++ "type": "478" ++ }, ++ { ++ "case": "vmdk", ++ "type": "479" ++ }, ++ { ++ "case": "luks", ++ "type": "480" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "477" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "383", ++ "meta-type": "enum", ++ "values": [ ++ "block-backend", ++ "block-job", ++ "block-driver" ++ ] ++ }, ++ { ++ "name": "[384]", ++ "element-type": "384", ++ "meta-type": "array" ++ }, ++ { ++ "name": "384", ++ "meta-type": "enum", ++ "values": [ ++ "consistent-read", ++ "write", ++ "write-unchanged", ++ "resize", ++ "graph-mod" ++ ] ++ }, ++ { ++ "name": "385", ++ "members": [ ++ { ++ "type": "48" ++ }, ++ { ++ "type": "str" ++ } ++ ], ++ "meta-type": "alternate" ++ }, ++ { ++ "name": "[386]", ++ "element-type": "386", ++ "meta-type": "array" ++ }, ++ { ++ "name": "386", ++ "members": [ ++ { ++ "name": "event", ++ "type": "481" ++ }, ++ { ++ "name": "state", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "iotype", ++ "default": null, ++ "type": "482" ++ }, ++ { ++ "name": "errno", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "sector", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "once", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "immediately", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[387]", ++ "element-type": "387", ++ "meta-type": "array" ++ }, ++ { ++ "name": "387", ++ "members": [ ++ { ++ "name": "event", ++ "type": "481" ++ }, ++ { ++ "name": "state", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "new_state", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "388", ++ "meta-type": "enum", ++ "values": [ ++ "auto", ++ "on", ++ "off" ++ ] ++ }, ++ { ++ "name": "389", ++ "meta-type": "enum", ++ "values": [ ++ "threads", ++ "native" ++ ] ++ }, ++ { ++ "name": "390", ++ "meta-type": "enum", ++ "values": [ ++ "tcp", ++ "iser" ++ ] ++ }, ++ { ++ "name": "391", ++ "meta-type": "enum", ++ "values": [ ++ "crc32c", ++ "none", ++ "crc32c-none", ++ "none-crc32c" ++ ] ++ }, ++ { ++ "name": "392", ++ "members": [ ++ { ++ "name": "type", ++ "type": "483" ++ }, ++ { ++ "name": "host", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "393", ++ "members": [ ++ { ++ "type": "48" ++ }, ++ { ++ "type": "str" ++ }, ++ { ++ "type": "null" ++ } ++ ], ++ "meta-type": "alternate" ++ }, ++ { ++ "name": "394", ++ "members": [ ++ { ++ "type": "484" ++ }, ++ { ++ "type": "485" ++ } ++ ], ++ "meta-type": "alternate" ++ }, ++ { ++ "name": "395", ++ "tag": "format", ++ "variants": [ ++ { ++ "case": "aes", ++ "type": "487" ++ }, ++ { ++ "case": "luks", ++ "type": "488" ++ } ++ ], ++ "members": [ ++ { ++ "name": "format", ++ "type": "486" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "396", ++ "tag": "format", ++ "variants": [ ++ { ++ "case": "aes", ++ "type": "487" ++ } ++ ], ++ "members": [ ++ { ++ "name": "format", ++ "type": "489" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[385]", ++ "element-type": "385", ++ "meta-type": "array" ++ }, ++ { ++ "name": "397", ++ "meta-type": "enum", ++ "values": [ ++ "quorum", ++ "fifo" ++ ] ++ }, ++ { ++ "name": "[398]", ++ "element-type": "398", ++ "meta-type": "array" ++ }, ++ { ++ "name": "398", ++ "meta-type": "enum", ++ "values": [ ++ "cephx", ++ "none" ++ ] ++ }, ++ { ++ "name": "[399]", ++ "element-type": "399", ++ "meta-type": "array" ++ }, ++ { ++ "name": "399", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "400", ++ "meta-type": "enum", ++ "values": [ ++ "primary", ++ "secondary" ++ ] ++ }, ++ { ++ "name": "401", ++ "members": [ ++ { ++ "name": "host", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ }, ++ { ++ "name": "numeric", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "to", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "ipv4", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "ipv6", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "keep-alive", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "402", ++ "tag": "mode", ++ "variants": [ ++ { ++ "case": "hash", ++ "type": "491" ++ }, ++ { ++ "case": "none", ++ "type": "0" ++ }, ++ { ++ "case": "known_hosts", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "mode", ++ "type": "490" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "403", ++ "members": [ ++ { ++ "name": "filename", ++ "type": "str" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ }, ++ { ++ "name": "nocow", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "404", ++ "members": [ ++ { ++ "name": "location", ++ "type": "256" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "405", ++ "members": [ ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cipher-alg", ++ "default": null, ++ "type": "493" ++ }, ++ { ++ "name": "cipher-mode", ++ "default": null, ++ "type": "494" ++ }, ++ { ++ "name": "ivgen-alg", ++ "default": null, ++ "type": "495" ++ }, ++ { ++ "name": "ivgen-hash-alg", ++ "default": null, ++ "type": "496" ++ }, ++ { ++ "name": "hash-alg", ++ "default": null, ++ "type": "496" ++ }, ++ { ++ "name": "iter-time", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "406", ++ "members": [ ++ { ++ "name": "location", ++ "type": "262" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "407", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "cluster-size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "408", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "encrypt", ++ "default": null, ++ "type": "497" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "409", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "data-file", ++ "default": null, ++ "type": "385" ++ }, ++ { ++ "name": "data-file-raw", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "version", ++ "default": null, ++ "type": "498" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "backing-fmt", ++ "default": null, ++ "type": "245" ++ }, ++ { ++ "name": "encrypt", ++ "default": null, ++ "type": "497" ++ }, ++ { ++ "name": "cluster-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ }, ++ { ++ "name": "lazy-refcounts", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "refcount-bits", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "410", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "backing-fmt", ++ "default": null, ++ "type": "245" ++ }, ++ { ++ "name": "cluster-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "table-size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "411", ++ "members": [ ++ { ++ "name": "location", ++ "type": "270" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "cluster-size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "412", ++ "members": [ ++ { ++ "name": "location", ++ "type": "272" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ }, ++ { ++ "name": "redundancy", ++ "default": null, ++ "type": "499" ++ }, ++ { ++ "name": "object-size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "413", ++ "members": [ ++ { ++ "name": "location", ++ "type": "273" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "414", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "preallocation", ++ "default": null, ++ "type": "492" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "415", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "log-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "block-size", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "subformat", ++ "default": null, ++ "type": "500" ++ }, ++ { ++ "name": "block-state-zero", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "416", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "extents", ++ "default": null, ++ "type": "[385]" ++ }, ++ { ++ "name": "subformat", ++ "default": null, ++ "type": "501" ++ }, ++ { ++ "name": "backing-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "adapter-type", ++ "default": null, ++ "type": "502" ++ }, ++ { ++ "name": "hwversion", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "zeroed-grain", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "417", ++ "members": [ ++ { ++ "name": "file", ++ "type": "385" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "subformat", ++ "default": null, ++ "type": "503" ++ }, ++ { ++ "name": "force-size", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "null", ++ "json-type": "null", ++ "meta-type": "builtin" ++ }, ++ { ++ "name": "418", ++ "meta-type": "enum", ++ "values": [ ++ "inet", ++ "unix", ++ "vsock", ++ "fd" ++ ] ++ }, ++ { ++ "name": "419", ++ "members": [ ++ { ++ "name": "data", ++ "type": "401" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "420", ++ "members": [ ++ { ++ "name": "data", ++ "type": "447" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "421", ++ "members": [ ++ { ++ "name": "data", ++ "type": "448" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "422", ++ "members": [ ++ { ++ "name": "data", ++ "type": "435" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "423", ++ "meta-type": "enum", ++ "values": [ ++ "file", ++ "serial", ++ "parallel", ++ "pipe", ++ "socket", ++ "udp", ++ "pty", ++ "null", ++ "mux", ++ "msmouse", ++ "wctablet", ++ "braille", ++ "testdev", ++ "stdio", ++ "console", ++ "spicevmc", ++ "spiceport", ++ "vc", ++ "ringbuf", ++ "memory" ++ ] ++ }, ++ { ++ "name": "424", ++ "members": [ ++ { ++ "name": "data", ++ "type": "504" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "425", ++ "members": [ ++ { ++ "name": "data", ++ "type": "505" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "426", ++ "members": [ ++ { ++ "name": "data", ++ "type": "506" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "427", ++ "members": [ ++ { ++ "name": "data", ++ "type": "507" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "428", ++ "members": [ ++ { ++ "name": "data", ++ "type": "508" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "429", ++ "members": [ ++ { ++ "name": "data", ++ "type": "509" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "430", ++ "members": [ ++ { ++ "name": "data", ++ "type": "510" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "431", ++ "members": [ ++ { ++ "name": "data", ++ "type": "511" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "432", ++ "members": [ ++ { ++ "name": "data", ++ "type": "512" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "433", ++ "members": [ ++ { ++ "name": "data", ++ "type": "513" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "434", ++ "members": [ ++ { ++ "name": "data", ++ "type": "514" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[435]", ++ "element-type": "435", ++ "meta-type": "array" ++ }, ++ { ++ "name": "435", ++ "members": [ ++ { ++ "name": "str", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "436", ++ "meta-type": "enum", ++ "values": [ ++ "passthrough", ++ "emulator" ++ ] ++ }, ++ { ++ "name": "437", ++ "members": [ ++ { ++ "name": "data", ++ "type": "515" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "438", ++ "members": [ ++ { ++ "name": "data", ++ "type": "516" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "439", ++ "meta-type": "enum", ++ "values": [ ++ "number", ++ "qcode" ++ ] ++ }, ++ { ++ "name": "440", ++ "members": [ ++ { ++ "name": "data", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "441", ++ "members": [ ++ { ++ "name": "data", ++ "type": "517" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "442", ++ "meta-type": "enum", ++ "values": [ ++ "key", ++ "btn", ++ "rel", ++ "abs" ++ ] ++ }, ++ { ++ "name": "443", ++ "members": [ ++ { ++ "name": "data", ++ "type": "518" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "444", ++ "members": [ ++ { ++ "name": "data", ++ "type": "519" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "445", ++ "members": [ ++ { ++ "name": "data", ++ "type": "520" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "446", ++ "meta-type": "enum", ++ "values": [ ++ "inet", ++ "unix", ++ "vsock", ++ "fd" ++ ] ++ }, ++ { ++ "name": "447", ++ "members": [ ++ { ++ "name": "path", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "448", ++ "members": [ ++ { ++ "name": "cid", ++ "type": "str" ++ }, ++ { ++ "name": "port", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "449", ++ "meta-type": "enum", ++ "values": [ ++ "abort", ++ "block-dirty-bitmap-add", ++ "block-dirty-bitmap-remove", ++ "block-dirty-bitmap-clear", ++ "block-dirty-bitmap-enable", ++ "block-dirty-bitmap-disable", ++ "block-dirty-bitmap-merge", ++ "blockdev-backup", ++ "blockdev-snapshot", ++ "blockdev-snapshot-internal-sync", ++ "blockdev-snapshot-sync", ++ "drive-backup" ++ ] ++ }, ++ { ++ "name": "450", ++ "members": [ ++ { ++ "name": "data", ++ "type": "521" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "451", ++ "members": [ ++ { ++ "name": "data", ++ "type": "35" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "452", ++ "members": [ ++ { ++ "name": "data", ++ "type": "36" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "453", ++ "members": [ ++ { ++ "name": "data", ++ "type": "37" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "454", ++ "members": [ ++ { ++ "name": "data", ++ "type": "30" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "455", ++ "members": [ ++ { ++ "name": "data", ++ "type": "26" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "456", ++ "members": [ ++ { ++ "name": "data", ++ "type": "67" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "457", ++ "members": [ ++ { ++ "name": "data", ++ "type": "25" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "458", ++ "members": [ ++ { ++ "name": "data", ++ "type": "29" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "459", ++ "meta-type": "enum", ++ "values": [ ++ "individual", ++ "grouped" ++ ] ++ }, ++ { ++ "name": "460", ++ "meta-type": "enum", ++ "values": [ ++ "string", ++ "number", ++ "int", ++ "boolean", ++ "null", ++ "object", ++ "array", ++ "value" ++ ] ++ }, ++ { ++ "name": "[461]", ++ "element-type": "461", ++ "meta-type": "array" ++ }, ++ { ++ "name": "461", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "default", ++ "default": null, ++ "type": "any" ++ }, ++ { ++ "name": "features", ++ "default": null, ++ "type": "[str]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[462]", ++ "element-type": "462", ++ "meta-type": "array" ++ }, ++ { ++ "name": "462", ++ "members": [ ++ { ++ "name": "case", ++ "type": "str" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[463]", ++ "element-type": "463", ++ "meta-type": "array" ++ }, ++ { ++ "name": "463", ++ "members": [ ++ { ++ "name": "type", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "464", ++ "meta-type": "enum", ++ "values": [ ++ "uninitialized", ++ "stopped", ++ "check-stop", ++ "operating", ++ "load" ++ ] ++ }, ++ { ++ "name": "465", ++ "meta-type": "enum", ++ "values": [ ++ "memory", ++ "first-level", ++ "second-level", ++ "third-level" ++ ] ++ }, ++ { ++ "name": "466", ++ "meta-type": "enum", ++ "values": [ ++ "access-latency", ++ "read-latency", ++ "write-latency", ++ "access-bandwidth", ++ "read-bandwidth", ++ "write-bandwidth" ++ ] ++ }, ++ { ++ "name": "467", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "direct", ++ "complex" ++ ] ++ }, ++ { ++ "name": "468", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "write-back", ++ "write-through" ++ ] ++ }, ++ { ++ "name": "469", ++ "members": [ ++ { ++ "name": "desc", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "class", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "470", ++ "members": [ ++ { ++ "name": "device", ++ "type": "int" ++ }, ++ { ++ "name": "vendor", ++ "type": "int" ++ }, ++ { ++ "name": "subsystem", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "subsystem-vendor", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "471", ++ "members": [ ++ { ++ "name": "bus", ++ "type": "522" ++ }, ++ { ++ "name": "devices", ++ "default": null, ++ "type": "[367]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[472]", ++ "element-type": "472", ++ "meta-type": "array" ++ }, ++ { ++ "name": "472", ++ "members": [ ++ { ++ "name": "bar", ++ "type": "int" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ }, ++ { ++ "name": "address", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "prefetch", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "mem_type_64", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "473", ++ "meta-type": "enum", ++ "values": [ ++ "string", ++ "boolean", ++ "number", ++ "size" ++ ] ++ }, ++ { ++ "name": "474", ++ "members": [ ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "addr", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "slot", ++ "type": "int" ++ }, ++ { ++ "name": "node", ++ "type": "int" ++ }, ++ { ++ "name": "memdev", ++ "type": "str" ++ }, ++ { ++ "name": "hotplugged", ++ "type": "bool" ++ }, ++ { ++ "name": "hotpluggable", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "475", ++ "members": [ ++ { ++ "name": "id", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "memaddr", ++ "type": "int" ++ }, ++ { ++ "name": "size", ++ "type": "int" ++ }, ++ { ++ "name": "memdev", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "476", ++ "meta-type": "enum", ++ "values": [ ++ "unknown", ++ "disabled-wait", ++ "extint-loop", ++ "pgmint-loop", ++ "opint-loop" ++ ] ++ }, ++ { ++ "name": "477", ++ "meta-type": "enum", ++ "values": [ ++ "qcow2", ++ "vmdk", ++ "luks" ++ ] ++ }, ++ { ++ "name": "478", ++ "members": [ ++ { ++ "name": "data", ++ "type": "523" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "479", ++ "members": [ ++ { ++ "name": "data", ++ "type": "524" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "480", ++ "members": [ ++ { ++ "name": "data", ++ "type": "525" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "481", ++ "meta-type": "enum", ++ "values": [ ++ "l1_update", ++ "l1_grow_alloc_table", ++ "l1_grow_write_table", ++ "l1_grow_activate_table", ++ "l2_load", ++ "l2_update", ++ "l2_update_compressed", ++ "l2_alloc_cow_read", ++ "l2_alloc_write", ++ "read_aio", ++ "read_backing_aio", ++ "read_compressed", ++ "write_aio", ++ "write_compressed", ++ "vmstate_load", ++ "vmstate_save", ++ "cow_read", ++ "cow_write", ++ "reftable_load", ++ "reftable_grow", ++ "reftable_update", ++ "refblock_load", ++ "refblock_update", ++ "refblock_update_part", ++ "refblock_alloc", ++ "refblock_alloc_hookup", ++ "refblock_alloc_write", ++ "refblock_alloc_write_blocks", ++ "refblock_alloc_write_table", ++ "refblock_alloc_switch_table", ++ "cluster_alloc", ++ "cluster_alloc_bytes", ++ "cluster_free", ++ "flush_to_os", ++ "flush_to_disk", ++ "pwritev_rmw_head", ++ "pwritev_rmw_after_head", ++ "pwritev_rmw_tail", ++ "pwritev_rmw_after_tail", ++ "pwritev", ++ "pwritev_zero", ++ "pwritev_done", ++ "empty_image_prepare", ++ "l1_shrink_write_table", ++ "l1_shrink_free_l2_clusters", ++ "cor_write", ++ "cluster_alloc_space", ++ "none" ++ ] ++ }, ++ { ++ "name": "482", ++ "meta-type": "enum", ++ "values": [ ++ "read", ++ "write", ++ "write-zeroes", ++ "discard", ++ "flush", ++ "block-status" ++ ] ++ }, ++ { ++ "name": "483", ++ "meta-type": "enum", ++ "values": [ ++ "inet" ++ ] ++ }, ++ { ++ "name": "484", ++ "members": [ ++ { ++ "name": "template", ++ "default": null, ++ "type": "485" ++ }, ++ { ++ "name": "main-header", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "active-l1", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "active-l2", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "refcount-table", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "refcount-block", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "snapshot-table", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "inactive-l1", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "inactive-l2", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "bitmap-directory", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "485", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "constant", ++ "cached", ++ "all" ++ ] ++ }, ++ { ++ "name": "486", ++ "meta-type": "enum", ++ "values": [ ++ "aes", ++ "luks" ++ ] ++ }, ++ { ++ "name": "487", ++ "members": [ ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "488", ++ "members": [ ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "489", ++ "meta-type": "enum", ++ "values": [ ++ "aes" ++ ] ++ }, ++ { ++ "name": "490", ++ "meta-type": "enum", ++ "values": [ ++ "none", ++ "hash", ++ "known_hosts" ++ ] ++ }, ++ { ++ "name": "491", ++ "members": [ ++ { ++ "name": "type", ++ "type": "526" ++ }, ++ { ++ "name": "hash", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "492", ++ "meta-type": "enum", ++ "values": [ ++ "off", ++ "metadata", ++ "falloc", ++ "full" ++ ] ++ }, ++ { ++ "name": "493", ++ "meta-type": "enum", ++ "values": [ ++ "aes-128", ++ "aes-192", ++ "aes-256", ++ "des-rfb", ++ "3des", ++ "cast5-128", ++ "serpent-128", ++ "serpent-192", ++ "serpent-256", ++ "twofish-128", ++ "twofish-192", ++ "twofish-256" ++ ] ++ }, ++ { ++ "name": "494", ++ "meta-type": "enum", ++ "values": [ ++ "ecb", ++ "cbc", ++ "xts", ++ "ctr" ++ ] ++ }, ++ { ++ "name": "495", ++ "meta-type": "enum", ++ "values": [ ++ "plain", ++ "plain64", ++ "essiv" ++ ] ++ }, ++ { ++ "name": "496", ++ "meta-type": "enum", ++ "values": [ ++ "md5", ++ "sha1", ++ "sha224", ++ "sha256", ++ "sha384", ++ "sha512", ++ "ripemd160" ++ ] ++ }, ++ { ++ "name": "497", ++ "tag": "format", ++ "variants": [ ++ { ++ "case": "qcow", ++ "type": "487" ++ }, ++ { ++ "case": "luks", ++ "type": "528" ++ } ++ ], ++ "members": [ ++ { ++ "name": "format", ++ "type": "527" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "498", ++ "meta-type": "enum", ++ "values": [ ++ "v2", ++ "v3" ++ ] ++ }, ++ { ++ "name": "499", ++ "tag": "type", ++ "variants": [ ++ { ++ "case": "full", ++ "type": "530" ++ }, ++ { ++ "case": "erasure-coded", ++ "type": "531" ++ } ++ ], ++ "members": [ ++ { ++ "name": "type", ++ "type": "529" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "500", ++ "meta-type": "enum", ++ "values": [ ++ "dynamic", ++ "fixed" ++ ] ++ }, ++ { ++ "name": "501", ++ "meta-type": "enum", ++ "values": [ ++ "monolithicSparse", ++ "monolithicFlat", ++ "twoGbMaxExtentSparse", ++ "twoGbMaxExtentFlat", ++ "streamOptimized" ++ ] ++ }, ++ { ++ "name": "502", ++ "meta-type": "enum", ++ "values": [ ++ "ide", ++ "buslogic", ++ "lsilogic", ++ "legacyESX" ++ ] ++ }, ++ { ++ "name": "503", ++ "meta-type": "enum", ++ "values": [ ++ "dynamic", ++ "fixed" ++ ] ++ }, ++ { ++ "name": "504", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "in", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "out", ++ "type": "str" ++ }, ++ { ++ "name": "append", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "505", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "device", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "506", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "addr", ++ "type": "282" ++ }, ++ { ++ "name": "tls-creds", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "tls-authz", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "server", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "wait", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "nodelay", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "telnet", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "tn3270", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "websocket", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "reconnect", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "507", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "remote", ++ "type": "282" ++ }, ++ { ++ "name": "local", ++ "default": null, ++ "type": "282" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "508", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "509", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "chardev", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "510", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "signal", ++ "default": null, ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "511", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "type", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "512", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "fqdn", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "513", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "width", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "height", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "cols", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "rows", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "514", ++ "members": [ ++ { ++ "name": "logfile", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "logappend", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "size", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "515", ++ "members": [ ++ { ++ "name": "path", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cancel-path", ++ "default": null, ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "516", ++ "members": [ ++ { ++ "name": "chardev", ++ "type": "str" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "517", ++ "meta-type": "enum", ++ "values": [ ++ "unmapped", ++ "shift", ++ "shift_r", ++ "alt", ++ "alt_r", ++ "ctrl", ++ "ctrl_r", ++ "menu", ++ "esc", ++ "1", ++ "2", ++ "3", ++ "4", ++ "5", ++ "6", ++ "7", ++ "8", ++ "9", ++ "0", ++ "minus", ++ "equal", ++ "backspace", ++ "tab", ++ "q", ++ "w", ++ "e", ++ "r", ++ "t", ++ "y", ++ "u", ++ "i", ++ "o", ++ "p", ++ "bracket_left", ++ "bracket_right", ++ "ret", ++ "a", ++ "s", ++ "d", ++ "f", ++ "g", ++ "h", ++ "j", ++ "k", ++ "l", ++ "semicolon", ++ "apostrophe", ++ "grave_accent", ++ "backslash", ++ "z", ++ "x", ++ "c", ++ "v", ++ "b", ++ "n", ++ "m", ++ "comma", ++ "dot", ++ "slash", ++ "asterisk", ++ "spc", ++ "caps_lock", ++ "f1", ++ "f2", ++ "f3", ++ "f4", ++ "f5", ++ "f6", ++ "f7", ++ "f8", ++ "f9", ++ "f10", ++ "num_lock", ++ "scroll_lock", ++ "kp_divide", ++ "kp_multiply", ++ "kp_subtract", ++ "kp_add", ++ "kp_enter", ++ "kp_decimal", ++ "sysrq", ++ "kp_0", ++ "kp_1", ++ "kp_2", ++ "kp_3", ++ "kp_4", ++ "kp_5", ++ "kp_6", ++ "kp_7", ++ "kp_8", ++ "kp_9", ++ "less", ++ "f11", ++ "f12", ++ "print", ++ "home", ++ "pgup", ++ "pgdn", ++ "end", ++ "left", ++ "up", ++ "down", ++ "right", ++ "insert", ++ "delete", ++ "stop", ++ "again", ++ "props", ++ "undo", ++ "front", ++ "copy", ++ "open", ++ "paste", ++ "find", ++ "cut", ++ "lf", ++ "help", ++ "meta_l", ++ "meta_r", ++ "compose", ++ "pause", ++ "ro", ++ "hiragana", ++ "henkan", ++ "yen", ++ "muhenkan", ++ "katakanahiragana", ++ "kp_comma", ++ "kp_equals", ++ "power", ++ "sleep", ++ "wake", ++ "audionext", ++ "audioprev", ++ "audiostop", ++ "audioplay", ++ "audiomute", ++ "volumeup", ++ "volumedown", ++ "mediaselect", ++ "mail", ++ "calculator", ++ "computer", ++ "ac_home", ++ "ac_back", ++ "ac_forward", ++ "ac_refresh", ++ "ac_bookmarks" ++ ] ++ }, ++ { ++ "name": "518", ++ "members": [ ++ { ++ "name": "key", ++ "type": "318" ++ }, ++ { ++ "name": "down", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "519", ++ "members": [ ++ { ++ "name": "button", ++ "type": "532" ++ }, ++ { ++ "name": "down", ++ "type": "bool" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "520", ++ "members": [ ++ { ++ "name": "axis", ++ "type": "533" ++ }, ++ { ++ "name": "value", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "521", ++ "members": [ ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "522", ++ "members": [ ++ { ++ "name": "number", ++ "type": "int" ++ }, ++ { ++ "name": "secondary", ++ "type": "int" ++ }, ++ { ++ "name": "subordinate", ++ "type": "int" ++ }, ++ { ++ "name": "io_range", ++ "type": "534" ++ }, ++ { ++ "name": "memory_range", ++ "type": "534" ++ }, ++ { ++ "name": "prefetchable_range", ++ "type": "534" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "523", ++ "members": [ ++ { ++ "name": "compat", ++ "type": "str" ++ }, ++ { ++ "name": "data-file", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "data-file-raw", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "lazy-refcounts", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "corrupt", ++ "default": null, ++ "type": "bool" ++ }, ++ { ++ "name": "refcount-bits", ++ "type": "int" ++ }, ++ { ++ "name": "encrypt", ++ "default": null, ++ "type": "535" ++ }, ++ { ++ "name": "bitmaps", ++ "default": null, ++ "type": "[536]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "524", ++ "members": [ ++ { ++ "name": "create-type", ++ "type": "str" ++ }, ++ { ++ "name": "cid", ++ "type": "int" ++ }, ++ { ++ "name": "parent-cid", ++ "type": "int" ++ }, ++ { ++ "name": "extents", ++ "type": "[239]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "525", ++ "members": [ ++ { ++ "name": "cipher-alg", ++ "type": "493" ++ }, ++ { ++ "name": "cipher-mode", ++ "type": "494" ++ }, ++ { ++ "name": "ivgen-alg", ++ "type": "495" ++ }, ++ { ++ "name": "ivgen-hash-alg", ++ "default": null, ++ "type": "496" ++ }, ++ { ++ "name": "hash-alg", ++ "type": "496" ++ }, ++ { ++ "name": "payload-offset", ++ "type": "int" ++ }, ++ { ++ "name": "master-key-iters", ++ "type": "int" ++ }, ++ { ++ "name": "uuid", ++ "type": "str" ++ }, ++ { ++ "name": "slots", ++ "type": "[537]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "526", ++ "meta-type": "enum", ++ "values": [ ++ "md5", ++ "sha1" ++ ] ++ }, ++ { ++ "name": "527", ++ "meta-type": "enum", ++ "values": [ ++ "qcow", ++ "luks" ++ ] ++ }, ++ { ++ "name": "528", ++ "members": [ ++ { ++ "name": "key-secret", ++ "default": null, ++ "type": "str" ++ }, ++ { ++ "name": "cipher-alg", ++ "default": null, ++ "type": "493" ++ }, ++ { ++ "name": "cipher-mode", ++ "default": null, ++ "type": "494" ++ }, ++ { ++ "name": "ivgen-alg", ++ "default": null, ++ "type": "495" ++ }, ++ { ++ "name": "ivgen-hash-alg", ++ "default": null, ++ "type": "496" ++ }, ++ { ++ "name": "hash-alg", ++ "default": null, ++ "type": "496" ++ }, ++ { ++ "name": "iter-time", ++ "default": null, ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "529", ++ "meta-type": "enum", ++ "values": [ ++ "full", ++ "erasure-coded" ++ ] ++ }, ++ { ++ "name": "530", ++ "members": [ ++ { ++ "name": "copies", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "531", ++ "members": [ ++ { ++ "name": "data-strips", ++ "type": "int" ++ }, ++ { ++ "name": "parity-strips", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "532", ++ "meta-type": "enum", ++ "values": [ ++ "left", ++ "middle", ++ "right", ++ "wheel-up", ++ "wheel-down", ++ "side", ++ "extra" ++ ] ++ }, ++ { ++ "name": "533", ++ "meta-type": "enum", ++ "values": [ ++ "x", ++ "y" ++ ] ++ }, ++ { ++ "name": "534", ++ "members": [ ++ { ++ "name": "base", ++ "type": "int" ++ }, ++ { ++ "name": "limit", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "535", ++ "tag": "format", ++ "variants": [ ++ { ++ "case": "luks", ++ "type": "525" ++ }, ++ { ++ "case": "aes", ++ "type": "0" ++ } ++ ], ++ "members": [ ++ { ++ "name": "format", ++ "type": "486" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[536]", ++ "element-type": "536", ++ "meta-type": "array" ++ }, ++ { ++ "name": "536", ++ "members": [ ++ { ++ "name": "name", ++ "type": "str" ++ }, ++ { ++ "name": "granularity", ++ "type": "int" ++ }, ++ { ++ "name": "flags", ++ "type": "[538]" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[239]", ++ "element-type": "239", ++ "meta-type": "array" ++ }, ++ { ++ "name": "[537]", ++ "element-type": "537", ++ "meta-type": "array" ++ }, ++ { ++ "name": "537", ++ "members": [ ++ { ++ "name": "active", ++ "type": "bool" ++ }, ++ { ++ "name": "iters", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "stripes", ++ "default": null, ++ "type": "int" ++ }, ++ { ++ "name": "key-offset", ++ "type": "int" ++ } ++ ], ++ "meta-type": "object" ++ }, ++ { ++ "name": "[538]", ++ "element-type": "538", ++ "meta-type": "array" ++ }, ++ { ++ "name": "538", ++ "meta-type": "enum", ++ "values": [ ++ "in-use", ++ "auto" ++ ] ++ } ++ ], ++ "id": "libvirt-45" ++} ++ ++{ ++ "execute": "query-sev-capabilities", ++ "id": "libvirt-46" ++} ++ ++{ ++ "id": "libvirt-46", ++ "error": { ++ "class": "GenericError", ++ "desc": "SEV feature is not available" ++ } ++} ++ ++{ ++ "execute": "query-cpu-model-expansion", ++ "arguments": { ++ "type": "static", ++ "model": { ++ "name": "host" ++ } ++ }, ++ "id": "libvirt-47" ++} ++ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": true, ++ "mmx": true, ++ "rdpid": false, ++ "arat": true, ++ "vmx-page-walk-4": true, ++ "vmx-page-walk-5": false, ++ "gfni": false, ++ "ibrs-all": false, ++ "vmx-desc-exit": true, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": true, ++ "vmx-rdseed-exit": true, ++ "vmx-eptp-switching": true, ++ "kvm-asyncpf": true, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "avx512cd": false, ++ "decodeassists": false, ++ "vmx-exit-load-efer": true, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4.1": true, ++ "family": 6, ++ "vmx-vmwrite-vmexit-fields": true, ++ "vmx-vnmi": true, ++ "vmx-true-ctls": true, ++ "vmx-ept-execonly": true, ++ "vmx-exit-save-efer": true, ++ "vmx-invept-all-context": true, ++ "wbnoinvd": false, ++ "avx512f": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "xcrypt": false, ++ "vmx-exit-load-pat": true, ++ "vmx-intr-exit": true, ++ "min-level": 22, ++ "vmx-flexpriority": true, ++ "xgetbv1": true, ++ "cid": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": false, ++ "vmx-cr8-load-exit": true, ++ "xsaveopt": true, ++ "vmx-apicv-vid": false, ++ "vmx-exit-save-pat": true, ++ "xtpr": false, ++ "tsx-ctrl": false, ++ "vmx-ple": false, ++ "avx512vl": false, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": true, ++ "vmx-vmfunc": true, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "cr8legacy": false, ++ "vmx-encls-exit": false, ++ "stibp": true, ++ "vmx-msr-bitmap": true, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": true, ++ "vmx-pml": true, ++ "vmx-nmi-exit": true, ++ "vmx-invept-single-context-noglobals": true, ++ "pn": false, ++ "rsba": false, ++ "dca": false, ++ "vendor": "GenuineIntel", ++ "vmx-unrestricted-guest": true, ++ "vmx-cr3-store-noexit": true, ++ "pku": false, ++ "smx": false, ++ "cmp-legacy": false, ++ "avx512-4fmaps": false, ++ "vmcb-clean": false, ++ "hle": true, ++ "3dnowext": false, ++ "amd-no-ssb": false, ++ "npt": false, ++ "rdctl-no": false, ++ "vmx-invvpid": true, ++ "clwb": false, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm-lock": false, ++ "smep": true, ++ "smap": true, ++ "pfthreshold": false, ++ "vmx-invpcid-exit": true, ++ "x2apic": true, ++ "avx512vbmi": false, ++ "avx512vnni": false, ++ "vmx-apicv-x2apic": true, ++ "kvm-pv-sched-yield": true, ++ "vmx-invlpg-exit": true, ++ "vmx-invvpid-all-context": true, ++ "vmx-activity-hlt": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "vmx-exit-ack-intr": true, ++ "ace2-en": false, ++ "pae": true, ++ "pat": true, ++ "sse": true, ++ "phe-en": false, ++ "vmx-tsc-offset": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "vmx-rdtsc-exit": true, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": true, ++ "mds-no": false, ++ "pcommit": false, ++ "vmx-vpid": true, ++ "syscall": true, ++ "avx512dq": false, ++ "svm": false, ++ "invtsc": false, ++ "vmx-monitor-exit": true, ++ "sse2": true, ++ "ssbd": true, ++ "vmx-wbinvd-exit": true, ++ "est": false, ++ "kvm-poll-control": true, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-eoi": true, ++ "kvm-pv-ipi": true, ++ "cx8": true, ++ "vmx-invvpid-single-addr": true, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": true, ++ "kvm-mmu": false, ++ "sse4.2": true, ++ "pge": true, ++ "avx512bitalg": false, ++ "pdcm": false, ++ "vmx-entry-load-bndcfgs": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "model": 94, ++ "movbe": true, ++ "nrip-save": false, ++ "ssse3": true, ++ "sse4a": false, ++ "vmx-pause-exit": true, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "stepping": 3, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ds-cpl": false, ++ "ibs": false, ++ "fma4": false, ++ "vmx-exit-nosave-debugctl": true, ++ "la57": false, ++ "vmx-invept": true, ++ "osvw": false, ++ "apic": true, ++ "pmm": false, ++ "vmx-entry-noload-debugctl": true, ++ "vmx-eptad": true, ++ "spec-ctrl": true, ++ "vmx-posted-intr": false, ++ "vmx-apicv-register": false, ++ "tsc-adjust": true, ++ "kvm-steal-time": true, ++ "kvmclock": true, ++ "vmx-zero-len-inject": false, ++ "pschange-mc-no": true, ++ "vmx-rdrand-exit": true, ++ "lwp": false, ++ "amd-ssbd": false, ++ "xop": false, ++ "ibpb": false, ++ "avx": true, ++ "core-capability": false, ++ "vmx-invept-single-context": true, ++ "movdiri": false, ++ "acpi": false, ++ "avx512bw": false, ++ "ace2": false, ++ "fsgsbase": true, ++ "vmx-ept-2mb": true, ++ "vmx-ept-1gb": true, ++ "ht": false, ++ "vmx-io-exit": true, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "popcnt": true, ++ "vaes": false, ++ "movdir64b": false, ++ "xsaves": true, ++ "vmx-shadow-vmcs": true, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": true, ++ "vmx-entry-load-pat": true, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": true, ++ "umip": true, ++ "vmx-store-lma": true, ++ "vmx-movdr-exit": true, ++ "pse": true, ++ "avx2": true, ++ "sep": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": true, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "misalignsse": false, ++ "split-lock-detect": false, ++ "min-xlevel": 2147483656, ++ "bmi1": true, ++ "bmi2": true, ++ "kvm-pv-unhalt": true, ++ "tsc-scale": false, ++ "topoext": false, ++ "amd-stibp": false, ++ "vmx-preemption-timer": true, ++ "clflushopt": true, ++ "vmx-vnmi-pending": true, ++ "monitor": false, ++ "vmx-vintr-pending": true, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": true, ++ "taa-no": false, ++ "arch-capabilities": true, ++ "vmx-secondary-ctls": true, ++ "vmx-xsaves": true, ++ "clzero": false, ++ "3dnow": false, ++ "erms": true, ++ "vmx-entry-ia32e-mode": true, ++ "lahf-lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": true, ++ "fxsr-opt": false, ++ "xstore": false, ++ "rtm": true, ++ "kvm-hint-dedicated": false, ++ "lmce": true, ++ "perfctr-nb": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vme": true, ++ "vmx": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": true, ++ "vmx-mtf": true, ++ "vmx-entry-load-efer": true, ++ "model-id": "Intel(R) Xeon(R) CPU E3-1245 v5 @ 3.50GHz", ++ "sha-ni": false, ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": true, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "libvirt-47" ++} ++ ++{ ++ "execute": "query-cpu-model-expansion", ++ "arguments": { ++ "type": "static", ++ "model": { ++ "name": "host", ++ "props": { ++ "migratable": false ++ } ++ } ++ }, ++ "id": "libvirt-48" ++} ++ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": true, ++ "mmx": true, ++ "rdpid": false, ++ "arat": true, ++ "vmx-page-walk-4": true, ++ "vmx-page-walk-5": false, ++ "gfni": false, ++ "ibrs-all": false, ++ "vmx-desc-exit": true, ++ "pause-filter": false, ++ "xsavec": true, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": true, ++ "vmx-rdseed-exit": true, ++ "vmx-eptp-switching": true, ++ "kvm-asyncpf": true, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "avx512cd": false, ++ "decodeassists": false, ++ "vmx-exit-load-efer": true, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4.1": true, ++ "family": 6, ++ "vmx-vmwrite-vmexit-fields": true, ++ "vmx-vnmi": true, ++ "vmx-true-ctls": true, ++ "vmx-ept-execonly": true, ++ "vmx-exit-save-efer": true, ++ "vmx-invept-all-context": true, ++ "wbnoinvd": false, ++ "avx512f": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "xcrypt": false, ++ "vmx-exit-load-pat": true, ++ "vmx-intr-exit": true, ++ "min-level": 22, ++ "vmx-flexpriority": true, ++ "xgetbv1": true, ++ "cid": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": false, ++ "vmx-cr8-load-exit": true, ++ "xsaveopt": true, ++ "vmx-apicv-vid": false, ++ "vmx-exit-save-pat": true, ++ "xtpr": false, ++ "tsx-ctrl": false, ++ "vmx-ple": false, ++ "avx512vl": false, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": true, ++ "vmx-vmfunc": true, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "cr8legacy": false, ++ "vmx-encls-exit": false, ++ "stibp": true, ++ "vmx-msr-bitmap": true, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": true, ++ "vmx-pml": true, ++ "vmx-nmi-exit": true, ++ "vmx-invept-single-context-noglobals": true, ++ "pn": false, ++ "rsba": false, ++ "dca": false, ++ "vendor": "GenuineIntel", ++ "vmx-unrestricted-guest": true, ++ "vmx-cr3-store-noexit": true, ++ "pku": false, ++ "smx": false, ++ "cmp-legacy": false, ++ "avx512-4fmaps": false, ++ "vmcb-clean": false, ++ "hle": true, ++ "3dnowext": false, ++ "amd-no-ssb": false, ++ "npt": false, ++ "rdctl-no": false, ++ "vmx-invvpid": true, ++ "clwb": false, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm-lock": false, ++ "smep": true, ++ "smap": true, ++ "pfthreshold": false, ++ "vmx-invpcid-exit": true, ++ "x2apic": true, ++ "avx512vbmi": false, ++ "avx512vnni": false, ++ "vmx-apicv-x2apic": true, ++ "kvm-pv-sched-yield": true, ++ "vmx-invlpg-exit": true, ++ "vmx-invvpid-all-context": true, ++ "vmx-activity-hlt": true, ++ "flushbyasid": false, ++ "f16c": true, ++ "vmx-exit-ack-intr": true, ++ "ace2-en": false, ++ "pae": true, ++ "pat": true, ++ "sse": true, ++ "phe-en": false, ++ "vmx-tsc-offset": true, ++ "kvm-nopiodelay": true, ++ "tm": false, ++ "kvmclock-stable-bit": true, ++ "vmx-rdtsc-exit": true, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": true, ++ "mds-no": false, ++ "pcommit": false, ++ "vmx-vpid": true, ++ "syscall": true, ++ "avx512dq": false, ++ "svm": false, ++ "invtsc": true, ++ "vmx-monitor-exit": true, ++ "sse2": true, ++ "ssbd": true, ++ "vmx-wbinvd-exit": true, ++ "est": false, ++ "kvm-poll-control": true, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-eoi": true, ++ "kvm-pv-ipi": true, ++ "cx8": true, ++ "vmx-invvpid-single-addr": true, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": true, ++ "kvm-mmu": false, ++ "sse4.2": true, ++ "pge": true, ++ "avx512bitalg": false, ++ "pdcm": false, ++ "vmx-entry-load-bndcfgs": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "model": 94, ++ "movbe": true, ++ "nrip-save": false, ++ "ssse3": true, ++ "sse4a": false, ++ "vmx-pause-exit": true, ++ "invpcid": true, ++ "pdpe1gb": true, ++ "tsc-deadline": true, ++ "skip-l1dfl-vmentry": true, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": true, ++ "cx16": true, ++ "de": true, ++ "stepping": 3, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ds-cpl": false, ++ "ibs": false, ++ "fma4": false, ++ "vmx-exit-nosave-debugctl": true, ++ "la57": false, ++ "vmx-invept": true, ++ "osvw": false, ++ "apic": true, ++ "pmm": false, ++ "vmx-entry-noload-debugctl": true, ++ "vmx-eptad": true, ++ "spec-ctrl": true, ++ "vmx-posted-intr": false, ++ "vmx-apicv-register": false, ++ "tsc-adjust": true, ++ "kvm-steal-time": true, ++ "kvmclock": true, ++ "vmx-zero-len-inject": false, ++ "pschange-mc-no": true, ++ "vmx-rdrand-exit": true, ++ "lwp": false, ++ "amd-ssbd": false, ++ "xop": false, ++ "ibpb": false, ++ "avx": true, ++ "core-capability": false, ++ "vmx-invept-single-context": true, ++ "movdiri": false, ++ "acpi": false, ++ "avx512bw": false, ++ "ace2": false, ++ "fsgsbase": true, ++ "vmx-ept-2mb": true, ++ "vmx-ept-1gb": true, ++ "ht": false, ++ "vmx-io-exit": true, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": false, ++ "popcnt": true, ++ "vaes": false, ++ "movdir64b": false, ++ "xsaves": true, ++ "vmx-shadow-vmcs": true, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": true, ++ "vmx-entry-load-pat": true, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": true, ++ "umip": true, ++ "vmx-store-lma": true, ++ "vmx-movdr-exit": true, ++ "pse": true, ++ "avx2": true, ++ "sep": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": true, ++ "nodeid-msr": false, ++ "md-clear": true, ++ "misalignsse": false, ++ "split-lock-detect": false, ++ "min-xlevel": 2147483656, ++ "bmi1": true, ++ "bmi2": true, ++ "kvm-pv-unhalt": true, ++ "tsc-scale": false, ++ "topoext": false, ++ "amd-stibp": false, ++ "vmx-preemption-timer": true, ++ "clflushopt": true, ++ "vmx-vnmi-pending": true, ++ "monitor": false, ++ "vmx-vintr-pending": true, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": true, ++ "taa-no": false, ++ "arch-capabilities": true, ++ "vmx-secondary-ctls": true, ++ "vmx-xsaves": true, ++ "clzero": false, ++ "3dnow": false, ++ "erms": true, ++ "vmx-entry-ia32e-mode": true, ++ "lahf-lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": true, ++ "fxsr-opt": false, ++ "xstore": false, ++ "rtm": true, ++ "kvm-hint-dedicated": false, ++ "lmce": true, ++ "perfctr-nb": false, ++ "rdrand": true, ++ "rdseed": true, ++ "avx512-4vnniw": false, ++ "vme": true, ++ "vmx": true, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": true, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": true, ++ "vmx-mtf": true, ++ "vmx-entry-load-efer": true, ++ "model-id": "Intel(R) Xeon(R) CPU E3-1245 v5 @ 3.50GHz", ++ "sha-ni": false, ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": true, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "libvirt-48" ++} ++ ++{ ++ "execute": "qmp_capabilities", ++ "id": "libvirt-1" ++} ++ ++{ ++ "return": { ++ }, ++ "id": "libvirt-1" ++} ++ ++{ ++ "execute": "query-cpu-definitions", ++ "id": "libvirt-2" ++} ++ ++{ ++ "return": [ ++ { ++ "name": "max", ++ "typename": "max-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "host", ++ "typename": "host-x86_64-cpu", ++ "unavailable-features": [ ++ "kvm" ++ ], ++ "static": false, ++ "migration-safe": false ++ }, ++ { ++ "name": "base", ++ "typename": "base-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": true, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64-v1", ++ "typename": "qemu64-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu64", ++ "typename": "qemu64-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "qemu64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32-v1", ++ "typename": "qemu32-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "qemu32", ++ "typename": "qemu32-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "qemu32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom-v1", ++ "typename": "phenom-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fxsr-opt" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "phenom", ++ "typename": "phenom-x86_64-cpu", ++ "unavailable-features": [ ++ "fxsr-opt" ++ ], ++ "alias-of": "phenom-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3-v1", ++ "typename": "pentium3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium3", ++ "typename": "pentium3-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2-v1", ++ "typename": "pentium2-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium2", ++ "typename": "pentium2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium-v1", ++ "typename": "pentium-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "pentium", ++ "typename": "pentium-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "pentium-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270-v1", ++ "typename": "n270-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "n270", ++ "typename": "n270-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "n270-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64-v1", ++ "typename": "kvm64-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm64", ++ "typename": "kvm64-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "kvm64-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32-v1", ++ "typename": "kvm32-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "kvm32", ++ "typename": "kvm32-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "kvm32-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo-v1", ++ "typename": "coreduo-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "coreduo", ++ "typename": "coreduo-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "coreduo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo-v1", ++ "typename": "core2duo-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "core2duo", ++ "typename": "core2duo-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "core2duo-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon-v1", ++ "typename": "athlon-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "athlon", ++ "typename": "athlon-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "athlon-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v2", ++ "typename": "Westmere-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-v1", ++ "typename": "Westmere-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere-IBRS", ++ "typename": "Westmere-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "spec-ctrl" ++ ], ++ "alias-of": "Westmere-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Westmere", ++ "typename": "Westmere-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Westmere-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v2", ++ "typename": "Snowridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "umip", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "spec-ctrl", ++ "arch-capabilities", ++ "core-capability", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge-v1", ++ "typename": "Snowridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "umip", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "spec-ctrl", ++ "arch-capabilities", ++ "core-capability", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "split-lock-detect" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Snowridge", ++ "typename": "Snowridge-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "umip", ++ "gfni", ++ "cldemote", ++ "movdiri", ++ "movdir64b", ++ "spec-ctrl", ++ "arch-capabilities", ++ "core-capability", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "split-lock-detect" ++ ], ++ "alias-of": "Snowridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v3", ++ "typename": "Skylake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v2", ++ "typename": "Skylake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-v1", ++ "typename": "Skylake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-noTSX-IBRS", ++ "typename": "Skylake-Server-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server-IBRS", ++ "typename": "Skylake-Server-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Server", ++ "typename": "Skylake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v3", ++ "typename": "Skylake-Client-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v2", ++ "typename": "Skylake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-v1", ++ "typename": "Skylake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-noTSX-IBRS", ++ "typename": "Skylake-Client-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Client-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client-IBRS", ++ "typename": "Skylake-Client-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Skylake-Client", ++ "typename": "Skylake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Skylake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v2", ++ "typename": "SandyBridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-v1", ++ "typename": "SandyBridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge-IBRS", ++ "typename": "SandyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "spec-ctrl" ++ ], ++ "alias-of": "SandyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "SandyBridge", ++ "typename": "SandyBridge-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx" ++ ], ++ "alias-of": "SandyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn-v1", ++ "typename": "Penryn-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Penryn", ++ "typename": "Penryn-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Penryn-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5-v1", ++ "typename": "Opteron_G5-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "misalignsse", ++ "3dnowprefetch", ++ "xop", ++ "fma4", ++ "tbm", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G5", ++ "typename": "Opteron_G5-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "misalignsse", ++ "3dnowprefetch", ++ "xop", ++ "fma4", ++ "tbm", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G5-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4-v1", ++ "typename": "Opteron_G4-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "avx", ++ "misalignsse", ++ "3dnowprefetch", ++ "xop", ++ "fma4", ++ "nrip-save" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G4", ++ "typename": "Opteron_G4-x86_64-cpu", ++ "unavailable-features": [ ++ "avx", ++ "misalignsse", ++ "3dnowprefetch", ++ "xop", ++ "fma4", ++ "nrip-save" ++ ], ++ "alias-of": "Opteron_G4-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3-v1", ++ "typename": "Opteron_G3-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "misalignsse" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G3", ++ "typename": "Opteron_G3-x86_64-cpu", ++ "unavailable-features": [ ++ "misalignsse" ++ ], ++ "alias-of": "Opteron_G3-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2-v1", ++ "typename": "Opteron_G2-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G2", ++ "typename": "Opteron_G2-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Opteron_G2-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1-v1", ++ "typename": "Opteron_G1-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Opteron_G1", ++ "typename": "Opteron_G1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Opteron_G1-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v2", ++ "typename": "Nehalem-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-v1", ++ "typename": "Nehalem-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem-IBRS", ++ "typename": "Nehalem-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "spec-ctrl" ++ ], ++ "alias-of": "Nehalem-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Nehalem", ++ "typename": "Nehalem-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Nehalem-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill-v1", ++ "typename": "KnightsMill-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "avx512f", ++ "rdseed", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "3dnowprefetch" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "KnightsMill", ++ "typename": "KnightsMill-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "avx512f", ++ "rdseed", ++ "avx512pf", ++ "avx512er", ++ "avx512cd", ++ "avx512-vpopcntdq", ++ "avx512-4vnniw", ++ "avx512-4fmaps", ++ "3dnowprefetch" ++ ], ++ "alias-of": "KnightsMill-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v2", ++ "typename": "IvyBridge-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-v1", ++ "typename": "IvyBridge-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge-IBRS", ++ "typename": "IvyBridge-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "spec-ctrl" ++ ], ++ "alias-of": "IvyBridge-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "IvyBridge", ++ "typename": "IvyBridge-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c" ++ ], ++ "alias-of": "IvyBridge-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v2", ++ "typename": "Icelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-v1", ++ "typename": "Icelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server-noTSX", ++ "typename": "Icelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "alias-of": "Icelake-Server-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Server", ++ "typename": "Icelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "alias-of": "Icelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v2", ++ "typename": "Icelake-Client-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-v1", ++ "typename": "Icelake-Client-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client-noTSX", ++ "typename": "Icelake-Client-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "alias-of": "Icelake-Client-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Icelake-Client", ++ "typename": "Icelake-Client-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "avx512vbmi", ++ "umip", ++ "avx512vbmi2", ++ "gfni", ++ "vaes", ++ "vpclmulqdq", ++ "avx512vnni", ++ "avx512bitalg", ++ "avx512-vpopcntdq", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "wbnoinvd", ++ "xsavec" ++ ], ++ "alias-of": "Icelake-Client-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v4", ++ "typename": "Haswell-v4-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v3", ++ "typename": "Haswell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "spec-ctrl" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v2", ++ "typename": "Haswell-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-v1", ++ "typename": "Haswell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX-IBRS", ++ "typename": "Haswell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "spec-ctrl" ++ ], ++ "alias-of": "Haswell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-noTSX", ++ "typename": "Haswell-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid" ++ ], ++ "alias-of": "Haswell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell-IBRS", ++ "typename": "Haswell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "spec-ctrl" ++ ], ++ "alias-of": "Haswell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Haswell", ++ "typename": "Haswell-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm" ++ ], ++ "alias-of": "Haswell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v3", ++ "typename": "EPYC-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "ibpb", ++ "nrip-save", ++ "xsavec", ++ "xsaves" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v2", ++ "typename": "EPYC-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "ibpb", ++ "nrip-save", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-v1", ++ "typename": "EPYC-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "nrip-save", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome-v1", ++ "typename": "EPYC-Rome-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "umip", ++ "rdpid", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "ibpb", ++ "amd-stibp", ++ "nrip-save", ++ "xsavec", ++ "xsaves" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-Rome", ++ "typename": "EPYC-Rome-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "umip", ++ "rdpid", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "perfctr-core", ++ "clzero", ++ "xsaveerptr", ++ "wbnoinvd", ++ "ibpb", ++ "amd-stibp", ++ "nrip-save", ++ "xsavec", ++ "xsaves" ++ ], ++ "alias-of": "EPYC-Rome-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC-IBPB", ++ "typename": "EPYC-IBPB-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "ibpb", ++ "nrip-save", ++ "xsavec" ++ ], ++ "alias-of": "EPYC-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "EPYC", ++ "typename": "EPYC-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "sha-ni", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "nrip-save", ++ "xsavec" ++ ], ++ "alias-of": "EPYC-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana-v1", ++ "typename": "Dhyana-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "ibpb", ++ "nrip-save", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Dhyana", ++ "typename": "Dhyana-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "avx", ++ "f16c", ++ "avx2", ++ "rdseed", ++ "fxsr-opt", ++ "misalignsse", ++ "3dnowprefetch", ++ "osvw", ++ "topoext", ++ "ibpb", ++ "nrip-save", ++ "xsavec" ++ ], ++ "alias-of": "Dhyana-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v2", ++ "typename": "Denverton-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "skip-l1dfl-vmentry" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton-v1", ++ "typename": "Denverton-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "skip-l1dfl-vmentry" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Denverton", ++ "typename": "Denverton-x86_64-cpu", ++ "unavailable-features": [ ++ "x2apic", ++ "tsc-deadline", ++ "rdseed", ++ "sha-ni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "skip-l1dfl-vmentry" ++ ], ++ "alias-of": "Denverton-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake-v1", ++ "typename": "Cooperlake-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "stibp", ++ "arch-capabilities", ++ "ssbd", ++ "avx512-bf16", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "ibrs-all", ++ "skip-l1dfl-vmentry", ++ "mds-no", ++ "pschange-mc-no", ++ "taa-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cooperlake", ++ "typename": "Cooperlake-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "stibp", ++ "arch-capabilities", ++ "ssbd", ++ "avx512-bf16", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "ibrs-all", ++ "skip-l1dfl-vmentry", ++ "mds-no", ++ "pschange-mc-no", ++ "taa-no" ++ ], ++ "alias-of": "Cooperlake-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe-v1", ++ "typename": "Conroe-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Conroe", ++ "typename": "Conroe-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "Conroe-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v3", ++ "typename": "Cascadelake-Server-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "ibrs-all", ++ "skip-l1dfl-vmentry", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v2", ++ "typename": "Cascadelake-Server-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "ibrs-all", ++ "skip-l1dfl-vmentry", ++ "mds-no" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-v1", ++ "typename": "Cascadelake-Server-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server-noTSX", ++ "typename": "Cascadelake-Server-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "arch-capabilities", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec", ++ "rdctl-no", ++ "ibrs-all", ++ "skip-l1dfl-vmentry", ++ "mds-no" ++ ], ++ "alias-of": "Cascadelake-Server-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Cascadelake-Server", ++ "typename": "Cascadelake-Server-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "avx512f", ++ "avx512dq", ++ "rdseed", ++ "avx512cd", ++ "avx512bw", ++ "avx512vl", ++ "avx512vnni", ++ "spec-ctrl", ++ "ssbd", ++ "3dnowprefetch", ++ "xsavec" ++ ], ++ "alias-of": "Cascadelake-Server-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v4", ++ "typename": "Broadwell-v4-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v3", ++ "typename": "Broadwell-v3-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v2", ++ "typename": "Broadwell-v2-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "3dnowprefetch" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-v1", ++ "typename": "Broadwell-v1-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "3dnowprefetch" ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX-IBRS", ++ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch" ++ ], ++ "alias-of": "Broadwell-v4", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-noTSX", ++ "typename": "Broadwell-noTSX-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "avx2", ++ "invpcid", ++ "rdseed", ++ "3dnowprefetch" ++ ], ++ "alias-of": "Broadwell-v2", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell-IBRS", ++ "typename": "Broadwell-IBRS-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "spec-ctrl", ++ "3dnowprefetch" ++ ], ++ "alias-of": "Broadwell-v3", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "Broadwell", ++ "typename": "Broadwell-x86_64-cpu", ++ "unavailable-features": [ ++ "fma", ++ "pcid", ++ "x2apic", ++ "tsc-deadline", ++ "avx", ++ "f16c", ++ "hle", ++ "avx2", ++ "invpcid", ++ "rtm", ++ "rdseed", ++ "3dnowprefetch" ++ ], ++ "alias-of": "Broadwell-v1", ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486-v1", ++ "typename": "486-v1-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "static": false, ++ "migration-safe": true ++ }, ++ { ++ "name": "486", ++ "typename": "486-x86_64-cpu", ++ "unavailable-features": [ ++ ], ++ "alias-of": "486-v1", ++ "static": false, ++ "migration-safe": true ++ } ++ ], ++ "id": "libvirt-2" ++} ++ ++{ ++ "execute": "query-cpu-model-expansion", ++ "arguments": { ++ "type": "static", ++ "model": { ++ "name": "max" ++ } ++ }, ++ "id": "libvirt-3" ++} ++ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": false, ++ "mmx": true, ++ "rdpid": false, ++ "arat": true, ++ "vmx-page-walk-4": false, ++ "vmx-page-walk-5": false, ++ "gfni": false, ++ "ibrs-all": false, ++ "vmx-desc-exit": false, ++ "pause-filter": false, ++ "xsavec": false, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": false, ++ "vmx-rdseed-exit": false, ++ "vmx-eptp-switching": false, ++ "kvm-asyncpf": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "avx512cd": false, ++ "decodeassists": false, ++ "vmx-exit-load-efer": false, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4.1": true, ++ "family": 6, ++ "vmx-vmwrite-vmexit-fields": false, ++ "vmx-vnmi": false, ++ "vmx-true-ctls": false, ++ "vmx-ept-execonly": false, ++ "vmx-exit-save-efer": false, ++ "vmx-invept-all-context": false, ++ "wbnoinvd": false, ++ "avx512f": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "xcrypt": false, ++ "vmx-exit-load-pat": false, ++ "vmx-intr-exit": false, ++ "min-level": 13, ++ "vmx-flexpriority": false, ++ "xgetbv1": true, ++ "cid": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": false, ++ "vmx-cr8-load-exit": false, ++ "xsaveopt": true, ++ "vmx-apicv-vid": false, ++ "vmx-exit-save-pat": false, ++ "xtpr": false, ++ "tsx-ctrl": false, ++ "vmx-ple": false, ++ "avx512vl": false, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": false, ++ "vmx-vmfunc": false, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "cr8legacy": true, ++ "vmx-encls-exit": false, ++ "stibp": false, ++ "vmx-msr-bitmap": false, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": false, ++ "vmx-pml": false, ++ "vmx-nmi-exit": false, ++ "vmx-invept-single-context-noglobals": false, ++ "pn": false, ++ "rsba": false, ++ "dca": false, ++ "vendor": "AuthenticAMD", ++ "vmx-unrestricted-guest": false, ++ "vmx-cr3-store-noexit": false, ++ "pku": true, ++ "smx": false, ++ "cmp-legacy": false, ++ "avx512-4fmaps": false, ++ "vmcb-clean": false, ++ "hle": false, ++ "3dnowext": true, ++ "amd-no-ssb": false, ++ "npt": true, ++ "rdctl-no": false, ++ "vmx-invvpid": false, ++ "clwb": true, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm-lock": false, ++ "smep": true, ++ "smap": true, ++ "pfthreshold": false, ++ "vmx-invpcid-exit": false, ++ "x2apic": false, ++ "avx512vbmi": false, ++ "avx512vnni": false, ++ "vmx-apicv-x2apic": false, ++ "kvm-pv-sched-yield": false, ++ "vmx-invlpg-exit": false, ++ "vmx-invvpid-all-context": false, ++ "vmx-activity-hlt": false, ++ "flushbyasid": false, ++ "f16c": false, ++ "vmx-exit-ack-intr": false, ++ "ace2-en": false, ++ "pae": true, ++ "pat": true, ++ "sse": true, ++ "phe-en": false, ++ "vmx-tsc-offset": false, ++ "kvm-nopiodelay": false, ++ "tm": false, ++ "kvmclock-stable-bit": false, ++ "vmx-rdtsc-exit": false, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": false, ++ "mds-no": false, ++ "pcommit": true, ++ "vmx-vpid": false, ++ "syscall": true, ++ "avx512dq": false, ++ "svm": true, ++ "invtsc": false, ++ "vmx-monitor-exit": false, ++ "sse2": true, ++ "ssbd": false, ++ "vmx-wbinvd-exit": false, ++ "est": false, ++ "kvm-poll-control": false, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-eoi": false, ++ "kvm-pv-ipi": false, ++ "cx8": true, ++ "vmx-invvpid-single-addr": false, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": false, ++ "kvm-mmu": false, ++ "sse4.2": true, ++ "pge": true, ++ "avx512bitalg": false, ++ "pdcm": false, ++ "vmx-entry-load-bndcfgs": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "model": 6, ++ "movbe": true, ++ "nrip-save": false, ++ "ssse3": true, ++ "sse4a": true, ++ "vmx-pause-exit": false, ++ "invpcid": false, ++ "pdpe1gb": true, ++ "tsc-deadline": false, ++ "skip-l1dfl-vmentry": false, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": false, ++ "cx16": true, ++ "de": true, ++ "stepping": 3, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ds-cpl": false, ++ "ibs": false, ++ "fma4": false, ++ "vmx-exit-nosave-debugctl": false, ++ "la57": true, ++ "vmx-invept": false, ++ "osvw": false, ++ "apic": true, ++ "pmm": false, ++ "vmx-entry-noload-debugctl": false, ++ "vmx-eptad": false, ++ "spec-ctrl": false, ++ "vmx-posted-intr": false, ++ "vmx-apicv-register": false, ++ "tsc-adjust": false, ++ "kvm-steal-time": false, ++ "kvmclock": false, ++ "vmx-zero-len-inject": false, ++ "pschange-mc-no": false, ++ "vmx-rdrand-exit": false, ++ "lwp": false, ++ "amd-ssbd": false, ++ "xop": false, ++ "ibpb": false, ++ "avx": false, ++ "core-capability": false, ++ "vmx-invept-single-context": false, ++ "movdiri": false, ++ "acpi": true, ++ "avx512bw": false, ++ "ace2": false, ++ "fsgsbase": true, ++ "vmx-ept-2mb": false, ++ "vmx-ept-1gb": false, ++ "ht": false, ++ "vmx-io-exit": false, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": true, ++ "popcnt": true, ++ "vaes": false, ++ "movdir64b": false, ++ "xsaves": false, ++ "vmx-shadow-vmcs": false, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": false, ++ "vmx-entry-load-pat": false, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": false, ++ "umip": false, ++ "vmx-store-lma": false, ++ "vmx-movdr-exit": false, ++ "pse": true, ++ "avx2": false, ++ "sep": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": false, ++ "nodeid-msr": false, ++ "md-clear": false, ++ "misalignsse": false, ++ "split-lock-detect": false, ++ "min-xlevel": 2147483658, ++ "bmi1": true, ++ "bmi2": true, ++ "kvm-pv-unhalt": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "amd-stibp": false, ++ "vmx-preemption-timer": false, ++ "clflushopt": true, ++ "vmx-vnmi-pending": false, ++ "monitor": true, ++ "vmx-vintr-pending": false, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": false, ++ "taa-no": false, ++ "arch-capabilities": false, ++ "vmx-secondary-ctls": false, ++ "vmx-xsaves": false, ++ "clzero": false, ++ "3dnow": true, ++ "erms": true, ++ "vmx-entry-ia32e-mode": false, ++ "lahf-lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": false, ++ "fxsr-opt": false, ++ "xstore": false, ++ "rtm": false, ++ "kvm-hint-dedicated": false, ++ "lmce": false, ++ "perfctr-nb": false, ++ "rdrand": true, ++ "rdseed": false, ++ "avx512-4vnniw": false, ++ "vme": false, ++ "vmx": false, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": false, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": false, ++ "vmx-mtf": false, ++ "vmx-entry-load-efer": false, ++ "model-id": "QEMU TCG CPU version 2.5+", ++ "sha-ni": false, ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": false, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "libvirt-3" ++} ++ ++{ ++ "execute": "query-cpu-model-expansion", ++ "arguments": { ++ "type": "static", ++ "model": { ++ "name": "max", ++ "props": { ++ "migratable": false ++ } ++ } ++ }, ++ "id": "libvirt-4" ++} ++ ++{ ++ "return": { ++ "model": { ++ "name": "base", ++ "props": { ++ "vmx-entry-load-rtit-ctl": false, ++ "cmov": true, ++ "ia64": false, ++ "ssb-no": false, ++ "aes": true, ++ "vmx-apicv-xapic": false, ++ "mmx": true, ++ "rdpid": false, ++ "arat": true, ++ "vmx-page-walk-4": false, ++ "vmx-page-walk-5": false, ++ "gfni": false, ++ "ibrs-all": false, ++ "vmx-desc-exit": false, ++ "pause-filter": false, ++ "xsavec": false, ++ "intel-pt": false, ++ "vmx-cr8-store-exit": false, ++ "vmx-rdseed-exit": false, ++ "vmx-eptp-switching": false, ++ "kvm-asyncpf": false, ++ "perfctr-core": false, ++ "mpx": true, ++ "pbe": false, ++ "avx512cd": false, ++ "decodeassists": false, ++ "vmx-exit-load-efer": false, ++ "vmx-exit-clear-bndcfgs": false, ++ "sse4.1": true, ++ "family": 6, ++ "vmx-vmwrite-vmexit-fields": false, ++ "vmx-vnmi": false, ++ "vmx-true-ctls": false, ++ "vmx-ept-execonly": false, ++ "vmx-exit-save-efer": false, ++ "vmx-invept-all-context": false, ++ "wbnoinvd": false, ++ "avx512f": false, ++ "msr": true, ++ "mce": true, ++ "mca": true, ++ "xcrypt": false, ++ "vmx-exit-load-pat": false, ++ "vmx-intr-exit": false, ++ "min-level": 13, ++ "vmx-flexpriority": false, ++ "xgetbv1": true, ++ "cid": false, ++ "ds": false, ++ "fxsr": true, ++ "avx512-bf16": false, ++ "vmx-cr8-load-exit": false, ++ "xsaveopt": true, ++ "vmx-apicv-vid": false, ++ "vmx-exit-save-pat": false, ++ "xtpr": false, ++ "tsx-ctrl": false, ++ "vmx-ple": false, ++ "avx512vl": false, ++ "avx512-vpopcntdq": false, ++ "phe": false, ++ "extapic": false, ++ "3dnowprefetch": false, ++ "vmx-vmfunc": false, ++ "vmx-activity-shutdown": false, ++ "avx512vbmi2": false, ++ "cr8legacy": true, ++ "vmx-encls-exit": false, ++ "stibp": false, ++ "vmx-msr-bitmap": false, ++ "xcrypt-en": false, ++ "vmx-mwait-exit": false, ++ "vmx-pml": false, ++ "vmx-nmi-exit": false, ++ "vmx-invept-single-context-noglobals": false, ++ "pn": false, ++ "rsba": false, ++ "dca": false, ++ "vendor": "AuthenticAMD", ++ "vmx-unrestricted-guest": false, ++ "vmx-cr3-store-noexit": false, ++ "pku": true, ++ "smx": false, ++ "cmp-legacy": false, ++ "avx512-4fmaps": false, ++ "vmcb-clean": false, ++ "hle": false, ++ "3dnowext": true, ++ "amd-no-ssb": false, ++ "npt": true, ++ "rdctl-no": false, ++ "vmx-invvpid": false, ++ "clwb": true, ++ "lbrv": false, ++ "adx": true, ++ "ss": true, ++ "pni": true, ++ "svm-lock": false, ++ "smep": true, ++ "smap": true, ++ "pfthreshold": false, ++ "vmx-invpcid-exit": false, ++ "x2apic": false, ++ "avx512vbmi": false, ++ "avx512vnni": false, ++ "vmx-apicv-x2apic": false, ++ "kvm-pv-sched-yield": false, ++ "vmx-invlpg-exit": false, ++ "vmx-invvpid-all-context": false, ++ "vmx-activity-hlt": false, ++ "flushbyasid": false, ++ "f16c": false, ++ "vmx-exit-ack-intr": false, ++ "ace2-en": false, ++ "pae": true, ++ "pat": true, ++ "sse": true, ++ "phe-en": false, ++ "vmx-tsc-offset": false, ++ "kvm-nopiodelay": false, ++ "tm": false, ++ "kvmclock-stable-bit": false, ++ "vmx-rdtsc-exit": false, ++ "hypervisor": true, ++ "vmx-rdtscp-exit": false, ++ "mds-no": false, ++ "pcommit": true, ++ "vmx-vpid": false, ++ "syscall": true, ++ "avx512dq": false, ++ "svm": true, ++ "invtsc": false, ++ "vmx-monitor-exit": false, ++ "sse2": true, ++ "ssbd": false, ++ "vmx-wbinvd-exit": false, ++ "est": false, ++ "kvm-poll-control": false, ++ "avx512ifma": false, ++ "tm2": false, ++ "kvm-pv-eoi": false, ++ "kvm-pv-ipi": false, ++ "cx8": true, ++ "vmx-invvpid-single-addr": false, ++ "waitpkg": false, ++ "cldemote": false, ++ "vmx-ept": false, ++ "kvm-mmu": false, ++ "sse4.2": true, ++ "pge": true, ++ "avx512bitalg": false, ++ "pdcm": false, ++ "vmx-entry-load-bndcfgs": false, ++ "vmx-exit-clear-rtit-ctl": false, ++ "model": 6, ++ "movbe": true, ++ "nrip-save": false, ++ "ssse3": true, ++ "sse4a": true, ++ "vmx-pause-exit": false, ++ "invpcid": false, ++ "pdpe1gb": true, ++ "tsc-deadline": false, ++ "skip-l1dfl-vmentry": false, ++ "vmx-exit-load-perf-global-ctrl": false, ++ "fma": false, ++ "cx16": true, ++ "de": true, ++ "stepping": 3, ++ "xsave": true, ++ "clflush": true, ++ "skinit": false, ++ "tsc": true, ++ "tce": false, ++ "fpu": true, ++ "ds-cpl": false, ++ "ibs": false, ++ "fma4": false, ++ "vmx-exit-nosave-debugctl": false, ++ "la57": true, ++ "vmx-invept": false, ++ "osvw": false, ++ "apic": true, ++ "pmm": false, ++ "vmx-entry-noload-debugctl": false, ++ "vmx-eptad": false, ++ "spec-ctrl": false, ++ "vmx-posted-intr": false, ++ "vmx-apicv-register": false, ++ "tsc-adjust": false, ++ "kvm-steal-time": false, ++ "kvmclock": false, ++ "vmx-zero-len-inject": false, ++ "pschange-mc-no": false, ++ "vmx-rdrand-exit": false, ++ "lwp": false, ++ "amd-ssbd": false, ++ "xop": false, ++ "ibpb": false, ++ "avx": false, ++ "core-capability": false, ++ "vmx-invept-single-context": false, ++ "movdiri": false, ++ "acpi": true, ++ "avx512bw": false, ++ "ace2": false, ++ "fsgsbase": true, ++ "vmx-ept-2mb": false, ++ "vmx-ept-1gb": false, ++ "ht": false, ++ "vmx-io-exit": false, ++ "nx": true, ++ "pclmulqdq": true, ++ "mmxext": true, ++ "popcnt": true, ++ "vaes": false, ++ "movdir64b": false, ++ "xsaves": false, ++ "vmx-shadow-vmcs": false, ++ "lm": true, ++ "vmx-exit-save-preemption-timer": false, ++ "vmx-entry-load-pat": false, ++ "vmx-entry-load-perf-global-ctrl": false, ++ "vmx-io-bitmap": false, ++ "umip": false, ++ "vmx-store-lma": false, ++ "vmx-movdr-exit": false, ++ "pse": true, ++ "avx2": false, ++ "sep": true, ++ "virt-ssbd": false, ++ "vmx-cr3-load-noexit": false, ++ "nodeid-msr": false, ++ "md-clear": false, ++ "misalignsse": false, ++ "split-lock-detect": false, ++ "min-xlevel": 2147483658, ++ "bmi1": true, ++ "bmi2": true, ++ "kvm-pv-unhalt": false, ++ "tsc-scale": false, ++ "topoext": false, ++ "amd-stibp": false, ++ "vmx-preemption-timer": false, ++ "clflushopt": true, ++ "vmx-vnmi-pending": false, ++ "monitor": true, ++ "vmx-vintr-pending": false, ++ "avx512er": false, ++ "pmm-en": false, ++ "pcid": false, ++ "taa-no": false, ++ "arch-capabilities": false, ++ "vmx-secondary-ctls": false, ++ "vmx-xsaves": false, ++ "clzero": false, ++ "3dnow": true, ++ "erms": true, ++ "vmx-entry-ia32e-mode": false, ++ "lahf-lm": true, ++ "vpclmulqdq": false, ++ "vmx-ins-outs": false, ++ "fxsr-opt": false, ++ "xstore": false, ++ "rtm": false, ++ "kvm-hint-dedicated": false, ++ "lmce": false, ++ "perfctr-nb": false, ++ "rdrand": true, ++ "rdseed": false, ++ "avx512-4vnniw": false, ++ "vme": false, ++ "vmx": false, ++ "dtes64": false, ++ "mtrr": true, ++ "rdtscp": true, ++ "xsaveerptr": false, ++ "pse36": true, ++ "kvm-pv-tlb-flush": false, ++ "vmx-activity-wait-sipi": false, ++ "tbm": false, ++ "wdt": false, ++ "vmx-rdpmc-exit": false, ++ "vmx-mtf": false, ++ "vmx-entry-load-efer": false, ++ "model-id": "QEMU TCG CPU version 2.5+", ++ "sha-ni": false, ++ "abm": true, ++ "vmx-ept-advanced-exitinfo": false, ++ "avx512pf": false, ++ "vmx-hlt-exit": false, ++ "xstore-en": false ++ } ++ } ++ }, ++ "id": "libvirt-4" ++} ++ ++{ ++ "execute": "query-machines", ++ "id": "libvirt-5" ++} ++ ++{ ++ "return": [ ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.12", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": false, ++ "name": "none", ++ "numa-mem-supported": false, ++ "cpu-max": 1, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.10", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.7", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.9", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.11", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-3.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.3", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.9", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "isapc", ++ "numa-mem-supported": true, ++ "default-cpu-type": "486-x86_64-cpu", ++ "cpu-max": 1, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.4", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-3.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.12", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.0.1", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-1.6", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-5.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false, ++ "alias": "q35" ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.8", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.10", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-3.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-4.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": false, ++ "name": "microvm", ++ "numa-mem-supported": false, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.3", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-1.2", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": true ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-4.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-5.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "is-default": true, ++ "cpu-max": 255, ++ "deprecated": false, ++ "alias": "pc" ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-2.8", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.5", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-i440fx-3.0", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 255, ++ "deprecated": false ++ }, ++ { ++ "hotpluggable-cpus": true, ++ "name": "pc-q35-2.11", ++ "numa-mem-supported": true, ++ "default-cpu-type": "qemu64-x86_64-cpu", ++ "cpu-max": 288, ++ "deprecated": false ++ } ++ ], ++ "id": "libvirt-5" ++} +diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +new file mode 100644 +index 0000000000..d0b5f18c02 +--- /dev/null ++++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +@@ -0,0 +1,2842 @@ ++ ++ /usr/bin/qemu-system-x86_64 ++ 0 ++ 0 ++ 0 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 4002091 ++ 0 ++ 43100241 ++ v5.0.0-rc1 ++ x86_64 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args +index 6e32f918f3..65974ca759 100644 +--- a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args ++++ b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args +@@ -13,7 +13,6 @@ QEMU_AUDIO_DRV=none \ + -object secret,id=masterKey0,format=raw,\ + file=/tmp/lib/domain--1-test/master-key.aes \ + -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +--cpu qemu64 \ + -m 1024 \ + -overcommit mem-lock=off \ + -smp 1,sockets=1,cores=1,threads=1 \ +diff --git a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args +index 646d63aa90..58bab55572 100644 +--- a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args ++++ b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args +@@ -13,7 +13,6 @@ QEMU_AUDIO_DRV=none \ + -object secret,id=masterKey0,format=raw,\ + file=/tmp/lib/domain--1-test/master-key.aes \ + -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +--cpu qemu64 \ + -m 1024 \ + -overcommit mem-lock=off \ + -smp 1,sockets=1,cores=1,threads=1 \ +diff --git a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args +index 59dcd98322..381956291c 100644 +--- a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args ++++ b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args +@@ -13,7 +13,6 @@ QEMU_AUDIO_DRV=none \ + -object secret,id=masterKey0,format=raw,\ + file=/tmp/lib/domain--1-test/master-key.aes \ + -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +--cpu qemu64 \ + -m 1024 \ + -overcommit mem-lock=off \ + -smp 1,sockets=1,cores=1,threads=1 \ +diff --git a/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args +index 1b0ffee6e8..76df9d2d4d 100644 +--- a/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args ++++ b/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args +@@ -13,7 +13,6 @@ QEMU_AUDIO_DRV=none \ + -object secret,id=masterKey0,format=raw,\ + file=/tmp/lib/domain--1-test/master-key.aes \ + -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +--cpu qemu64 \ + -m 1024 \ + -overcommit mem-lock=off \ + -smp 1,sockets=1,cores=1,threads=1 \ +diff --git a/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml +index 669992bcf6..2a99f35cf8 100644 +--- a/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml ++++ b/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml +@@ -12,9 +12,6 @@ + + + +- +- qemu64 +- + + destroy + restart +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-only-stop-external-devices-after-the-domain.patch b/SOURCES/libvirt-qemu-only-stop-external-devices-after-the-domain.patch new file mode 100644 index 0000000..a5475cb --- /dev/null +++ b/SOURCES/libvirt-qemu-only-stop-external-devices-after-the-domain.patch @@ -0,0 +1,49 @@ +From cd9f9fa54ff87661a0958027baa0c13fca57d2fc Mon Sep 17 00:00:00 2001 +Message-Id: +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Wed, 13 May 2020 15:49:12 +0200 +Subject: [PATCH] qemu: only stop external devices after the domain +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +A failure in qemuProcessLaunch would lead to qemuExtDevicesStop +being called twice - once in the cleanup section and then again +in qemuProcessStop. + +However, the first one is called while the QEMU process is +still running, which is too soon for the swtpm process, because +the swtmp_ioctl command can lock up: + +https://bugzilla.redhat.com/show_bug.cgi?id=1822523 + +Remove the first call and only leave the one in qemuProcessStop, +which is called after the QEMU process is killed. + +Signed-off-by: Ján Tomko +Reviewed-by: Daniel Henrique Barboza +Reviewed-by: Erik Skultety +(cherry picked from commit 006782a8bc5a27125211946fcb12a40f7d4ed12a) +Signed-off-by: Ján Tomko +Message-Id: <5a8b7f93e0b74cfb27f4bf780eebc7e756a5dcde.1589377631.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_process.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index dffff04554..95c0315e53 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -6962,8 +6962,6 @@ qemuProcessLaunch(virConnectPtr conn, + ret = 0; + + cleanup: +- if (ret < 0) +- qemuExtDevicesStop(driver, vm); + qemuDomainSecretDestroy(vm); + return ret; + } +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-prevent-attempts-to-detach-a-device-on-a-controller-with-hotplug-off.patch b/SOURCES/libvirt-qemu-prevent-attempts-to-detach-a-device-on-a-controller-with-hotplug-off.patch new file mode 100644 index 0000000..5c0bf52 --- /dev/null +++ b/SOURCES/libvirt-qemu-prevent-attempts-to-detach-a-device-on-a-controller-with-hotplug-off.patch @@ -0,0 +1,79 @@ +From 176ca1e59775810524a2375927725fbe419d9e5c Mon Sep 17 00:00:00 2001 +Message-Id: <176ca1e59775810524a2375927725fbe419d9e5c@dist-git> +From: Laine Stump +Date: Mon, 18 May 2020 14:53:04 -0400 +Subject: [PATCH] qemu: prevent attempts to detach a device on a controller + with hotplug='off' + +Although the original patches to support controllers with +hotplug='off' were checking during hotplug/attach requests that the +device was being plugged into a PCI controller that didn't have +hotplug disabled, but I forgot to do the same for device detach (the +main impetus for adding the feature was to prevent unplugs originating +from within the guest, so it slipped my mind). So although the guest +OS was ultimately unable to honor the unplug request, libvirt could +still be used to make such a request, and since device attach/detach +are asynchronous operations, the caller to libvirt would receive a +success status back (the device would stubbornly/correctly remain in +the domain status XML however) + +This patch remedies that, by looking at the controller for the device +in the detach request, and immediately failing the operation if that +controller has hotplug=off. + +Signed-off-by: Laine Stump +Reviewed-by: Erik Skultety +(cherry picked from commit c0e04c2e62957fe872b5bc3d89d5b1d95f10450c) + +https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200518185304.188810-1-laine@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_hotplug.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 3ccc01f0b7..29e1a41f9d 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -5846,6 +5846,36 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, + return -1; + } + ++ if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { ++ ++ virDomainControllerDefPtr controller; ++ int controllerIdx = virDomainControllerFind(vm->def, ++ VIR_DOMAIN_CONTROLLER_TYPE_PCI, ++ info->addr.pci.bus); ++ if (controllerIdx < 0) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ _("cannot hot unplug %s device with PCI guest address: " ++ VIR_PCI_DEVICE_ADDRESS_FMT ++ " - controller not found"), ++ virDomainDeviceTypeToString(detach.type), ++ info->addr.pci.domain, info->addr.pci.bus, ++ info->addr.pci.slot, info->addr.pci.function); ++ return -1; ++ } ++ ++ controller = vm->def->controllers[controllerIdx]; ++ if (controller->opts.pciopts.hotplug == VIR_TRISTATE_SWITCH_OFF) { ++ virReportError(VIR_ERR_OPERATION_FAILED, ++ _("cannot hot unplug %s device with PCI guest address: " ++ VIR_PCI_DEVICE_ADDRESS_FMT ++ " - not allowed by controller"), ++ virDomainDeviceTypeToString(detach.type), ++ info->addr.pci.domain, info->addr.pci.bus, ++ info->addr.pci.slot, info->addr.pci.function); ++ return -1; ++ } ++ } ++ + /* + * Issue the qemu monitor command to delete the device (based on + * its alias), and optionally wait a short time in case the +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-snapshot-Allow-snapshots-of-read-only-disks-when-we-can-create-them.patch b/SOURCES/libvirt-qemu-snapshot-Allow-snapshots-of-read-only-disks-when-we-can-create-them.patch new file mode 100644 index 0000000..2812437 --- /dev/null +++ b/SOURCES/libvirt-qemu-snapshot-Allow-snapshots-of-read-only-disks-when-we-can-create-them.patch @@ -0,0 +1,43 @@ +From a229c76e2a5008dbdbcad996ae4f75a3d51b709f Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 12 May 2020 17:24:10 +0200 +Subject: [PATCH] qemu: snapshot: Allow snapshots of read-only disks when we + can create them +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +With -blockdev or when reusing externally created images and thus +without the need for formatting the image we actually can support +snapshots of read-only disks. Arguably it's not very useful so they are +not done by default but users of libvirt such as oVirt are actually +using this. + +https://bugzilla.redhat.com/show_bug.cgi?id=1832204 + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit fe574ea1f52daebddfdc91dd27234059c375e4bf) +Message-Id: <2f8f6e53de334a6e3c2d91711fe4dbd81d8b3ee8.1589296861.git.pkrempa@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_driver.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 26215f8d6a..7ae8641577 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -14968,7 +14968,7 @@ qemuDomainSnapshotPrepareDiskExternal(virDomainDiskDefPtr disk, + int err; + int rc; + +- if (disk->src->readonly) { ++ if (disk->src->readonly && !(reuse || blockdev)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("external snapshot for readonly disk %s " + "is not supported"), disk->dst); +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemu-use-QEMU_CAPS_STORAGE_WERROR-for-disk-error-attributes.patch b/SOURCES/libvirt-qemu-use-QEMU_CAPS_STORAGE_WERROR-for-disk-error-attributes.patch new file mode 100644 index 0000000..20a9b01 --- /dev/null +++ b/SOURCES/libvirt-qemu-use-QEMU_CAPS_STORAGE_WERROR-for-disk-error-attributes.patch @@ -0,0 +1,114 @@ +From 94f0a246fd5e53d24feff99704fca0e812c3f50d Mon Sep 17 00:00:00 2001 +Message-Id: <94f0a246fd5e53d24feff99704fca0e812c3f50d@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Wed, 1 Apr 2020 17:19:27 +0200 +Subject: [PATCH] qemu: use QEMU_CAPS_STORAGE_WERROR for disk-error attributes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When moving the formatting of this attributes from -drive +to -device, the QEMU_CAPS_USB_STORAGE_WERROR capability +was used, because usb-storage was the last device to gain +this capability. + +However this lead to the assumption that QEMU binaries +without the usb-storage device do not support this, +leading to breakage on s390x with blockdev. + +Fixes: bb4f3543bbf3ebbffa833ae7df55c298920243eb +https://bugzilla.redhat.com/show_bug.cgi?id=1819250 + +Signed-off-by: Ján Tomko +Reviewed-by: Peter Krempa +(cherry picked from commit 29fc9e96a9db30000137e648b775b6b08e05d43b) +Signed-off-by: Ján Tomko +Message-Id: <890258bf43d483173d07687f2eff72c03a243580.1585754141.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_command.c | 4 ++-- + .../disk-error-policy-s390x.s390x-2.12.0.args | 12 ++++++------ + .../disk-error-policy-s390x.s390x-latest.args | 12 ++++++------ + 3 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index de97504ce1..4653e6ac3c 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -1805,7 +1805,7 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, + + /* werror/rerror are really frontend attributes, but older + * qemu requires them on -drive instead of -device */ +- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_STORAGE_WERROR)) ++ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_STORAGE_WERROR)) + qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt); + + if (disk->src->readonly) +@@ -2256,7 +2256,7 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, + + qemuBuildDiskFrontendAttributes(disk, &opt); + +- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_STORAGE_WERROR)) ++ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_STORAGE_WERROR)) + qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt); + + return virBufferContentAndReset(&opt); +diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args +index cf932d1fad..6b93b74ec1 100644 +--- a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args ++++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args +@@ -26,17 +26,17 @@ file=/tmp/lib/domain--1-guest/master-key.aes \ + -no-shutdown \ + -boot strict=on \ + -drive file=/var/images/image1,format=qcow2,if=none,id=drive-virtio-disk0,\ +-werror=stop,rerror=stop,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0000,drive=drive-virtio-disk0,\ +-id=virtio-disk0,bootindex=1,write-cache=on \ ++id=virtio-disk0,bootindex=1,write-cache=on,werror=stop,rerror=stop \ + -drive file=/var/images/image2,format=qcow2,if=none,id=drive-virtio-disk1,\ +-werror=enospc,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0001,drive=drive-virtio-disk1,\ +-id=virtio-disk1,write-cache=on \ ++id=virtio-disk1,write-cache=on,werror=enospc \ + -drive file=/var/images/image3,format=qcow2,if=none,id=drive-virtio-disk2,\ +-werror=report,rerror=ignore,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0002,drive=drive-virtio-disk2,\ +-id=virtio-disk2,write-cache=on \ ++id=virtio-disk2,write-cache=on,werror=report,rerror=ignore \ + -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ + resourcecontrol=deny \ + -msg timestamp=on +diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args +index 5748ad7823..b1604675a1 100644 +--- a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args ++++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args +@@ -26,17 +26,17 @@ file=/tmp/lib/domain--1-guest/master-key.aes \ + -no-shutdown \ + -boot strict=on \ + -drive file=/var/images/image1,format=qcow2,if=none,id=drive-virtio-disk0,\ +-werror=stop,rerror=stop,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0000,drive=drive-virtio-disk0,\ +-id=virtio-disk0,bootindex=1,write-cache=on \ ++id=virtio-disk0,bootindex=1,write-cache=on,werror=stop,rerror=stop \ + -drive file=/var/images/image2,format=qcow2,if=none,id=drive-virtio-disk1,\ +-werror=enospc,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0001,drive=drive-virtio-disk1,\ +-id=virtio-disk1,write-cache=on \ ++id=virtio-disk1,write-cache=on,werror=enospc \ + -drive file=/var/images/image3,format=qcow2,if=none,id=drive-virtio-disk2,\ +-werror=report,rerror=ignore,cache=none \ ++cache=none \ + -device virtio-blk-ccw,scsi=off,devno=fe.0.0002,drive=drive-virtio-disk2,\ +-id=virtio-disk2,write-cache=on \ ++id=virtio-disk2,write-cache=on,werror=report,rerror=ignore \ + -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ + resourcecontrol=deny \ + -msg timestamp=on +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemuBackupBegin-Don-t-leak-def-on-early-failures.patch b/SOURCES/libvirt-qemuBackupBegin-Don-t-leak-def-on-early-failures.patch new file mode 100644 index 0000000..4009b29 --- /dev/null +++ b/SOURCES/libvirt-qemuBackupBegin-Don-t-leak-def-on-early-failures.patch @@ -0,0 +1,39 @@ +From 148ee94fdde4b4b6a78ff2a734a2bc9105a81166 Mon Sep 17 00:00:00 2001 +Message-Id: <148ee94fdde4b4b6a78ff2a734a2bc9105a81166@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:07 +0200 +Subject: [PATCH] qemuBackupBegin: Don't leak 'def' on early failures +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The cleanup path expects that 'def' is assigned to 'priv->backup', but +that's not the case for early failures. Add a check to stop overwriting +of 'def' so that it can be freed. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit b5212365b640fceb7116dca30518b42bf6ab42df) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <18f55f981e9a6eba7266424fb0f244a2c7102508.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 67d646f477..c207d3b7d0 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -803,7 +803,7 @@ qemuBackupBegin(virDomainObjPtr vm, + ignore_value(qemuDomainObjExitMonitor(priv->driver, vm)); + } + +- if (ret < 0 && !job_started) ++ if (ret < 0 && !job_started && priv->backup) + def = g_steal_pointer(&priv->backup); + + if (ret == 0) +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Don-t-exit-early-when-the-job-has-started.patch b/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Don-t-exit-early-when-the-job-has-started.patch new file mode 100644 index 0000000..82d17ab --- /dev/null +++ b/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Don-t-exit-early-when-the-job-has-started.patch @@ -0,0 +1,75 @@ +From 9dee5f450fba6b084aaef5a46b112942e6efd913 Mon Sep 17 00:00:00 2001 +Message-Id: <9dee5f450fba6b084aaef5a46b112942e6efd913@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:10 +0200 +Subject: [PATCH] qemuBackupDiskDataCleanupOne: Don't exit early when the job + has started +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Originally the function was cleaning up a failed job only but now +there's other stuff that needs to be cleared too. + +Make only steps which clean up after a failed job depend on the +'started' field and execute the rest of the code always. + +This fixes a leak of the backup job tracking object and the blockdev-add +helper data. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 165b430eb9a1213ef32f14ace14d8377e9e71446) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <2cd881ed2059b64293b32b42fbe942cc2e147f81.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index fdc75d3160..c68227f029 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -124,26 +124,25 @@ qemuBackupDiskDataCleanupOne(virDomainObjPtr vm, + { + qemuDomainObjPrivatePtr priv = vm->privateData; + +- if (dd->started) +- return; ++ if (!dd->started) { ++ if (dd->added) { ++ qemuDomainObjEnterMonitor(priv->driver, vm); ++ qemuBlockStorageSourceAttachRollback(priv->mon, dd->crdata->srcdata[0]); ++ ignore_value(qemuDomainObjExitMonitor(priv->driver, vm)); ++ } + +- if (dd->added) { +- qemuDomainObjEnterMonitor(priv->driver, vm); +- qemuBlockStorageSourceAttachRollback(priv->mon, dd->crdata->srcdata[0]); +- ignore_value(qemuDomainObjExitMonitor(priv->driver, vm)); +- } ++ if (dd->created) { ++ if (virStorageFileUnlink(dd->store) < 0) ++ VIR_WARN("Unable to remove just-created %s", NULLSTR(dd->store->path)); ++ } + +- if (dd->created) { +- if (virStorageFileUnlink(dd->store) < 0) +- VIR_WARN("Unable to remove just-created %s", NULLSTR(dd->store->path)); ++ if (dd->labelled) ++ qemuDomainStorageSourceAccessRevoke(priv->driver, vm, dd->store); + } + + if (dd->initialized) + virStorageFileDeinit(dd->store); + +- if (dd->labelled) +- qemuDomainStorageSourceAccessRevoke(priv->driver, vm, dd->store); +- + if (dd->blockjob) + qemuBlockJobStartupFinalize(vm, dd->blockjob); + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Free-incrementalBitmap.patch b/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Free-incrementalBitmap.patch new file mode 100644 index 0000000..3af93a2 --- /dev/null +++ b/SOURCES/libvirt-qemuBackupDiskDataCleanupOne-Free-incrementalBitmap.patch @@ -0,0 +1,37 @@ +From bae38a946b063c4c384ddfb22a0c04137c51d31c Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:11 +0200 +Subject: [PATCH] qemuBackupDiskDataCleanupOne: Free 'incrementalBitmap' +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The bitmap name used for the incremental backup would be leaked +otherwise. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit d55b0811ff9968eafa8d9ed394a365659fa6e0c5) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index c68227f029..5c403f8f35 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -148,6 +148,7 @@ qemuBackupDiskDataCleanupOne(virDomainObjPtr vm, + + qemuBlockStorageSourceChainDataFree(dd->crdata); + virObjectUnref(dd->terminator); ++ g_free(dd->incrementalBitmap); + } + + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemuBackupDiskStarted-Fix-improper-dereference-of-array.patch b/SOURCES/libvirt-qemuBackupDiskStarted-Fix-improper-dereference-of-array.patch new file mode 100644 index 0000000..514572f --- /dev/null +++ b/SOURCES/libvirt-qemuBackupDiskStarted-Fix-improper-dereference-of-array.patch @@ -0,0 +1,38 @@ +From 9bec4051732e43d24808893643826268ab88b8cc Mon Sep 17 00:00:00 2001 +Message-Id: <9bec4051732e43d24808893643826268ab88b8cc@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:09 +0200 +Subject: [PATCH] qemuBackupDiskStarted: Fix improper dereference of array +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The code would repeatedly mark the first disk's blockjob as started +rather than accessing all the blockjobs. Fix the dereferencing operator. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 214faa0b04ace42aebfa40e1d19aabbf3003f0fe) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <1d33c3080e24baf96a0d9435d1588b4a48a98425.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_backup.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c +index 013a82e06d..fdc75d3160 100644 +--- a/src/qemu/qemu_backup.c ++++ b/src/qemu/qemu_backup.c +@@ -479,7 +479,7 @@ qemuBackupDiskStarted(virDomainObjPtr vm, + for (i = 0; i < ndd; i++) { + dd[i].started = true; + dd[i].backupdisk->state = VIR_DOMAIN_BACKUP_DISK_STATE_RUNNING; +- qemuBlockJobStarted(dd->blockjob, vm); ++ qemuBlockJobStarted(dd[i].blockjob, vm); + } + } + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemuBlockBitmapChainIsValid-Adjust-to-new-semantics-of-bitmaps.patch b/SOURCES/libvirt-qemuBlockBitmapChainIsValid-Adjust-to-new-semantics-of-bitmaps.patch new file mode 100644 index 0000000..2f3ba23 --- /dev/null +++ b/SOURCES/libvirt-qemuBlockBitmapChainIsValid-Adjust-to-new-semantics-of-bitmaps.patch @@ -0,0 +1,95 @@ +From 4fcacae366ef35c336a6b9b0ff35cdf0a3c80760 Mon Sep 17 00:00:00 2001 +Message-Id: <4fcacae366ef35c336a6b9b0ff35cdf0a3c80760@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:50 +0200 +Subject: [PATCH] qemuBlockBitmapChainIsValid: Adjust to new semantics of + bitmaps +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reject duplicates and other problematic bitmaps according to the new +semantics of bitmap use in libvirt. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 3857b073cb3a44c6a54e040f395ed58531f16634) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_block.c | 38 +++++++++++++++++++++++--------------- + 1 file changed, 23 insertions(+), 15 deletions(-) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index a44774c237..38c8269721 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -2835,41 +2835,49 @@ qemuBlockGetNamedNodeData(virDomainObjPtr vm, + /** + * qemuBlockBitmapChainIsValid: + * +- * Validates that the backing chain of @src contains proper consistent bitmap +- * data for a chain of bitmaps named @bitmapname. ++ * Validates that the backing chain of @src contains bitmaps which libvirt will ++ * consider as properly corresponding to a checkpoint named @bitmapname. + * +- * A valid chain: +- * 1) bitmaps of same name are in a consecutive subset of images without gap +- * 2) don't have any inconsistent bitmaps ++ * The bitmaps need to: ++ * 1) start from the top image @src ++ * 2) must be present in consecutive layers ++ * 3) all must be active, persistent and not inconsistent + */ + bool + qemuBlockBitmapChainIsValid(virStorageSourcePtr src, + const char *bitmapname, + virHashTablePtr blockNamedNodeData) + { +- qemuBlockNamedNodeDataBitmapPtr bitmap; + virStorageSourcePtr n; +- bool chain_started = false; ++ bool found = false; + bool chain_ended = false; + +- for (n = src; n; n = n->backingStore) { +- if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, n, bitmapname))) { +- if (chain_started) +- chain_ended = true; ++ for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) { ++ qemuBlockNamedNodeDataBitmapPtr bitmap; ++ ++ if (!(bitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, ++ n, bitmapname))) { ++ /* rule 1, must start from top */ ++ if (!found) ++ return false; ++ ++ chain_ended = true; + + continue; + } + ++ /* rule 2, no-gaps */ + if (chain_ended) + return false; + +- chain_started = true; +- +- if (bitmap->inconsistent) ++ /* rule 3 */ ++ if (bitmap->inconsistent || !bitmap->persistent || !bitmap->recording) + return false; ++ ++ found = true; + } + +- return chain_started; ++ return found; + } + + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemuBlockStorageSourceCreateFormat-Force-write-access-when-formatting-images.patch b/SOURCES/libvirt-qemuBlockStorageSourceCreateFormat-Force-write-access-when-formatting-images.patch new file mode 100644 index 0000000..e36b90d --- /dev/null +++ b/SOURCES/libvirt-qemuBlockStorageSourceCreateFormat-Force-write-access-when-formatting-images.patch @@ -0,0 +1,59 @@ +From 57493d29be457a3b2a9f0c781e2a82968ec3e01d Mon Sep 17 00:00:00 2001 +Message-Id: <57493d29be457a3b2a9f0c781e2a82968ec3e01d@dist-git> +From: Peter Krempa +Date: Tue, 12 May 2020 17:24:09 +0200 +Subject: [PATCH] qemuBlockStorageSourceCreateFormat: Force write access when + formatting images +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We need qemu to be able to write the newly created images so that it can +format them to the specified storage format. + +Force write access by relabelling the images when formatting. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 10d62782798cd6e4d472a764575c189247a263b3) + +https://bugzilla.redhat.com/show_bug.cgi?id=1832204 +Message-Id: <0370c95a3990f94ef136d2de6df63d34989c672a.1589296861.git.pkrempa@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/qemu/qemu_block.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index 6790f05ff7..a44774c237 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -2658,6 +2658,12 @@ qemuBlockStorageSourceCreate(virDomainObjPtr vm, + return -1; + } + ++ /* grant write access to read-only images during formatting */ ++ if (src->readonly && ++ qemuDomainStorageSourceAccessAllow(priv->driver, vm, src, false, ++ false, true) < 0) ++ return -1; ++ + if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) + goto cleanup; + +@@ -2684,6 +2690,12 @@ qemuBlockStorageSourceCreate(virDomainObjPtr vm, + asyncJob) < 0) + goto cleanup; + ++ /* revoke write access to read-only images during formatting */ ++ if (src->readonly && ++ qemuDomainStorageSourceAccessAllow(priv->driver, vm, src, true, ++ false, true) < 0) ++ goto cleanup; ++ + if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) + goto cleanup; + +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemuMonitorTestProcessCommandDefaultValidate-Output-validator-output-to-stderr.patch b/SOURCES/libvirt-qemuMonitorTestProcessCommandDefaultValidate-Output-validator-output-to-stderr.patch new file mode 100644 index 0000000..f5301c3 --- /dev/null +++ b/SOURCES/libvirt-qemuMonitorTestProcessCommandDefaultValidate-Output-validator-output-to-stderr.patch @@ -0,0 +1,80 @@ +From 881e24d9b7545122a4b74f4545135bffe98fab4c Mon Sep 17 00:00:00 2001 +Message-Id: <881e24d9b7545122a4b74f4545135bffe98fab4c@dist-git> +From: Peter Krempa +Date: Sun, 26 Apr 2020 13:04:04 -0400 +Subject: [PATCH] qemuMonitorTestProcessCommandDefaultValidate: Output + validator output to stderr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Trying to squeeze the validator output into the monitor reply message +doesn't make sense and doesn't work well as it's not well formed JSON: + +54) qemuMonitorJSONAddNetdev ... libvirt: error : internal error: cannot parse json { "error": { "desc": "failed to validate arguments of 'netdev_add' against QAPI schema: { + ERROR: variant 'test' for discriminator 'type' not found +", "class": "UnexpectedCommand" } }: lexical error: invalid character inside string. + ev_add' against QAPI schema: { ERROR: variant 'test' for + (right here) ------^ +FAILED + +Output it to stderr if requested and just note that schema validation +failed in the error message: + +54) qemuMonitorJSONAddNetdev ... +failed to validate arguments of 'netdev_add' against QAPI schema +args: +{ + "id": "net0", + "type": "test" +} + +validator output: + { + ERROR: variant 'test' for discriminator 'type' not found + +libvirt: QEMU Driver error : internal error: unable to execute QEMU command 'netdev_add': failed to validate arguments of 'netdev_add' against QAPI schema (to see debug output use VIR_TEST_DEBUG=2) +FAILED + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 5a13eb165559039bda2c1e0e4149dba0e0af820e) + +Required on 8.2.1 branch due to adding caps_5.0.0.x86_64.replies +Prerequisite for https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-2-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + tests/qemumonitortestutils.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c +index b29e5d8cd2..b72f186374 100644 +--- a/tests/qemumonitortestutils.c ++++ b/tests/qemumonitortestutils.c +@@ -537,10 +537,19 @@ qemuMonitorTestProcessCommandDefaultValidate(qemuMonitorTestPtr test, + } + + if (testQEMUSchemaValidate(args, schemaroot, test->qapischema, &debug) < 0) { ++ if (virTestGetDebug() == 2) { ++ g_autofree char *argstr = virJSONValueToString(args, true); ++ fprintf(stderr, ++ "\nfailed to validate arguments of '%s' against QAPI schema\n" ++ "args:\n%s\nvalidator output:\n %s\n", ++ cmdname, NULLSTR(argstr), virBufferCurrentContent(&debug)); ++ } ++ + if (qemuMonitorReportError(test, + "failed to validate arguments of '%s' " +- "against QAPI schema: %s", +- cmdname, virBufferCurrentContent(&debug)) == 0) ++ "against QAPI schema " ++ "(to see debug output use VIR_TEST_DEBUG=2)", ++ cmdname) == 0) + return 1; + return -1; + } +-- +2.26.2 + diff --git a/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-backup-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-backup-bitmap-handling.patch new file mode 100644 index 0000000..e6a6f03 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-backup-bitmap-handling.patch @@ -0,0 +1,139 @@ +From 747e726988e43451139b3113e7b5f60b2f50e17e Mon Sep 17 00:00:00 2001 +Message-Id: <747e726988e43451139b3113e7b5f60b2f50e17e@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:58 +0200 +Subject: [PATCH] qemublocktest: Add 'basic' tests for backup bitmap handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The 'basic' case is just a single backing store layer containing the +bitmaps so we just copy the bitmaps over to the backup bitmap. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 8c6e2da25e55081164cb5eb02ddece38500c5cff) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <94d168ffd27a6da8ffec1dfb37268e79c395c21e.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 4 +++ + .../backupmerge/basic-deep-out.json | 25 +++++++++++++++++++ + .../backupmerge/basic-flat-out.json | 25 +++++++++++++++++++ + .../backupmerge/basic-intermediate-out.json | 25 +++++++++++++++++++ + 4 files changed, 79 insertions(+) + create mode 100644 tests/qemublocktestdata/backupmerge/basic-deep-out.json + create mode 100644 tests/qemublocktestdata/backupmerge/basic-flat-out.json + create mode 100644 tests/qemublocktestdata/backupmerge/basic-intermediate-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index dcdc9eade0..7a0159f659 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1262,6 +1262,10 @@ mymain(void) + + TEST_BACKUP_BITMAP_CALCULATE("empty", bitmapSourceChain, "a", "empty"); + ++ TEST_BACKUP_BITMAP_CALCULATE("basic-flat", bitmapSourceChain, "current", "basic"); ++ TEST_BACKUP_BITMAP_CALCULATE("basic-intermediate", bitmapSourceChain, "d", "basic"); ++ TEST_BACKUP_BITMAP_CALCULATE("basic-deep", bitmapSourceChain, "a", "basic"); ++ + #define TEST_CHECKPOINT_DELETE(testname, delbmp, named) \ + do { \ + checkpointdeletedata.name = testname; \ +diff --git a/tests/qemublocktestdata/backupmerge/basic-deep-out.json b/tests/qemublocktestdata/backupmerge/basic-deep-out.json +new file mode 100644 +index 0000000000..ff77af789b +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/basic-deep-out.json +@@ -0,0 +1,25 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/backupmerge/basic-flat-out.json b/tests/qemublocktestdata/backupmerge/basic-flat-out.json +new file mode 100644 +index 0000000000..4637bbc377 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/basic-flat-out.json +@@ -0,0 +1,25 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json b/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json +new file mode 100644 +index 0000000000..f2f3b3f568 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json +@@ -0,0 +1,25 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ } ++ ] ++ } ++ } ++] +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-commit-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-commit-bitmap-handling.patch new file mode 100644 index 0000000..cb3709c --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-basic-tests-for-commit-bitmap-handling.patch @@ -0,0 +1,355 @@ +From 433f551418c9b40b5da9bf36abb5f9eba0662369 Mon Sep 17 00:00:00 2001 +Message-Id: <433f551418c9b40b5da9bf36abb5f9eba0662369@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:01 +0200 +Subject: [PATCH] qemublocktest: Add 'basic' tests for commit bitmap handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In the 'basic' case we have few bitmaps in only the top layer. Simulate +commit into the backing of the top layer and also 2 levels deep. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 79bc7c1828212c165d8b71bd6166ca24695a8ecd) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <9973a947b47bb20fa2e3f03e1a36541c2f1f3018.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 4 + + .../bitmapblockcommit/basic-1-2 | 145 ++++++++++++++++++ + .../bitmapblockcommit/basic-1-3 | 145 ++++++++++++++++++ + .../bitmapblockcommit/basic-2-3 | 1 + + 4 files changed, 295 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-1-2 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-1-3 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-2-3 + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index f0e80a0738..43abc49534 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1357,6 +1357,10 @@ mymain(void) + + TEST_BITMAP_BLOCKCOMMIT("empty", 1, 2, "empty"); + ++ TEST_BITMAP_BLOCKCOMMIT("basic-1-2", 1, 2, "basic"); ++ TEST_BITMAP_BLOCKCOMMIT("basic-1-3", 1, 3, "basic"); ++ TEST_BITMAP_BLOCKCOMMIT("basic-2-3", 2, 3, "basic"); ++ + cleanup: + qemuTestDriverFree(&driver); + VIR_FREE(capslatest_x86_64); +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 b/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 +new file mode 100644 +index 0000000000..d393d31044 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 +@@ -0,0 +1,145 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 b/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 +new file mode 100644 +index 0000000000..3fa902c354 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 +@@ -0,0 +1,145 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 b/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 +new file mode 100644 +index 0000000000..9260011852 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 +@@ -0,0 +1 @@ ++merge bitmpas: +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-empty-case-for-blockcopy-bitmap-handling-test.patch b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-blockcopy-bitmap-handling-test.patch new file mode 100644 index 0000000..137f4fa --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-blockcopy-bitmap-handling-test.patch @@ -0,0 +1,47 @@ +From 57911844644ca352154859050e59444aca4e4ca5 Mon Sep 17 00:00:00 2001 +Message-Id: <57911844644ca352154859050e59444aca4e4ca5@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:42 +0200 +Subject: [PATCH] qemublocktest: Add 'empty' case for blockcopy bitmap handling + test +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 264d7cf444633c0d2d20b30b612754943fede5a3) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 3 +++ + tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json | 0 + tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json | 0 + 3 files changed, 3 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 5f1c68f6de..2009cad228 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1407,6 +1407,9 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_BITMAP_BLOCKCOPY("empty-shallow", true, "empty"); ++ TEST_BITMAP_BLOCKCOPY("empty-deep", false, "empty"); ++ + TEST_BITMAP_BLOCKCOPY("basic-shallow", true, "basic"); + TEST_BITMAP_BLOCKCOPY("basic-deep", false, "basic"); + +diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json +new file mode 100644 +index 0000000000..e69de29bb2 +diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json +new file mode 100644 +index 0000000000..e69de29bb2 +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-bitmap-handling.patch new file mode 100644 index 0000000..ce24ad9 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-bitmap-handling.patch @@ -0,0 +1,46 @@ +From 04bc9dbf9940f6976c5320ce628f97197625e4d7 Mon Sep 17 00:00:00 2001 +Message-Id: <04bc9dbf9940f6976c5320ce628f97197625e4d7@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:43 +0200 +Subject: [PATCH] qemublocktest: Add 'empty' case for checkpoint bitmap + handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit cc1a33b59940f9e2a0856ac49dd9b8a185df8a01) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 2 ++ + tests/qemublocktestdata/bitmapblockcommit/empty | 2 ++ + 2 files changed, 4 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/empty + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 2009cad228..36e3378f5b 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1429,6 +1429,8 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_BITMAP_BLOCKCOMMIT("empty", 1, 2, "empty"); ++ + TEST_BITMAP_BLOCKCOMMIT("basic-1-2", 1, 2, "basic"); + TEST_BITMAP_BLOCKCOMMIT("basic-1-3", 1, 3, "basic"); + TEST_BITMAP_BLOCKCOMMIT("basic-2-3", 2, 3, "basic"); +diff --git a/tests/qemublocktestdata/bitmapblockcommit/empty b/tests/qemublocktestdata/bitmapblockcommit/empty +new file mode 100644 +index 0000000000..bfc58f994e +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/empty +@@ -0,0 +1,2 @@ ++pre job bitmap disable: ++merge bitmpas: +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-deletion.patch b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-deletion.patch new file mode 100644 index 0000000..92139fb --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-checkpoint-deletion.patch @@ -0,0 +1,68 @@ +From 081af2b88972972f000593d10629f0f269a7ad41 Mon Sep 17 00:00:00 2001 +Message-Id: <081af2b88972972f000593d10629f0f269a7ad41@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:41 +0200 +Subject: [PATCH] qemublocktest: Add 'empty' case for checkpoint deletion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use the new test data for checkpoint deletion testing. This test also +requires modification of the internals to allow checking for test +failure. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 88f175d88718114c032107df102d7c8071f0a38e) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <957325a358cad71b3002dd03c3ec656ee4f225a9.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 13 +++++++------ + .../checkpointdelete/empty-out.json | 1 + + 2 files changed, 8 insertions(+), 6 deletions(-) + create mode 100644 tests/qemublocktestdata/checkpointdelete/empty-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 3ef6ccec9b..5f1c68f6de 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -851,14 +851,13 @@ testQemuCheckpointDeleteMerge(const void *opaque) + data->parentbitmap, + actions, + "testdisk", +- &reopenimages) < 0) { +- VIR_TEST_VERBOSE("failed to generate checkpoint delete transaction\n"); +- return -1; ++ &reopenimages) >= 0) { ++ if (virJSONValueToBuffer(actions, &buf, true) < 0) ++ return -1; ++ } else { ++ virBufferAddLit(&buf, "NULL\n"); + } + +- if (virJSONValueToBuffer(actions, &buf, true) < 0) +- return -1; +- + if (reopenimages) { + virBufferAddLit(&buf, "reopen nodes:\n"); + +@@ -1332,6 +1331,8 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_CHECKPOINT_DELETE_MERGE("empty", "a", NULL, "empty"); ++ + TEST_CHECKPOINT_DELETE_MERGE("basic-noparent", "a", NULL, "basic"); + TEST_CHECKPOINT_DELETE_MERGE("basic-intermediate1", "b", "a", "basic"); + TEST_CHECKPOINT_DELETE_MERGE("basic-intermediate2", "c", "b", "basic"); +diff --git a/tests/qemublocktestdata/checkpointdelete/empty-out.json b/tests/qemublocktestdata/checkpointdelete/empty-out.json +new file mode 100644 +index 0000000000..7951defec1 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/empty-out.json +@@ -0,0 +1 @@ ++NULL +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-empty-case-for-incremental-backup-test.patch b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-incremental-backup-test.patch new file mode 100644 index 0000000..5e9f808 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-empty-case-for-incremental-backup-test.patch @@ -0,0 +1,74 @@ +From 60c3e3fd52b1d2fe5fbab42d762248a02b5143f6 Mon Sep 17 00:00:00 2001 +Message-Id: <60c3e3fd52b1d2fe5fbab42d762248a02b5143f6@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:40 +0200 +Subject: [PATCH] qemublocktest: Add 'empty' case for incremental backup test +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use the new test data when calculating incremental backup operations. As +incremental backup fails with no bitmap the test code is modified to +allow testing this case too. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 218d00f443a5e211ea3664996c610f62b18425f7) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <45ec7a3b4dce5f583d2864991e16cdc090b8dfce.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 19 ++++++++++--------- + .../backupmerge/empty-out.json | 1 + + 2 files changed, 11 insertions(+), 9 deletions(-) + create mode 100644 tests/qemublocktestdata/backupmerge/empty-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 2063ca0be7..3ef6ccec9b 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -793,17 +793,16 @@ testQemuBackupIncrementalBitmapCalculate(const void *opaque) + + incremental = testQemuBackupGetIncremental(data->incremental); + +- if (!(mergebitmaps = qemuBackupDiskPrepareOneBitmapsChain(incremental, +- data->chain, +- nodedata, +- "testdisk"))) { +- VIR_TEST_VERBOSE("failed to calculate merged bitmaps"); +- return -1; ++ if ((mergebitmaps = qemuBackupDiskPrepareOneBitmapsChain(incremental, ++ data->chain, ++ nodedata, ++ "testdisk"))) { ++ if (!(actual = virJSONValueToString(mergebitmaps, true))) ++ return -1; ++ } else { ++ actual = g_strdup("NULL\n"); + } + +- if (!(actual = virJSONValueToString(mergebitmaps, true))) +- return -1; +- + return virTestCompareToFile(actual, expectpath); + } + +@@ -1311,6 +1310,8 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_BACKUP_BITMAP_CALCULATE("empty", bitmapSourceChain, "a", "empty"); ++ + TEST_BACKUP_BITMAP_CALCULATE("basic-flat", bitmapSourceChain, "current", "basic"); + TEST_BACKUP_BITMAP_CALCULATE("basic-intermediate", bitmapSourceChain, "d", "basic"); + TEST_BACKUP_BITMAP_CALCULATE("basic-deep", bitmapSourceChain, "a", "basic"); +diff --git a/tests/qemublocktestdata/backupmerge/empty-out.json b/tests/qemublocktestdata/backupmerge/empty-out.json +new file mode 100644 +index 0000000000..7951defec1 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/empty-out.json +@@ -0,0 +1 @@ ++NULL +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-empty-test-case-for-bitmaps.patch b/SOURCES/libvirt-qemublocktest-Add-empty-test-case-for-bitmaps.patch new file mode 100644 index 0000000..e4744ab --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-empty-test-case-for-bitmaps.patch @@ -0,0 +1,133 @@ +From 07e5713853789cc0b216c7d3731cbda68f905eac Mon Sep 17 00:00:00 2001 +Message-Id: <07e5713853789cc0b216c7d3731cbda68f905eac@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:39 +0200 +Subject: [PATCH] qemublocktest: Add 'empty' test case for bitmaps +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add test data for an image without bitmaps. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 15ef0c1c3891feaa949e082d922c54ebe6563e40) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <2e329c1ef636060b4c094cac8c0d3558994986ce.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 4 ++ + tests/qemublocktestdata/bitmap/empty.json | 70 +++++++++++++++++++++++ + tests/qemublocktestdata/bitmap/empty.out | 1 + + 3 files changed, 75 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmap/empty.json + create mode 100644 tests/qemublocktestdata/bitmap/empty.out + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index d15965d9eb..2063ca0be7 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1291,6 +1291,8 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_BITMAP_DETECT("empty"); ++ + TEST_BITMAP_DETECT("basic"); + TEST_BITMAP_DETECT("synthetic"); + TEST_BITMAP_DETECT("snapshots"); +@@ -1359,6 +1361,8 @@ mymain(void) + ret = -1; \ + } while (0) + ++ TEST_BITMAP_VALIDATE("empty", "a", false); ++ + TEST_BITMAP_VALIDATE("basic", "a", true); + TEST_BITMAP_VALIDATE("basic", "b", true); + TEST_BITMAP_VALIDATE("basic", "c", true); +diff --git a/tests/qemublocktestdata/bitmap/empty.json b/tests/qemublocktestdata/bitmap/empty.json +new file mode 100644 +index 0000000000..ec43b25f0d +--- /dev/null ++++ b/tests/qemublocktestdata/bitmap/empty.json +@@ -0,0 +1,70 @@ ++[ ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 10485760, ++ "filename": "/tmp/pull4.qcow2", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 200704, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "lazy-refcounts": false, ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/pull4.qcow2", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 197120, ++ "filename": "/tmp/pull4.qcow2", ++ "format": "file", ++ "actual-size": 200704, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/pull4.qcow2", ++ "encryption_key_missing": false ++ } ++] +diff --git a/tests/qemublocktestdata/bitmap/empty.out b/tests/qemublocktestdata/bitmap/empty.out +new file mode 100644 +index 0000000000..3787cbd354 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmap/empty.out +@@ -0,0 +1 @@ ++libvirt-1-format: +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-new-synthetic-bitmap-detection-and-validation-test-case.patch b/SOURCES/libvirt-qemublocktest-Add-new-synthetic-bitmap-detection-and-validation-test-case.patch new file mode 100644 index 0000000..5019da5 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-new-synthetic-bitmap-detection-and-validation-test-case.patch @@ -0,0 +1,593 @@ +From 3afb35cc6b6dabd52fe508766d5a914d74135f69 Mon Sep 17 00:00:00 2001 +Message-Id: <3afb35cc6b6dabd52fe508766d5a914d74135f69@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:52 +0200 +Subject: [PATCH] qemublocktest: Add new 'synthetic' bitmap detection and + validation test case +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Based on the 'snapshots' example with manual tweaks to introduce +inactive, transient, inconsistent and duplicate bitmaps in various parts +of the chain to exercise detection and new validation code. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit b3845f0e3d0ec58b25274cb6b70906f44333069f) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <6e6222a085da03ad17af728db3bdb9027c0d8b0e.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 11 + + tests/qemublocktestdata/bitmap/synthetic.json | 506 ++++++++++++++++++ + tests/qemublocktestdata/bitmap/synthetic.out | 15 + + 3 files changed, 532 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmap/synthetic.json + create mode 100644 tests/qemublocktestdata/bitmap/synthetic.out + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index af81f1b77a..2f675d7e03 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1302,6 +1302,7 @@ mymain(void) + + TEST_BITMAP_DETECT("basic"); + TEST_BITMAP_DETECT("snapshots"); ++ TEST_BITMAP_DETECT("synthetic"); + + #define TEST_BACKUP_BITMAP_CALCULATE(testname, source, incrbackup, named) \ + do { \ +@@ -1357,6 +1358,16 @@ mymain(void) + TEST_BITMAP_VALIDATE("snapshots", "d", true); + TEST_BITMAP_VALIDATE("snapshots", "current", true); + ++ TEST_BITMAP_VALIDATE("synthetic", "a", false); ++ TEST_BITMAP_VALIDATE("synthetic", "b", false); ++ TEST_BITMAP_VALIDATE("synthetic", "c", false); ++ TEST_BITMAP_VALIDATE("synthetic", "d", false); ++ TEST_BITMAP_VALIDATE("synthetic", "current", false); ++ TEST_BITMAP_VALIDATE("synthetic", "top-ok", true); ++ TEST_BITMAP_VALIDATE("synthetic", "top-inactive", false); ++ TEST_BITMAP_VALIDATE("synthetic", "top-transient", false); ++ TEST_BITMAP_VALIDATE("synthetic", "top-inactive-transient", false); ++ + #define TEST_BITMAP_BLOCKCOPY(testname, shllw, ndf) \ + do { \ + blockbitmapblockcopydata.name = testname; \ +diff --git a/tests/qemublocktestdata/bitmap/synthetic.json b/tests/qemublocktestdata/bitmap/synthetic.json +new file mode 100644 +index 0000000000..3712c8e5fc +--- /dev/null ++++ b/tests/qemublocktestdata/bitmap/synthetic.json +@@ -0,0 +1,506 @@ ++[ ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.1590749073", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 208896, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "current", ++ "granularity": 65536 ++ } ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1590749012", ++ "backing-filename": "/tmp/bitmaps.1590749012", ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1590749012", ++ "dirty-bitmaps": [ ++ { ++ "name": "current", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "inconsistent": true, ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "top-ok", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "top-inactive", ++ "recording": false, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "top-transient", ++ "recording": true, ++ "persistent": false, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "top-transient-inactive", ++ "recording": false, ++ "persistent": false, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590749073", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 328192, ++ "filename": "/tmp/bitmaps.1590749073", ++ "format": "file", ++ "actual-size": 208896, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590749073", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.1590749012", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 208896, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "d", ++ "granularity": 65536 ++ } ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1590748995", ++ "backing-filename": "/tmp/bitmaps.1590748995", ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-2-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1590748995", ++ "dirty-bitmaps": [ ++ { ++ "name": "d", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590749012", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 328192, ++ "filename": "/tmp/bitmaps.1590749012", ++ "format": "file", ++ "actual-size": 208896, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-2-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590749012", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.1590748995", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 212992, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "c", ++ "granularity": 65536 ++ }, ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "b", ++ "granularity": 65536 ++ } ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1590748992", ++ "backing-filename": "/tmp/bitmaps.1590748992", ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-3-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1590748992", ++ "dirty-bitmaps": [ ++ { ++ "name": "b", ++ "recording": true, ++ "persistent": false, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "c", ++ "recording": false, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "d", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590748995", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 393728, ++ "filename": "/tmp/bitmaps.1590748995", ++ "format": "file", ++ "actual-size": 212992, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-3-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590748995", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.1590748992", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 200704, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.qcow2", ++ "backing-filename": "/tmp/bitmaps.qcow2", ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-4-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.qcow2", ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590748992", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 197120, ++ "filename": "/tmp/bitmaps.1590748992", ++ "format": "file", ++ "actual-size": 200704, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-4-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1590748992", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.qcow2", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 208896, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 ++ } ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-5-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "dirty-bitmaps": [ ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 328192, ++ "filename": "/tmp/bitmaps.qcow2", ++ "format": "file", ++ "actual-size": 208896, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-5-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ } ++] +diff --git a/tests/qemublocktestdata/bitmap/synthetic.out b/tests/qemublocktestdata/bitmap/synthetic.out +new file mode 100644 +index 0000000000..cde7228e01 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmap/synthetic.out +@@ -0,0 +1,15 @@ ++libvirt-1-format: ++ current: record:1 busy:0 persist:1 inconsist:1 gran:65536 dirty:0 ++ top-ok: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ top-inactive: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ top-transient: record:1 busy:0 persist:0 inconsist:0 gran:65536 dirty:0 ++ top-transient-inactive: record:0 busy:0 persist:0 inconsist:0 gran:65536 dirty:0 ++libvirt-2-format: ++ d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++libvirt-3-format: ++ b: record:1 busy:0 persist:0 inconsist:0 gran:65536 dirty:0 ++ c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++libvirt-4-format: ++libvirt-5-format: ++ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-backup-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-backup-bitmap-handling.patch new file mode 100644 index 0000000..90d07cc --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-backup-bitmap-handling.patch @@ -0,0 +1,161 @@ +From 8528b76210e54f664f2098e0127dac811f12800a Mon Sep 17 00:00:00 2001 +Message-Id: <8528b76210e54f664f2098e0127dac811f12800a@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:59 +0200 +Subject: [PATCH] qemublocktest: Add 'snapshots' tests for backup bitmap + handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The 'snapshots' case has multiple layers so we need to make sure that +the bitmaps are merged with the appropriate temporary bitmaps formatted +from the allocation bitmap for any backing chain layer above. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit b630cf4c0d8446a301fd23e87c9e8d60d547b5e8) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <3ef354322f829f47c91738060dd6557462e6d6d5.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 4 ++ + .../backupmerge/snapshots-deep-out.json | 41 +++++++++++++++++++ + .../backupmerge/snapshots-flat-out.json | 25 +++++++++++ + .../snapshots-intermediate-out.json | 29 +++++++++++++ + 4 files changed, 99 insertions(+) + create mode 100644 tests/qemublocktestdata/backupmerge/snapshots-deep-out.json + create mode 100644 tests/qemublocktestdata/backupmerge/snapshots-flat-out.json + create mode 100644 tests/qemublocktestdata/backupmerge/snapshots-intermediate-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 7a0159f659..8ce878f15b 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1266,6 +1266,10 @@ mymain(void) + TEST_BACKUP_BITMAP_CALCULATE("basic-intermediate", bitmapSourceChain, "d", "basic"); + TEST_BACKUP_BITMAP_CALCULATE("basic-deep", bitmapSourceChain, "a", "basic"); + ++ TEST_BACKUP_BITMAP_CALCULATE("snapshots-flat", bitmapSourceChain, "current", "snapshots"); ++ TEST_BACKUP_BITMAP_CALCULATE("snapshots-intermediate", bitmapSourceChain, "d", "snapshots"); ++ TEST_BACKUP_BITMAP_CALCULATE("snapshots-deep", bitmapSourceChain, "a", "snapshots"); ++ + #define TEST_CHECKPOINT_DELETE(testname, delbmp, named) \ + do { \ + checkpointdeletedata.name = testname; \ +diff --git a/tests/qemublocktestdata/backupmerge/snapshots-deep-out.json b/tests/qemublocktestdata/backupmerge/snapshots-deep-out.json +new file mode 100644 +index 0000000000..d678507b85 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/snapshots-deep-out.json +@@ -0,0 +1,41 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "a" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/backupmerge/snapshots-flat-out.json b/tests/qemublocktestdata/backupmerge/snapshots-flat-out.json +new file mode 100644 +index 0000000000..4637bbc377 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/snapshots-flat-out.json +@@ -0,0 +1,25 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/backupmerge/snapshots-intermediate-out.json b/tests/qemublocktestdata/backupmerge/snapshots-intermediate-out.json +new file mode 100644 +index 0000000000..30d8bcd8b7 +--- /dev/null ++++ b/tests/qemublocktestdata/backupmerge/snapshots-intermediate-out.json +@@ -0,0 +1,29 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "target_node", ++ "name": "target-bitmap-name", ++ "persistent": false, ++ "disabled": true, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "target_node", ++ "target": "target-bitmap-name", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ ] ++ } ++ } ++] +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-block-commit-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-block-commit-bitmap-handling.patch new file mode 100644 index 0000000..9b0852e --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-snapshots-tests-for-block-commit-bitmap-handling.patch @@ -0,0 +1,1105 @@ +From 59a754b5c95a4795178d2a117abb7f7145c830a4 Mon Sep 17 00:00:00 2001 +Message-Id: <59a754b5c95a4795178d2a117abb7f7145c830a4@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:02 +0200 +Subject: [PATCH] qemublocktest: Add 'snapshots' tests for block commit bitmap + handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Simulate commit between all the combinations of layers in the +'snapshots' case to see whether the code merges the correct bitmaps with +the correct depth of temporary bitmaps. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit b5eaabfbf892c8d4a30b2822325959a6ecb93cb6) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 14 ++ + .../bitmapblockcommit/snapshots-1-2 | 105 +++++++++++ + .../bitmapblockcommit/snapshots-1-3 | 131 ++++++++++++++ + .../bitmapblockcommit/snapshots-1-4 | 163 +++++++++++++++++ + .../bitmapblockcommit/snapshots-1-5 | 167 ++++++++++++++++++ + .../bitmapblockcommit/snapshots-2-3 | 65 +++++++ + .../bitmapblockcommit/snapshots-2-4 | 97 ++++++++++ + .../bitmapblockcommit/snapshots-2-5 | 101 +++++++++++ + .../bitmapblockcommit/snapshots-3-4 | 62 +++++++ + .../bitmapblockcommit/snapshots-3-5 | 66 +++++++ + .../bitmapblockcommit/snapshots-4-5 | 16 ++ + 11 files changed, 987 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 + create mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 43abc49534..e1468f13fa 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1361,6 +1361,20 @@ mymain(void) + TEST_BITMAP_BLOCKCOMMIT("basic-1-3", 1, 3, "basic"); + TEST_BITMAP_BLOCKCOMMIT("basic-2-3", 2, 3, "basic"); + ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-1-2", 1, 2, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-1-3", 1, 3, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-1-4", 1, 4, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-1-5", 1, 5, "snapshots"); ++ ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-2-3", 2, 3, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-2-4", 2, 4, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-2-5", 2, 5, "snapshots"); ++ ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-3-4", 3, 4, "snapshots"); ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-3-5", 3, 5, "snapshots"); ++ ++ TEST_BITMAP_BLOCKCOMMIT("snapshots-4-5", 4, 5, "snapshots"); ++ + cleanup: + qemuTestDriverFree(&driver); + VIR_FREE(capslatest_x86_64); +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 +new file mode 100644 +index 0000000000..7d5b0a4402 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 +@@ -0,0 +1,105 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-2-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 +new file mode 100644 +index 0000000000..17a020ba20 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 +@@ -0,0 +1,131 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 +new file mode 100644 +index 0000000000..972d30b2e1 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 +@@ -0,0 +1,163 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 +new file mode 100644 +index 0000000000..3cda5b4132 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 +@@ -0,0 +1,167 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 +new file mode 100644 +index 0000000000..cb952eeb06 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 +@@ -0,0 +1,65 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-3-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 +new file mode 100644 +index 0000000000..a540ca42e3 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 +@@ -0,0 +1,97 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 +new file mode 100644 +index 0000000000..8ea6036a33 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 +@@ -0,0 +1,101 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 +new file mode 100644 +index 0000000000..736d4fd9df +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 +@@ -0,0 +1,62 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-4-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 +new file mode 100644 +index 0000000000..207d82e6b6 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 +@@ -0,0 +1,66 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ } ++ ] ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 +new file mode 100644 +index 0000000000..4a8e6c5cff +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 +@@ -0,0 +1,16 @@ ++merge bitmpas: ++[ ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "libvirt-5-format", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ } ++ ] ++ } ++ } ++] +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Add-test-cases-for-handling-bitmaps-during-block-copy.patch b/SOURCES/libvirt-qemublocktest-Add-test-cases-for-handling-bitmaps-during-block-copy.patch new file mode 100644 index 0000000..ad3e573 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Add-test-cases-for-handling-bitmaps-during-block-copy.patch @@ -0,0 +1,685 @@ +From 98ac7cbfb11dd6e5eadc88698f762cd9a48b4789 Mon Sep 17 00:00:00 2001 +Message-Id: <98ac7cbfb11dd6e5eadc88698f762cd9a48b4789@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:24:05 +0200 +Subject: [PATCH] qemublocktest: Add test cases for handling bitmaps during + block-copy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Test both 'basic' and 'snapshots' cases on shallow and deep copy modes. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 5f2fdcc867a08baa3d931cde895761bcbb45b7f6) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <1f77aeac4a968c1115893226589b8d97f8a90838.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 5 + + .../bitmapblockcopy/basic-deep-out.json | 144 ++++++++++++++ + .../bitmapblockcopy/basic-shallow-out.json | 144 ++++++++++++++ + .../bitmapblockcopy/snapshots-deep-out.json | 180 ++++++++++++++++++ + .../snapshots-shallow-out.json | 144 ++++++++++++++ + 5 files changed, 617 insertions(+) + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json + create mode 100644 tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 193b4aaed0..758a7c1db0 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1345,6 +1345,11 @@ mymain(void) + TEST_BITMAP_BLOCKCOPY("empty-shallow", true, "empty"); + TEST_BITMAP_BLOCKCOPY("empty-deep", false, "empty"); + ++ TEST_BITMAP_BLOCKCOPY("basic-shallow", true, "basic"); ++ TEST_BITMAP_BLOCKCOPY("basic-deep", false, "basic"); ++ ++ TEST_BITMAP_BLOCKCOPY("snapshots-shallow", true, "snapshots"); ++ TEST_BITMAP_BLOCKCOPY("snapshots-deep", false, "snapshots"); + + #define TEST_BITMAP_BLOCKCOMMIT(testname, topimg, baseimg, ndf) \ + do {\ +diff --git a/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json +new file mode 100644 +index 0000000000..a8c2749879 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json +@@ -0,0 +1,144 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json +new file mode 100644 +index 0000000000..a8c2749879 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json +@@ -0,0 +1,144 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json +new file mode 100644 +index 0000000000..ac2ffb4ce2 +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json +@@ -0,0 +1,180 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "c" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "c" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "b" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "b" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-3-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-4-format", ++ "name": "a" ++ }, ++ { ++ "node": "libvirt-5-format", ++ "name": "a" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "libvirt-2-format", ++ "name": "d" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json +new file mode 100644 +index 0000000000..3a9942569a +--- /dev/null ++++ b/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json +@@ -0,0 +1,144 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "current", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "current", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "current" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "c", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "c", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "c" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "b", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "b", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "b" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "a", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "a", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "a" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-add", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "d", ++ "persistent": true, ++ "disabled": false, ++ "granularity": 65536 ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-merge", ++ "data": { ++ "node": "mirror-format-node", ++ "target": "d", ++ "bitmaps": [ ++ { ++ "node": "libvirt-1-format", ++ "name": "d" ++ }, ++ { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ ] ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "mirror-format-node", ++ "name": "libvirt-tmp-activewrite" ++ } ++ } ++] +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Delete-synthetic-bitmap-test-cases.patch b/SOURCES/libvirt-qemublocktest-Delete-synthetic-bitmap-test-cases.patch new file mode 100644 index 0000000..45ae66e --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Delete-synthetic-bitmap-test-cases.patch @@ -0,0 +1,1903 @@ +From 54d676350560f8eedf9dc2140f2eb879725e65b4 Mon Sep 17 00:00:00 2001 +Message-Id: <54d676350560f8eedf9dc2140f2eb879725e65b4@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:45 +0200 +Subject: [PATCH] qemublocktest: Delete 'synthetic' bitmap test cases +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +They will be replaced by a different set which will test scenarios +relevant for the new semantics. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 5aa423c52d784896675ce55c86ba662dbfc3ee95) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <7373e6767b3f2572dd5437e29fa31c14aff5bc52.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 3 - + .../bitmap/snapshots-synthetic-broken.json | 837 ------------------ + .../bitmap/snapshots-synthetic-broken.out | 14 - + .../snapshots-synthetic-checkpoint.json | 827 ----------------- + .../bitmap/snapshots-synthetic-checkpoint.out | 13 - + tests/qemublocktestdata/bitmap/synthetic.json | 118 --- + tests/qemublocktestdata/bitmap/synthetic.out | 6 - + 7 files changed, 1818 deletions(-) + delete mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json + delete mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out + delete mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.json + delete mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.out + delete mode 100644 tests/qemublocktestdata/bitmap/synthetic.json + delete mode 100644 tests/qemublocktestdata/bitmap/synthetic.out + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 239b2ef9df..75527ca64b 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1292,10 +1292,7 @@ mymain(void) + TEST_BITMAP_DETECT("empty"); + + TEST_BITMAP_DETECT("basic"); +- TEST_BITMAP_DETECT("synthetic"); + TEST_BITMAP_DETECT("snapshots"); +- TEST_BITMAP_DETECT("snapshots-synthetic-checkpoint"); +- TEST_BITMAP_DETECT("snapshots-synthetic-broken"); + + #define TEST_BACKUP_BITMAP_CALCULATE(testname, source, incrbackup, named) \ + do { \ +diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json +deleted file mode 100644 +index 8cf14d4baa..0000000000 +--- a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json ++++ /dev/null +@@ -1,837 +0,0 @@ +-[ +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911550", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "in-use", +- "auto" +- ], +- "name": "current", +- "granularity": 65536 +- }, +- { +- "flags": [ +- "in-use" +- ], +- "name": "d", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911540", +- "backing-filename": "/tmp/pull4.1575911540", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-format", +- "backing_file_depth": 4, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911540", +- "dirty-bitmaps": [ +- { +- "name": "d", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "current", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911550", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-2-format", +- "backing_file_depth": 3, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911527", +- "dirty-bitmaps": [ +- { +- "name": "c", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "oa", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "ob", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "d", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "inconsistent": true, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911540", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-2-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-3-format", +- "backing_file_depth": 2, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911522", +- "dirty-bitmaps": [ +- { +- "name": "a", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "b", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 459264, +- "filename": "/tmp/pull4.1575911527", +- "format": "file", +- "actual-size": 217088, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-3-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-4-format", +- "backing_file_depth": 1, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.qcow2", +- "dirty-bitmaps": [ +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.1575911522", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-4-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-5-format", +- "backing_file_depth": 0, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "dirty-bitmaps": [ +- { +- "name": "a", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.qcow2", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-5-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- } +-] +diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out +deleted file mode 100644 +index ad24a580f1..0000000000 +--- a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out ++++ /dev/null +@@ -1,14 +0,0 @@ +-libvirt-1-format: +- d: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-2-format: +- c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- oa: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- ob: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- d: record:1 busy:0 persist:1 inconsist:1 gran:65536 dirty:0 +-libvirt-3-format: +- a: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-4-format: +-libvirt-5-format: +- a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.json b/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.json +deleted file mode 100644 +index 25cc150d67..0000000000 +--- a/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.json ++++ /dev/null +@@ -1,827 +0,0 @@ +-[ +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911550", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "in-use", +- "auto" +- ], +- "name": "current", +- "granularity": 65536 +- }, +- { +- "flags": [ +- "in-use" +- ], +- "name": "d", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911540", +- "backing-filename": "/tmp/pull4.1575911540", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-format", +- "backing_file_depth": 4, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911540", +- "dirty-bitmaps": [ +- { +- "name": "d", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "current", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911550", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-2-format", +- "backing_file_depth": 3, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911527", +- "dirty-bitmaps": [ +- { +- "name": "c", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "d", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911540", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-2-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-3-format", +- "backing_file_depth": 2, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911522", +- "dirty-bitmaps": [ +- { +- "name": "a", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "b", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 459264, +- "filename": "/tmp/pull4.1575911527", +- "format": "file", +- "actual-size": 217088, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-3-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-4-format", +- "backing_file_depth": 1, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.qcow2", +- "dirty-bitmaps": [ +- { +- "name": "a", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.1575911522", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-4-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-5-format", +- "backing_file_depth": 0, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "dirty-bitmaps": [ +- { +- "name": "a", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.qcow2", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-5-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- } +-] +diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.out b/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.out +deleted file mode 100644 +index 0270657001..0000000000 +--- a/tests/qemublocktestdata/bitmap/snapshots-synthetic-checkpoint.out ++++ /dev/null +@@ -1,13 +0,0 @@ +-libvirt-1-format: +- d: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-2-format: +- c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-3-format: +- a: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-4-format: +- a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-libvirt-5-format: +- a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +diff --git a/tests/qemublocktestdata/bitmap/synthetic.json b/tests/qemublocktestdata/bitmap/synthetic.json +deleted file mode 100644 +index 56882bd615..0000000000 +--- a/tests/qemublocktestdata/bitmap/synthetic.json ++++ /dev/null +@@ -1,118 +0,0 @@ +-[ +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 200704, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-format", +- "backing_file_depth": 0, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "dirty-bitmaps": [ +- { +- "name": "current", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "d", +- "recording": false, +- "persistent": false, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "c", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 1234, +- "count": 0 +- }, +- { +- "name": "b", +- "recording": false, +- "persistent": true, +- "busy": true, +- "status": "disabled", +- "granularity": 65536, +- "count": 21314 +- }, +- { +- "name": "a", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "inconsistent": true, +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 197120, +- "filename": "/tmp/pull4.qcow2", +- "format": "file", +- "actual-size": 200704, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- } +-] +diff --git a/tests/qemublocktestdata/bitmap/synthetic.out b/tests/qemublocktestdata/bitmap/synthetic.out +deleted file mode 100644 +index e8041c5b77..0000000000 +--- a/tests/qemublocktestdata/bitmap/synthetic.out ++++ /dev/null +@@ -1,6 +0,0 @@ +-libvirt-1-format: +- current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- d: record:0 busy:0 persist:0 inconsist:0 gran:65536 dirty:0 +- c: record:0 busy:0 persist:1 inconsist:0 gran:1234 dirty:0 +- b: record:0 busy:1 persist:1 inconsist:0 gran:65536 dirty:21314 +- a: record:0 busy:0 persist:1 inconsist:1 gran:65536 dirty:0 +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Disable-testcases-for-all-bitmap-handling.patch b/SOURCES/libvirt-qemublocktest-Disable-testcases-for-all-bitmap-handling.patch new file mode 100644 index 0000000..d3ff671 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Disable-testcases-for-all-bitmap-handling.patch @@ -0,0 +1,3366 @@ +From 7bbd4fea7b99290161c740c406aa46665b32be92 Mon Sep 17 00:00:00 2001 +Message-Id: <7bbd4fea7b99290161c740c406aa46665b32be92@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:44 +0200 +Subject: [PATCH] qemublocktest: Disable testcases for all bitmap handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upcoming patches are going to rewrite and semantically modify how +bitmaps are handled during blockjobs. This is possible as incremental +backup is not yet fully enabled. + +As the changes are going to be incompatible with any current test data +remove all test cases for bitmap handling during checkpoint deletion, +incremental backups, block commit, block copy, and bitmap validation +operations. + +The tests will be gradually added back later after the code and +test-data is refactored. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit e0828604f77b61d8ee41e72758b0c9d712b1e263) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 94 ------------- + .../backupmerge/basic-deep-out.json | 22 --- + .../backupmerge/basic-flat-out.json | 6 - + .../backupmerge/basic-intermediate-out.json | 10 -- + .../backupmerge/snapshot-deep-out.json | 38 ----- + .../backupmerge/snapshot-flat-out.json | 6 - + .../snapshot-intermediate-out.json | 14 -- + .../bitmapblockcommit/basic-1-2 | 119 ---------------- + .../bitmapblockcommit/basic-1-3 | 119 ---------------- + .../bitmapblockcommit/basic-2-3 | 2 - + .../bitmapblockcommit/snapshots-1-2 | 49 ------- + .../bitmapblockcommit/snapshots-1-3 | 76 ---------- + .../bitmapblockcommit/snapshots-1-4 | 126 ----------------- + .../bitmapblockcommit/snapshots-1-5 | 130 ----------------- + .../bitmapblockcommit/snapshots-2-3 | 49 ------- + .../bitmapblockcommit/snapshots-2-4 | 99 ------------- + .../bitmapblockcommit/snapshots-2-5 | 103 -------------- + .../bitmapblockcommit/snapshots-3-4 | 72 ---------- + .../bitmapblockcommit/snapshots-3-5 | 76 ---------- + .../bitmapblockcommit/snapshots-4-5 | 33 ----- + .../snapshots-synthetic-broken-1-2 | 57 -------- + .../snapshots-synthetic-broken-1-3 | 112 --------------- + .../snapshots-synthetic-broken-1-4 | 119 ---------------- + .../snapshots-synthetic-broken-1-5 | 119 ---------------- + .../snapshots-synthetic-broken-2-3 | 89 ------------ + .../snapshots-synthetic-broken-2-4 | 96 ------------- + .../snapshots-synthetic-broken-2-5 | 96 ------------- + .../snapshots-synthetic-broken-3-4 | 27 ---- + .../snapshots-synthetic-broken-3-5 | 27 ---- + .../snapshots-synthetic-broken-4-5 | 20 --- + .../bitmapblockcopy/basic-deep-out.json | 117 --------------- + .../bitmapblockcopy/basic-shallow-out.json | 117 --------------- + .../bitmapblockcopy/snapshots-deep-out.json | 133 ------------------ + .../snapshots-shallow-out.json | 48 ------- + .../checkpointdelete/basic-current-out.json | 29 ---- + .../basic-intermediate1-out.json | 22 --- + .../basic-intermediate2-out.json | 22 --- + .../basic-intermediate3-out.json | 22 --- + .../checkpointdelete/basic-noparent-out.json | 9 -- + .../snapshots-current-out.json | 29 ---- + .../snapshots-intermediate1-out.json | 24 ---- + .../snapshots-intermediate2-out.json | 62 -------- + .../snapshots-intermediate3-out.json | 61 -------- + .../snapshots-noparent-out.json | 27 ---- + ...hots-synthetic-checkpoint-current-out.json | 29 ---- + ...ynthetic-checkpoint-intermediate1-out.json | 31 ---- + ...ynthetic-checkpoint-intermediate2-out.json | 34 ----- + ...ynthetic-checkpoint-intermediate3-out.json | 61 -------- + ...ots-synthetic-checkpoint-noparent-out.json | 27 ---- + 49 files changed, 2909 deletions(-) + delete mode 100644 tests/qemublocktestdata/backupmerge/basic-deep-out.json + delete mode 100644 tests/qemublocktestdata/backupmerge/basic-flat-out.json + delete mode 100644 tests/qemublocktestdata/backupmerge/basic-intermediate-out.json + delete mode 100644 tests/qemublocktestdata/backupmerge/snapshot-deep-out.json + delete mode 100644 tests/qemublocktestdata/backupmerge/snapshot-flat-out.json + delete mode 100644 tests/qemublocktestdata/backupmerge/snapshot-intermediate-out.json + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-1-2 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-1-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/basic-2-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-2 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-3 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-4 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-4-5 + delete mode 100644 tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json + delete mode 100644 tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json + delete mode 100644 tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json + delete mode 100644 tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/basic-current-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-current-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate1-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate2-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate3-out.json + delete mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-noparent-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 36e3378f5b..239b2ef9df 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1311,14 +1311,6 @@ mymain(void) + + TEST_BACKUP_BITMAP_CALCULATE("empty", bitmapSourceChain, "a", "empty"); + +- TEST_BACKUP_BITMAP_CALCULATE("basic-flat", bitmapSourceChain, "current", "basic"); +- TEST_BACKUP_BITMAP_CALCULATE("basic-intermediate", bitmapSourceChain, "d", "basic"); +- TEST_BACKUP_BITMAP_CALCULATE("basic-deep", bitmapSourceChain, "a", "basic"); +- +- TEST_BACKUP_BITMAP_CALCULATE("snapshot-flat", bitmapSourceChain, "current", "snapshots"); +- TEST_BACKUP_BITMAP_CALCULATE("snapshot-intermediate", bitmapSourceChain, "d", "snapshots"); +- TEST_BACKUP_BITMAP_CALCULATE("snapshot-deep", bitmapSourceChain, "a", "snapshots"); +- + #define TEST_CHECKPOINT_DELETE_MERGE(testname, delbmp, parbmp, named) \ + do { \ + checkpointdeletedata.name = testname; \ +@@ -1333,24 +1325,6 @@ mymain(void) + + TEST_CHECKPOINT_DELETE_MERGE("empty", "a", NULL, "empty"); + +- TEST_CHECKPOINT_DELETE_MERGE("basic-noparent", "a", NULL, "basic"); +- TEST_CHECKPOINT_DELETE_MERGE("basic-intermediate1", "b", "a", "basic"); +- TEST_CHECKPOINT_DELETE_MERGE("basic-intermediate2", "c", "b", "basic"); +- TEST_CHECKPOINT_DELETE_MERGE("basic-intermediate3", "d", "c", "basic"); +- TEST_CHECKPOINT_DELETE_MERGE("basic-current", "current", "d", "basic"); +- +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-noparent", "a", NULL, "snapshots"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-intermediate1", "b", "a", "snapshots"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-intermediate2", "c", "b", "snapshots"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-intermediate3", "d", "c", "snapshots"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-current", "current", "d", "snapshots"); +- +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-synthetic-checkpoint-noparent", "a", NULL, "snapshots-synthetic-checkpoint"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-synthetic-checkpoint-intermediate1", "b", "a", "snapshots-synthetic-checkpoint"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-synthetic-checkpoint-intermediate2", "c", "b", "snapshots-synthetic-checkpoint"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-synthetic-checkpoint-intermediate3", "d", "c", "snapshots-synthetic-checkpoint"); +- TEST_CHECKPOINT_DELETE_MERGE("snapshots-synthetic-checkpoint-current", "current", "d", "snapshots-synthetic-checkpoint"); +- + #define TEST_BITMAP_VALIDATE(testname, bitmap, rc) \ + do { \ + blockbitmapvalidatedata.name = testname; \ +@@ -1365,36 +1339,6 @@ mymain(void) + + TEST_BITMAP_VALIDATE("empty", "a", false); + +- TEST_BITMAP_VALIDATE("basic", "a", true); +- TEST_BITMAP_VALIDATE("basic", "b", true); +- TEST_BITMAP_VALIDATE("basic", "c", true); +- TEST_BITMAP_VALIDATE("basic", "d", true); +- TEST_BITMAP_VALIDATE("basic", "current", true); +- +- TEST_BITMAP_VALIDATE("snapshots", "a", true); +- TEST_BITMAP_VALIDATE("snapshots", "b", true); +- TEST_BITMAP_VALIDATE("snapshots", "c", true); +- TEST_BITMAP_VALIDATE("snapshots", "d", true); +- TEST_BITMAP_VALIDATE("snapshots", "current", true); +- +- TEST_BITMAP_VALIDATE("synthetic", "a", false); +- TEST_BITMAP_VALIDATE("synthetic", "b", true); +- TEST_BITMAP_VALIDATE("synthetic", "c", true); +- TEST_BITMAP_VALIDATE("synthetic", "d", true); +- TEST_BITMAP_VALIDATE("synthetic", "current", true); +- +- TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "a", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "b", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "c", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "d", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "current", true); +- +- TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "a", false); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "b", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "c", true); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "d", false); +- TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "current", true); +- + #define TEST_BITMAP_BLOCKCOPY(testname, shllw, ndf) \ + do { \ + blockbitmapblockcopydata.name = testname; \ +@@ -1410,12 +1354,6 @@ mymain(void) + TEST_BITMAP_BLOCKCOPY("empty-shallow", true, "empty"); + TEST_BITMAP_BLOCKCOPY("empty-deep", false, "empty"); + +- TEST_BITMAP_BLOCKCOPY("basic-shallow", true, "basic"); +- TEST_BITMAP_BLOCKCOPY("basic-deep", false, "basic"); +- +- TEST_BITMAP_BLOCKCOPY("snapshots-shallow", true, "snapshots"); +- TEST_BITMAP_BLOCKCOPY("snapshots-deep", false, "snapshots"); +- + + #define TEST_BITMAP_BLOCKCOMMIT(testname, topimg, baseimg, ndf) \ + do {\ +@@ -1431,38 +1369,6 @@ mymain(void) + + TEST_BITMAP_BLOCKCOMMIT("empty", 1, 2, "empty"); + +- TEST_BITMAP_BLOCKCOMMIT("basic-1-2", 1, 2, "basic"); +- TEST_BITMAP_BLOCKCOMMIT("basic-1-3", 1, 3, "basic"); +- TEST_BITMAP_BLOCKCOMMIT("basic-2-3", 2, 3, "basic"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-1-2", 1, 2, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-1-3", 1, 3, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-1-4", 1, 4, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-1-5", 1, 5, "snapshots"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-2-3", 2, 3, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-2-4", 2, 4, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-2-5", 2, 5, "snapshots"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-3-4", 3, 4, "snapshots"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-3-5", 3, 5, "snapshots"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-4-5", 4, 5, "snapshots"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-1-2", 1, 2, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-1-3", 1, 3, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-1-4", 1, 4, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-1-5", 1, 5, "snapshots-synthetic-broken"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-2-3", 2, 3, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-2-4", 2, 4, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-2-5", 2, 5, "snapshots-synthetic-broken"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-3-4", 3, 4, "snapshots-synthetic-broken"); +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-3-5", 3, 5, "snapshots-synthetic-broken"); +- +- TEST_BITMAP_BLOCKCOMMIT("snapshots-synthetic-broken-4-5", 4, 5, "snapshots-synthetic-broken"); +- + cleanup: + qemuTestDriverFree(&driver); + VIR_FREE(capslatest_x86_64); +diff --git a/tests/qemublocktestdata/backupmerge/basic-deep-out.json b/tests/qemublocktestdata/backupmerge/basic-deep-out.json +deleted file mode 100644 +index 28c3d16259..0000000000 +--- a/tests/qemublocktestdata/backupmerge/basic-deep-out.json ++++ /dev/null +@@ -1,22 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- }, +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-1-format", +- "name": "c" +- }, +- { +- "node": "libvirt-1-format", +- "name": "b" +- }, +- { +- "node": "libvirt-1-format", +- "name": "a" +- } +-] +diff --git a/tests/qemublocktestdata/backupmerge/basic-flat-out.json b/tests/qemublocktestdata/backupmerge/basic-flat-out.json +deleted file mode 100644 +index b89252e284..0000000000 +--- a/tests/qemublocktestdata/backupmerge/basic-flat-out.json ++++ /dev/null +@@ -1,6 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +-] +diff --git a/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json b/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json +deleted file mode 100644 +index 0dffcafd5f..0000000000 +--- a/tests/qemublocktestdata/backupmerge/basic-intermediate-out.json ++++ /dev/null +@@ -1,10 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- }, +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +-] +diff --git a/tests/qemublocktestdata/backupmerge/snapshot-deep-out.json b/tests/qemublocktestdata/backupmerge/snapshot-deep-out.json +deleted file mode 100644 +index 526fc8d55b..0000000000 +--- a/tests/qemublocktestdata/backupmerge/snapshot-deep-out.json ++++ /dev/null +@@ -1,38 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- }, +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "b" +- }, +- { +- "node": "libvirt-3-format", +- "name": "a" +- }, +- { +- "node": "libvirt-4-format", +- "name": "a" +- }, +- { +- "node": "libvirt-5-format", +- "name": "a" +- } +-] +diff --git a/tests/qemublocktestdata/backupmerge/snapshot-flat-out.json b/tests/qemublocktestdata/backupmerge/snapshot-flat-out.json +deleted file mode 100644 +index b89252e284..0000000000 +--- a/tests/qemublocktestdata/backupmerge/snapshot-flat-out.json ++++ /dev/null +@@ -1,6 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +-] +diff --git a/tests/qemublocktestdata/backupmerge/snapshot-intermediate-out.json b/tests/qemublocktestdata/backupmerge/snapshot-intermediate-out.json +deleted file mode 100644 +index 537d776ec6..0000000000 +--- a/tests/qemublocktestdata/backupmerge/snapshot-intermediate-out.json ++++ /dev/null +@@ -1,14 +0,0 @@ +-[ +- { +- "node": "libvirt-1-format", +- "name": "current" +- }, +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 b/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 +deleted file mode 100644 +index 8eeb4c3a11..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/basic-1-2 ++++ /dev/null +@@ -1,119 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "a", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 b/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 +deleted file mode 100644 +index 71b48e31a5..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/basic-1-3 ++++ /dev/null +@@ -1,119 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "a", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 b/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 +deleted file mode 100644 +index bfc58f994e..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/basic-2-3 ++++ /dev/null +@@ -1,2 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 +deleted file mode 100644 +index 0015b9ceb3..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-2 ++++ /dev/null +@@ -1,49 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-2-format", +- "name": "d" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 +deleted file mode 100644 +index 5691b408aa..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-3 ++++ /dev/null +@@ -1,76 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-3-format", +- "name": "c" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 +deleted file mode 100644 +index 454001531a..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-4 ++++ /dev/null +@@ -1,126 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-4-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 +deleted file mode 100644 +index 2fd43d7917..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-1-5 ++++ /dev/null +@@ -1,130 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- }, +- { +- "node": "libvirt-4-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 +deleted file mode 100644 +index d719a90bd7..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-3 ++++ /dev/null +@@ -1,49 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-3-format", +- "name": "c" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "d", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 +deleted file mode 100644 +index 9e37962344..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-4 ++++ /dev/null +@@ -1,99 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-4-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "d", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 +deleted file mode 100644 +index d6b20a5d05..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-2-5 ++++ /dev/null +@@ -1,103 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- }, +- { +- "node": "libvirt-4-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "d", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 +deleted file mode 100644 +index b96e8910d7..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-4 ++++ /dev/null +@@ -1,72 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-4-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "c", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 +deleted file mode 100644 +index 9570c34c40..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-3-5 ++++ /dev/null +@@ -1,76 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- }, +- { +- "node": "libvirt-4-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "c", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 +deleted file mode 100644 +index 7e1020d96e..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-4-5 ++++ /dev/null +@@ -1,33 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-4-format", +- "name": "a" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-2 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-2 +deleted file mode 100644 +index 463120d442..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-2 ++++ /dev/null +@@ -1,57 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- }, +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- }, +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-3 +deleted file mode 100644 +index fec6f95dd1..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-3 ++++ /dev/null +@@ -1,112 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-4 +deleted file mode 100644 +index 697230f67b..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-4 ++++ /dev/null +@@ -1,119 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-5 +deleted file mode 100644 +index 6bf1f0da64..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-1-5 ++++ /dev/null +@@ -1,119 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-3 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-3 +deleted file mode 100644 +index f202bb94b1..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-3 ++++ /dev/null +@@ -1,89 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-3-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-4 +deleted file mode 100644 +index 864cc9041b..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-4 ++++ /dev/null +@@ -1,96 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-5 +deleted file mode 100644 +index 4c5d8dbe80..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-2-5 ++++ /dev/null +@@ -1,96 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "oa", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "oa", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "oa" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "ob", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "ob", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "ob" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-4 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-4 +deleted file mode 100644 +index 367a930a74..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-4 ++++ /dev/null +@@ -1,27 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-4-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-4-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-5 +deleted file mode 100644 +index 0062ec140c..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-3-5 ++++ /dev/null +@@ -1,27 +0,0 @@ +-pre job bitmap disable: +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-5-format", +- "name": "b", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-5-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-4-5 b/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-4-5 +deleted file mode 100644 +index b1f10a8a24..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcommit/snapshots-synthetic-broken-4-5 ++++ /dev/null +@@ -1,20 +0,0 @@ +-pre job bitmap disable: +-[ +- { +- "type": "block-dirty-bitmap-disable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-merge bitmpas: +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json +deleted file mode 100644 +index 4ed2b97e95..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcopy/basic-deep-out.json ++++ /dev/null +@@ -1,117 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "a", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json +deleted file mode 100644 +index 4ed2b97e95..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcopy/basic-shallow-out.json ++++ /dev/null +@@ -1,117 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "a", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json +deleted file mode 100644 +index 5456553d78..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcopy/snapshots-deep-out.json ++++ /dev/null +@@ -1,133 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "a", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "a" +- }, +- { +- "node": "libvirt-4-format", +- "name": "a" +- }, +- { +- "node": "libvirt-5-format", +- "name": "a" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- }, +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- }, +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json +deleted file mode 100644 +index ddd47f7ee1..0000000000 +--- a/tests/qemublocktestdata/bitmapblockcopy/snapshots-shallow-out.json ++++ /dev/null +@@ -1,48 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "current", +- "persistent": true, +- "disabled": false, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "current", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "mirror-format-node", +- "name": "d", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "mirror-format-node", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-current-out.json b/tests/qemublocktestdata/checkpointdelete/basic-current-out.json +deleted file mode 100644 +index 1b607567e8..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/basic-current-out.json ++++ /dev/null +@@ -1,29 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "current" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json +deleted file mode 100644 +index eccb7ed15f..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json ++++ /dev/null +@@ -1,22 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "b" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json +deleted file mode 100644 +index de40e4b5b0..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json ++++ /dev/null +@@ -1,22 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "c" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json +deleted file mode 100644 +index b5d85f43f0..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json ++++ /dev/null +@@ -1,22 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json +deleted file mode 100644 +index e87382fdb4..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json ++++ /dev/null +@@ -1,9 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "a" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json +deleted file mode 100644 +index 1b607567e8..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json ++++ /dev/null +@@ -1,29 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "current" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json +deleted file mode 100644 +index c9bda3a17a..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json ++++ /dev/null +@@ -1,24 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- } +-] +-reopen nodes: +-libvirt-3-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json +deleted file mode 100644 +index 8a0e3f2cff..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json ++++ /dev/null +@@ -1,62 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-2-format", +- "name": "c" +- } +- }, +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-3-format", +- "name": "c" +- } +- } +-] +-reopen nodes: +-libvirt-3-format +-libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json +deleted file mode 100644 +index 211bc40baf..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json ++++ /dev/null +@@ -1,61 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-1-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- }, +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-2-format", +- "name": "c" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-2-format", +- "name": "d" +- } +- } +-] +-reopen nodes: +-libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json +deleted file mode 100644 +index f750f44da2..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json ++++ /dev/null +@@ -1,27 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-3-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-4-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-reopen nodes: +-libvirt-5-format +-libvirt-4-format +-libvirt-3-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-current-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-current-out.json +deleted file mode 100644 +index 1b607567e8..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-current-out.json ++++ /dev/null +@@ -1,29 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "d", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "current" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "current" +- } +- } +-] +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate1-out.json +deleted file mode 100644 +index d7e6d18637..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate1-out.json ++++ /dev/null +@@ -1,31 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-3-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-3-format", +- "target": "a", +- "bitmaps": [ +- { +- "node": "libvirt-3-format", +- "name": "b" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-3-format", +- "name": "b" +- } +- } +-] +-reopen nodes: +-libvirt-3-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate2-out.json +deleted file mode 100644 +index cfbff010c2..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate2-out.json ++++ /dev/null +@@ -1,34 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-2-format", +- "name": "b", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "b", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "c" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-2-format", +- "name": "c" +- } +- } +-] +-reopen nodes: +-libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate3-out.json +deleted file mode 100644 +index 211bc40baf..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-intermediate3-out.json ++++ /dev/null +@@ -1,61 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-add", +- "data": { +- "node": "libvirt-1-format", +- "name": "c", +- "persistent": true, +- "disabled": true, +- "granularity": 65536 +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-1-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-1-format", +- "name": "d" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-1-format", +- "name": "d" +- } +- }, +- { +- "type": "block-dirty-bitmap-enable", +- "data": { +- "node": "libvirt-2-format", +- "name": "c" +- } +- }, +- { +- "type": "block-dirty-bitmap-merge", +- "data": { +- "node": "libvirt-2-format", +- "target": "c", +- "bitmaps": [ +- { +- "node": "libvirt-2-format", +- "name": "d" +- } +- ] +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-2-format", +- "name": "d" +- } +- } +-] +-reopen nodes: +-libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-noparent-out.json +deleted file mode 100644 +index f750f44da2..0000000000 +--- a/tests/qemublocktestdata/checkpointdelete/snapshots-synthetic-checkpoint-noparent-out.json ++++ /dev/null +@@ -1,27 +0,0 @@ +-[ +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-3-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-4-format", +- "name": "a" +- } +- }, +- { +- "type": "block-dirty-bitmap-remove", +- "data": { +- "node": "libvirt-5-format", +- "name": "a" +- } +- } +-] +-reopen nodes: +-libvirt-5-format +-libvirt-4-format +-libvirt-3-format +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Extract-printing-of-nodename-list.patch b/SOURCES/libvirt-qemublocktest-Extract-printing-of-nodename-list.patch new file mode 100644 index 0000000..d957b5c --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Extract-printing-of-nodename-list.patch @@ -0,0 +1,78 @@ +From 25790c1e38a02e16182bb8c708af656f82db950a Mon Sep 17 00:00:00 2001 +Message-Id: <25790c1e38a02e16182bb8c708af656f82db950a@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:46 +0200 +Subject: [PATCH] qemublocktest: Extract printing of nodename list +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There will be multiple places where we'll need to print nodenames from a +GSList of virStorageSource for testing purposes. Extract the code into a +function. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 69cacbe5061a82d3207df113d5c845f38f3decca) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <6f3b4a3424a76d6fe788545b0ddffd3cbb372623.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 75527ca64b..9d6d871be8 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -647,6 +647,23 @@ testQemuDetectBitmaps(const void *opaque) + } + + ++static void ++testQemuBitmapListPrint(const char *title, ++ GSList *next, ++ virBufferPtr buf) ++{ ++ if (!next) ++ return; ++ ++ virBufferAsprintf(buf, "%s\n", title); ++ ++ for (; next; next = next->next) { ++ virStorageSourcePtr src = next->data; ++ virBufferAsprintf(buf, "%s\n", src->nodeformat); ++ } ++} ++ ++ + static virStorageSourcePtr + testQemuBackupIncrementalBitmapCalculateGetFakeImage(size_t idx) + { +@@ -829,7 +846,6 @@ testQemuCheckpointDeleteMerge(const void *opaque) + g_autoptr(virHashTable) nodedata = NULL; + g_autoptr(GSList) reopenimages = NULL; + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; +- GSList *tmp; + + expectpath = g_strdup_printf("%s/%s%s-out.json", abs_srcdir, + checkpointDeletePrefix, data->name); +@@ -858,14 +874,7 @@ testQemuCheckpointDeleteMerge(const void *opaque) + virBufferAddLit(&buf, "NULL\n"); + } + +- if (reopenimages) { +- virBufferAddLit(&buf, "reopen nodes:\n"); +- +- for (tmp = reopenimages; tmp; tmp = tmp->next) { +- virStorageSourcePtr src = tmp->data; +- virBufferAsprintf(&buf, "%s\n", src->nodeformat); +- } +- } ++ testQemuBitmapListPrint("reopen nodes:", reopenimages, &buf); + + actual = virBufferContentAndReset(&buf); + +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Re-add-bitmap-validation-for-basic-and-snapshots-cases.patch b/SOURCES/libvirt-qemublocktest-Re-add-bitmap-validation-for-basic-and-snapshots-cases.patch new file mode 100644 index 0000000..cd5929e --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Re-add-bitmap-validation-for-basic-and-snapshots-cases.patch @@ -0,0 +1,49 @@ +From 82ab591e0d4183f9d4d12c8d905f2c0c71795f68 Mon Sep 17 00:00:00 2001 +Message-Id: <82ab591e0d4183f9d4d12c8d905f2c0c71795f68@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:51 +0200 +Subject: [PATCH] qemublocktest: Re-add bitmap validation for 'basic' and + 'snapshots' cases +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Now that we've updated both the test data and the validator to new +semantics we can start testing again. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 9c007fd418e7fa7320662347662b926835a20c16) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 9d6d871be8..af81f1b77a 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1345,6 +1345,18 @@ mymain(void) + + TEST_BITMAP_VALIDATE("empty", "a", false); + ++ TEST_BITMAP_VALIDATE("basic", "a", true); ++ TEST_BITMAP_VALIDATE("basic", "b", true); ++ TEST_BITMAP_VALIDATE("basic", "c", true); ++ TEST_BITMAP_VALIDATE("basic", "d", true); ++ TEST_BITMAP_VALIDATE("basic", "current", true); ++ ++ TEST_BITMAP_VALIDATE("snapshots", "a", true); ++ TEST_BITMAP_VALIDATE("snapshots", "b", true); ++ TEST_BITMAP_VALIDATE("snapshots", "c", true); ++ TEST_BITMAP_VALIDATE("snapshots", "d", true); ++ TEST_BITMAP_VALIDATE("snapshots", "current", true); ++ + #define TEST_BITMAP_BLOCKCOPY(testname, shllw, ndf) \ + do { \ + blockbitmapblockcopydata.name = testname; \ +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Re-introduce-testing-of-checkpoint-deletion.patch b/SOURCES/libvirt-qemublocktest-Re-introduce-testing-of-checkpoint-deletion.patch new file mode 100644 index 0000000..3f40790 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Re-introduce-testing-of-checkpoint-deletion.patch @@ -0,0 +1,401 @@ +From 4b9cb933c1501309a858130f5465313699840ec1 Mon Sep 17 00:00:00 2001 +Message-Id: <4b9cb933c1501309a858130f5465313699840ec1@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:55 +0200 +Subject: [PATCH] qemublocktest: Re-introduce testing of checkpoint deletion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Exercise the now arguably simpler checkpoint deletion code on the +'basic', 'snapshots', and 'synthetic' test data sets. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 2c5a3da365d9a33ff23458ca2a914f9d35ebd510) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: <8df51bc8ee6e86fe36d971670ecdc89ecc989532.1592906423.git.pkrempa@redhat.com> +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 18 ++++++++ + .../checkpointdelete/basic-current-out.json | 9 ++++ + .../basic-intermediate1-out.json | 9 ++++ + .../basic-intermediate2-out.json | 9 ++++ + .../basic-intermediate3-out.json | 9 ++++ + .../checkpointdelete/basic-noparent-out.json | 9 ++++ + .../snapshots-current-out.json | 9 ++++ + .../snapshots-intermediate1-out.json | 26 ++++++++++++ + .../snapshots-intermediate2-out.json | 26 ++++++++++++ + .../snapshots-intermediate3-out.json | 18 ++++++++ + .../snapshots-noparent-out.json | 42 +++++++++++++++++++ + .../synthetic-current-out.json | 9 ++++ + .../synthetic-intermediate1-out.json | 11 +++++ + .../synthetic-intermediate2-out.json | 11 +++++ + .../synthetic-intermediate3-out.json | 19 +++++++++ + .../synthetic-noparent-out.json | 11 +++++ + 16 files changed, 245 insertions(+) + create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-current-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/synthetic-current-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/synthetic-intermediate1-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/synthetic-intermediate2-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/synthetic-intermediate3-out.json + create mode 100644 tests/qemublocktestdata/checkpointdelete/synthetic-noparent-out.json + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 0ec964c2c6..7c8f67dd6b 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -1329,6 +1329,24 @@ mymain(void) + + TEST_CHECKPOINT_DELETE("empty", "a", "empty"); + ++ TEST_CHECKPOINT_DELETE("basic-noparent", "a", "basic"); ++ TEST_CHECKPOINT_DELETE("basic-intermediate1", "b", "basic"); ++ TEST_CHECKPOINT_DELETE("basic-intermediate2", "c", "basic"); ++ TEST_CHECKPOINT_DELETE("basic-intermediate3", "d", "basic"); ++ TEST_CHECKPOINT_DELETE("basic-current", "current", "basic"); ++ ++ TEST_CHECKPOINT_DELETE("snapshots-noparent", "a", "snapshots"); ++ TEST_CHECKPOINT_DELETE("snapshots-intermediate1", "b", "snapshots"); ++ TEST_CHECKPOINT_DELETE("snapshots-intermediate2", "c", "snapshots"); ++ TEST_CHECKPOINT_DELETE("snapshots-intermediate3", "d", "snapshots"); ++ TEST_CHECKPOINT_DELETE("snapshots-current", "current", "snapshots"); ++ ++ TEST_CHECKPOINT_DELETE("synthetic-noparent", "a", "synthetic"); ++ TEST_CHECKPOINT_DELETE("synthetic-intermediate1", "b", "synthetic"); ++ TEST_CHECKPOINT_DELETE("synthetic-intermediate2", "c", "synthetic"); ++ TEST_CHECKPOINT_DELETE("synthetic-intermediate3", "d", "synthetic"); ++ TEST_CHECKPOINT_DELETE("synthetic-current", "current", "synthetic"); ++ + #define TEST_BITMAP_VALIDATE(testname, bitmap, rc) \ + do { \ + blockbitmapvalidatedata.name = testname; \ +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-current-out.json b/tests/qemublocktestdata/checkpointdelete/basic-current-out.json +new file mode 100644 +index 0000000000..6ed1b63b66 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/basic-current-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "current" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json +new file mode 100644 +index 0000000000..e1dd4920cd +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/basic-intermediate1-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "b" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json +new file mode 100644 +index 0000000000..5638532d35 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/basic-intermediate2-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "c" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json +new file mode 100644 +index 0000000000..8c56b0e689 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/basic-intermediate3-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "d" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json +new file mode 100644 +index 0000000000..e87382fdb4 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/basic-noparent-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "a" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json +new file mode 100644 +index 0000000000..6ed1b63b66 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/snapshots-current-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "current" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json +new file mode 100644 +index 0000000000..1cde09131e +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate1-out.json +@@ -0,0 +1,26 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "b" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "b" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ } ++] ++reopen nodes: ++libvirt-3-format ++libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json +new file mode 100644 +index 0000000000..6fcd7ee0d1 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate2-out.json +@@ -0,0 +1,26 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "c" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "c" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ } ++] ++reopen nodes: ++libvirt-3-format ++libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json +new file mode 100644 +index 0000000000..2977dc3042 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/snapshots-intermediate3-out.json +@@ -0,0 +1,18 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "d" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ } ++] ++reopen nodes: ++libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json +new file mode 100644 +index 0000000000..e4a6a413a3 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/snapshots-noparent-out.json +@@ -0,0 +1,42 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "a" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "a" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "a" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-4-format", ++ "name": "a" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "a" ++ } ++ } ++] ++reopen nodes: ++libvirt-5-format ++libvirt-4-format ++libvirt-3-format ++libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/synthetic-current-out.json b/tests/qemublocktestdata/checkpointdelete/synthetic-current-out.json +new file mode 100644 +index 0000000000..6ed1b63b66 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/synthetic-current-out.json +@@ -0,0 +1,9 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-1-format", ++ "name": "current" ++ } ++ } ++] +diff --git a/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate1-out.json b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate1-out.json +new file mode 100644 +index 0000000000..6eb9716aaa +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate1-out.json +@@ -0,0 +1,11 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "b" ++ } ++ } ++] ++reopen nodes: ++libvirt-3-format +diff --git a/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate2-out.json b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate2-out.json +new file mode 100644 +index 0000000000..92b849cfc9 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate2-out.json +@@ -0,0 +1,11 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "c" ++ } ++ } ++] ++reopen nodes: ++libvirt-3-format +diff --git a/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate3-out.json b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate3-out.json +new file mode 100644 +index 0000000000..466df52007 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/synthetic-intermediate3-out.json +@@ -0,0 +1,19 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-2-format", ++ "name": "d" ++ } ++ }, ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-3-format", ++ "name": "d" ++ } ++ } ++] ++reopen nodes: ++libvirt-3-format ++libvirt-2-format +diff --git a/tests/qemublocktestdata/checkpointdelete/synthetic-noparent-out.json b/tests/qemublocktestdata/checkpointdelete/synthetic-noparent-out.json +new file mode 100644 +index 0000000000..0479815f36 +--- /dev/null ++++ b/tests/qemublocktestdata/checkpointdelete/synthetic-noparent-out.json +@@ -0,0 +1,11 @@ ++[ ++ { ++ "type": "block-dirty-bitmap-remove", ++ "data": { ++ "node": "libvirt-5-format", ++ "name": "a" ++ } ++ } ++] ++reopen nodes: ++libvirt-5-format +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Rename-TEST_CHECKPOINT_DELETE_MERGE-to-TEST_CHECKPOINT_DELETE.patch b/SOURCES/libvirt-qemublocktest-Rename-TEST_CHECKPOINT_DELETE_MERGE-to-TEST_CHECKPOINT_DELETE.patch new file mode 100644 index 0000000..2caebb2 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Rename-TEST_CHECKPOINT_DELETE_MERGE-to-TEST_CHECKPOINT_DELETE.patch @@ -0,0 +1,81 @@ +From a97672d9aa9be91ddb2fee0e592e0e137ecca20f Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:54 +0200 +Subject: [PATCH] qemublocktest: Rename TEST_CHECKPOINT_DELETE_MERGE to + TEST_CHECKPOINT_DELETE +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Also rename the helper struct and function. + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit 520d139b9c3bbf6cc6453044fa6304e1429b7f11) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktest.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c +index 201e5df6b4..0ec964c2c6 100644 +--- a/tests/qemublocktest.c ++++ b/tests/qemublocktest.c +@@ -826,7 +826,7 @@ testQemuBackupIncrementalBitmapCalculate(const void *opaque) + + static const char *checkpointDeletePrefix = "qemublocktestdata/checkpointdelete/"; + +-struct testQemuCheckpointDeleteMergeData { ++struct testQemuCheckpointDeleteData { + const char *name; + virStorageSourcePtr chain; + const char *deletebitmap; +@@ -835,9 +835,9 @@ struct testQemuCheckpointDeleteMergeData { + + + static int +-testQemuCheckpointDeleteMerge(const void *opaque) ++testQemuCheckpointDelete(const void *opaque) + { +- const struct testQemuCheckpointDeleteMergeData *data = opaque; ++ const struct testQemuCheckpointDeleteData *data = opaque; + g_autofree char *actual = NULL; + g_autofree char *expectpath = NULL; + g_autoptr(virJSONValue) actions = NULL; +@@ -1037,7 +1037,7 @@ mymain(void) + struct testJSONtoJSONData jsontojsondata; + struct testQemuImageCreateData imagecreatedata; + struct testQemuBackupIncrementalBitmapCalculateData backupbitmapcalcdata; +- struct testQemuCheckpointDeleteMergeData checkpointdeletedata; ++ struct testQemuCheckpointDeleteData checkpointdeletedata; + struct testQemuBlockBitmapValidateData blockbitmapvalidatedata; + struct testQemuBlockBitmapBlockcopyData blockbitmapblockcopydata; + struct testQemuBlockBitmapBlockcommitData blockbitmapblockcommitdata; +@@ -1316,18 +1316,18 @@ mymain(void) + + TEST_BACKUP_BITMAP_CALCULATE("empty", bitmapSourceChain, "a", "empty"); + +-#define TEST_CHECKPOINT_DELETE_MERGE(testname, delbmp, named) \ ++#define TEST_CHECKPOINT_DELETE(testname, delbmp, named) \ + do { \ + checkpointdeletedata.name = testname; \ + checkpointdeletedata.chain = bitmapSourceChain; \ + checkpointdeletedata.deletebitmap = delbmp; \ + checkpointdeletedata.nodedatafile = named; \ + if (virTestRun("checkpoint delete " testname, \ +- testQemuCheckpointDeleteMerge, &checkpointdeletedata) < 0) \ ++ testQemuCheckpointDelete, &checkpointdeletedata) < 0) \ + ret = -1; \ + } while (0) + +- TEST_CHECKPOINT_DELETE_MERGE("empty", "a", "empty"); ++ TEST_CHECKPOINT_DELETE("empty", "a", "empty"); + + #define TEST_BITMAP_VALIDATE(testname, bitmap, rc) \ + do { \ +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Replace-basic-bitmap-detection-test-case-data.patch b/SOURCES/libvirt-qemublocktest-Replace-basic-bitmap-detection-test-case-data.patch new file mode 100644 index 0000000..a3263a1 --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Replace-basic-bitmap-detection-test-case-data.patch @@ -0,0 +1,282 @@ +From 79ee60c0e547a9023eeb7912b10fe363645f5d5a Mon Sep 17 00:00:00 2001 +Message-Id: <79ee60c0e547a9023eeb7912b10fe363645f5d5a@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:48 +0200 +Subject: [PATCH] qemublocktest: Replace 'basic' bitmap detection test case + data +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use test data which conforms to the new semantics which changed in the +previous patch. + +The test data was created by the same set of commands as originally in +commit 9aac9d5bdab039a50de2d8c627b3a1f1578ed471 + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit de32397007d5d2a9ca57791ec159f72f7666322b) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktestdata/bitmap/basic.json | 229 +++++++++++----------- + tests/qemublocktestdata/bitmap/basic.out | 8 +- + 2 files changed, 119 insertions(+), 118 deletions(-) + +diff --git a/tests/qemublocktestdata/bitmap/basic.json b/tests/qemublocktestdata/bitmap/basic.json +index 9d418b1a37..718106bf99 100644 +--- a/tests/qemublocktestdata/bitmap/basic.json ++++ b/tests/qemublocktestdata/bitmap/basic.json +@@ -1,117 +1,118 @@ + [ +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 200704, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-format", +- "backing_file_depth": 0, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "dirty-bitmaps": [ +- { +- "name": "current", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "d", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "c", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "b", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- }, +- { +- "name": "a", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 +- } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 10485760, ++ "filename": "/tmp/bitmaps.qcow2", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 200704, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "dirty-flag": false + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 197120, +- "filename": "/tmp/pull4.qcow2", +- "format": "file", +- "actual-size": 200704, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- } ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "dirty-bitmaps": [ ++ { ++ "name": "current", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "d", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "c", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "b", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 197120, ++ "filename": "/tmp/bitmaps.qcow2", ++ "format": "file", ++ "actual-size": 200704, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ } + ] +diff --git a/tests/qemublocktestdata/bitmap/basic.out b/tests/qemublocktestdata/bitmap/basic.out +index 539f7d9bad..5c4c35b3f0 100644 +--- a/tests/qemublocktestdata/bitmap/basic.out ++++ b/tests/qemublocktestdata/bitmap/basic.out +@@ -1,6 +1,6 @@ + libvirt-1-format: + current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- d: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- b: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- a: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ c: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemublocktest-Replace-snapshots-bitmap-detection-test-case-data.patch b/SOURCES/libvirt-qemublocktest-Replace-snapshots-bitmap-detection-test-case-data.patch new file mode 100644 index 0000000..a3d14ec --- /dev/null +++ b/SOURCES/libvirt-qemublocktest-Replace-snapshots-bitmap-detection-test-case-data.patch @@ -0,0 +1,1476 @@ +From 31106cd65ee58f168769bb91eab8a0e5116b7a97 Mon Sep 17 00:00:00 2001 +Message-Id: <31106cd65ee58f168769bb91eab8a0e5116b7a97@dist-git> +From: Peter Krempa +Date: Tue, 23 Jun 2020 12:23:49 +0200 +Subject: [PATCH] qemublocktest: Replace 'snapshots' bitmap detection test case + data +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use test data which conforms to the new semantics which changed in the +previous patch. + +The test data was created by the same set of commands as originally in +commit 0b27b655b1bac480186ce80457113cd5dc34e6a1 + +Signed-off-by: Peter Krempa +Reviewed-by: Eric Blake +(cherry picked from commit ff00fa228d66b47e1b24c4a8cccf845af1d9385c) +https://bugzilla.redhat.com/show_bug.cgi?id=1804593 +Message-Id: +Reviewed-by: Ján Tomko +--- + tests/qemublocktestdata/bitmap/snapshots.json | 1382 +++++++---------- + tests/qemublocktestdata/bitmap/snapshots.out | 13 +- + 2 files changed, 588 insertions(+), 807 deletions(-) + +diff --git a/tests/qemublocktestdata/bitmap/snapshots.json b/tests/qemublocktestdata/bitmap/snapshots.json +index 87e77ad408..2a20aea812 100644 +--- a/tests/qemublocktestdata/bitmap/snapshots.json ++++ b/tests/qemublocktestdata/bitmap/snapshots.json +@@ -1,836 +1,612 @@ + [ +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 104857600, ++ "filename": "/tmp/bitmaps.1591792950", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 225280, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "current", ++ "granularity": 65536 ++ }, ++ { ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "c", ++ "granularity": 65536 + }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911550", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "in-use", +- "auto" +- ], +- "name": "current", +- "granularity": 65536 +- }, +- { +- "flags": [ +- "in-use" +- ], +- "name": "d", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } ++ { ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "b", ++ "granularity": 65536 + }, +- "full-backing-filename": "/tmp/pull4.1575911540", +- "backing-filename": "/tmp/pull4.1575911540", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-format", +- "backing_file_depth": 4, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911540", +- "dirty-bitmaps": [ + { +- "name": "d", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 + }, + { +- "name": "current", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "in-use", ++ "auto" ++ ], ++ "name": "d", ++ "granularity": 65536 + } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1591792938", ++ "backing-filename": "/tmp/bitmaps.1591792938", ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1591792938", ++ "dirty-bitmaps": [ ++ { ++ "name": "d", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "b", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "c", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "current", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1591792950", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 590336, ++ "filename": "/tmp/bitmaps.1591792950", ++ "format": "file", ++ "actual-size": 225280, ++ "dirty-flag": false + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911550", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-1-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911550", +- "encryption_key_missing": false ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-1-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false ++ "file": "/tmp/bitmaps.1591792950", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 104857600, ++ "filename": "/tmp/bitmaps.1591792938", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 221184, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "d", ++ "granularity": 65536 + }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911540", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 212992, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "d", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "c", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } ++ { ++ "flags": [ ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 + }, +- "full-backing-filename": "/tmp/pull4.1575911527", +- "backing-filename": "/tmp/pull4.1575911527", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-2-format", +- "backing_file_depth": 3, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911527", +- "dirty-bitmaps": [ + { +- "name": "c", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "b", ++ "granularity": 65536 + }, + { +- "name": "d", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "c", ++ "granularity": 65536 + } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1591792930", ++ "backing-filename": "/tmp/bitmaps.1591792930", ++ "dirty-flag": false + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 393728, +- "filename": "/tmp/pull4.1575911540", +- "format": "file", +- "actual-size": 212992, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-2-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911540", +- "encryption_key_missing": false ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-2-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1591792930", ++ "dirty-bitmaps": [ ++ { ++ "name": "c", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "b", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "d", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911527", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 217088, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "c", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "b", +- "granularity": 65536 +- }, +- { +- "flags": [ +- +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.1575911522", +- "backing-filename": "/tmp/pull4.1575911522", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-3-format", +- "backing_file_depth": 2, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.1575911522", +- "dirty-bitmaps": [ ++ "file": "/tmp/bitmaps.1591792938", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 524800, ++ "filename": "/tmp/bitmaps.1591792938", ++ "format": "file", ++ "actual-size": 221184, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-2-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1591792938", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 104857600, ++ "filename": "/tmp/bitmaps.1591792930", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 217088, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ + { +- "name": "a", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "c", ++ "granularity": 65536 + }, + { +- "name": "b", +- "recording": false, +- "persistent": true, +- "busy": false, +- "status": "disabled", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "b", ++ "granularity": 65536 + }, + { +- "name": "c", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 + } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.1591792925", ++ "backing-filename": "/tmp/bitmaps.1591792925", ++ "dirty-flag": false + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 459264, +- "filename": "/tmp/pull4.1575911527", +- "format": "file", +- "actual-size": 217088, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-3-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911527", +- "encryption_key_missing": false ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-3-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.1591792925", ++ "dirty-bitmaps": [ ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "b", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ }, ++ { ++ "name": "c", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "backing-image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "backing-filename-format": "qcow2", +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.1575911522", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "full-backing-filename": "/tmp/pull4.qcow2", +- "backing-filename": "/tmp/pull4.qcow2", +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-4-format", +- "backing_file_depth": 1, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "backing_file": "/tmp/pull4.qcow2", +- "dirty-bitmaps": [ ++ "file": "/tmp/bitmaps.1591792930", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 459264, ++ "filename": "/tmp/bitmaps.1591792930", ++ "format": "file", ++ "actual-size": 217088, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-3-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1591792930", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "backing-filename-format": "qcow2", ++ "virtual-size": 104857600, ++ "filename": "/tmp/bitmaps.1591792925", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 208896, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ + { +- "name": "a", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 + } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "full-backing-filename": "/tmp/bitmaps.qcow2", ++ "backing-filename": "/tmp/bitmaps.qcow2", ++ "dirty-flag": false + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.1575911522", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-4-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.1575911522", +- "encryption_key_missing": false ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-4-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "backing_file": "/tmp/bitmaps.qcow2", ++ "dirty-bitmaps": [ ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 10485760, +- "filename": "/tmp/pull4.qcow2", +- "cluster-size": 65536, +- "format": "qcow2", +- "actual-size": 208896, +- "format-specific": { +- "type": "qcow2", +- "data": { +- "compat": "1.1", +- "lazy-refcounts": false, +- "bitmaps": [ +- { +- "flags": [ +- "auto" +- ], +- "name": "a", +- "granularity": 65536 +- } +- ], +- "refcount-bits": 16, +- "corrupt": false +- } +- }, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": true, +- "node-name": "libvirt-5-format", +- "backing_file_depth": 0, +- "drv": "qcow2", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "dirty-bitmaps": [ ++ "file": "/tmp/bitmaps.1591792925", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 328192, ++ "filename": "/tmp/bitmaps.1591792925", ++ "format": "file", ++ "actual-size": 208896, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-4-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.1591792925", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 104857600, ++ "filename": "/tmp/bitmaps.qcow2", ++ "cluster-size": 65536, ++ "format": "qcow2", ++ "actual-size": 208896, ++ "format-specific": { ++ "type": "qcow2", ++ "data": { ++ "compat": "1.1", ++ "compression-type": "zlib", ++ "lazy-refcounts": false, ++ "bitmaps": [ + { +- "name": "a", +- "recording": true, +- "persistent": true, +- "busy": false, +- "status": "active", +- "granularity": 65536, +- "count": 0 ++ "flags": [ ++ "auto" ++ ], ++ "name": "a", ++ "granularity": 65536 + } +- ], +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false ++ ], ++ "refcount-bits": 16, ++ "corrupt": false ++ } ++ }, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": true, ++ "node-name": "libvirt-5-format", ++ "backing_file_depth": 0, ++ "drv": "qcow2", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "dirty-bitmaps": [ ++ { ++ "name": "a", ++ "recording": true, ++ "persistent": true, ++ "busy": false, ++ "status": "active", ++ "granularity": 65536, ++ "count": 0 ++ } ++ ], ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true ++ }, ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ }, ++ { ++ "iops_rd": 0, ++ "detect_zeroes": "off", ++ "image": { ++ "virtual-size": 328192, ++ "filename": "/tmp/bitmaps.qcow2", ++ "format": "file", ++ "actual-size": 208896, ++ "dirty-flag": false ++ }, ++ "iops_wr": 0, ++ "ro": false, ++ "node-name": "libvirt-5-storage", ++ "backing_file_depth": 0, ++ "drv": "file", ++ "iops": 0, ++ "bps_wr": 0, ++ "write_threshold": 0, ++ "encrypted": false, ++ "bps": 0, ++ "bps_rd": 0, ++ "cache": { ++ "no-flush": false, ++ "direct": false, ++ "writeback": true + }, +- { +- "iops_rd": 0, +- "detect_zeroes": "off", +- "image": { +- "virtual-size": 328192, +- "filename": "/tmp/pull4.qcow2", +- "format": "file", +- "actual-size": 208896, +- "dirty-flag": false +- }, +- "iops_wr": 0, +- "ro": false, +- "node-name": "libvirt-5-storage", +- "backing_file_depth": 0, +- "drv": "file", +- "iops": 0, +- "bps_wr": 0, +- "write_threshold": 0, +- "encrypted": false, +- "bps": 0, +- "bps_rd": 0, +- "cache": { +- "no-flush": false, +- "direct": false, +- "writeback": true +- }, +- "file": "/tmp/pull4.qcow2", +- "encryption_key_missing": false +- } ++ "file": "/tmp/bitmaps.qcow2", ++ "encryption_key_missing": false ++ } + ] +diff --git a/tests/qemublocktestdata/bitmap/snapshots.out b/tests/qemublocktestdata/bitmap/snapshots.out +index 5dafe946cf..24ca27e4d8 100644 +--- a/tests/qemublocktestdata/bitmap/snapshots.out ++++ b/tests/qemublocktestdata/bitmap/snapshots.out +@@ -1,12 +1,17 @@ + libvirt-1-format: +- d: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ c: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + libvirt-2-format: +- c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ c: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + d: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + libvirt-3-format: +- a: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +- b: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 ++ b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + c: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 + libvirt-4-format: + a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0 +-- +2.27.0 + diff --git a/SOURCES/libvirt-qemumonitorjsontest-AddNetdev-Use-real-variant.patch b/SOURCES/libvirt-qemumonitorjsontest-AddNetdev-Use-real-variant.patch new file mode 100644 index 0000000..dc5c9dd --- /dev/null +++ b/SOURCES/libvirt-qemumonitorjsontest-AddNetdev-Use-real-variant.patch @@ -0,0 +1,43 @@ +From d2d22773873d6386f30f88a2d477c23a2fd534e2 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Sun, 26 Apr 2020 13:04:05 -0400 +Subject: [PATCH] qemumonitorjsontest: AddNetdev: Use real variant +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +QEMU now formalized the arguments of netdev-add in the schema, so we +must use a real type to pass the schema validation once the schema is +updated. + +The 'user' variant doesn't have any other mandatory fields. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko + +Required on 8.2.1 branch due to adding caps_5.0.0.x86_64.replies +Prerequisite for https://bugzilla.redhat.com/1802592 +Signed-off-by: Laine Stump +Message-Id: <20200426170415.18328-3-laine@redhat.com> +Reviewed-by: Michal Privoznik +--- + tests/qemumonitorjsontest.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c +index 2c696a2e8b..2fb72b827d 100644 +--- a/tests/qemumonitorjsontest.c ++++ b/tests/qemumonitorjsontest.c +@@ -1308,7 +1308,7 @@ GEN_TEST_FUNC(qemuMonitorJSONDump, "dummy_protocol", "elf", + true) + GEN_TEST_FUNC(qemuMonitorJSONGraphicsRelocate, VIR_DOMAIN_GRAPHICS_TYPE_SPICE, + "localhost", 12345, 12346, "certsubjectval") +-GEN_TEST_FUNC(qemuMonitorJSONAddNetdev, "id=net0,type=test") ++GEN_TEST_FUNC(qemuMonitorJSONAddNetdev, "id=net0,type=user") + GEN_TEST_FUNC(qemuMonitorJSONRemoveNetdev, "net0") + GEN_TEST_FUNC(qemuMonitorJSONDelDevice, "ide0") + GEN_TEST_FUNC(qemuMonitorJSONAddDevice, "some_dummy_devicestr") +-- +2.26.2 + diff --git a/SOURCES/libvirt-storage_file-create-Create-new-images-with-write-permission-bit.patch b/SOURCES/libvirt-storage_file-create-Create-new-images-with-write-permission-bit.patch new file mode 100644 index 0000000..bb28a75 --- /dev/null +++ b/SOURCES/libvirt-storage_file-create-Create-new-images-with-write-permission-bit.patch @@ -0,0 +1,69 @@ +From 1624090a014019ac1b61dc62557b829426068835 Mon Sep 17 00:00:00 2001 +Message-Id: <1624090a014019ac1b61dc62557b829426068835@dist-git> +From: Peter Krempa +Date: Tue, 12 May 2020 17:24:08 +0200 +Subject: [PATCH] storage_file: create: Create new images with write permission + bit +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The 'Create' API of the two storage file backends is used only on +code-paths where we need to format the image after creating an empty +file. Since the DAC security driver only modifies the owner of the file +and not the mode we need to create all files which are going to be +formatted with the write bit set for the user. + +Signed-off-by: Peter Krempa +Reviewed-by: Ján Tomko +(cherry picked from commit 20939b037c37789ddca54c18862fb45b4b41740f) + +https://bugzilla.redhat.com/show_bug.cgi?id=1832204 +Message-Id: <647821632e4b2822eceb81590459aafa2f88b6fb.1589296861.git.pkrempa@redhat.com> +Reviewed-by: Jiri Denemark +--- + src/storage/storage_file_fs.c | 6 +----- + src/storage/storage_file_gluster.c | 6 +----- + 2 files changed, 2 insertions(+), 10 deletions(-) + +diff --git a/src/storage/storage_file_fs.c b/src/storage/storage_file_fs.c +index 8817970f44..1629c3d877 100644 +--- a/src/storage/storage_file_fs.c ++++ b/src/storage/storage_file_fs.c +@@ -83,13 +83,9 @@ virStorageFileBackendFileInit(virStorageSourcePtr src) + static int + virStorageFileBackendFileCreate(virStorageSourcePtr src) + { +- mode_t mode = S_IRUSR; + VIR_AUTOCLOSE fd = -1; + +- if (!src->readonly) +- mode |= S_IWUSR; +- +- if ((fd = virFileOpenAs(src->path, O_WRONLY | O_TRUNC | O_CREAT, mode, ++ if ((fd = virFileOpenAs(src->path, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR, + src->drv->uid, src->drv->gid, 0)) < 0) { + errno = -fd; + return -1; +diff --git a/src/storage/storage_file_gluster.c b/src/storage/storage_file_gluster.c +index f389a94437..608f93d2f6 100644 +--- a/src/storage/storage_file_gluster.c ++++ b/src/storage/storage_file_gluster.c +@@ -152,13 +152,9 @@ virStorageFileBackendGlusterCreate(virStorageSourcePtr src) + { + virStorageFileBackendGlusterPrivPtr priv = src->drv->priv; + glfs_fd_t *fd = NULL; +- mode_t mode = S_IRUSR; +- +- if (!src->readonly) +- mode |= S_IWUSR; + + if (!(fd = glfs_creat(priv->vol, src->path, +- O_CREAT | O_TRUNC | O_WRONLY, mode))) ++ O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR))) + return -1; + + ignore_value(glfs_close(fd)); +-- +2.26.2 + diff --git a/SOURCES/libvirt-tests-qemu-add-disk-error-policy-tests-for-s390x.patch b/SOURCES/libvirt-tests-qemu-add-disk-error-policy-tests-for-s390x.patch new file mode 100644 index 0000000..b37307a --- /dev/null +++ b/SOURCES/libvirt-tests-qemu-add-disk-error-policy-tests-for-s390x.patch @@ -0,0 +1,185 @@ +From 0e378fc059e8fc52e665910b6c87719750cb6dbe Mon Sep 17 00:00:00 2001 +Message-Id: <0e378fc059e8fc52e665910b6c87719750cb6dbe@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Wed, 1 Apr 2020 17:19:25 +0200 +Subject: [PATCH] tests: qemu: add disk-error-policy tests for s390x +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +To demonstrate the move of these attributes from -drive to -device. + +Signed-off-by: Ján Tomko +Reviewed-by: Peter Krempa +(cherry picked from commit 248d205171c9927b6d0e0077d2f3d9996c5540d9) +Signed-off-by: Ján Tomko +https://bugzilla.redhat.com/show_bug.cgi?id=1819250 + +Conflicts: the -latest.args file has an extra "-cpu qemu" upstream +Message-Id: <5bec690d10f7d452d47fbf2db7dd24e7e855fe1b.1585754141.git.jtomko@redhat.com> +Reviewed-by: Jiri Denemark +--- + .../disk-error-policy-s390x.s390x-2.12.0.args | 42 +++++++++++++++++++ + .../disk-error-policy-s390x.s390x-latest.args | 42 +++++++++++++++++++ + .../disk-error-policy-s390x.xml | 37 ++++++++++++++++ + tests/qemuxml2argvtest.c | 2 + + 4 files changed, 123 insertions(+) + create mode 100644 tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args + create mode 100644 tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args + create mode 100644 tests/qemuxml2argvdata/disk-error-policy-s390x.xml + +diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args +new file mode 100644 +index 0000000000..cf932d1fad +--- /dev/null ++++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-2.12.0.args +@@ -0,0 +1,42 @@ ++LC_ALL=C \ ++PATH=/bin \ ++HOME=/tmp/lib/domain--1-guest \ ++USER=test \ ++LOGNAME=test \ ++XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ ++XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ ++XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ ++QEMU_AUDIO_DRV=none \ ++/usr/bin/qemu-system-s390x \ ++-name guest=guest,debug-threads=on \ ++-S \ ++-object secret,id=masterKey0,format=raw,\ ++file=/tmp/lib/domain--1-guest/master-key.aes \ ++-machine s390-ccw-virtio-2.12,accel=tcg,usb=off,dump-guest-core=off \ ++-m 214 \ ++-realtime mlock=off \ ++-smp 1,sockets=1,cores=1,threads=1 \ ++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ ++-display none \ ++-no-user-config \ ++-nodefaults \ ++-chardev socket,id=charmonitor,fd=1729,server,nowait \ ++-mon chardev=charmonitor,id=monitor,mode=control \ ++-rtc base=utc \ ++-no-shutdown \ ++-boot strict=on \ ++-drive file=/var/images/image1,format=qcow2,if=none,id=drive-virtio-disk0,\ ++werror=stop,rerror=stop,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0000,drive=drive-virtio-disk0,\ ++id=virtio-disk0,bootindex=1,write-cache=on \ ++-drive file=/var/images/image2,format=qcow2,if=none,id=drive-virtio-disk1,\ ++werror=enospc,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0001,drive=drive-virtio-disk1,\ ++id=virtio-disk1,write-cache=on \ ++-drive file=/var/images/image3,format=qcow2,if=none,id=drive-virtio-disk2,\ ++werror=report,rerror=ignore,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0002,drive=drive-virtio-disk2,\ ++id=virtio-disk2,write-cache=on \ ++-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ ++resourcecontrol=deny \ ++-msg timestamp=on +diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args +new file mode 100644 +index 0000000000..5748ad7823 +--- /dev/null ++++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.s390x-latest.args +@@ -0,0 +1,42 @@ ++LC_ALL=C \ ++PATH=/bin \ ++HOME=/tmp/lib/domain--1-guest \ ++USER=test \ ++LOGNAME=test \ ++XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ ++XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ ++XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ ++QEMU_AUDIO_DRV=none \ ++/usr/bin/qemu-system-s390x \ ++-name guest=guest,debug-threads=on \ ++-S \ ++-object secret,id=masterKey0,format=raw,\ ++file=/tmp/lib/domain--1-guest/master-key.aes \ ++-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ ++-m 214 \ ++-overcommit mem-lock=off \ ++-smp 1,sockets=1,cores=1,threads=1 \ ++-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ ++-display none \ ++-no-user-config \ ++-nodefaults \ ++-chardev socket,id=charmonitor,fd=1729,server,nowait \ ++-mon chardev=charmonitor,id=monitor,mode=control \ ++-rtc base=utc \ ++-no-shutdown \ ++-boot strict=on \ ++-drive file=/var/images/image1,format=qcow2,if=none,id=drive-virtio-disk0,\ ++werror=stop,rerror=stop,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0000,drive=drive-virtio-disk0,\ ++id=virtio-disk0,bootindex=1,write-cache=on \ ++-drive file=/var/images/image2,format=qcow2,if=none,id=drive-virtio-disk1,\ ++werror=enospc,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0001,drive=drive-virtio-disk1,\ ++id=virtio-disk1,write-cache=on \ ++-drive file=/var/images/image3,format=qcow2,if=none,id=drive-virtio-disk2,\ ++werror=report,rerror=ignore,cache=none \ ++-device virtio-blk-ccw,scsi=off,devno=fe.0.0002,drive=drive-virtio-disk2,\ ++id=virtio-disk2,write-cache=on \ ++-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ ++resourcecontrol=deny \ ++-msg timestamp=on +diff --git a/tests/qemuxml2argvdata/disk-error-policy-s390x.xml b/tests/qemuxml2argvdata/disk-error-policy-s390x.xml +new file mode 100644 +index 0000000000..7149e66d70 +--- /dev/null ++++ b/tests/qemuxml2argvdata/disk-error-policy-s390x.xml +@@ -0,0 +1,37 @@ ++ ++ guest ++ 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 ++ 219136 ++ 219136 ++ 1 ++ ++ hvm ++ ++ ++ ++ destroy ++ restart ++ destroy ++ ++ /usr/bin/qemu-system-s390x ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++
++ ++ ++ ++ +diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c +index 7bc01d55d5..d6c5f436ae 100644 +--- a/tests/qemuxml2argvtest.c ++++ b/tests/qemuxml2argvtest.c +@@ -1051,6 +1051,8 @@ mymain(void) + DO_TEST("disk-error-policy", NONE); + DO_TEST_CAPS_VER("disk-error-policy", "2.12.0"); + DO_TEST_CAPS_LATEST("disk-error-policy"); ++ DO_TEST_CAPS_ARCH_VER("disk-error-policy-s390x", "s390x", "2.12.0"); ++ DO_TEST_CAPS_ARCH_LATEST("disk-error-policy-s390x", "s390x"); + DO_TEST_CAPS_VER("disk-cache", "1.5.3"); + DO_TEST_CAPS_VER("disk-cache", "2.6.0"); + DO_TEST_CAPS_VER("disk-cache", "2.7.0"); +-- +2.26.2 + diff --git a/SOURCES/libvirt-tools-Secure-guest-check-for-AMD-in-virt-host-validate.patch b/SOURCES/libvirt-tools-Secure-guest-check-for-AMD-in-virt-host-validate.patch new file mode 100644 index 0000000..d962395 --- /dev/null +++ b/SOURCES/libvirt-tools-Secure-guest-check-for-AMD-in-virt-host-validate.patch @@ -0,0 +1,107 @@ +From 962f3c23ce6f477cfb24f5fa66a9f296ce953759 Mon Sep 17 00:00:00 2001 +Message-Id: <962f3c23ce6f477cfb24f5fa66a9f296ce953759@dist-git> +From: Boris Fiuczynski +Date: Wed, 24 Jun 2020 13:16:21 +0200 +Subject: [PATCH] tools: Secure guest check for AMD in virt-host-validate +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add checking in virt-host-validate for secure guest support +on x86 for AMD Secure Encrypted Virtualization. + +Signed-off-by: Boris Fiuczynski +Reviewed-by: Paulo de Rezende Pinatti +Reviewed-by: Bjoern Walk +Reviewed-by: Erik Skultety +(cherry picked from commit 4b561d49ad5d6cc45766714253adb798bb99b6e8) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Signed-off-by: Jiri Denemark +Message-Id: <638121e5c2692557b1b2d716371d324d61273282.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + tools/virt-host-validate-common.c | 30 +++++++++++++++++++++++++++++- + tools/virt-host-validate-common.h | 1 + + 2 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c +index e59469a49b..82e6092c01 100644 +--- a/tools/virt-host-validate-common.c ++++ b/tools/virt-host-validate-common.c +@@ -40,7 +40,8 @@ VIR_ENUM_IMPL(virHostValidateCPUFlag, + "vmx", + "svm", + "sie", +- "158"); ++ "158", ++ "sev"); + + static bool quiet; + +@@ -420,14 +421,18 @@ int virHostValidateSecureGuests(const char *hvname, + { + virBitmapPtr flags; + bool hasFac158 = false; ++ bool hasAMDSev = false; + virArch arch = virArchFromHost(); + g_autofree char *cmdline = NULL; + static const char *kIBMValues[] = {"y", "Y", "on", "ON", "oN", "On", "1"}; ++ g_autofree char *mod_value = NULL; + + flags = virHostValidateGetCPUFlags(); + + if (flags && virBitmapIsBitSet(flags, VIR_HOST_VALIDATE_CPU_FLAG_FACILITY_158)) + hasFac158 = true; ++ else if (flags && virBitmapIsBitSet(flags, VIR_HOST_VALIDATE_CPU_FLAG_SEV)) ++ hasAMDSev = true; + + virBitmapFree(flags); + +@@ -463,6 +468,29 @@ int virHostValidateSecureGuests(const char *hvname, + virHostMsgFail(level, "Hardware or firmware does not provide " + "support for IBM Secure Execution"); + } ++ } else if (hasAMDSev) { ++ if (virFileReadValueString(&mod_value, "/sys/module/kvm_amd/parameters/sev") < 0) { ++ virHostMsgFail(level, "AMD Secure Encrypted Virtualization not " ++ "supported by the currently used kernel"); ++ return 0; ++ } ++ ++ if (mod_value[0] != '1') { ++ virHostMsgFail(level, ++ "AMD Secure Encrypted Virtualization appears to be " ++ "disabled in kernel. Add kvm_amd.sev=1 " ++ "to the kernel cmdline arguments"); ++ return 0; ++ } ++ ++ if (virFileExists("/dev/sev")) { ++ virHostMsgPass(); ++ return 1; ++ } else { ++ virHostMsgFail(level, ++ "AMD Secure Encrypted Virtualization appears to be " ++ "disabled in firemare."); ++ } + } else { + virHostMsgFail(level, + "Unknown if this platform has Secure Guest support"); +diff --git a/tools/virt-host-validate-common.h b/tools/virt-host-validate-common.h +index 1653c9c95b..014331c0e0 100644 +--- a/tools/virt-host-validate-common.h ++++ b/tools/virt-host-validate-common.h +@@ -39,6 +39,7 @@ typedef enum { + VIR_HOST_VALIDATE_CPU_FLAG_SVM, + VIR_HOST_VALIDATE_CPU_FLAG_SIE, + VIR_HOST_VALIDATE_CPU_FLAG_FACILITY_158, ++ VIR_HOST_VALIDATE_CPU_FLAG_SEV, + + VIR_HOST_VALIDATE_CPU_FLAG_LAST, + } virHostValidateCPUFlag; +-- +2.27.0 + diff --git a/SOURCES/libvirt-tools-Secure-guest-check-on-s390-in-virt-host-validate.patch b/SOURCES/libvirt-tools-Secure-guest-check-on-s390-in-virt-host-validate.patch new file mode 100644 index 0000000..2aa8ecc --- /dev/null +++ b/SOURCES/libvirt-tools-Secure-guest-check-on-s390-in-virt-host-validate.patch @@ -0,0 +1,158 @@ +From 085b955a75c49585d94fd5a19d6ac37833bb05cb Mon Sep 17 00:00:00 2001 +Message-Id: <085b955a75c49585d94fd5a19d6ac37833bb05cb@dist-git> +From: Boris Fiuczynski +Date: Wed, 24 Jun 2020 13:16:20 +0200 +Subject: [PATCH] tools: Secure guest check on s390 in virt-host-validate +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add checking in virt-host-validate for secure guest support +on s390 for IBM Secure Execution. + +Signed-off-by: Boris Fiuczynski +Tested-by: Viktor Mihajlovski +Reviewed-by: Paulo de Rezende Pinatti +Reviewed-by: Bjoern Walk +Reviewed-by: Erik Skultety +(cherry picked from commit 0254ceab82f5e1f7b505730586d8c8337ecc5920) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Conflicts: + tools/virt-host-validate-common.c + tools/virt-host-validate-common.h + - unrelated commit 4653a5194c1 was not backported + +Signed-off-by: Jiri Denemark +Message-Id: <744e4ceb0760fe10ab0d82de24a78c280482d90d.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + tools/virt-host-validate-common.c | 64 ++++++++++++++++++++++++++++++- + tools/virt-host-validate-common.h | 4 ++ + tools/virt-host-validate-qemu.c | 4 ++ + 3 files changed, 70 insertions(+), 2 deletions(-) + +diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c +index bce0f14917..e59469a49b 100644 +--- a/tools/virt-host-validate-common.c ++++ b/tools/virt-host-validate-common.c +@@ -39,7 +39,8 @@ VIR_ENUM_IMPL(virHostValidateCPUFlag, + VIR_HOST_VALIDATE_CPU_FLAG_LAST, + "vmx", + "svm", +- "sie"); ++ "sie", ++ "158"); + + static bool quiet; + +@@ -209,7 +210,8 @@ virBitmapPtr virHostValidateGetCPUFlags(void) + * on the architecture, so check possible prefixes */ + if (!STRPREFIX(line, "flags") && + !STRPREFIX(line, "Features") && +- !STRPREFIX(line, "features")) ++ !STRPREFIX(line, "features") && ++ !STRPREFIX(line, "facilities")) + continue; + + /* fgets() includes the trailing newline in the output buffer, +@@ -411,3 +413,61 @@ int virHostValidateIOMMU(const char *hvname, + virHostMsgPass(); + return 0; + } ++ ++ ++int virHostValidateSecureGuests(const char *hvname, ++ virHostValidateLevel level) ++{ ++ virBitmapPtr flags; ++ bool hasFac158 = false; ++ virArch arch = virArchFromHost(); ++ g_autofree char *cmdline = NULL; ++ static const char *kIBMValues[] = {"y", "Y", "on", "ON", "oN", "On", "1"}; ++ ++ flags = virHostValidateGetCPUFlags(); ++ ++ if (flags && virBitmapIsBitSet(flags, VIR_HOST_VALIDATE_CPU_FLAG_FACILITY_158)) ++ hasFac158 = true; ++ ++ virBitmapFree(flags); ++ ++ virHostMsgCheck(hvname, "%s", _("for secure guest support")); ++ if (ARCH_IS_S390(arch)) { ++ if (hasFac158) { ++ if (!virFileIsDir("/sys/firmware/uv")) { ++ virHostMsgFail(level, "IBM Secure Execution not supported by " ++ "the currently used kernel"); ++ return 0; ++ } ++ ++ if (virFileReadValueString(&cmdline, "/proc/cmdline") < 0) ++ return -1; ++ ++ /* we're prefix matching rather than equality matching here, because ++ * kernel would treat even something like prot_virt='yFOO' as ++ * enabled ++ */ ++ if (virKernelCmdlineMatchParam(cmdline, "prot_virt", kIBMValues, ++ G_N_ELEMENTS(kIBMValues), ++ VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | ++ VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX)) { ++ virHostMsgPass(); ++ return 1; ++ } else { ++ virHostMsgFail(level, ++ "IBM Secure Execution appears to be disabled " ++ "in kernel. Add prot_virt=1 to kernel cmdline " ++ "arguments"); ++ } ++ } else { ++ virHostMsgFail(level, "Hardware or firmware does not provide " ++ "support for IBM Secure Execution"); ++ } ++ } else { ++ virHostMsgFail(level, ++ "Unknown if this platform has Secure Guest support"); ++ return -1; ++ } ++ ++ return 0; ++} +diff --git a/tools/virt-host-validate-common.h b/tools/virt-host-validate-common.h +index 1b7e93e520..1653c9c95b 100644 +--- a/tools/virt-host-validate-common.h ++++ b/tools/virt-host-validate-common.h +@@ -38,6 +38,7 @@ typedef enum { + VIR_HOST_VALIDATE_CPU_FLAG_VMX = 0, + VIR_HOST_VALIDATE_CPU_FLAG_SVM, + VIR_HOST_VALIDATE_CPU_FLAG_SIE, ++ VIR_HOST_VALIDATE_CPU_FLAG_FACILITY_158, + + VIR_HOST_VALIDATE_CPU_FLAG_LAST, + } virHostValidateCPUFlag; +@@ -83,3 +84,6 @@ int virHostValidateCGroupControllers(const char *hvname, + + int virHostValidateIOMMU(const char *hvname, + virHostValidateLevel level); ++ ++int virHostValidateSecureGuests(const char *hvname, ++ virHostValidateLevel level); +diff --git a/tools/virt-host-validate-qemu.c b/tools/virt-host-validate-qemu.c +index ff3c1f0231..b38b0fbd6a 100644 +--- a/tools/virt-host-validate-qemu.c ++++ b/tools/virt-host-validate-qemu.c +@@ -112,5 +112,9 @@ int virHostValidateQEMU(void) + VIR_HOST_VALIDATE_WARN) < 0) + ret = -1; + ++ if (virHostValidateSecureGuests("QEMU", ++ VIR_HOST_VALIDATE_WARN) < 0) ++ ret = -1; ++ + return ret; + } +-- +2.27.0 + diff --git a/SOURCES/libvirt-util-Introduce-a-parser-for-kernel-cmdline-arguments.patch b/SOURCES/libvirt-util-Introduce-a-parser-for-kernel-cmdline-arguments.patch new file mode 100644 index 0000000..3f1b1d3 --- /dev/null +++ b/SOURCES/libvirt-util-Introduce-a-parser-for-kernel-cmdline-arguments.patch @@ -0,0 +1,446 @@ +From 8b59b9dab54c094dfc9bafd9d9f2c18f25877f36 Mon Sep 17 00:00:00 2001 +Message-Id: <8b59b9dab54c094dfc9bafd9d9f2c18f25877f36@dist-git> +From: Paulo de Rezende Pinatti +Date: Wed, 24 Jun 2020 13:16:17 +0200 +Subject: [PATCH] util: Introduce a parser for kernel cmdline arguments +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Introduce two utility functions to parse a kernel command +line string according to the kernel code parsing rules in +order to enable the caller to perform operations such as +verifying whether certain argument=value combinations are +present or retrieving an argument's value. + +Signed-off-by: Paulo de Rezende Pinatti +Signed-off-by: Boris Fiuczynski +Reviewed-by: Erik Skultety +(cherry picked from commit c5fffb959d93b83d87e70b21d19424e9722700b0) + +https://bugzilla.redhat.com/show_bug.cgi?id=1848997 +https://bugzilla.redhat.com/show_bug.cgi?id=1850351 + +Conflicts: + src/util/virutil.c + - unrelated commits db72866310d and ab36f729470 were not + backported + +Signed-off-by: Jiri Denemark +Message-Id: <784fbc062d41f991b6321ac051b05e6c80a470cd.1592996194.git.jdenemar@redhat.com> +Reviewed-by: Ján Tomko +--- + src/libvirt_private.syms | 2 + + src/util/virutil.c | 185 +++++++++++++++++++++++++++++++++++++++ + src/util/virutil.h | 34 +++++++ + tests/utiltest.c | 136 ++++++++++++++++++++++++++++ + 4 files changed, 357 insertions(+) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index a3fe49ae33..9e290c7bdf 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -3395,6 +3395,8 @@ virHexToBin; + virHostGetDRMRenderNode; + virHostHasIOMMU; + virIndexToDiskName; ++virKernelCmdlineMatchParam; ++virKernelCmdlineNextParam; + virMemoryLimitIsSet; + virMemoryLimitTruncate; + virMemoryMaxValue; +diff --git a/src/util/virutil.c b/src/util/virutil.c +index 261b2d2af6..17fd06dbb2 100644 +--- a/src/util/virutil.c ++++ b/src/util/virutil.c +@@ -1673,3 +1673,188 @@ virHostGetDRMRenderNode(void) + VIR_DIR_CLOSE(driDir); + return ret; + } ++ ++ ++static const char *virKernelCmdlineSkipQuote(const char *cmdline, ++ bool *is_quoted) ++{ ++ if (cmdline[0] == '"') { ++ *is_quoted = !(*is_quoted); ++ cmdline++; ++ } ++ return cmdline; ++} ++ ++ ++/** ++ * virKernelCmdlineFindEqual: ++ * @cmdline: target kernel command line string ++ * @is_quoted: indicates whether the string begins with quotes ++ * @res: pointer to the position immediately after the parsed parameter, ++ * can be used in subsequent calls to process further parameters until ++ * the end of the string. ++ * ++ * Iterate over the provided kernel command line string while honoring ++ * the kernel quoting rules and returns the index of the equal sign ++ * separating argument and value. ++ * ++ * Returns 0 for the cases where no equal sign is found or the argument ++ * itself begins with the equal sign (both cases indicating that the ++ * argument has no value). Otherwise, returns the index of the equal ++ * sign in the string. ++ */ ++static size_t virKernelCmdlineFindEqual(const char *cmdline, ++ bool is_quoted, ++ const char **res) ++{ ++ size_t i; ++ size_t equal_index = 0; ++ ++ for (i = 0; cmdline[i]; i++) { ++ if (!(is_quoted) && g_ascii_isspace(cmdline[i])) ++ break; ++ if (equal_index == 0 && cmdline[i] == '=') { ++ equal_index = i; ++ continue; ++ } ++ virKernelCmdlineSkipQuote(cmdline + i, &is_quoted); ++ } ++ *res = cmdline + i; ++ return equal_index; ++} ++ ++ ++static char* virKernelArgNormalize(const char *arg) ++{ ++ return virStringReplace(arg, "_", "-"); ++} ++ ++ ++/** ++ * virKernelCmdlineNextParam: ++ * @cmdline: kernel command line string to be checked for next parameter ++ * @param: pointer to hold retrieved parameter, will be NULL if none found ++ * @val: pointer to hold retrieved value of @param ++ * ++ * Parse the kernel cmdline and store the next parameter in @param ++ * and the value of @param in @val which can be NULL if @param has ++ * no value. In addition returns the address right after @param=@value ++ * for possible further processing. ++ * ++ * Returns a pointer to address right after @param=@val in the ++ * kernel command line, will point to the string's end (NULL) ++ * in case no next parameter is found ++ */ ++const char *virKernelCmdlineNextParam(const char *cmdline, ++ char **param, ++ char **val) ++{ ++ const char *next; ++ int equal_index; ++ bool is_quoted = false; ++ *param = NULL; ++ *val = NULL; ++ ++ virSkipSpaces(&cmdline); ++ cmdline = virKernelCmdlineSkipQuote(cmdline, &is_quoted); ++ equal_index = virKernelCmdlineFindEqual(cmdline, is_quoted, &next); ++ ++ if (next == cmdline) ++ return next; ++ ++ /* param has no value */ ++ if (equal_index == 0) { ++ if (is_quoted && next[-1] == '"') ++ *param = g_strndup(cmdline, next - cmdline - 1); ++ else ++ *param = g_strndup(cmdline, next - cmdline); ++ return next; ++ } ++ ++ *param = g_strndup(cmdline, equal_index); ++ ++ if (cmdline[equal_index + 1] == '"') { ++ is_quoted = true; ++ equal_index++; ++ } ++ ++ if (is_quoted && next[-1] == '"') ++ *val = g_strndup(cmdline + equal_index + 1, ++ next - cmdline - equal_index - 2); ++ else ++ *val = g_strndup(cmdline + equal_index + 1, ++ next - cmdline - equal_index - 1); ++ return next; ++} ++ ++ ++static bool virKernelCmdlineStrCmp(const char *kernel_val, ++ const char *caller_val, ++ virKernelCmdlineFlags flags) ++{ ++ if (flags & VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX) ++ return STRPREFIX(kernel_val, caller_val); ++ return STREQ(kernel_val, caller_val); ++} ++ ++ ++/** ++ * virKernelCmdlineMatchParam: ++ * @cmdline: kernel command line string to be checked for @arg ++ * @arg: kernel command line argument ++ * @values: array of possible values to match @arg ++ * @len_values: size of array, it can be 0 meaning a match will be positive if ++ * the argument has no value. ++ * @flags: bitwise-OR of virKernelCmdlineFlags ++ * ++ * Try to match the provided kernel cmdline string with the provided @arg ++ * and the list @values of possible values according to the matching strategy ++ * defined in @flags. ++ * ++ * ++ * Returns true if a match is found, false otherwise ++ */ ++bool virKernelCmdlineMatchParam(const char *cmdline, ++ const char *arg, ++ const char **values, ++ size_t len_values, ++ virKernelCmdlineFlags flags) ++{ ++ bool match = false; ++ size_t i; ++ const char *next = cmdline; ++ g_autofree char *arg_norm = virKernelArgNormalize(arg); ++ ++ while (next[0] != '\0') { ++ g_autofree char *kparam = NULL; ++ g_autofree char *kparam_norm = NULL; ++ g_autofree char *kval = NULL; ++ ++ next = virKernelCmdlineNextParam(next, &kparam, &kval); ++ ++ if (!kparam) ++ break; ++ ++ kparam_norm = virKernelArgNormalize(kparam); ++ ++ if (STRNEQ(kparam_norm, arg_norm)) ++ continue; ++ ++ if (!kval) { ++ match = (len_values == 0) ? true : false; ++ } else { ++ match = false; ++ for (i = 0; i < len_values; i++) { ++ if (virKernelCmdlineStrCmp(kval, values[i], flags)) { ++ match = true; ++ break; ++ } ++ } ++ } ++ ++ if (match && (flags & VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST)) ++ break; ++ } ++ ++ return match; ++} +diff --git a/src/util/virutil.h b/src/util/virutil.h +index 0dcaff79ac..f1d2ccdd1f 100644 +--- a/src/util/virutil.h ++++ b/src/util/virutil.h +@@ -145,6 +145,40 @@ bool virHostHasIOMMU(void); + + char *virHostGetDRMRenderNode(void) G_GNUC_NO_INLINE; + ++/* Kernel cmdline match and comparison strategy for arg=value pairs */ ++typedef enum { ++ /* substring comparison of argument values */ ++ VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX = 1, ++ ++ /* strict string comparison of argument values */ ++ VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ = 2, ++ ++ /* look for any occurrence of the argument with the expected value, ++ * this should be used when an argument set to the expected value overrides ++ * all the other occurrences of the argument, e.g. when looking for 'arg=1' ++ * in 'arg=0 arg=1 arg=0' the search would succeed with this flag ++ */ ++ VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST = 4, ++ ++ /* look for the last occurrence of argument with the expected value, ++ * this should be used when the last occurrence of the argument overrides ++ * all the other ones, e.g. when looking for 'arg=1' in 'arg=0 arg=1' the ++ * search would succeed with this flag, but in 'arg=1 arg=0' it would not, ++ * because 'arg=0' overrides all the previous occurrences of 'arg' ++ */ ++ VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST = 8, ++} virKernelCmdlineFlags; ++ ++const char *virKernelCmdlineNextParam(const char *cmdline, ++ char **param, ++ char **val); ++ ++bool virKernelCmdlineMatchParam(const char *cmdline, ++ const char *arg, ++ const char **values, ++ size_t len_values, ++ virKernelCmdlineFlags flags); ++ + /** + * VIR_ASSIGN_IS_OVERFLOW: + * @rvalue: value that is checked (evaluated twice) +diff --git a/tests/utiltest.c b/tests/utiltest.c +index 5ae04585cb..2bff7859dc 100644 +--- a/tests/utiltest.c ++++ b/tests/utiltest.c +@@ -254,6 +254,140 @@ testOverflowCheckMacro(const void *data G_GNUC_UNUSED) + } + + ++struct testKernelCmdlineNextParamData ++{ ++ const char *cmdline; ++ const char *param; ++ const char *val; ++ const char *next; ++}; ++ ++static struct testKernelCmdlineNextParamData kEntries[] = { ++ { "arg1 arg2 arg3=val1", "arg1", NULL, " arg2 arg3=val1" }, ++ { "arg1=val1 arg2 arg3=val3 arg4", "arg1", "val1", " arg2 arg3=val3 arg4" }, ++ { "arg1=sub1=val1,sub2=val2 arg3=val3 arg4", "arg1", "sub1=val1,sub2=val2", " arg3=val3 arg4" }, ++ { "arg3=val3 ", "arg3", "val3", " " }, ++ { "arg3=val3", "arg3", "val3", "" }, ++ { "arg-3=val3 arg4", "arg-3", "val3", " arg4" }, ++ { " arg_3=val3 arg4", "arg_3", "val3", " arg4" }, ++ { "arg2=\"value with space\" arg3=val3", "arg2", "value with space", " arg3=val3" }, ++ { " arg2=\"value with space\" arg3=val3", "arg2", "value with space", " arg3=val3" }, ++ { " \"arg2=value with space\" arg3=val3", "arg2", "value with space", " arg3=val3" }, ++ { "arg2=\"val\"ue arg3", "arg2", "val\"ue", " arg3" }, ++ { "arg2=value\" long\" arg3", "arg2", "value\" long\"", " arg3" }, ++ { " \"arg2 with space=value with space\" arg3", "arg2 with space", "value with space", " arg3" }, ++ { " arg2\" with space=val2\" arg3", "arg2\" with space", "val2\"", " arg3" }, ++ { " arg2longer=someval\" long\" arg2=val2", "arg2longer", "someval\" long\"", " arg2=val2" }, ++ { "=val1 arg2=val2", "=val1", NULL, " arg2=val2" }, ++ { " ", NULL, NULL, "" }, ++ { "", NULL, NULL, "" }, ++}; ++ ++static int ++testKernelCmdlineNextParam(const void *data G_GNUC_UNUSED) ++{ ++ const char *next; ++ size_t i; ++ ++ for (i = 0; i < G_N_ELEMENTS(kEntries); ++i) { ++ g_autofree char * param = NULL; ++ g_autofree char * val = NULL; ++ ++ next = virKernelCmdlineNextParam(kEntries[i].cmdline, ¶m, &val); ++ ++ if (STRNEQ_NULLABLE(param, kEntries[i].param) || ++ STRNEQ_NULLABLE(val, kEntries[i].val) || ++ STRNEQ(next, kEntries[i].next)) { ++ VIR_TEST_DEBUG("\nKernel cmdline [%s]", kEntries[i].cmdline); ++ VIR_TEST_DEBUG("Expect param [%s]", kEntries[i].param); ++ VIR_TEST_DEBUG("Actual param [%s]", param); ++ VIR_TEST_DEBUG("Expect value [%s]", kEntries[i].val); ++ VIR_TEST_DEBUG("Actual value [%s]", val); ++ VIR_TEST_DEBUG("Expect next [%s]", kEntries[i].next); ++ VIR_TEST_DEBUG("Actual next [%s]", next); ++ ++ return -1; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++struct testKernelCmdlineMatchData ++{ ++ const char *cmdline; ++ const char *arg; ++ const char *values[2]; ++ virKernelCmdlineFlags flags; ++ bool result; ++}; ++ ++static struct testKernelCmdlineMatchData kMatchEntries[] = { ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"1", "y"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, false }, ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"on", "yes"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, true }, ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"1", "y"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX, true }, ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"a", "b"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST | VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX, false }, ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"on", "yes"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, false }, ++ {"arg1 myarg=no arg2=val2 myarg=yes arg4=val4 myarg=no arg5", "myarg", {"1", "y"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX, false }, ++ {"arg1 myarg=no arg2=val2 arg4=val4 myarg=yes arg5", "myarg", {"on", "yes"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, true }, ++ {"arg1 myarg=no arg2=val2 arg4=val4 myarg=yes arg5", "myarg", {"1", "y"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX, true }, ++ {"arg1 myarg=no arg2=val2 arg4=val4 myarg arg5", "myarg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, true }, ++ {"arg1 myarg arg2=val2 arg4=val4 myarg=yes arg5", "myarg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST, true }, ++ {"arg1 myarg arg2=val2 arg4=val4 myarg=yes arg5", "myarg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, false }, ++ {"arg1 my-arg=no arg2=val2 arg4=val4 my_arg=yes arg5", "my-arg", {"on", "yes"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, true }, ++ {"arg1 my-arg=no arg2=val2 arg4=val4 my_arg=yes arg5 ", "my-arg", {"on", "yes"}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, true }, ++ {"arg1 my-arg arg2=val2 arg4=val4 my_arg=yes arg5", "my_arg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST, true }, ++ {"arg1 my-arg arg2=val2 arg4=val4 my-arg=yes arg5", "my_arg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST, true }, ++ {"=arg1 my-arg arg2=val2 arg4=val4 my-arg=yes arg5", "my_arg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST, true }, ++ {"my-arg =arg1 arg2=val2 arg4=val4 my-arg=yes arg5", "=arg1", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, true }, ++ {"arg1 arg2=val2 myarg=sub1=val1 arg5", "myarg", {"sub1=val1", NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, true }, ++ {"arg1 arg2=", "arg2", {"", ""}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST | VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ, true }, ++ {" ", "myarg", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, false }, ++ {"", "", {NULL, NULL}, VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST, false }, ++}; ++ ++ ++static int ++testKernelCmdlineMatchParam(const void *data G_GNUC_UNUSED) ++{ ++ bool result; ++ size_t i, lenValues; ++ ++ for (i = 0; i < G_N_ELEMENTS(kMatchEntries); ++i) { ++ if (kMatchEntries[i].values[0] == NULL) ++ lenValues = 0; ++ else ++ lenValues = G_N_ELEMENTS(kMatchEntries[i].values); ++ ++ result = virKernelCmdlineMatchParam(kMatchEntries[i].cmdline, ++ kMatchEntries[i].arg, ++ kMatchEntries[i].values, ++ lenValues, ++ kMatchEntries[i].flags); ++ ++ if (result != kMatchEntries[i].result) { ++ VIR_TEST_DEBUG("\nKernel cmdline [%s]", kMatchEntries[i].cmdline); ++ VIR_TEST_DEBUG("Kernel argument [%s]", kMatchEntries[i].arg); ++ VIR_TEST_DEBUG("Kernel values [%s] [%s]", kMatchEntries[i].values[0], ++ kMatchEntries[i].values[1]); ++ if (kMatchEntries[i].flags & VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX) ++ VIR_TEST_DEBUG("Flag [VIR_KERNEL_CMDLINE_FLAGS_CMP_PREFIX]"); ++ if (kMatchEntries[i].flags & VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ) ++ VIR_TEST_DEBUG("Flag [VIR_KERNEL_CMDLINE_FLAGS_CMP_EQ]"); ++ if (kMatchEntries[i].flags & VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST) ++ VIR_TEST_DEBUG("Flag [VIR_KERNEL_CMDLINE_FLAGS_SEARCH_FIRST]"); ++ if (kMatchEntries[i].flags & VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST) ++ VIR_TEST_DEBUG("Flag [VIR_KERNEL_CMDLINE_FLAGS_SEARCH_LAST]"); ++ VIR_TEST_DEBUG("Expect result [%d]", kMatchEntries[i].result); ++ VIR_TEST_DEBUG("Actual result [%d]", result); ++ ++ return -1; ++ } ++ } ++ ++ return 0; ++} + + + static int +@@ -277,6 +411,8 @@ mymain(void) + DO_TEST(ParseVersionString); + DO_TEST(RoundValueToPowerOfTwo); + DO_TEST(OverflowCheckMacro); ++ DO_TEST(KernelCmdlineNextParam); ++ DO_TEST(KernelCmdlineMatchParam); + + return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE; + } +-- +2.27.0 + diff --git a/SOURCES/libvirt-util-Move-virIsDevMapperDevice-to-virdevmapper.c.patch b/SOURCES/libvirt-util-Move-virIsDevMapperDevice-to-virdevmapper.c.patch new file mode 100644 index 0000000..53a265b --- /dev/null +++ b/SOURCES/libvirt-util-Move-virIsDevMapperDevice-to-virdevmapper.c.patch @@ -0,0 +1,186 @@ +From 16b26f917f445c837127c786c7b641e1e38f93fe Mon Sep 17 00:00:00 2001 +Message-Id: <16b26f917f445c837127c786c7b641e1e38f93fe@dist-git> +From: Michal Privoznik +Date: Fri, 19 Jun 2020 17:44:08 +0200 +Subject: [PATCH] util: Move virIsDevMapperDevice() to virdevmapper.c +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When introducing virdevmapper.c (in v4.3.0-rc1~427) I didn't +realize there is a function that calls in devmapper. The function +is called virIsDevMapperDevice() and lives in virutil.c. Now that +we have a special file for handling devmapper move it there. + +Signed-off-by: Michal Privoznik +Reviewed-by: Jiri Denemark +(cherry picked from commit dfa0e118f745fe3f4fe95975c6100f0fc6d788be) + +https://bugzilla.redhat.com/show_bug.cgi?id=1849095 + +Conflicts: +- src/util/virutil.c - Context, becasue v6.0.0-206-gfc920f704c is + not backported. + +Signed-off-by: Michal Privoznik +Message-Id: <84be146c2e7fc097da7189a7bf270577ffba18b2.1592581422.git.mprivozn@redhat.com> +Reviewed-by: Ján Tomko +--- + src/libvirt_private.syms | 2 +- + src/storage/parthelper.c | 2 +- + src/storage/storage_backend_disk.c | 1 + + src/util/virdevmapper.c | 24 ++++++++++++++++++++++++ + src/util/virdevmapper.h | 3 +++ + src/util/virutil.c | 24 ------------------------ + src/util/virutil.h | 2 -- + 7 files changed, 30 insertions(+), 28 deletions(-) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index ac5527ef01..a3fe49ae33 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -1871,6 +1871,7 @@ virDBusSetSharedBus; + + # util/virdevmapper.h + virDevMapperGetTargets; ++virIsDevMapperDevice; + + + # util/virdnsmasq.h +@@ -3394,7 +3395,6 @@ virHexToBin; + virHostGetDRMRenderNode; + virHostHasIOMMU; + virIndexToDiskName; +-virIsDevMapperDevice; + virMemoryLimitIsSet; + virMemoryLimitTruncate; + virMemoryMaxValue; +diff --git a/src/storage/parthelper.c b/src/storage/parthelper.c +index 761a7f93fc..812e90d3cb 100644 +--- a/src/storage/parthelper.c ++++ b/src/storage/parthelper.c +@@ -36,10 +36,10 @@ + #include + #include + +-#include "virutil.h" + #include "virfile.h" + #include "virstring.h" + #include "virgettext.h" ++#include "virdevmapper.h" + + /* we don't need to include the full internal.h just for this */ + #define STREQ(a, b) (strcmp(a, b) == 0) +diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c +index 00e8b1aa13..90c57af59b 100644 +--- a/src/storage/storage_backend_disk.c ++++ b/src/storage/storage_backend_disk.c +@@ -31,6 +31,7 @@ + #include "virfile.h" + #include "configmake.h" + #include "virstring.h" ++#include "virdevmapper.h" + + #define VIR_FROM_THIS VIR_FROM_STORAGE + +diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c +index f000979ce0..23b2a16057 100644 +--- a/src/util/virdevmapper.c ++++ b/src/util/virdevmapper.c +@@ -214,3 +214,27 @@ virDevMapperGetTargets(const char *path G_GNUC_UNUSED, + return -1; + } + #endif /* ! WITH_DEVMAPPER */ ++ ++ ++#if WITH_DEVMAPPER ++bool ++virIsDevMapperDevice(const char *dev_name) ++{ ++ struct stat buf; ++ ++ if (!stat(dev_name, &buf) && ++ S_ISBLK(buf.st_mode) && ++ dm_is_dm_major(major(buf.st_rdev))) ++ return true; ++ ++ return false; ++} ++ ++#else /* ! WITH_DEVMAPPER */ ++ ++bool ++virIsDevMapperDevice(const char *dev_name G_GNUC_UNUSED) ++{ ++ return false; ++} ++#endif /* ! WITH_DEVMAPPER */ +diff --git a/src/util/virdevmapper.h b/src/util/virdevmapper.h +index 87bbc63cfd..834900692e 100644 +--- a/src/util/virdevmapper.h ++++ b/src/util/virdevmapper.h +@@ -25,3 +25,6 @@ + int + virDevMapperGetTargets(const char *path, + char ***devPaths) G_GNUC_NO_INLINE; ++ ++bool ++virIsDevMapperDevice(const char *dev_name) ATTRIBUTE_NONNULL(1); +diff --git a/src/util/virutil.c b/src/util/virutil.c +index 4198473fce..261b2d2af6 100644 +--- a/src/util/virutil.c ++++ b/src/util/virutil.c +@@ -37,10 +37,6 @@ + #include + #include + +-#if WITH_DEVMAPPER +-# include +-#endif +- + #include + #ifdef HAVE_GETPWUID_R + # include +@@ -1327,26 +1323,6 @@ void virWaitForDevices(void) + ignore_value(virCommandRun(cmd, &exitstatus)); + } + +-#if WITH_DEVMAPPER +-bool +-virIsDevMapperDevice(const char *dev_name) +-{ +- struct stat buf; +- +- if (!stat(dev_name, &buf) && +- S_ISBLK(buf.st_mode) && +- dm_is_dm_major(major(buf.st_rdev))) +- return true; +- +- return false; +-} +-#else +-bool virIsDevMapperDevice(const char *dev_name G_GNUC_UNUSED) +-{ +- return false; +-} +-#endif +- + bool + virValidateWWN(const char *wwn) + { +diff --git a/src/util/virutil.h b/src/util/virutil.h +index 58c45a6447..0dcaff79ac 100644 +--- a/src/util/virutil.h ++++ b/src/util/virutil.h +@@ -116,8 +116,6 @@ bool virDoesUserExist(const char *name); + bool virDoesGroupExist(const char *name); + + +-bool virIsDevMapperDevice(const char *dev_name) ATTRIBUTE_NONNULL(1); +- + bool virValidateWWN(const char *wwn); + + int virGetDeviceID(const char *path, +-- +2.27.0 + diff --git a/SOURCES/libvirt-virDevMapperGetTargetsImpl-Check-for-dm-major-properly.patch b/SOURCES/libvirt-virDevMapperGetTargetsImpl-Check-for-dm-major-properly.patch new file mode 100644 index 0000000..86c9233 --- /dev/null +++ b/SOURCES/libvirt-virDevMapperGetTargetsImpl-Check-for-dm-major-properly.patch @@ -0,0 +1,69 @@ +From e0f87dd97d0061eb2ea22b025c8bbf3310c78290 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Fri, 19 Jun 2020 17:44:09 +0200 +Subject: [PATCH] virDevMapperGetTargetsImpl: Check for dm major properly +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In v6.4.0-rc1~143 I've introduced a check that is supposed to +return from the function early, if given path is not a dm target. +While the idea is still valid, the implementation had a flaw. +It calls stat() over given path and the uses major(sb.st_dev) to +learn the major of the device. This is then passed to +dm_is_dm_major() which returns true or false depending whether +the device is under devmapper's control or not. + +The problem with this approach is in how the major of the device +is obtained - paths managed by devmapper are special files and +thus we want to be using st_rdev instead of st_dev to obtain the +major number. Well, that's what virIsDevMapperDevice() does +already so might as well us that. + +Fixes: 01626c668ecfbe465d18799ac4628e6127ea1d47 +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1839992 + +Signed-off-by: Michal Privoznik +Reviewed-by: Jiri Denemark +(cherry picked from commit d53ab9f54ea8d6cc1e5c3b04c4eb743cae9518ce) + +https://bugzilla.redhat.com/show_bug.cgi?id=1849095 + +Signed-off-by: Michal Privoznik +Message-Id: +Reviewed-by: Ján Tomko +--- + src/util/virdevmapper.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c +index 23b2a16057..c346432d86 100644 +--- a/src/util/virdevmapper.c ++++ b/src/util/virdevmapper.c +@@ -66,7 +66,6 @@ virDevMapperGetTargetsImpl(const char *path, + char ***devPaths_ret, + unsigned int ttl) + { +- struct stat sb; + struct dm_task *dmt = NULL; + struct dm_deps *deps; + struct dm_info info; +@@ -85,13 +84,7 @@ virDevMapperGetTargetsImpl(const char *path, + return ret; + } + +- if (stat(path, &sb) < 0) { +- if (errno == ENOENT) +- return 0; +- return -1; +- } +- +- if (!dm_is_dm_major(major(sb.st_dev))) ++ if (!virIsDevMapperDevice(path)) + return 0; + + if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) { +-- +2.27.0 + diff --git a/SOURCES/libvirt-virDevMapperGetTargetsImpl-quit-early-if-device-is-not-a-devmapper-target.patch b/SOURCES/libvirt-virDevMapperGetTargetsImpl-quit-early-if-device-is-not-a-devmapper-target.patch new file mode 100644 index 0000000..c645ad1 --- /dev/null +++ b/SOURCES/libvirt-virDevMapperGetTargetsImpl-quit-early-if-device-is-not-a-devmapper-target.patch @@ -0,0 +1,68 @@ +From 7ea7ef99b8d3f9a7d83ea12a843d786b182f24e3 Mon Sep 17 00:00:00 2001 +Message-Id: <7ea7ef99b8d3f9a7d83ea12a843d786b182f24e3@dist-git> +From: Michal Privoznik +Date: Mon, 11 May 2020 16:56:48 +0200 +Subject: [PATCH] virDevMapperGetTargetsImpl: quit early if device is not a + devmapper target +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +As suggested in the linked bug, libvirt should firstly check +whether the major number of the device is device mapper major. +Because if it isn't subsequent DM_DEVICE_DEPS task may not only +fail, but also yield different results. In the bugzilla this is +demonstrated by creating a devmapper target named 'loop0' and +then creating loop target /dev/loop0. When the latter is then +passed to a domain, our virDevMapperGetTargetsImpl() function +blindly asks devmapper to provide target dependencies for +/dev/loop0 and because of the way devmapper APIs work, it will +'sanitize' the input by using the last component only which is +'loop0' and thus return different results than expected. + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1823976 + +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 01626c668ecfbe465d18799ac4628e6127ea1d47) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1834353 + +Signed-off-by: Michal Privoznik +Message-Id: +Reviewed-by: Jiri Denemark +--- + src/util/virdevmapper.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c +index cc6a099faa..f000979ce0 100644 +--- a/src/util/virdevmapper.c ++++ b/src/util/virdevmapper.c +@@ -66,6 +66,7 @@ virDevMapperGetTargetsImpl(const char *path, + char ***devPaths_ret, + unsigned int ttl) + { ++ struct stat sb; + struct dm_task *dmt = NULL; + struct dm_deps *deps; + struct dm_info info; +@@ -84,6 +85,15 @@ virDevMapperGetTargetsImpl(const char *path, + return ret; + } + ++ if (stat(path, &sb) < 0) { ++ if (errno == ENOENT) ++ return 0; ++ return -1; ++ } ++ ++ if (!dm_is_dm_major(major(sb.st_dev))) ++ return 0; ++ + if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) { + if (errno == ENOENT || errno == ENODEV) { + /* It's okay. Kernel is probably built without +-- +2.26.2 + diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec index 5e65b4e..ed004d6 100644 --- a/SPECS/libvirt.spec +++ b/SPECS/libvirt.spec @@ -219,7 +219,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 6.0.0 -Release: 17%{?dist}%{?extra_release} +Release: 25%{?dist}%{?extra_release} License: LGPLv2+ URL: https://libvirt.org/ @@ -530,6 +530,132 @@ Patch298: libvirt-qemuDomainSnapshotDiskPrepareOne-Fix-logic-of-relative-backing Patch299: libvirt-qemuCheckpointCreateXML-Check-VM-liveness-first.patch Patch300: libvirt-qemu-checkpoint-Allow-checkpoint-redefine-for-offline-VMs.patch Patch301: libvirt-virDomainCheckpointRedefinePrep-Set-current-checkpoint-if-there-isn-t-any.patch +Patch302: libvirt-qemu-avoid-launching-non-x86-guests-with-APIC-EOI-setting.patch +Patch303: libvirt-tests-qemu-add-disk-error-policy-tests-for-s390x.patch +Patch304: libvirt-qemu-add-QEMU_CAPS_STORAGE_WERROR.patch +Patch305: libvirt-qemu-use-QEMU_CAPS_STORAGE_WERROR-for-disk-error-attributes.patch +Patch306: libvirt-qemuMonitorTestProcessCommandDefaultValidate-Output-validator-output-to-stderr.patch +Patch307: libvirt-qemumonitorjsontest-AddNetdev-Use-real-variant.patch +Patch308: libvirt-qemu-new-capabilities-flag-pcie-root-port.hotplug.patch +Patch309: libvirt-conf-new-attribute-hotplug-for-pci-controllers.patch +Patch310: libvirt-qemu-hook-up-pcie-root-port-hotplug-off-option.patch +Patch311: libvirt-docs-mention-hotplug-off-in-news.xml.patch +Patch312: libvirt-conf-add-new-PCI_CONNECT-flag-AUTOASSIGN.patch +Patch313: libvirt-conf-qemu-s-VIR_PCI_CONNECT_HOTPLUGGABLE-VIR_PCI_CONNECT_AUTOASSIGN-g.patch +Patch314: libvirt-conf-simplify-logic-when-checking-for-AUTOASSIGN-PCI-addresses.patch +Patch315: libvirt-qemu-conf-set-HOTPLUGGABLE-connect-flag-during-PCI-address-set-init.patch +Patch316: libvirt-conf-check-HOTPLUGGABLE-connect-flag-when-validating-a-PCI-address.patch +Patch317: libvirt-conf-during-PCI-hotplug-require-that-the-controller-support-hotplug.patch +Patch318: libvirt-qemu-fix-detection-of-vCPU-pids-when-multiple-dies-are-present.patch +Patch319: libvirt-storage_file-create-Create-new-images-with-write-permission-bit.patch +Patch320: libvirt-qemuBlockStorageSourceCreateFormat-Force-write-access-when-formatting-images.patch +Patch321: libvirt-qemu-snapshot-Allow-snapshots-of-read-only-disks-when-we-can-create-them.patch +Patch322: libvirt-qemu-blockcopy-Allow-copy-of-read-only-disks-with-blockdev.patch +Patch323: libvirt-virDevMapperGetTargetsImpl-quit-early-if-device-is-not-a-devmapper-target.patch +Patch324: libvirt-qemu-only-stop-external-devices-after-the-domain.patch +Patch325: libvirt-qemu-fixing-auto-detecting-binary-in-domain-capabilities.patch +Patch326: libvirt-qemu-prevent-attempts-to-detach-a-device-on-a-controller-with-hotplug-off.patch +Patch327: libvirt-cpu-Change-control-flow-in-virCPUUpdateLive.patch +Patch328: libvirt-cpu_x86-Prepare-virCPUx86UpdateLive-for-easier-extension.patch +Patch329: libvirt-cpu-Honor-check-full-for-host-passthrough-CPUs.patch +Patch330: libvirt-cputest-Add-data-for-Intel-R-Core-TM-i7-8550U-CPU-without-TSX.patch +Patch331: libvirt-cpu_map-Add-more-noTSX-x86-CPU-models.patch +Patch332: libvirt-cpu_map-Add-decode-element-to-x86-CPU-model-definitions.patch +Patch333: libvirt-cpu_x86-Honor-CPU-models-decode-element.patch +Patch334: libvirt-cpu_map-Don-t-use-new-noTSX-models-for-host-model-CPUs.patch +Patch335: libvirt-cpu_x86-Drop-noTSX-hint-for-incompatible-CPUs.patch +Patch336: libvirt-cpu_x86-Use-glib-allocation-for-virCPU-x86-Data.patch +Patch337: libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Vendor.patch +Patch338: libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Feature.patch +Patch339: libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Model.patch +Patch340: libvirt-cpu_x86-Use-glib-allocation-for-virCPUx86Map.patch +Patch341: libvirt-cpu_x86-Use-glib-allocation-in-virCPUx86GetModels.patch +Patch342: libvirt-cpu_x86-Use-g_auto-in-x86DataToCPU.patch +Patch343: libvirt-cpu_x86-Use-g_auto-in-x86VendorParse.patch +Patch344: libvirt-cpu_x86-Use-g_auto-in-x86FeatureParse.patch +Patch345: libvirt-cpu_x86-Use-g_auto-in-x86ModelFromCPU.patch +Patch346: libvirt-cpu_x86-Use-g_auto-in-x86ModelParse.patch +Patch347: libvirt-cpu_x86-Use-g_auto-in-virCPUx86LoadMap.patch +Patch348: libvirt-cpu_x86-Use-g_auto-in-virCPUx86DataParse.patch +Patch349: libvirt-cpu_x86-Use-g_auto-in-x86Compute.patch +Patch350: libvirt-cpu_x86-Use-g_auto-in-virCPUx86Compare.patch +Patch351: libvirt-cpu_x86-Use-g_auto-in-x86Decode.patch +Patch352: libvirt-cpu_x86-Use-g_auto-in-x86EncodePolicy.patch +Patch353: libvirt-cpu_x86-Use-g_auto-in-x86Encode.patch +Patch354: libvirt-cpu_x86-Use-g_auto-in-virCPUx86CheckFeature.patch +Patch355: libvirt-cpu_x86-Use-g_auto-in-virCPUx86GetHost.patch +Patch356: libvirt-cpu_x86-Use-g_auto-in-virCPUx86Baseline.patch +Patch357: libvirt-cpu_x86-Use-g_auto-in-x86UpdateHostModel.patch +Patch358: libvirt-cpu_x86-Use-g_auto-in-virCPUx86Update.patch +Patch359: libvirt-cpu_x86-Use-g_auto-in-virCPUx86UpdateLive.patch +Patch360: libvirt-cpu_x86-Use-g_auto-in-virCPUx86Translate.patch +Patch361: libvirt-cpu_x86-Use-g_auto-in-virCPUx86ExpandFeatures.patch +Patch362: libvirt-cpu_x86-Use-g_auto-in-virCPUx86CopyMigratable.patch +Patch363: libvirt-cpu_x86-Move-and-rename-x86ModelCopySignatures.patch +Patch364: libvirt-cpu_x86-Move-and-rename-x86ModelHasSignature.patch +Patch365: libvirt-cpu_x86-Move-and-rename-x86FormatSignatures.patch +Patch366: libvirt-cpu_x86-Introduce-virCPUx86SignaturesFree.patch +Patch367: libvirt-cpu_x86-Introduce-virCPUx86SignatureFromCPUID.patch +Patch368: libvirt-cpu_x86-Replace-32b-signatures-in-virCPUx86Model-with-a-struct.patch +Patch369: libvirt-cpu_x86-Don-t-check-return-value-of-x86ModelCopy.patch +Patch370: libvirt-cpu_x86-Add-support-for-stepping-part-of-CPU-signature.patch +Patch371: libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Platinum-9242-CPU.patch +Patch372: libvirt-cputest-Add-data-for-Intel-R-Xeon-R-Gold-6130-CPU.patch +Patch373: libvirt-cpu_map-Distinguish-Cascadelake-Server-from-Skylake-Server.patch +Patch374: libvirt-cputest-Add-data-for-Cooperlake-CPU.patch +Patch375: libvirt-cpu_map-Add-pschange-mc-no-bit-in-IA32_ARCH_CAPABILITIES-MSR.patch +Patch376: libvirt-cpu_map-Add-Cooperlake-x86-CPU-model.patch +Patch377: libvirt-cpu_map-Distribute-x86_Cooperlake.xml.patch +Patch378: libvirt-qemu-Refuse-to-use-ps2-on-machines-that-do-not-have-this-bus.patch +Patch379: libvirt-nodedev-fix-race-in-API-usage-vs-initial-device-enumeration.patch +Patch380: libvirt-qemu-backup-Fix-handling-of-backing-store-for-backup-target-images.patch +Patch381: libvirt-qemu-backup-Split-up-code-traversing-checkpoint-list-looking-for-bitmaps.patch +Patch382: libvirt-qemu-backup-Fix-backup-of-disk-skipped-in-an-intermediate-checkpoint.patch +Patch383: libvirt-conf-backup-Store-incremental-backup-checkpoint-name-per-disk.patch +Patch384: libvirt-qemu-backup-Move-fetching-of-checkpoint-list-for-incremental-backup.patch +Patch385: libvirt-qemublocktest-Add-empty-test-case-for-bitmaps.patch +Patch386: libvirt-qemublocktest-Add-empty-case-for-incremental-backup-test.patch +Patch387: libvirt-qemublocktest-Add-empty-case-for-checkpoint-deletion.patch +Patch388: libvirt-qemublocktest-Add-empty-case-for-blockcopy-bitmap-handling-test.patch +Patch389: libvirt-qemublocktest-Add-empty-case-for-checkpoint-bitmap-handling.patch +Patch390: libvirt-qemublocktest-Disable-testcases-for-all-bitmap-handling.patch +Patch391: libvirt-qemublocktest-Delete-synthetic-bitmap-test-cases.patch +Patch392: libvirt-qemublocktest-Extract-printing-of-nodename-list.patch +Patch393: libvirt-qemu-checkpoint-Don-t-chain-bitmaps-for-checkpoints.patch +Patch394: libvirt-qemublocktest-Replace-basic-bitmap-detection-test-case-data.patch +Patch395: libvirt-qemublocktest-Replace-snapshots-bitmap-detection-test-case-data.patch +Patch396: libvirt-qemuBlockBitmapChainIsValid-Adjust-to-new-semantics-of-bitmaps.patch +Patch397: libvirt-qemublocktest-Re-add-bitmap-validation-for-basic-and-snapshots-cases.patch +Patch398: libvirt-qemublocktest-Add-new-synthetic-bitmap-detection-and-validation-test-case.patch +Patch399: libvirt-qemu-checkpoint-Don-t-merge-checkpoints-during-deletion.patch +Patch400: libvirt-qemublocktest-Rename-TEST_CHECKPOINT_DELETE_MERGE-to-TEST_CHECKPOINT_DELETE.patch +Patch401: libvirt-qemublocktest-Re-introduce-testing-of-checkpoint-deletion.patch +Patch402: libvirt-qemu-block-Add-universal-helper-for-merging-dirty-bitmaps-for-all-scenarios.patch +Patch403: libvirt-qemu-backup-Rewrite-backup-bitmap-handling-to-the-new-bitmap-semantics.patch +Patch404: libvirt-qemublocktest-Add-basic-tests-for-backup-bitmap-handling.patch +Patch405: libvirt-qemublocktest-Add-snapshots-tests-for-backup-bitmap-handling.patch +Patch406: libvirt-qemu-Rewrite-bitmap-handling-for-block-commit.patch +Patch407: libvirt-qemublocktest-Add-basic-tests-for-commit-bitmap-handling.patch +Patch408: libvirt-qemublocktest-Add-snapshots-tests-for-block-commit-bitmap-handling.patch +Patch409: libvirt-qemu-blockjob-Remove-disabledBitmapsBase-field-from-commit-job-private-data.patch +Patch410: libvirt-qemu-Rewrite-bitmap-handling-for-block-copy.patch +Patch411: libvirt-qemublocktest-Add-test-cases-for-handling-bitmaps-during-block-copy.patch +Patch412: libvirt-kbase-Add-document-outlining-internals-of-incremental-backup-in-qemu.patch +Patch413: libvirt-qemuBackupBegin-Don-t-leak-def-on-early-failures.patch +Patch414: libvirt-qemu-backup-Initialize-store-source-properly-and-just-once.patch +Patch415: libvirt-qemuBackupDiskStarted-Fix-improper-dereference-of-array.patch +Patch416: libvirt-qemuBackupDiskDataCleanupOne-Don-t-exit-early-when-the-job-has-started.patch +Patch417: libvirt-qemuBackupDiskDataCleanupOne-Free-incrementalBitmap.patch +Patch418: libvirt-util-Move-virIsDevMapperDevice-to-virdevmapper.c.patch +Patch419: libvirt-virDevMapperGetTargetsImpl-Check-for-dm-major-properly.patch +Patch420: libvirt-conf-Don-t-format-http-cookies-unless-VIR_DOMAIN_DEF_FORMAT_SECURE-is-used.patch +Patch421: libvirt-util-Introduce-a-parser-for-kernel-cmdline-arguments.patch +Patch422: libvirt-qemu-Check-if-s390-secure-guest-support-is-enabled.patch +Patch423: libvirt-qemu-Check-if-AMD-secure-guest-support-is-enabled.patch +Patch424: libvirt-tools-Secure-guest-check-on-s390-in-virt-host-validate.patch +Patch425: libvirt-tools-Secure-guest-check-for-AMD-in-virt-host-validate.patch +Patch426: libvirt-docs-Update-AMD-launch-secure-description.patch +Patch427: libvirt-docs-Describe-protected-virtualization-guest-setup.patch Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} @@ -2306,6 +2432,29 @@ exit 0 %changelog +* Wed Jun 24 2020 Jiri Denemark - 6.0.0-25 +- Upgrade components in virt:rhel module:stream for RHEL-8.3 release (rhbz#1828317) +- conf: Don't format http cookies unless VIR_DOMAIN_DEF_FORMAT_SECURE is used (CVE-2020-14301) +- util: Introduce a parser for kernel cmdline arguments (rhbz#1848997) +- qemu: Check if s390 secure guest support is enabled (rhbz#1848997) +- qemu: Check if AMD secure guest support is enabled (rhbz#1848997) +- tools: Secure guest check on s390 in virt-host-validate (rhbz#1848997) +- tools: Secure guest check for AMD in virt-host-validate (rhbz#1848997) +- docs: Update AMD launch secure description (rhbz#1848997) +- docs: Describe protected virtualization guest setup (rhbz#1848997) + +* Fri Jun 19 2020 Danilo C. L. de Paula - 6.0.0 +- Resolves: bz#1828317 +(Upgrade components in virt:rhel module:stream for RHEL-8.3 release) + +* Tue Jun 09 2020 Danilo C. L. de Paula - 6.0.0 +- Resolves: bz#1810193 +(Upgrade components in virt:rhel module:stream for RHEL-8.3 release) + +* Fri Jun 05 2020 Danilo C. L. de Paula - 6.0.0 +- Resolves: bz#1810193 +(Upgrade components in virt:rhel module:stream for RHEL-8.3 release) + * Mon Apr 27 2020 Danilo C. L. de Paula - 6.0.0 - Resolves: bz#1810193 (Upgrade components in virt:rhel module:stream for RHEL-8.3 release)