From e043cfc8572c5b4478a3e16a7c05ccb5f499e290 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Tue, 17 Feb 2026 14:58:02 +0100 Subject: [PATCH] libvirt-11.10.0-9.el10 - qemu: capabilities: Probe properties of 'scsi-block' and 'scsi-generic' devices (RHEL-135115) - qemu: capabilities: Introduce QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR (RHEL-135115) - RHEL-ONLY: backport test data for 'migrate-pr' capability of 'scsi-block' (RHEL-135115) - qemu: Implement support for persistent reservation migration control (RHEL-135115) - qemu: Extract disk setup done via QMP into a separate helper (RHEL-131335) - qemu: process: Rename 'qemuProcessSetupDiskThrottling' to 'qemuProcessSetupDisks' (RHEL-131335) - qemu: monitor: Extract block latency histogram stats into 'qemuBlockStats' (RHEL-131335) - Expose latency histograms via 'virConnectGetAllDomainStats' (RHEL-131335) - qemu: monitor: Add handlers for 'block-latency-histogram-set' (RHEL-131335) - docs: formatdomain: Fix indentation of docs for element (RHEL-131335) - docs: formatdomain: Reword section about the '' element under disk driver (RHEL-131335) - Introduce support for disk operation latency histogram collection (RHEL-131335) - qemu: Setup disk latency histograms on startup/hotplug/update (RHEL-131335) Resolves: RHEL-131335, RHEL-135115 --- ...rams-via-virConnectGetAllDomainStats.patch | 248 + ...eration-latency-histogram-collection.patch | 422 + ...-migrate-pr-capability-of-scsi-block.patch | 125 + ...s-for-disk-driver-statistics-element.patch | 62 + ...statistics-element-under-disk-driver.patch | 51 + ...-done-via-QMP-into-a-separate-helper.patch | 144 + ...istent-reservation-migration-control.patch | 220 + ...histograms-on-startup-hotplug-update.patch | 132 + ...MU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch | 58 + ...-scsi-block-and-scsi-generic-devices.patch | 7714 +++++++++++++++++ ...lers-for-block-latency-histogram-set.patch | 182 + ...-histogram-stats-into-qemuBlockStats.patch | 168 + ...kThrottling-to-qemuProcessSetupDisks.patch | 62 + libvirt.spec | 30 +- 14 files changed, 9617 insertions(+), 1 deletion(-) create mode 100644 libvirt-Expose-latency-histograms-via-virConnectGetAllDomainStats.patch create mode 100644 libvirt-Introduce-support-for-disk-operation-latency-histogram-collection.patch create mode 100644 libvirt-RHEL-ONLY-backport-test-data-for-migrate-pr-capability-of-scsi-block.patch create mode 100644 libvirt-docs-formatdomain-Fix-indentation-of-docs-for-disk-driver-statistics-element.patch create mode 100644 libvirt-docs-formatdomain-Reword-section-about-the-statistics-element-under-disk-driver.patch create mode 100644 libvirt-qemu-Extract-disk-setup-done-via-QMP-into-a-separate-helper.patch create mode 100644 libvirt-qemu-Implement-support-for-persistent-reservation-migration-control.patch create mode 100644 libvirt-qemu-Setup-disk-latency-histograms-on-startup-hotplug-update.patch create mode 100644 libvirt-qemu-capabilities-Introduce-QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch create mode 100644 libvirt-qemu-capabilities-Probe-properties-of-scsi-block-and-scsi-generic-devices.patch create mode 100644 libvirt-qemu-monitor-Add-handlers-for-block-latency-histogram-set.patch create mode 100644 libvirt-qemu-monitor-Extract-block-latency-histogram-stats-into-qemuBlockStats.patch create mode 100644 libvirt-qemu-process-Rename-qemuProcessSetupDiskThrottling-to-qemuProcessSetupDisks.patch diff --git a/libvirt-Expose-latency-histograms-via-virConnectGetAllDomainStats.patch b/libvirt-Expose-latency-histograms-via-virConnectGetAllDomainStats.patch new file mode 100644 index 0000000..fd28497 --- /dev/null +++ b/libvirt-Expose-latency-histograms-via-virConnectGetAllDomainStats.patch @@ -0,0 +1,248 @@ +From 48f5933f6cd6f53997823cfe2a277b822b00264f Mon Sep 17 00:00:00 2001 +Message-ID: <48f5933f6cd6f53997823cfe2a277b822b00264f.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 29 Jan 2026 18:10:26 +0100 +Subject: [PATCH] Expose latency histograms via 'virConnectGetAllDomainStats' + +Add documentation and constants for constructing the stats field names +for latency histograms and expose them in the qemu driver: + +Example: + + block.1.latency_histogram.read.bin.count=9 + block.1.latency_histogram.read.bin.0.start=0 + block.1.latency_histogram.read.bin.0.value=0 + block.1.latency_histogram.read.bin.1.start=10 + block.1.latency_histogram.read.bin.1.value=0 + block.1.latency_histogram.read.bin.2.start=100 + block.1.latency_histogram.read.bin.2.value=0 + block.1.latency_histogram.read.bin.3.start=1000 + block.1.latency_histogram.read.bin.3.value=1047 + block.1.latency_histogram.read.bin.4.start=10000 + block.1.latency_histogram.read.bin.4.value=2131 + block.1.latency_histogram.read.bin.5.start=100000 + block.1.latency_histogram.read.bin.5.value=0 + block.1.latency_histogram.read.bin.6.start=1000000 + block.1.latency_histogram.read.bin.6.value=0 + block.1.latency_histogram.read.bin.7.start=10000000 + block.1.latency_histogram.read.bin.7.value=0 + block.1.latency_histogram.read.bin.8.start=100000000 + block.1.latency_histogram.read.bin.8.value=0 + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 237e49127a9390f054e33e689ba9db1587cdc9f1) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + docs/manpages/virsh.rst | 7 ++ + include/libvirt/libvirt-domain.h | 113 +++++++++++++++++++++++++++++++ + src/qemu/qemu_driver.c | 43 ++++++++++++ + 3 files changed, 163 insertions(+) + +diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst +index a9d691824e..ff0cf1a715 100644 +--- a/docs/manpages/virsh.rst ++++ b/docs/manpages/virsh.rst +@@ -2811,6 +2811,13 @@ Information listed includes: + pending write operations in the defined interval + * ``block..timed_group..zone_append_queue_depth_avg`` - average number + of pending zone append operations in the defined interval ++* ``block..latency_histogram..bin.count`` - number of bins in ++ latency histogram. is one of ``read``, ``write``, ``zone_append``, or ++ ``flush`` ++* ``block..latency_histogram..bin..start`` start boundary of ++ a latency histogram bin in nanoseconds of given operation duration ++* ``block..latency_histogram..bin..value`` current number of ++ events corresponding to the given bin and type + + + *--iothread* returns information about IOThreads on the running guest +diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h +index 16fac6b085..8e62bd23d4 100644 +--- a/include/libvirt/libvirt-domain.h ++++ b/include/libvirt/libvirt-domain.h +@@ -3815,6 +3815,119 @@ struct _virDomainStatsRecord { + */ + # define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_QUEUE_DEPTH_AVG ".zone_append_queue_depth_avg" + ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX: ++ * ++ * The parameter name prefix to access 'read' latency histograms. Concatenate ++ * the prefix with either: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT ++ * to get the number of bins in given histogram ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and ++ * entry number formatted as an unsigned integer and one of the latency ++ * histogram suffix parameters to compelte a full bin parameter name ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX ".latency_histogram.read." ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX: ++ * ++ * The parameter name prefix to access 'write' latency histograms. Concatenate ++ * the prefix with either: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT ++ * to get the number of bins in given histogram ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and ++ * entry number formatted as an unsigned integer and one of the latency ++ * histogram suffix parameters to compelte a full bin parameter name ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX ".latency_histogram.write." ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX: ++ * ++ * The parameter name prefix to access 'zone_append' latency histograms. Concatenate ++ * the prefix with either: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT ++ * to get the number of bins in given histogram ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and ++ * entry number formatted as an unsigned integer and one of the latency ++ * histogram suffix parameters to compelte a full bin parameter name ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX ".latency_histogram.zone_append." ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX: ++ * ++ * The parameter name prefix to access 'flush' latency histograms. Concatenate ++ * the prefix with either: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT ++ * to get the number of bins in given histogram ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and ++ * entry number formatted as an unsigned integer and one of the latency ++ * histogram suffix parameters to compelte a full bin parameter name ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX ".latency_histogram.flush." ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT: ++ * ++ * The parameter name suffix to access number of bins in one of the following ++ * latency histogram types: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX ++ * ++ * Number of bins in latency histogram as unsigned long long. ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT "bin.count" ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX: ++ * ++ * The parameter name suffix to access a latency histogram bin in one of the ++ * following latency histogram types: ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX ++ * - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX ++ * ++ * Concatenate with a bin number as unsigned int and one of the other field ++ * suffixes to access bin parameters. ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX "bin." ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START: ++ * ++ * Start of the current latency histogram bin in nanoseconds as unsigned long long. ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START ".start" ++ ++/** ++ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE: ++ * ++ * Current value of the number of occurences of the latency within this bin ++ * as unsigned long long. ++ * ++ * Since: 12.1.0 ++ */ ++# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE ".value" ++ ++ + /** + * VIR_DOMAIN_STATS_PERF_CMT: + * +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 08a547c546..f3e7410f9e 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -17597,6 +17597,36 @@ qemuDomainGetStatsBlockExportBackendStorage(const char *entryname, + } + + ++static void ++qemuDomainGetStatsBlockExportFrontendLatencyHistogram(struct qemuBlockStatsLatencyHistogram *h, ++ size_t disk_idx, ++ const char *prefix_hist, ++ virTypedParamList *par) ++{ ++ size_t i; ++ ++ if (!h) ++ return; ++ ++ virTypedParamListAddULLong(par, h->nbins, ++ VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s" VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT, ++ disk_idx, prefix_hist); ++ ++ for (i = 0; i < h->nbins; i++) { ++ virTypedParamListAddULLong(par, h->bins[i].start, ++ VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s" ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX "%zu" ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START, ++ disk_idx, prefix_hist, i); ++ virTypedParamListAddULLong(par, h->bins[i].value, ++ VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s" ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX "%zu" ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE, ++ disk_idx, prefix_hist, i); ++ } ++} ++ ++ + static void + qemuDomainGetStatsBlockExportFrontend(const char *frontendname, + GHashTable *stats, +@@ -17721,6 +17751,19 @@ qemuDomainGetStatsBlockExportFrontend(const char *frontendname, + idx, i); + } + } ++ ++ qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_read, idx, ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX, ++ par); ++ qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_write, idx, ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX, ++ par); ++ qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_zone, idx, ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX, ++ par); ++ qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_flush, idx, ++ VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX, ++ par); + } + + +-- +2.53.0 diff --git a/libvirt-Introduce-support-for-disk-operation-latency-histogram-collection.patch b/libvirt-Introduce-support-for-disk-operation-latency-histogram-collection.patch new file mode 100644 index 0000000..c417f58 --- /dev/null +++ b/libvirt-Introduce-support-for-disk-operation-latency-histogram-collection.patch @@ -0,0 +1,422 @@ +From 8fbea435edb1635ec98c9419e9249223e5c3b2b6 Mon Sep 17 00:00:00 2001 +Message-ID: <8fbea435edb1635ec98c9419e9249223e5c3b2b6.1771336682.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Fri, 23 Jan 2026 17:09:27 +0100 +Subject: [PATCH] Introduce support for disk operation latency histogram + collection + +Add config and docs allowing enabling latency histogram collection for +block device operations. + +This patch sets up the docs, schema and XML infrastructure. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit b874c944bd8c4ffa6c51394557587c8c203f1656) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + docs/formatdomain.rst | 41 ++++++ + src/conf/domain_conf.c | 133 +++++++++++++++++- + src/conf/domain_conf.h | 7 + + src/conf/schemas/domaincommon.rng | 37 ++++- + ...isk-statistics-intervals.x86_64-latest.xml | 29 ++++ + .../disk-statistics-intervals.xml | 25 ++++ + 6 files changed, 262 insertions(+), 10 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 70882c6820..31232deb3c 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -3628,6 +3628,47 @@ paravirtualized driver is specified via the ``disk`` element. + + :since:`Since 11.9.0 (QEMU 10.2, virtio, ide, scsi disks only)`. + ++ Block operation latency histogram collection can be configured using ++ ```` sub-element. The histogram is collected for ++ the whole runtime of the VM, but can be re-started or reconfigured using ++ the `virDomainUpdateDeviceFlags `__ ++ API. Using the same config re-starts histogram collection. ++ ++ The optional ``type`` attribute configures specific operation to collect ++ the histogram for. Supported types are ``read``, ``write``, ``zone``, and ++ ``flush``. If the ``type`` attribute is omitted the histogram collection ++ bins bins apply to all of the aforementioned types, which can be overriden ++ with specific config. ++ ++ The ```` has multiple mandatory ```` sub-elements ++ with mandatory ``start`` attribute configuring the starting boundary of ++ the histogram bin configured in nanosecods of the operation duration and ++ the intervals must be properly ordered and non-duplicate. ++ ++ Example:: ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ [or for specific operation types] ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ :since:`Since 12.1.0`. ++ + - The optional ``queues`` attribute specifies the number of virt queues for + virtio-blk ( :since:`Since 3.9.0` ) or vhost-user-blk + ( :since:`Since 7.1.0` ) +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index f5c4d135a9..83c58ab5ff 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -2445,6 +2445,11 @@ virDomainDiskDefFree(virDomainDiskDef *def) + virObjectUnref(def->privateData); + g_slist_free_full(def->iothreads, (GDestroyNotify) virDomainIothreadMappingDefFree); + g_free(def->statistics); ++ g_free(def->histogram_boundaries); ++ g_free(def->histogram_boundaries_read); ++ g_free(def->histogram_boundaries_write); ++ g_free(def->histogram_boundaries_zone); ++ g_free(def->histogram_boundaries_flush); + + if (def->throttlefilters) { + size_t i; +@@ -8307,6 +8312,91 @@ virDomainIothreadMappingDefParse(xmlNodePtr driverNode, + } + + ++static int ++virDomainDiskDefDriverParseXMLHistogramOne(virDomainDiskDef *def, ++ xmlNodePtr cur) ++{ ++ g_autofree char *histogram_type = NULL; ++ unsigned int **histogram_config = NULL; ++ g_autoptr(GPtrArray) binNodes = virXMLNodeGetSubelementList(cur, "bin"); ++ size_t nbins = 0; ++ size_t i; ++ ++ if ((histogram_type = virXMLPropString(cur, "type"))) { ++ if (STREQ(histogram_type, "read")) { ++ histogram_config = &def->histogram_boundaries_read; ++ } else if (STREQ(histogram_type, "write")) { ++ histogram_config = &def->histogram_boundaries_write; ++ } else if (STREQ(histogram_type, "zone")) { ++ histogram_config = &def->histogram_boundaries_zone; ++ } else if (STREQ(histogram_type, "flush")) { ++ histogram_config = &def->histogram_boundaries_flush; ++ } else { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("unknown latency_histogram type '%1$s'"), ++ histogram_type); ++ return -1; ++ } ++ } else { ++ histogram_config = &def->histogram_boundaries; ++ } ++ ++ if (*histogram_config) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("only one latency-histogram of a given type is supported")); ++ return -1; ++ } ++ ++ if (binNodes->len == 0) { ++ virReportError(VIR_ERR_XML_ERROR, "%s", ++ _("missing 'bin' elements for 'latency-histogram'")); ++ return -1; ++ } ++ ++ *histogram_config = g_new0(unsigned int, binNodes->len + 1); ++ ++ for (i = 0; i < binNodes->len; i++) { ++ unsigned int val; ++ ++ if (virXMLPropUInt(g_ptr_array_index(binNodes, i), ++ "start", 10, ++ VIR_XML_PROP_REQUIRED, ++ &val) < 0) ++ return -1; ++ ++ if (nbins > 0 && ++ (val == 0 || ++ val <= (*histogram_config)[nbins-1])) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("the values of 'start' attribute of a 'latency-histogram' 'bin' configuration must be sorted and non-overlapping")); ++ return -1; ++ } ++ ++ if (val > 0) ++ (*histogram_config)[nbins++] = val; ++ } ++ ++ return 0; ++} ++ ++ ++static int ++virDomainDiskDefDriverParseXMLHistograms(virDomainDiskDef *def, ++ xmlNodePtr cur) ++{ ++ g_autoptr(GPtrArray) histogramNodes = virXMLNodeGetSubelementList(cur, "latency-histogram"); ++ size_t i; ++ ++ for (i = 0; i < histogramNodes->len; i++) { ++ if (virDomainDiskDefDriverParseXMLHistogramOne(def, ++ g_ptr_array_index(histogramNodes, i)) < 0) ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ + static int + virDomainDiskDefDriverParseXML(virDomainDiskDef *def, + xmlNodePtr cur) +@@ -8380,6 +8470,9 @@ virDomainDiskDefDriverParseXML(virDomainDiskDef *def, + return -1; + } + } ++ ++ if (virDomainDiskDefDriverParseXMLHistograms(def, statisticsNode) < 0) ++ return -1; + } + + if (virXMLPropEnum(cur, "detect_zeroes", +@@ -23961,12 +24054,37 @@ virDomainDiskDefFormatThrottleFilters(virBuffer *buf, + } + + ++static void ++virDomainDiskDefFormatDriverHistogram(virBuffer *buf, ++ const char *type, ++ unsigned int *bins) ++{ ++ g_auto(virBuffer) histogramAttrBuf = VIR_BUFFER_INITIALIZER; ++ g_auto(virBuffer) histogramChildBuf = VIR_BUFFER_INIT_CHILD(buf); ++ ++ if (!bins || bins[0] == 0) ++ return; ++ ++ if (type) ++ virBufferAsprintf(&histogramAttrBuf, " type='%s'", type); ++ ++ /* we dont store the start boundary of the first bin but it's always there */ ++ virBufferAddLit(&histogramChildBuf, "\n"); ++ ++ for (; *bins > 0; bins++) ++ virBufferAsprintf(&histogramChildBuf, "\n", *bins); ++ ++ virXMLFormatElement(buf, "latency-histogram", &histogramAttrBuf, &histogramChildBuf); ++} ++ ++ + static void + virDomainDiskDefFormatDriver(virBuffer *buf, + virDomainDiskDef *disk) + { + g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); ++ g_auto(virBuffer) statisticsChildBuf = VIR_BUFFER_INIT_CHILD(&childBuf); + + virBufferEscapeString(&attrBuf, " name='%s'", virDomainDiskGetDriver(disk)); + +@@ -24038,16 +24156,25 @@ virDomainDiskDefFormatDriver(virBuffer *buf, + virDomainIothreadMappingDefFormat(&childBuf, disk->iothreads); + + if (disk->statistics) { +- g_auto(virBuffer) statisticsChildBuf = VIR_BUFFER_INIT_CHILD(&childBuf); + size_t i; + + for (i = 0; disk->statistics[i] > 0; i++) + virBufferAsprintf(&statisticsChildBuf, "\n", + disk->statistics[i]); +- +- virXMLFormatElement(&childBuf, "statistics", NULL, &statisticsChildBuf); + } + ++ virDomainDiskDefFormatDriverHistogram(&statisticsChildBuf, NULL, ++ disk->histogram_boundaries); ++ virDomainDiskDefFormatDriverHistogram(&statisticsChildBuf, "read", ++ disk->histogram_boundaries_read); ++ virDomainDiskDefFormatDriverHistogram(&statisticsChildBuf, "write", ++ disk->histogram_boundaries_write); ++ virDomainDiskDefFormatDriverHistogram(&statisticsChildBuf, "zone", ++ disk->histogram_boundaries_zone); ++ virDomainDiskDefFormatDriverHistogram(&statisticsChildBuf, "flush", ++ disk->histogram_boundaries_flush); ++ ++ virXMLFormatElement(&childBuf, "statistics", NULL, &statisticsChildBuf); + + virXMLFormatElement(buf, "driver", &attrBuf, &childBuf); + } +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 8f53ed96c0..b120d4a68e 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -596,6 +596,13 @@ struct _virDomainDiskDef { + GSList *iothreads; /* List of virDomainIothreadMappingDef */ + unsigned int *statistics; /* Optional, zero terminated list of intervals to + collect statistics for */ ++ /* optional zero terminated lists of bin boundaries for latency histograms */ ++ unsigned int *histogram_boundaries; ++ unsigned int *histogram_boundaries_read; ++ unsigned int *histogram_boundaries_write; ++ unsigned int *histogram_boundaries_zone; ++ unsigned int *histogram_boundaries_flush; ++ + virDomainDiskDetectZeroes detect_zeroes; + virTristateSwitch discard_no_unref; + char *domain_name; /* backend domain name */ +diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng +index 1f9ac102a0..441328a08e 100644 +--- a/src/conf/schemas/domaincommon.rng ++++ b/src/conf/schemas/domaincommon.rng +@@ -2728,13 +2728,36 @@ + + + +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ read ++ write ++ zone ++ flush ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/qemuxmlconfdata/disk-statistics-intervals.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-statistics-intervals.x86_64-latest.xml +index 4c55c50ef5..d02f954073 100644 +--- a/tests/qemuxmlconfdata/disk-statistics-intervals.x86_64-latest.xml ++++ b/tests/qemuxmlconfdata/disk-statistics-intervals.x86_64-latest.xml +@@ -22,6 +22,11 @@ + + + ++ ++ ++ ++ ++ + + + +@@ -33,6 +38,30 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/tests/qemuxmlconfdata/disk-statistics-intervals.xml b/tests/qemuxmlconfdata/disk-statistics-intervals.xml +index f5e801f5a8..5f9e9470d7 100644 +--- a/tests/qemuxmlconfdata/disk-statistics-intervals.xml ++++ b/tests/qemuxmlconfdata/disk-statistics-intervals.xml +@@ -19,6 +19,11 @@ + + + ++ ++ ++ ++ ++ + + + +@@ -29,6 +34,26 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +-- +2.53.0 diff --git a/libvirt-RHEL-ONLY-backport-test-data-for-migrate-pr-capability-of-scsi-block.patch b/libvirt-RHEL-ONLY-backport-test-data-for-migrate-pr-capability-of-scsi-block.patch new file mode 100644 index 0000000..de4bb90 --- /dev/null +++ b/libvirt-RHEL-ONLY-backport-test-data-for-migrate-pr-capability-of-scsi-block.patch @@ -0,0 +1,125 @@ +From c2eb6d70891d9be5ce13f07946841239a81c3ed9 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Mon, 16 Feb 2026 15:08:54 +0100 +Subject: [PATCH] RHEL-ONLY: backport test data for 'migrate-pr' capability of + 'scsi-block' + +In upstream qemu the capability is present starting with qemu-11.0. We +don't have the test data downstream and backporting them would be too +invasive. Backport the relevant capability detection as a +downstream-only fix. + +https://issues.redhat.com/browse/RHEL-140614 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-135115 [rhel-10.2] + +Signed-off-by: Peter Krempa +--- + .../caps_10.2.0_x86_64.replies | 79 ++++++++++++++++++- + .../caps_10.2.0_x86_64.xml | 1 + + 2 files changed, 76 insertions(+), 4 deletions(-) + +diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies +index cb4abb4533..10db9baca1 100644 +--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies +@@ -33081,10 +33081,81 @@ + } + + { +- "error": { +- "class": "DeviceNotFound", +- "desc": "The libvirt device dump was not collected for this version+device tuple" +- }, ++ "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": "auto", ++ "name": "rerror", ++ "description": "Error handling policy (report/ignore/enospc/stop/auto)", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": 2147483647, ++ "name": "max_io_size", ++ "type": "uint64" ++ }, ++ { ++ "default-value": false, ++ "name": "share-rw", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": true, ++ "name": "migrate-pr", ++ "description": "on/off", ++ "type": "bool" ++ }, ++ { ++ "default-value": "auto", ++ "name": "werror", ++ "description": "Error handling policy (report/ignore/enospc/stop/auto)", ++ "type": "BlockdevOnError" ++ }, ++ { ++ "default-value": 1073741824, ++ "name": "max_unmap_size", ++ "type": "uint64" ++ }, ++ { ++ "default-value": -1, ++ "name": "scsi_version", ++ "type": "int32" ++ }, ++ { ++ "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": 30, ++ "name": "io_timeout", ++ "type": "uint32" ++ }, ++ { ++ "name": "bootindex", ++ "type": "int32" ++ } ++ ], + "id": "libvirt-37" + } + +diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml +index 7cff2c2291..7d5a75ce88 100644 +--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml ++++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml +@@ -215,6 +215,7 @@ + + + ++ + 10001091 + 43100287 + v10.2.0-rc1-38-gfb241d0a1f +-- +2.53.0 diff --git a/libvirt-docs-formatdomain-Fix-indentation-of-docs-for-disk-driver-statistics-element.patch b/libvirt-docs-formatdomain-Fix-indentation-of-docs-for-disk-driver-statistics-element.patch new file mode 100644 index 0000000..b178d43 --- /dev/null +++ b/libvirt-docs-formatdomain-Fix-indentation-of-docs-for-disk-driver-statistics-element.patch @@ -0,0 +1,62 @@ +From f6268acd96651ce72014e2ea7ed649caff0b9133 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Fri, 30 Jan 2026 17:47:46 +0100 +Subject: [PATCH] docs: formatdomain: Fix indentation of docs for + element + +All other paragraphs in this section use 2 spaces after hyphen, fix the +recently added section. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 7da1a83914ca10cc811583d7310bf60e04b70488) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + docs/formatdomain.rst | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 9836837441..45f262113b 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -3605,22 +3605,22 @@ paravirtualized driver is specified via the ``disk`` element. + + + +- - The optional ``statistics`` sub-element allows configuring statistics +- collection in configurable intervals for the given disk. Intervals are +- configured by ```` sub-elements with ``interval`` attribute +- configuring the collection window duration in seconds. The statistics +- are available via the bulk statistics API. ++ - The optional ``statistics`` sub-element allows configuring statistics ++ collection in configurable intervals for the given disk. Intervals are ++ configured by ```` sub-elements with ``interval`` attribute ++ configuring the collection window duration in seconds. The statistics ++ are available via the bulk statistics API. + +- Example:: ++ Example:: + +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ + +- :since:`Since 11.9.0 (QEMU 10.2, virtio, ide, scsi disks only)`. ++ :since:`Since 11.9.0 (QEMU 10.2, virtio, ide, scsi disks only)`. + + - The optional ``queues`` attribute specifies the number of virt queues for + virtio-blk ( :since:`Since 3.9.0` ) or vhost-user-blk +-- +2.53.0 diff --git a/libvirt-docs-formatdomain-Reword-section-about-the-statistics-element-under-disk-driver.patch b/libvirt-docs-formatdomain-Reword-section-about-the-statistics-element-under-disk-driver.patch new file mode 100644 index 0000000..a727efe --- /dev/null +++ b/libvirt-docs-formatdomain-Reword-section-about-the-statistics-element-under-disk-driver.patch @@ -0,0 +1,51 @@ +From ea6f8a96929577416a5cc4f4452f920312aef081 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Fri, 30 Jan 2026 17:37:48 +0100 +Subject: [PATCH] docs: formatdomain: Reword section about the '' + element under disk driver + +Separate the timed statistics group and link to the fields which are +returned by it. + +Prepare the wording for more statistics configs in the future. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit ad65b00c1393f7f13e15744e2e1be4fb531e2a17) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + docs/formatdomain.rst | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 45f262113b..70882c6820 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -3605,11 +3605,17 @@ paravirtualized driver is specified via the ``disk`` element. + + + +- - The optional ``statistics`` sub-element allows configuring statistics +- collection in configurable intervals for the given disk. Intervals are +- configured by ```` sub-elements with ``interval`` attribute +- configuring the collection window duration in seconds. The statistics +- are available via the bulk statistics API. ++ - The optional ``statistics`` sub-element allows configuring various optional ++ statistics collection. ++ ++ Statistic values returned under ++ `VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_PREFIX `__ ++ typed parameter prefix returned by the ++ `virConnectGetAllDomainStats `__ ++ API are collected based on one or more configurable intervals. An interval ++ of collection is configured by ```` sub-elements with ++ ``interval`` attribute configuring the collection window duration in ++ seconds. + + Example:: + +-- +2.53.0 diff --git a/libvirt-qemu-Extract-disk-setup-done-via-QMP-into-a-separate-helper.patch b/libvirt-qemu-Extract-disk-setup-done-via-QMP-into-a-separate-helper.patch new file mode 100644 index 0000000..9e8f997 --- /dev/null +++ b/libvirt-qemu-Extract-disk-setup-done-via-QMP-into-a-separate-helper.patch @@ -0,0 +1,144 @@ +From 92a7fef67b736e20c8e94f3407df7a984ee59102 Mon Sep 17 00:00:00 2001 +Message-ID: <92a7fef67b736e20c8e94f3407df7a984ee59102.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 29 Jan 2026 11:15:04 +0100 +Subject: [PATCH] qemu: Extract disk setup done via QMP into a separate helper + +Introduce 'qemuProcessSetupDiskPropsRuntime' helper function which will +collect all code used for runtime setup of a disk. + +This is currently old-style throttling. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 1789a0f8a3623e8f0f6e50730feb58e3d8c48376) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] + +Conflicts: + - Commit b9b9092c9c1f8b42e311c524d9fc4a8e73ae28a6 which dropped disk + property refresh was not backported, thus the context around the call + to qemuProcessSetupDiskPropsRuntime was different +--- + src/qemu/qemu_hotplug.c | 23 +++++------------------ + src/qemu/qemu_process.c | 37 +++++++++++++++++++++++++++---------- + src/qemu/qemu_process.h | 3 +++ + 3 files changed, 35 insertions(+), 28 deletions(-) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index fb426deb1a..f2dc4469a3 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -569,13 +569,8 @@ qemuDomainChangeMediaBlockdev(virDomainObj *vm, + } + + /* set throttling for the new image */ +- if (rc == 0 && +- !virStorageSourceIsEmpty(newsrc) && +- qemuDiskConfigBlkdeviotuneEnabled(disk)) { +- rc = qemuMonitorSetBlockIoThrottle(priv->mon, +- diskPriv->qomName, +- &disk->blkdeviotune); +- } ++ if (rc == 0) ++ rc = qemuProcessSetupDiskPropsRuntime(priv->mon, disk); + + if (rc == 0) + rc = qemuMonitorBlockdevTrayClose(priv->mon, diskPriv->qomName); +@@ -795,21 +790,13 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm, + if (rc == 0) + rc = qemuMonitorAddDeviceProps(priv->mon, &devprops); + +- /* Setup throttling of disk via block_set_io_throttle QMP command. This +- * is a hack until the 'throttle' blockdev driver will support modification +- * of the trhottle group. See also qemuProcessSetupDiskThrottlingBlockdev. +- * As there isn't anything sane to do if this fails, let's just return +- * success. +- */ + if (rc == 0) { + qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); + g_autoptr(GHashTable) blockinfo = NULL; + +- if (qemuDiskConfigBlkdeviotuneEnabled(disk)) { +- if (qemuMonitorSetBlockIoThrottle(priv->mon, diskPriv->qomName, +- &disk->blkdeviotune) < 0) +- VIR_WARN("failed to set blkdeviotune for '%s' of '%s'", disk->dst, vm->def->name); +- } ++ /* There isn't anything sane to do if this fails (rollback would ++ * require hot-unplug), let's just return success. */ ++ ignore_value(qemuProcessSetupDiskPropsRuntime(priv->mon, disk)); + + if ((blockinfo = qemuMonitorGetBlockInfo(priv->mon))) { + struct qemuDomainDiskInfo *diskinfo; +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index d8f0c78fd1..c99bb36c93 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7937,6 +7937,32 @@ qemuProcessGenID(virDomainObj *vm, + } + + ++/** ++ * qemuProcessSetupDiskPropsRuntime: ++ * @mon: qemu monitor object ++ * @disk: disk definition ++ * ++ * This function expects that caller already entered 'monitor' context. ++ * ++ * Sets up disk properties which are only possible to be set in runtime. ++ */ ++int ++qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon, ++ virDomainDiskDef *disk) ++{ ++ if (virStorageSourceIsEmpty(disk->src)) ++ return 0; ++ ++ if (qemuDiskConfigBlkdeviotuneEnabled(disk) && ++ qemuMonitorSetBlockIoThrottle(mon, ++ QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName, ++ &disk->blkdeviotune) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ + /** + * qemuProcessSetupDiskThrottling: + * +@@ -7960,16 +7986,7 @@ qemuProcessSetupDiskThrottling(virDomainObj *vm, + for (i = 0; i < vm->def->ndisks; i++) { + virDomainDiskDef *disk = vm->def->disks[i]; + +- /* Setting throttling for empty drives fails */ +- if (virStorageSourceIsEmpty(disk->src)) +- continue; +- +- if (!qemuDiskConfigBlkdeviotuneEnabled(disk)) +- continue; +- +- if (qemuMonitorSetBlockIoThrottle(qemuDomainGetMonitor(vm), +- QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName, +- &disk->blkdeviotune) < 0) ++ if (qemuProcessSetupDiskPropsRuntime(qemuDomainGetMonitor(vm), disk) < 0) + goto cleanup; + } + +diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h +index 426e11d79e..df78b00abb 100644 +--- a/src/qemu/qemu_process.h ++++ b/src/qemu/qemu_process.h +@@ -146,6 +146,9 @@ int qemuProcessPrepareHostStorageSourceChain(virDomainObj *vm, + int qemuProcessPrepareHostStorageDisk(virDomainObj *vm, + virDomainDiskDef *disk); + ++int qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon, ++ virDomainDiskDef *disk); ++ + int qemuProcessDeleteThreadContext(virDomainObj *vm); + + int qemuProcessLaunch(virConnectPtr conn, +-- +2.53.0 diff --git a/libvirt-qemu-Implement-support-for-persistent-reservation-migration-control.patch b/libvirt-qemu-Implement-support-for-persistent-reservation-migration-control.patch new file mode 100644 index 0000000..9194604 --- /dev/null +++ b/libvirt-qemu-Implement-support-for-persistent-reservation-migration-control.patch @@ -0,0 +1,220 @@ +From 3f03b1cbc20d0af7900cc43cc576a356a95a292b Mon Sep 17 00:00:00 2001 +Message-ID: <3f03b1cbc20d0af7900cc43cc576a356a95a292b.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 11 Dec 2025 19:47:16 +0100 +Subject: [PATCH] qemu: Implement support for persistent reservation migration + control + +The 'migration' attribute for the '' element allows to +control the persistent reservation migration feature independently of +the machine type default. + +Add the XML plumbing and qemu support. + +We consider it ABI for now since it influences qemu migration protocol. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 0d3ef7cb71979172de2c531d865e4525a314f902) + +https://issues.redhat.com/browse/RHEL-140614 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-135115 [rhel-10.2] +--- + docs/formatdomain.rst | 3 +++ + src/conf/domain_conf.c | 21 +++++++++++++++++++ + src/conf/schemas/storagecommon.rng | 5 +++++ + src/conf/storage_source_conf.c | 10 +++++++++ + src/conf/storage_source_conf.h | 2 ++ + src/qemu/qemu_command.c | 4 ++++ + src/qemu/qemu_validate.c | 16 ++++++++++++++ + ...irtio-scsi-reservations.x86_64-latest.args | 2 +- + .../disk-virtio-scsi-reservations.xml | 2 +- + 9 files changed, 63 insertions(+), 2 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 167912348e..9836837441 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -3169,6 +3169,9 @@ paravirtualized driver is specified via the ``disk`` element. + the socket, and finally ``mode`` which accepts one value ``client`` + specifying the role of hypervisor. It's recommended to allow libvirt + manage the persistent reservations. ++ :since:`Since 12.1.0` the ``migration`` (values ``yes``, ``no``) controls ++ whether the hypervisor should attempt to migrate persistent reservations ++ during migration. + ``initiator`` + :since:`Since 4.7.0`, the ``initiator`` element is supported for + a disk ``type`` "network" that is using a ``source`` element with the +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 902c1188ef..f5c4d135a9 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -20951,6 +20951,27 @@ virDomainDiskDefCheckABIStability(virDomainDiskDef *src, + return false; + } + ++ /* While not guest visible it influences the qemu migration stream so ++ * we need to keep it identical */ ++ if (src->src->pr || dst->src->pr) { ++ virTristateBool srcmig = VIR_TRISTATE_BOOL_ABSENT; ++ virTristateBool dstmig = VIR_TRISTATE_BOOL_ABSENT; ++ ++ if (src->src->pr) ++ srcmig = src->src->pr->migration; ++ ++ if (dst->src->pr) ++ dstmig = dst->src->pr->migration; ++ ++ if (srcmig != dstmig) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("Target disk reservations 'migration' property %1$s does not match source %2$s"), ++ virTristateBoolTypeToString(dstmig), ++ virTristateBoolTypeToString(srcmig)); ++ return false; ++ } ++ } ++ + if (!virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio)) + return false; + +diff --git a/src/conf/schemas/storagecommon.rng b/src/conf/schemas/storagecommon.rng +index 14704c737e..450d53131f 100644 +--- a/src/conf/schemas/storagecommon.rng ++++ b/src/conf/schemas/storagecommon.rng +@@ -104,6 +104,11 @@ + + + ++ ++ ++ ++ ++ + + + +diff --git a/src/conf/storage_source_conf.c b/src/conf/storage_source_conf.c +index 087de1eaf2..24d4b0de6a 100644 +--- a/src/conf/storage_source_conf.c ++++ b/src/conf/storage_source_conf.c +@@ -330,6 +330,11 @@ virStoragePRDefParseXML(xmlXPathContextPtr ctxt) + &prd->managed) < 0) + goto cleanup; + ++ if (virXMLPropTristateBool(ctxt->node, "migration", ++ VIR_XML_PROP_NONZERO, ++ &prd->migration) < 0) ++ goto cleanup; ++ + type = virXPathString("string(./source[1]/@type)", ctxt); + path = virXPathString("string(./source[1]/@path)", ctxt); + mode = virXPathString("string(./source[1]/@mode)", ctxt); +@@ -384,6 +389,11 @@ virStoragePRDefFormat(virBuffer *buf, + { + virBufferAsprintf(buf, "managed)); ++ ++ if (prd->migration != VIR_TRISTATE_BOOL_ABSENT) ++ virBufferAsprintf(buf, " migration='%s'", ++ virTristateBoolTypeToString(prd->migration)); ++ + if (prd->path && + (prd->managed == VIR_TRISTATE_BOOL_NO || !migratable)) { + virBufferAddLit(buf, ">\n"); +diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h +index fc868b31af..5a4b088eeb 100644 +--- a/src/conf/storage_source_conf.h ++++ b/src/conf/storage_source_conf.h +@@ -235,6 +235,8 @@ struct _virStoragePRDef { + virTristateBool managed; + char *path; + ++ virTristateBool migration; ++ + /* manager object alias */ + char *mgralias; + }; +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index f355352018..c8626e6d49 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -1691,6 +1691,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, + g_autofree char *usbdiskalias = NULL; + const virDomainDeviceInfo *deviceinfo = &disk->info; + g_autoptr(virJSONValue) statistics = NULL; ++ virTristateBool migrate_pr = VIR_TRISTATE_BOOL_ABSENT; + virDomainDeviceInfo usbSCSIinfo = { + .type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE, + .addr.drive = { .diskbus = VIR_DOMAIN_DISK_BUS_USB }, +@@ -1716,6 +1717,8 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, + case VIR_DOMAIN_DISK_BUS_SCSI: + if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { + driver = "scsi-block"; ++ if (disk->src->pr) ++ migrate_pr = disk->src->pr->migration; + } else { + if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) { + driver = "scsi-cd"; +@@ -1937,6 +1940,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def, + "S:rerror", rpolicy, + "A:stats-intervals", &statistics, + "T:dpofua", disk->dpofua, /* SCSI-only, ensured by validation */ ++ "T:migrate-pr", migrate_pr, /* 'scsi-block' only, ensured by validation */ + NULL) < 0) + return NULL; + +diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c +index da08fd17cd..a3dbd9a33b 100644 +--- a/src/qemu/qemu_validate.c ++++ b/src/qemu/qemu_validate.c +@@ -3227,6 +3227,22 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk, + } + } + ++ if (disk->src->pr && ++ disk->src->pr->migration != VIR_TRISTATE_BOOL_ABSENT) { ++ if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN || ++ disk->bus != VIR_DOMAIN_DISK_BUS_SCSI) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("persistent reservation migration supported only with 'lun' disks on 'scsi' bus")); ++ return -1; ++ } ++ ++ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR)) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("persistent reservation migration not supported by this qemu")); ++ return -1; ++ } ++ } ++ + if (disk->rotation_rate) { + if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI && + disk->bus != VIR_DOMAIN_DISK_BUS_IDE && +diff --git a/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.x86_64-latest.args b/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.x86_64-latest.args +index cbc2a0f398..f1d7a450ee 100644 +--- a/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.x86_64-latest.args ++++ b/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.x86_64-latest.args +@@ -33,7 +33,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ + -device '{"driver":"scsi-block","bus":"scsi0.0","channel":0,"scsi-id":0,"lun":0,"drive":"libvirt-2-storage","id":"scsi0-0-0-0","bootindex":1}' \ + -object '{"qom-type":"pr-manager-helper","id":"pr-helper-libvirt-1-storage","path":"/path/to/qemu-pr-helper.sock"}' \ + -blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest2","pr-manager":"pr-helper-libvirt-1-storage","node-name":"libvirt-1-storage","read-only":false}' \ +--device '{"driver":"scsi-block","bus":"scsi0.0","channel":0,"scsi-id":0,"lun":1,"drive":"libvirt-1-storage","id":"scsi0-0-0-1"}' \ ++-device '{"driver":"scsi-block","bus":"scsi0.0","channel":0,"scsi-id":0,"lun":1,"drive":"libvirt-1-storage","id":"scsi0-0-0-1","migrate-pr":true}' \ + -audiodev '{"id":"audio1","driver":"none"}' \ + -device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x4"}' \ + -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +diff --git a/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.xml b/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.xml +index 9c55d6ec3e..7f9160ff3a 100644 +--- a/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.xml ++++ b/tests/qemuxmlconfdata/disk-virtio-scsi-reservations.xml +@@ -28,7 +28,7 @@ + + + +- ++ + + + +-- +2.53.0 diff --git a/libvirt-qemu-Setup-disk-latency-histograms-on-startup-hotplug-update.patch b/libvirt-qemu-Setup-disk-latency-histograms-on-startup-hotplug-update.patch new file mode 100644 index 0000000..64a9170 --- /dev/null +++ b/libvirt-qemu-Setup-disk-latency-histograms-on-startup-hotplug-update.patch @@ -0,0 +1,132 @@ +From f496b6095bf96eb8931b78054a272a5aaf70a2d9 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Fri, 23 Jan 2026 17:18:14 +0100 +Subject: [PATCH] qemu: Setup disk latency histograms on startup/hotplug/update + +Setup the histograms on startup and hotplug of devices via +'qemuProcessSetupDiskPropsRuntime' and facilitate update/reset/disable +of histogram collection via 'qemuDomainChangeDiskLive'. + +The latter allows to use the update device API to either clear the bins +or select new bin configuration or disable the histogram altogether +without the need for a specific API. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 5787326541be4eafaa7ae3b4f866b3da793d44fe) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + src/qemu/qemu_domain.c | 17 +++++++++++++++++ + src/qemu/qemu_domain.h | 3 +++ + src/qemu/qemu_hotplug.c | 29 +++++++++++++++++++++++++++++ + src/qemu/qemu_process.c | 10 ++++++++++ + 4 files changed, 59 insertions(+) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 8e1ebe7799..bdab117e96 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -10463,6 +10463,23 @@ qemuDomainInitializePflashStorageSource(virDomainObj *vm, + } + + ++/** ++ * qemuDomainDiskHasLatencyHistogram: ++ * @disk: disk definition ++ * ++ * Returns whether @disk has any latency histogram settings configured. ++ */ ++bool ++qemuDomainDiskHasLatencyHistogram(virDomainDiskDef *disk) ++{ ++ return disk->histogram_boundaries || ++ disk->histogram_boundaries_read || ++ disk->histogram_boundaries_write || ++ disk->histogram_boundaries_zone || ++ disk->histogram_boundaries_flush; ++} ++ ++ + /** + * qemuDomainDiskBlockJobIsSupported: + * +diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h +index 3361e97315..30ca67bf76 100644 +--- a/src/qemu/qemu_domain.h ++++ b/src/qemu/qemu_domain.h +@@ -1078,6 +1078,9 @@ int + qemuDomainInitializePflashStorageSource(virDomainObj *vm, + virQEMUDriverConfig *cfg); + ++bool ++qemuDomainDiskHasLatencyHistogram(virDomainDiskDef *disk); ++ + bool + qemuDomainDiskBlockJobIsSupported(virDomainDiskDef *disk); + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index f2dc4469a3..9445599d2c 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -7310,6 +7310,35 @@ qemuDomainChangeDiskLive(virDomainObj *vm, + dev->data.disk->src = NULL; + } + ++ if (qemuDomainDiskHasLatencyHistogram(disk) || ++ qemuDomainDiskHasLatencyHistogram(orig_disk)) { ++ int rc; ++ ++ qemuDomainObjEnterMonitor(vm); ++ rc = qemuMonitorBlockLatencyHistogramSet(qemuDomainGetMonitor(vm), ++ QEMU_DOMAIN_DISK_PRIVATE(orig_disk)->qomName, ++ disk->histogram_boundaries, ++ disk->histogram_boundaries_read, ++ disk->histogram_boundaries_write, ++ disk->histogram_boundaries_zone, ++ disk->histogram_boundaries_flush); ++ qemuDomainObjExitMonitor(vm); ++ ++ if (rc < 0) ++ return -1; ++ ++ g_clear_pointer(&orig_disk->histogram_boundaries, g_free); ++ g_clear_pointer(&orig_disk->histogram_boundaries_read, g_free); ++ g_clear_pointer(&orig_disk->histogram_boundaries_write, g_free); ++ g_clear_pointer(&orig_disk->histogram_boundaries_zone, g_free); ++ g_clear_pointer(&orig_disk->histogram_boundaries_flush, g_free); ++ orig_disk->histogram_boundaries = g_steal_pointer(&disk->histogram_boundaries); ++ orig_disk->histogram_boundaries_read = g_steal_pointer(&disk->histogram_boundaries_read); ++ orig_disk->histogram_boundaries_write = g_steal_pointer(&disk->histogram_boundaries_write); ++ orig_disk->histogram_boundaries_zone = g_steal_pointer(&disk->histogram_boundaries_zone); ++ orig_disk->histogram_boundaries_flush = g_steal_pointer(&disk->histogram_boundaries_flush); ++ } ++ + /* in case when we aren't updating disk source we update startup policy here */ + orig_disk->startupPolicy = dev->data.disk->startupPolicy; + orig_disk->snapshot = dev->data.disk->snapshot; +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index aadfaa92b0..37e688018c 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7959,6 +7959,16 @@ qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon, + &disk->blkdeviotune) < 0) + return -1; + ++ if (qemuDomainDiskHasLatencyHistogram(disk) && ++ qemuMonitorBlockLatencyHistogramSet(mon, ++ QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName, ++ disk->histogram_boundaries, ++ disk->histogram_boundaries_read, ++ disk->histogram_boundaries_write, ++ disk->histogram_boundaries_zone, ++ disk->histogram_boundaries_flush) < 0) ++ return -1; ++ + return 0; + } + +-- +2.53.0 diff --git a/libvirt-qemu-capabilities-Introduce-QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch b/libvirt-qemu-capabilities-Introduce-QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch new file mode 100644 index 0000000..dda2822 --- /dev/null +++ b/libvirt-qemu-capabilities-Introduce-QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch @@ -0,0 +1,58 @@ +From 2674cc2e58f98439fe72e4d832e6e2e9b41a614f Mon Sep 17 00:00:00 2001 +Message-ID: <2674cc2e58f98439fe72e4d832e6e2e9b41a614f.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 11 Dec 2025 19:26:40 +0100 +Subject: [PATCH] qemu: capabilities: Introduce + QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR + +Introduce capability for persisten migration control support. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit b0edb7eb9b819e0560bb7d65b4e0c89082b3b43b) + +https://issues.redhat.com/browse/RHEL-140614 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-135115 [rhel-10.2] + +Conflicts: + - Commit befdd44bf836c3ba46e46d57b587127e12736591 adding + QEMU_CAPS_VIRTIO_IOMMU_AW_BITS was not backported +--- + src/qemu/qemu_capabilities.c | 2 ++ + src/qemu/qemu_capabilities.h | 1 + + 2 files changed, 3 insertions(+) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index 1efb77d03b..2c8bd62c99 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -755,6 +755,7 @@ VIR_ENUM_IMPL(virQEMUCaps, + "disk-timed-stats", /* QEMU_CAPS_DISK_TIMED_STATS */ + "query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */ + "mshv", /* QEMU_CAPS_MSHV */ ++ "scsi-block.migrate-pr", /* QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR */ + ); + + +@@ -1536,6 +1537,7 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIDisk[] = { + }; + + static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIBlock[] = { ++ { "migrate-pr", QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR, NULL }, + }; + + static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIGeneric[] = { +diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h +index f180844e66..0c76f2edda 100644 +--- a/src/qemu/qemu_capabilities.h ++++ b/src/qemu/qemu_capabilities.h +@@ -730,6 +730,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ + QEMU_CAPS_DISK_TIMED_STATS, /* timed stats support ('stats-intervals' property of disk frontends) */ + QEMU_CAPS_QUERY_ACCELERATORS, /* query-accelerators command */ + QEMU_CAPS_MSHV, /* -accel mshv */ ++ QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR, /* persistent reservation migration support */ + + QEMU_CAPS_LAST /* this must always be the last item */ + } virQEMUCapsFlags; +-- +2.53.0 diff --git a/libvirt-qemu-capabilities-Probe-properties-of-scsi-block-and-scsi-generic-devices.patch b/libvirt-qemu-capabilities-Probe-properties-of-scsi-block-and-scsi-generic-devices.patch new file mode 100644 index 0000000..5dcf830 --- /dev/null +++ b/libvirt-qemu-capabilities-Probe-properties-of-scsi-block-and-scsi-generic-devices.patch @@ -0,0 +1,7714 @@ +From 661368feba96d228825535a990d4a57381c6e1ee Mon Sep 17 00:00:00 2001 +Message-ID: <661368feba96d228825535a990d4a57381c6e1ee.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 11 Dec 2025 18:43:39 +0100 +Subject: [PATCH] qemu: capabilities: Probe properties of 'scsi-block' and + 'scsi-generic' devices + +Add code to probe properties of 'scsi-block' and 'scsi-generic' qemu +devices. For now the '.replies' are modified using the +'qemu-replies-tool' script and the data is annotated as fake and is in +fact missing. Further updates will populate them for any real dump. + +The properties for the two devices will be later used e.g. to detect +support for persistent reservations migration support. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit d917bf662b65099472b15c5a1fa1493a5f4cdd14) + +https://issues.redhat.com/browse/RHEL-140614 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-135115 [rhel-10.2] + +Conflicts: + - Some capability output files don't exist upstream. +--- + src/qemu/qemu_capabilities.c | 12 +++ + .../caps_10.0.0_aarch64.replies | 76 +++++++++++----- + .../caps_10.0.0_ppc64.replies | 60 ++++++++++--- + .../caps_10.0.0_s390x.replies | 64 ++++++++++---- + .../caps_10.0.0_x86_64+amdsev.replies | 84 ++++++++++++------ + .../caps_10.0.0_x86_64.replies | 84 ++++++++++++------ + .../caps_10.1.0_x86_64+inteltdx.replies | 88 +++++++++++++------ + .../caps_10.1.0_x86_64.replies | 88 +++++++++++++------ + .../caps_10.2.0_x86_64+mshv.replies | 88 +++++++++++++------ + .../caps_10.2.0_x86_64.replies | 88 +++++++++++++------ + .../caps_6.2.0_ppc64.replies | 60 ++++++++++--- + .../caps_6.2.0_x86_64.replies | 84 ++++++++++++------ + .../caps_7.0.0_ppc64.replies | 60 ++++++++++--- + .../caps_7.0.0_x86_64.replies | 84 ++++++++++++------ + .../caps_7.1.0_ppc64.replies | 60 ++++++++++--- + .../caps_7.1.0_x86_64.replies | 84 ++++++++++++------ + .../caps_7.2.0_ppc.replies | 56 +++++++++--- + .../caps_7.2.0_x86_64+hvf.replies | 84 ++++++++++++------ + .../caps_7.2.0_x86_64.replies | 84 ++++++++++++------ + .../caps_8.0.0_x86_64.replies | 84 ++++++++++++------ + .../caps_8.1.0_s390x.replies | 60 ++++++++++--- + .../caps_8.1.0_x86_64.replies | 84 ++++++++++++------ + .../caps_8.2.0_aarch64.replies | 76 +++++++++++----- + .../caps_8.2.0_armv7l.replies | 76 +++++++++++----- + .../caps_8.2.0_loongarch64.replies | 64 ++++++++++---- + .../caps_8.2.0_s390x.replies | 60 ++++++++++--- + .../caps_8.2.0_x86_64.replies | 84 ++++++++++++------ + .../caps_9.0.0_sparc.replies | 52 ++++++++--- + .../caps_9.0.0_x86_64.replies | 84 ++++++++++++------ + .../caps_9.1.0_riscv64.replies | 64 ++++++++++---- + .../caps_9.1.0_s390x.replies | 64 ++++++++++---- + .../caps_9.1.0_x86_64.replies | 84 ++++++++++++------ + .../caps_9.2.0_aarch64+hvf.replies | 72 ++++++++++----- + .../caps_9.2.0_s390x.replies | 64 ++++++++++---- + .../caps_9.2.0_x86_64+amdsev.replies | 84 ++++++++++++------ + .../caps_9.2.0_x86_64.replies | 84 ++++++++++++------ + 36 files changed, 1880 insertions(+), 748 deletions(-) + +diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c +index d738805ee8..1efb77d03b 100644 +--- a/src/qemu/qemu_capabilities.c ++++ b/src/qemu/qemu_capabilities.c +@@ -1535,6 +1535,12 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIDisk[] = { + { "stats-intervals", QEMU_CAPS_DISK_TIMED_STATS, NULL }, + }; + ++static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIBlock[] = { ++}; ++ ++static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsSCSIGeneric[] = { ++}; ++ + static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsIDEDrive[] = { + { "stats-intervals", QEMU_CAPS_DISK_TIMED_STATS, NULL }, + }; +@@ -1779,6 +1785,12 @@ static virQEMUCapsDeviceTypeProps virQEMUCapsDeviceProps[] = { + { "amd-iommu", virQEMUCapsDevicePropsAMDIOMMU, + G_N_ELEMENTS(virQEMUCapsDevicePropsAMDIOMMU), + QEMU_CAPS_AMD_IOMMU }, ++ { "scsi-block", virQEMUCapsDevicePropsSCSIBlock, ++ G_N_ELEMENTS(virQEMUCapsDevicePropsSCSIBlock), ++ -1 }, ++ { "scsi-generic", virQEMUCapsDevicePropsSCSIGeneric, ++ G_N_ELEMENTS(virQEMUCapsDevicePropsSCSIGeneric), ++ -1 }, + }; + + static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsMemoryBackendFile[] = { +diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies +index f3d7ee69c1..0448dcaab9 100644 +--- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies +@@ -32064,12 +32064,44 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -32159,7 +32191,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -32167,7 +32199,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -32246,7 +32278,7 @@ + "type": "int" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -32254,7 +32286,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -32502,12 +32534,12 @@ + "type": "link" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-machines", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -33602,7 +33634,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -33610,7 +33642,7 @@ + "arguments": { + "typename": "virt-10.0-machine" + }, +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -33857,7 +33889,7 @@ + "type": "string" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -33865,7 +33897,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -33984,12 +34016,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -34283,12 +34315,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -35755,12 +35787,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35776,7 +35808,7 @@ + "kernel": false + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35787,7 +35819,7 @@ + "name": "host" + } + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35820,7 +35852,7 @@ + } + } + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35835,11 +35867,11 @@ + } + } + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +- "id": "libvirt-41", ++ "id": "libvirt-43", + "error": { + "class": "GenericError", + "desc": "Parameter 'model.props.hv-passthrough' is unexpected" +diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.replies b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.replies +index 76d0b6fb6f..4833e479ad 100644 +--- a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.replies +@@ -31668,12 +31668,44 @@ + "id": "libvirt-31" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31767,7 +31799,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31775,7 +31807,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -31854,12 +31886,12 @@ + "type": "int" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-machines", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -32198,7 +32230,7 @@ + "default-ram-id": "ppc_spapr.ram" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -32206,7 +32238,7 @@ + "arguments": { + "typename": "pseries-10.0-machine" + }, +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32469,7 +32501,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32477,7 +32509,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32596,12 +32628,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -35133,12 +35165,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -36500,7 +36532,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.replies b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.replies +index 52068141f9..ecd9af85ce 100644 +--- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.replies ++++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.replies +@@ -30530,12 +30530,44 @@ + "id": "libvirt-32" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-34" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-34" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30625,7 +30657,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30633,7 +30665,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -30712,12 +30744,12 @@ + "type": "int" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-machines", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30992,7 +31024,7 @@ + "default-ram-id": "s390.ram" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31000,7 +31032,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31119,12 +31151,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31834,12 +31866,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33117,7 +33149,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33128,7 +33160,7 @@ + "name": "host" + } + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -33200,7 +33232,7 @@ + } + } + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -33211,7 +33243,7 @@ + "name": "host" + } + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -33367,7 +33399,7 @@ + } + } + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.replies b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.replies +index d49f1c3548..b228f9fd25 100644 +--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.replies ++++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.replies +@@ -32202,12 +32202,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32297,7 +32329,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32305,7 +32337,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32384,7 +32416,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32392,7 +32424,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34565,12 +34597,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35226,7 +35258,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35234,7 +35266,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35353,7 +35385,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35361,7 +35393,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -35568,12 +35600,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -37350,12 +37382,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -38878,12 +38910,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +@@ -38894,16 +38926,16 @@ + "pdh": "AQAAAAE3AAADEAAAAwAAAAIAAAAZzB1NV5cz0ISI+tYZQHDF/dw77x1Zz+u2jw0cUf+KR3u958kjxZlN5IFNIo7sUgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8eYMemS1wynFwgVIgw9ZdHI+6qmsr91sCHKjJHGGBLRF3DHGYtdCLEsYQCVmJQywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAC/3y8ro5AhFTmPkAnaWckGQXhPEnSKInCUEpNnGgufIttDMtWgsjaAX7Jve/Hjcg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADe6oGDni6/LfA/HHDe0vBW4xoma82CBGyydXkq/PJfhO6fra1H9symYAiEd6db4n8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "cpu0-id": "BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw==" + }, +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -38918,7 +38950,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39319,7 +39351,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39333,7 +39365,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39734,7 +39766,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39749,7 +39781,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -40261,7 +40293,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.replies +index 73d9a1b313..f67fc5d217 100644 +--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.replies +@@ -32139,12 +32139,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32238,7 +32270,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32246,7 +32278,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32325,7 +32357,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32333,7 +32365,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34506,12 +34538,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35167,7 +35199,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35175,7 +35207,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35294,7 +35326,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35302,7 +35334,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -35509,12 +35541,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -38147,12 +38179,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -39675,16 +39707,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -39693,11 +39725,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -39712,7 +39744,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -40113,7 +40145,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -40127,7 +40159,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -40528,7 +40560,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -40543,7 +40575,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -41055,7 +41087,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.replies b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.replies +index 2c4dcb149e..d6ddd6a3c9 100644 +--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.replies ++++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.replies +@@ -31359,12 +31359,44 @@ + "id": "libvirt-34" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-35" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-36" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-36" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31454,7 +31486,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31462,7 +31494,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31541,7 +31573,7 @@ + "type": "int" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31549,7 +31581,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -33738,12 +33770,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-machines", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -34149,7 +34181,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -34157,7 +34189,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34276,7 +34308,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34284,7 +34316,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34491,12 +34523,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -36342,12 +36374,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -37681,16 +37713,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +- "id": "libvirt-43", ++ "id": "libvirt-45", + "error": { + "class": "GenericError", + "desc": "SEV is not enabled in KVM" +@@ -37699,7 +37731,7 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -37727,7 +37759,7 @@ + ], + "flc": true + }, +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -37738,7 +37770,7 @@ + "name": "host" + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +@@ -38143,7 +38175,7 @@ + } + } + }, +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +@@ -38157,7 +38189,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -38562,7 +38594,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -38573,7 +38605,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39089,7 +39121,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39104,7 +39136,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39620,7 +39652,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.replies +index 8b8079617f..b4ce4668e1 100644 +--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.replies +@@ -32805,12 +32805,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32904,7 +32936,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32912,7 +32944,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32991,7 +33023,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32999,7 +33031,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35206,12 +35238,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35617,7 +35649,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35625,7 +35657,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35749,7 +35781,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35757,7 +35789,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -35964,12 +35996,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -39021,12 +39053,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -40557,16 +40589,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -40575,11 +40607,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -40594,7 +40626,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -40999,7 +41031,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -41013,7 +41045,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -41418,7 +41450,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -41429,7 +41461,7 @@ + "name": "host" + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -41948,7 +41980,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -41963,7 +41995,7 @@ + } + } + }, +- "id": "libvirt-50" ++ "id": "libvirt-52" + } + + { +@@ -42482,7 +42514,7 @@ + } + } + }, +- "id": "libvirt-50" ++ "id": "libvirt-52" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.replies b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.replies +index b8703698ce..168e3253ee 100644 +--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.replies ++++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.replies +@@ -32293,12 +32293,44 @@ + "id": "libvirt-35" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-36" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-36" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32392,7 +32424,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32400,7 +32432,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32479,7 +32511,7 @@ + "type": "int" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32487,7 +32519,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -34718,12 +34750,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-machines", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35129,7 +35161,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35137,7 +35169,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35261,7 +35293,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35269,7 +35301,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -35476,12 +35508,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -36861,12 +36893,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -38256,16 +38288,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +- "id": "libvirt-44", ++ "id": "libvirt-46", + "error": { + "class": "GenericError", + "desc": "KVM not enabled" +@@ -38274,11 +38306,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -38293,7 +38325,7 @@ + "name": "host" + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -38701,7 +38733,7 @@ + } + } + }, +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -38715,7 +38747,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39123,7 +39155,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39134,7 +39166,7 @@ + "name": "host" + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39658,7 +39690,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39673,7 +39705,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -40197,7 +40229,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies +index 72f27e7a48..cb4abb4533 100644 +--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.replies +@@ -33072,12 +33072,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -33171,7 +33203,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -33179,7 +33211,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33258,7 +33290,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33266,7 +33298,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -35497,12 +35529,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35908,7 +35940,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -35916,7 +35948,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -36040,7 +36072,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -36048,7 +36080,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -36255,12 +36287,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -38316,12 +38348,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -39852,16 +39884,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV is not enabled in KVM" +@@ -39870,11 +39902,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -39889,7 +39921,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -40297,7 +40329,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -40311,7 +40343,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -40719,7 +40751,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -40730,7 +40762,7 @@ + "name": "host" + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -41254,7 +41286,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -41269,7 +41301,7 @@ + } + } + }, +- "id": "libvirt-50" ++ "id": "libvirt-52" + } + + { +@@ -41793,7 +41825,7 @@ + } + } + }, +- "id": "libvirt-50" ++ "id": "libvirt-52" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.replies b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.replies +index c248bced28..9ca1e062f8 100644 +--- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.replies +@@ -25425,12 +25425,44 @@ + "id": "libvirt-31" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -25505,7 +25537,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -25513,7 +25545,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -25587,12 +25619,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-machines", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -25955,7 +25987,7 @@ + "default-ram-id": "mpc8544ds.ram" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -25963,7 +25995,7 @@ + "arguments": { + "typename": "pseries-6.2-machine" + }, +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -26195,7 +26227,7 @@ + "type": "string" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -26203,7 +26235,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -26306,12 +26338,12 @@ + "type": "child" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -28963,12 +28995,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -30091,7 +30123,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.replies +index 9b0d762799..60ad0860a1 100644 +--- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.replies +@@ -25778,12 +25778,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -25862,7 +25894,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -25870,7 +25902,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -25944,7 +25976,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -25952,7 +25984,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -27692,12 +27724,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -28180,7 +28212,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -28188,7 +28220,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -28291,7 +28323,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -28299,7 +28331,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -28463,12 +28495,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -30492,12 +30524,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -31817,16 +31849,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -31835,11 +31867,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -31854,7 +31886,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -32187,7 +32219,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -32201,7 +32233,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -32534,7 +32566,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -32549,7 +32581,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -32882,7 +32914,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.replies b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.replies +index 58a624b006..9eeaa3633e 100644 +--- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.replies +@@ -26130,12 +26130,44 @@ + "id": "libvirt-32" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-34" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-34" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -26214,7 +26246,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -26222,7 +26254,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -26296,12 +26328,12 @@ + "type": "int" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-machines", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -26673,7 +26705,7 @@ + "default-ram-id": "ppc_spapr.ram" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -26681,7 +26713,7 @@ + "arguments": { + "typename": "pseries-7.0-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -26913,7 +26945,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -26921,7 +26953,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -27024,12 +27056,12 @@ + "type": "child" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -29555,12 +29587,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -30747,7 +30779,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.replies +index 6f27d3a349..d6ba5062e9 100644 +--- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.replies +@@ -26292,12 +26292,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -26376,7 +26408,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -26384,7 +26416,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -26458,7 +26490,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -26466,7 +26498,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -28222,12 +28254,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -28728,7 +28760,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -28736,7 +28768,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -28839,7 +28871,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -28847,7 +28879,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -29024,12 +29056,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -31089,12 +31121,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -32418,16 +32450,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -32436,7 +32468,7 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -32457,7 +32489,7 @@ + } + ] + }, +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +@@ -32468,7 +32500,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -32805,7 +32837,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -32819,7 +32851,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -33156,7 +33188,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -33171,7 +33203,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -33508,7 +33540,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.replies b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.replies +index 546214a9ef..582a541a87 100644 +--- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.replies ++++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.replies +@@ -26820,12 +26820,44 @@ + "id": "libvirt-32" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-34" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-34" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -26904,7 +26936,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -26912,7 +26944,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -26986,12 +27018,12 @@ + "type": "int" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-machines", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -27372,7 +27404,7 @@ + "default-ram-id": "ppc_spapr.ram" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -27380,7 +27412,7 @@ + "arguments": { + "typename": "pseries-7.1-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -27622,7 +27654,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -27630,7 +27662,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -27743,12 +27775,12 @@ + "type": "child" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -30262,12 +30294,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -31454,7 +31486,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.replies +index fcee75b20a..f8a7da376c 100644 +--- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.replies +@@ -27037,12 +27037,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -27121,7 +27153,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -27129,7 +27161,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -27203,7 +27235,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -27211,7 +27243,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -29004,12 +29036,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -29528,7 +29560,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -29536,7 +29568,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -29649,7 +29681,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -29657,7 +29689,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -29849,12 +29881,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -31793,12 +31825,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -33122,16 +33154,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -33140,11 +33172,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -33159,7 +33191,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -33497,7 +33529,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -33511,7 +33543,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -33849,7 +33881,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -33864,7 +33896,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -34202,7 +34234,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.replies b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.replies +index a55685c8f0..42e92e070b 100644 +--- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.replies ++++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.replies +@@ -27426,12 +27426,44 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -27515,7 +27547,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -27523,7 +27555,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -27602,12 +27634,12 @@ + "type": "int" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -27710,7 +27742,7 @@ + "default-ram-id": "mpc8544ds.ram" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -27718,7 +27750,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -27831,12 +27863,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30146,12 +30178,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31467,5 +31499,5 @@ + "option": "drive" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } +diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.replies b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.replies +index 1095899c6e..d4101c3c89 100644 +--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.replies ++++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.replies +@@ -28006,12 +28006,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -28095,7 +28127,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -28103,7 +28135,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -28182,7 +28214,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -28190,7 +28222,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -29983,12 +30015,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -30525,7 +30557,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -30533,7 +30565,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -30646,7 +30678,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -30654,7 +30686,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -30846,12 +30878,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -32790,12 +32822,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -34119,16 +34151,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -34137,11 +34169,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -34156,7 +34188,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -34494,7 +34526,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -34508,7 +34540,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -34846,7 +34878,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -34861,7 +34893,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -35199,7 +35231,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.replies +index f87ebf41ee..801fbf5ad6 100644 +--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.replies +@@ -28006,12 +28006,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -28095,7 +28127,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -28103,7 +28135,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -28182,7 +28214,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -28190,7 +28222,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -29983,12 +30015,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -30525,7 +30557,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -30533,7 +30565,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -30646,7 +30678,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -30654,7 +30686,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -30846,12 +30878,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -32790,12 +32822,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -34119,16 +34151,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -34137,11 +34169,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -34156,7 +34188,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -34494,7 +34526,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -34508,7 +34540,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -34846,7 +34878,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -34861,7 +34893,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -35199,7 +35231,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.replies +index 49faceec28..97d1531611 100644 +--- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.replies +@@ -29355,12 +29355,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -29444,7 +29476,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -29452,7 +29484,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -29531,7 +29563,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -29539,7 +29571,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -31356,12 +31388,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -31977,7 +32009,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -31985,7 +32017,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -32098,7 +32130,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -32106,7 +32138,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -32298,12 +32330,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -34349,12 +34381,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -35795,16 +35827,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -35813,11 +35845,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -35832,7 +35864,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -36175,7 +36207,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -36189,7 +36221,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -36532,7 +36564,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -36547,7 +36579,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -36996,7 +37028,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.replies b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.replies +index 8a71843283..6bd4f80dc2 100644 +--- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.replies ++++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.replies +@@ -27805,12 +27805,44 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -27895,7 +27927,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -27903,7 +27935,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -27982,12 +28014,12 @@ + "type": "int" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -28262,7 +28294,7 @@ + "default-ram-id": "s390.ram" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -28270,7 +28302,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -28383,12 +28415,12 @@ + "type": "child" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -29152,12 +29184,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30380,7 +30412,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30391,7 +30423,7 @@ + "name": "host" + } + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -30440,7 +30472,7 @@ + } + } + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.replies +index 458d656220..10906cb369 100644 +--- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.replies +@@ -30132,12 +30132,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -30226,7 +30258,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -30234,7 +30266,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -30313,7 +30345,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -30321,7 +30353,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -32218,12 +32250,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -32859,7 +32891,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -32867,7 +32899,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -32980,7 +33012,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -32988,7 +33020,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -33176,12 +33208,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -35563,12 +35595,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -37026,16 +37058,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -37044,11 +37076,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -37063,7 +37095,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -37426,7 +37458,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -37440,7 +37472,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -37803,7 +37835,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -37818,7 +37850,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -38287,7 +38319,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies +index d1ca8b37f5..002ca31b9f 100644 +--- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies +@@ -31154,12 +31154,44 @@ + "id": "libvirt-31" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31249,7 +31281,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31257,7 +31289,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -31336,7 +31368,7 @@ + "type": "int" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -31344,7 +31376,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -31553,12 +31585,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-machines", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32670,7 +32702,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32678,7 +32710,7 @@ + "arguments": { + "typename": "virt-8.2-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32914,7 +32946,7 @@ + "type": "child" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32922,7 +32954,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -33035,12 +33067,12 @@ + "type": "child" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33334,12 +33366,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34704,12 +34736,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34725,7 +34757,7 @@ + "kernel": false + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34736,7 +34768,7 @@ + "name": "host" + } + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34769,7 +34801,7 @@ + } + } + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34784,11 +34816,11 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +- "id": "libvirt-42", ++ "id": "libvirt-44", + "error": { + "class": "GenericError", + "desc": "Parameter 'hv-passthrough' is unexpected" +diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies +index d28046578d..b8f7b6f68a 100644 +--- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies ++++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies +@@ -31388,12 +31388,44 @@ + "id": "libvirt-31" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-33" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-33" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31487,7 +31519,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -31495,7 +31527,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -31574,7 +31606,7 @@ + "type": "int" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -31582,7 +31614,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -31724,12 +31756,12 @@ + "type": "link" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-machines", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32787,7 +32819,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -32795,7 +32827,7 @@ + "arguments": { + "typename": "virt-8.2-machine" + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -33031,7 +33063,7 @@ + "type": "child" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -33039,7 +33071,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -33152,12 +33184,12 @@ + "type": "child" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -33379,12 +33411,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34866,12 +34898,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34887,7 +34919,7 @@ + "kernel": false + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34898,11 +34930,11 @@ + "name": "host" + } + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +- "id": "libvirt-41", ++ "id": "libvirt-43", + "error": { + "class": "GenericError", + "desc": "The CPU type 'host' requires KVM" +@@ -34921,11 +34953,11 @@ + } + } + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +- "id": "libvirt-42", ++ "id": "libvirt-44", + "error": { + "class": "GenericError", + "desc": "The CPU type 'host' requires KVM" +diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.replies b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.replies +index 7f2bb97635..a908ebf644 100644 +--- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.replies ++++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.replies +@@ -28042,12 +28042,44 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -28137,7 +28169,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -28145,7 +28177,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -28224,12 +28256,12 @@ + "type": "int" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -28263,7 +28295,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -28271,7 +28303,7 @@ + "arguments": { + "typename": "virt-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -28403,7 +28435,7 @@ + "type": "str" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -28411,7 +28443,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -28524,12 +28556,12 @@ + "type": "child" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -28553,12 +28585,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -29873,7 +29905,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -29884,11 +29916,11 @@ + "name": "host" + } + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +- "id": "libvirt-38", ++ "id": "libvirt-40", + "error": { + "class": "GenericError", + "desc": "The CPU type 'host' is not a recognized LoongArch CPU type" +diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.replies b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.replies +index 492cef2065..4ee07edb25 100644 +--- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.replies ++++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.replies +@@ -28498,12 +28498,44 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -28593,7 +28625,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -28601,7 +28633,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -28680,12 +28712,12 @@ + "type": "int" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -28970,7 +29002,7 @@ + "default-ram-id": "s390.ram" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -28978,7 +29010,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -29091,12 +29123,12 @@ + "type": "child" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -29860,12 +29892,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31096,7 +31128,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31107,7 +31139,7 @@ + "name": "host" + } + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31156,7 +31188,7 @@ + } + } + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.replies +index 4b34b01eea..aedd6ec2de 100644 +--- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.replies +@@ -30823,12 +30823,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -30922,7 +30954,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -30930,7 +30962,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31009,7 +31041,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31017,7 +31049,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -32930,12 +32962,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -33551,7 +33583,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -33559,7 +33591,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -33672,7 +33704,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -33680,7 +33712,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -33868,12 +33900,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -36255,12 +36287,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -37731,16 +37763,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -37749,11 +37781,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -37768,7 +37800,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38135,7 +38167,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38149,7 +38181,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -38516,7 +38548,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -38531,7 +38563,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -39004,7 +39036,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies +index 2d492d7b06..90086a65cc 100644 +--- a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies ++++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies +@@ -24332,12 +24332,44 @@ + } + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-17" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-17" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-18" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-18" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-17" ++ "id": "libvirt-19" + } + + { +@@ -24431,7 +24463,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-17" ++ "id": "libvirt-19" + } + + { +@@ -24439,7 +24471,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-18" ++ "id": "libvirt-20" + } + + { +@@ -24518,12 +24550,12 @@ + "type": "int" + } + ], +- "id": "libvirt-18" ++ "id": "libvirt-20" + } + + { + "execute": "query-machines", +- "id": "libvirt-19" ++ "id": "libvirt-21" + } + + { +@@ -24639,7 +24671,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-19" ++ "id": "libvirt-21" + } + + { +@@ -24647,7 +24679,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-20" ++ "id": "libvirt-22" + } + + { +@@ -24760,12 +24792,12 @@ + "type": "child" + } + ], +- "id": "libvirt-20" ++ "id": "libvirt-22" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-21" ++ "id": "libvirt-23" + } + + { +@@ -26098,5 +26130,5 @@ + "option": "drive" + } + ], +- "id": "libvirt-21" ++ "id": "libvirt-23" + } +diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.replies +index 6099885857..270ba9f557 100644 +--- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.replies +@@ -31019,12 +31019,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31118,7 +31150,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31126,7 +31158,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31205,7 +31237,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31213,7 +31245,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -33130,12 +33162,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -33771,7 +33803,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -33779,7 +33811,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -33892,7 +33924,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -33900,7 +33932,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -34092,12 +34124,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -36479,12 +36511,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -37959,16 +37991,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -37977,11 +38009,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "SGX is not enabled in KVM" +@@ -37996,7 +38028,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38364,7 +38396,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38378,7 +38410,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -38746,7 +38778,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -38761,7 +38793,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -39235,7 +39267,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.replies b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.replies +index 51896936cc..e0a9a3082b 100644 +--- a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.replies ++++ b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.replies +@@ -29380,12 +29380,44 @@ + "id": "libvirt-29" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-30" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -29479,7 +29511,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -29487,7 +29519,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -29566,12 +29598,12 @@ + "type": "int" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { + "execute": "query-machines", +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -29646,7 +29678,7 @@ + "default-ram-id": "riscv_virt_board.ram" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -29654,7 +29686,7 @@ + "arguments": { + "typename": "virt-machine" + }, +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -29810,7 +29842,7 @@ + "type": "child" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -29818,7 +29850,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -29931,12 +29963,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30020,12 +30052,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31439,7 +31471,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -31450,11 +31482,11 @@ + "name": "host" + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +- "id": "libvirt-37", ++ "id": "libvirt-39", + "error": { + "class": "GenericError", + "desc": "The requested expansion type is not supported" +diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies +index d8f0b032ba..4ea1a6a6f7 100644 +--- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies ++++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies +@@ -29547,12 +29547,44 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -29642,7 +29674,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -29650,7 +29682,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -29729,12 +29761,12 @@ + "type": "int" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30039,7 +30071,7 @@ + "default-ram-id": "s390.ram" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30047,7 +30079,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -30160,12 +30192,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -30803,12 +30835,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32047,7 +32079,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32058,7 +32090,7 @@ + "name": "host" + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32130,7 +32162,7 @@ + } + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32141,7 +32173,7 @@ + "name": "host" + } + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32213,7 +32245,7 @@ + } + } + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.replies +index 7c6c525d12..257e43a145 100644 +--- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.replies +@@ -31428,12 +31428,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31527,7 +31559,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31535,7 +31567,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31614,7 +31646,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31622,7 +31654,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -33671,12 +33703,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34292,7 +34324,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34300,7 +34332,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34413,7 +34445,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34421,7 +34453,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -34613,12 +34645,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -37169,12 +37201,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -38657,16 +38689,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -38675,11 +38707,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -38694,7 +38726,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39072,7 +39104,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39086,7 +39118,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39464,7 +39496,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39479,7 +39511,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -39967,7 +39999,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies +index 66dcfe42d0..14b11c5c30 100644 +--- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies ++++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies +@@ -30529,12 +30529,44 @@ + "id": "libvirt-27" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-28" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-28" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-29" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-29" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-28" ++ "id": "libvirt-30" + } + + { +@@ -30619,7 +30651,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-28" ++ "id": "libvirt-30" + } + + { +@@ -30627,7 +30659,7 @@ + "arguments": { + "typename": "max-arm-cpu" + }, +- "id": "libvirt-29" ++ "id": "libvirt-31" + } + + { +@@ -30784,12 +30816,12 @@ + "type": "link" + } + ], +- "id": "libvirt-29" ++ "id": "libvirt-31" + } + + { + "execute": "query-machines", +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -31839,7 +31871,7 @@ + "default-ram-id": "ram" + } + ], +- "id": "libvirt-30" ++ "id": "libvirt-32" + } + + { +@@ -31847,7 +31879,7 @@ + "arguments": { + "typename": "virt-9.2-machine" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -32088,7 +32120,7 @@ + "type": "child" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -32096,7 +32128,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -32214,12 +32246,12 @@ + "type": "child" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -32513,12 +32545,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -33834,12 +33866,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-gic-capabilities", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -33855,7 +33887,7 @@ + "kernel": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -33866,11 +33898,11 @@ + "name": "host" + } + }, +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +- "id": "libvirt-36", ++ "id": "libvirt-38", + "error": { + "class": "GenericError", + "desc": "The CPU type 'host' requires KVM" +@@ -33889,11 +33921,11 @@ + } + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +- "id": "libvirt-37", ++ "id": "libvirt-39", + "error": { + "class": "GenericError", + "desc": "The CPU type 'host' requires KVM" +diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies +index 1a47f2b71b..78a59cf3e5 100644 +--- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies ++++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies +@@ -29757,12 +29757,44 @@ + "id": "libvirt-30" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-31" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-32" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-32" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -29852,7 +29884,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-31" ++ "id": "libvirt-33" + } + + { +@@ -29860,7 +29892,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { +@@ -29939,12 +29971,12 @@ + "type": "int" + } + ], +- "id": "libvirt-32" ++ "id": "libvirt-34" + } + + { + "execute": "query-machines", +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30259,7 +30291,7 @@ + "default-ram-id": "s390.ram" + } + ], +- "id": "libvirt-33" ++ "id": "libvirt-35" + } + + { +@@ -30267,7 +30299,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { +@@ -30385,12 +30417,12 @@ + "type": "child" + } + ], +- "id": "libvirt-34" ++ "id": "libvirt-36" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { +@@ -31028,12 +31060,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-35" ++ "id": "libvirt-37" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32281,7 +32313,7 @@ + "option": "drive" + } + ], +- "id": "libvirt-36" ++ "id": "libvirt-38" + } + + { +@@ -32292,7 +32324,7 @@ + "name": "host" + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32364,7 +32396,7 @@ + } + } + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -32375,7 +32407,7 @@ + "name": "host" + } + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32516,7 +32548,7 @@ + } + } + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.replies b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.replies +index 764b71bcdc..81a4188752 100644 +--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.replies ++++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.replies +@@ -31872,12 +31872,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31971,7 +32003,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31979,7 +32011,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32058,7 +32090,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -32066,7 +32098,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34208,12 +34240,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34859,7 +34891,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34867,7 +34899,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34985,7 +35017,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34993,7 +35025,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -35191,12 +35223,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -36821,12 +36853,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -38339,12 +38371,12 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +@@ -38355,16 +38387,16 @@ + "pdh": "AQAAAAE3AAADEAAAAwAAAAIAAAAZzB1NV5cz0ISI+tYZQHDF/dw77x1Zz+u2jw0cUf+KR3u958kjxZlN5IFNIo7sUgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8eYMemS1wynFwgVIgw9ZdHI+6qmsr91sCHKjJHGGBLRF3DHGYtdCLEsYQCVmJQywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAIAAAC/3y8ro5AhFTmPkAnaWckGQXhPEnSKInCUEpNnGgufIttDMtWgsjaAX7Jve/Hjcg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADe6oGDni6/LfA/HHDe0vBW4xoma82CBGyydXkq/PJfhO6fra1H9symYAiEd6db4n8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "cpu0-id": "BlAwmcr4Ruya3YvEGe2EBxuWjMAfIYolslNNM92RsIKxLkWDDRqivqSBOD+qQRCYS9joBYSHMD1g+rmjY+MmVw==" + }, +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -38379,7 +38411,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38779,7 +38811,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -38793,7 +38825,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39193,7 +39225,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39208,7 +39240,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -39719,7 +39751,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.replies b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.replies +index 1b68825df6..69182ce4fc 100644 +--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.replies ++++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.replies +@@ -31764,12 +31764,44 @@ + "id": "libvirt-36" + } + ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-block" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-37" ++} ++ ++{ ++ "execute": "device-list-properties", ++ "arguments": { ++ "typename": "scsi-generic" ++ }, ++ "id": "libvirt-38" ++} ++ ++{ ++ "error": { ++ "class": "DeviceNotFound", ++ "desc": "The libvirt device dump was not collected for this version+device tuple" ++ }, ++ "id": "libvirt-38" ++} ++ + { + "execute": "qom-list-properties", + "arguments": { + "typename": "memory-backend-file" + }, +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31863,7 +31895,7 @@ + "type": "bool" + } + ], +- "id": "libvirt-37" ++ "id": "libvirt-39" + } + + { +@@ -31871,7 +31903,7 @@ + "arguments": { + "typename": "memory-backend-memfd" + }, +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31950,7 +31982,7 @@ + "type": "int" + } + ], +- "id": "libvirt-38" ++ "id": "libvirt-40" + } + + { +@@ -31958,7 +31990,7 @@ + "arguments": { + "typename": "max-x86_64-cpu" + }, +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { +@@ -34100,12 +34132,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-39" ++ "id": "libvirt-41" + } + + { + "execute": "query-machines", +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34741,7 +34773,7 @@ + "default-ram-id": "pc.ram" + } + ], +- "id": "libvirt-40" ++ "id": "libvirt-42" + } + + { +@@ -34749,7 +34781,7 @@ + "arguments": { + "typename": "none-machine" + }, +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34867,7 +34899,7 @@ + "type": "child" + } + ], +- "id": "libvirt-41" ++ "id": "libvirt-43" + } + + { +@@ -34875,7 +34907,7 @@ + "arguments": { + "typename": "generic-pc-machine" + }, +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { +@@ -35073,12 +35105,12 @@ + "type": "bool" + } + ], +- "id": "libvirt-42" ++ "id": "libvirt-44" + } + + { + "execute": "query-cpu-definitions", +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { +@@ -37521,12 +37553,12 @@ + "deprecated": false + } + ], +- "id": "libvirt-43" ++ "id": "libvirt-45" + } + + { + "execute": "query-command-line-options", +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { +@@ -39019,16 +39051,16 @@ + "option": "drive" + } + ], +- "id": "libvirt-44" ++ "id": "libvirt-46" + } + + { + "execute": "query-sev-capabilities", +- "id": "libvirt-45" ++ "id": "libvirt-47" + } + + { +- "id": "libvirt-45", ++ "id": "libvirt-47", + "error": { + "class": "GenericError", + "desc": "SEV: Failed to open /dev/sev: No such file or directory" +@@ -39037,11 +39069,11 @@ + + { + "execute": "query-sgx-capabilities", +- "id": "libvirt-46" ++ "id": "libvirt-48" + } + + { +- "id": "libvirt-46", ++ "id": "libvirt-48", + "error": { + "class": "GenericError", + "desc": "Could not open '/dev/sgx_vepc': No such file or directory" +@@ -39056,7 +39088,7 @@ + "name": "host" + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39456,7 +39488,7 @@ + } + } + }, +- "id": "libvirt-47" ++ "id": "libvirt-49" + } + + { +@@ -39470,7 +39502,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39870,7 +39902,7 @@ + } + } + }, +- "id": "libvirt-48" ++ "id": "libvirt-50" + } + + { +@@ -39885,7 +39917,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +@@ -40396,7 +40428,7 @@ + } + } + }, +- "id": "libvirt-49" ++ "id": "libvirt-51" + } + + { +-- +2.53.0 diff --git a/libvirt-qemu-monitor-Add-handlers-for-block-latency-histogram-set.patch b/libvirt-qemu-monitor-Add-handlers-for-block-latency-histogram-set.patch new file mode 100644 index 0000000..438aebd --- /dev/null +++ b/libvirt-qemu-monitor-Add-handlers-for-block-latency-histogram-set.patch @@ -0,0 +1,182 @@ +From 99b1b6fda9b4e098a7bbbbb44e02064c57bff558 Mon Sep 17 00:00:00 2001 +Message-ID: <99b1b6fda9b4e098a7bbbbb44e02064c57bff558.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 11 Dec 2025 18:38:12 +0100 +Subject: [PATCH] qemu: monitor: Add handlers for 'block-latency-histogram-set' + +Add QMP monitor code for setting up latency histogram configuration. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit ad4830ce6844b75800685ea85b15a53b8dbc5ac6) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + src/qemu/qemu_monitor.c | 21 +++++++++++++ + src/qemu/qemu_monitor.h | 9 ++++++ + src/qemu/qemu_monitor_json.c | 60 ++++++++++++++++++++++++++++++++++++ + src/qemu/qemu_monitor_json.h | 9 ++++++ + tests/qemumonitorjsontest.c | 9 ++++++ + 5 files changed, 108 insertions(+) + +diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c +index cdd08004fb..3d7477c01c 100644 +--- a/src/qemu/qemu_monitor.c ++++ b/src/qemu/qemu_monitor.c +@@ -4612,3 +4612,24 @@ qemuMonitorBlockdevSetActive(qemuMonitor *mon, + + return qemuMonitorJSONBlockdevSetActive(mon, nodename, active); + } ++ ++ ++int ++qemuMonitorBlockLatencyHistogramSet(qemuMonitor *mon, ++ const char *id, ++ unsigned int *boundaries, ++ unsigned int *boundaries_read, ++ unsigned int *boundaries_write, ++ unsigned int *boundaries_zone, ++ unsigned int *boundaries_flush) ++{ ++ QEMU_CHECK_MONITOR(mon); ++ VIR_DEBUG("id='%s'", id); ++ ++ return qemuMonitorJSONBlockLatencyHistogramSet(mon, id, ++ boundaries, ++ boundaries_read, ++ boundaries_write, ++ boundaries_zone, ++ boundaries_flush); ++} +diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h +index 238f7be875..bbe400003a 100644 +--- a/src/qemu/qemu_monitor.h ++++ b/src/qemu/qemu_monitor.h +@@ -1988,3 +1988,12 @@ int + qemuMonitorBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active); ++ ++int ++qemuMonitorBlockLatencyHistogramSet(qemuMonitor *mon, ++ const char *id, ++ unsigned int *boundaries, ++ unsigned int *boundaries_read, ++ unsigned int *boundaries_write, ++ unsigned int *boundaries_zone, ++ unsigned int *boundaries_flush); +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index edeea22ee0..45f690d9e2 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -9130,3 +9130,63 @@ qemuMonitorJSONBlockdevSetActive(qemuMonitor *mon, + + return qemuMonitorJSONCheckError(cmd, reply); + } ++ ++ ++static virJSONValue * ++qemuMonitorJSONBlockLatencyHistogramBoundary(unsigned int *bound) ++{ ++ g_autoptr(virJSONValue) ret = virJSONValueNewArray(); ++ ++ if (!bound) ++ return NULL; ++ ++ for (; *bound > 0; bound++) { ++ g_autoptr(virJSONValue) val = virJSONValueNewNumberUint(*bound); ++ ++ /* the only error is if the first argument is not an array */ ++ ignore_value(virJSONValueArrayAppend(ret, &val)); ++ } ++ ++ return g_steal_pointer(&ret); ++} ++ ++ ++int ++qemuMonitorJSONBlockLatencyHistogramSet(qemuMonitor *mon, ++ const char *id, ++ unsigned int *boundaries, ++ unsigned int *boundaries_read, ++ unsigned int *boundaries_write, ++ unsigned int *boundaries_zone, ++ unsigned int *boundaries_flush) ++{ ++ g_autoptr(virJSONValue) cmd = NULL; ++ g_autoptr(virJSONValue) reply = NULL; ++ ++ g_autoptr(virJSONValue) bound = NULL; ++ g_autoptr(virJSONValue) bound_read = NULL; ++ g_autoptr(virJSONValue) bound_write = NULL; ++ g_autoptr(virJSONValue) bound_zone = NULL; ++ g_autoptr(virJSONValue) bound_flush = NULL; ++ ++ bound = qemuMonitorJSONBlockLatencyHistogramBoundary(boundaries); ++ bound_read = qemuMonitorJSONBlockLatencyHistogramBoundary(boundaries_read); ++ bound_write = qemuMonitorJSONBlockLatencyHistogramBoundary(boundaries_write); ++ bound_zone = qemuMonitorJSONBlockLatencyHistogramBoundary(boundaries_zone); ++ bound_flush = qemuMonitorJSONBlockLatencyHistogramBoundary(boundaries_flush); ++ ++ if (!(cmd = qemuMonitorJSONMakeCommand("block-latency-histogram-set", ++ "s:id", id, ++ "A:boundaries", &bound, ++ "A:boundaries-read", &bound_read, ++ "A:boundaries-write", &bound_write, ++ "A:boundaries-zap", &bound_zone, ++ "A:boundaries-flush", &bound_flush, ++ NULL))) ++ return -1; ++ ++ if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) ++ return -1; ++ ++ return qemuMonitorJSONCheckError(cmd, reply); ++} +diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h +index db9160eb68..b418f70048 100644 +--- a/src/qemu/qemu_monitor_json.h ++++ b/src/qemu/qemu_monitor_json.h +@@ -815,3 +815,12 @@ int + qemuMonitorJSONBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active); ++ ++int ++qemuMonitorJSONBlockLatencyHistogramSet(qemuMonitor *mon, ++ const char *id, ++ unsigned int *boundaries, ++ unsigned int *boundaries_read, ++ unsigned int *boundaries_write, ++ unsigned int *boundaries_zone, ++ unsigned int *boundaries_flush); +diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c +index bfe81739a7..1c1aaaa586 100644 +--- a/tests/qemumonitorjsontest.c ++++ b/tests/qemumonitorjsontest.c +@@ -1130,6 +1130,14 @@ GEN_TEST_FUNC(qemuMonitorJSONSetAction, + GEN_TEST_FUNC(qemuMonitorJSONSetLaunchSecurityState, "sev_secret_header", + "sev_secret", 0, true) + ++unsigned int testHistogramBoundaries[] = {10, 30, 50, 0}; ++GEN_TEST_FUNC(qemuMonitorJSONBlockLatencyHistogramSet, "devid", ++ testHistogramBoundaries, ++ testHistogramBoundaries, ++ testHistogramBoundaries, ++ testHistogramBoundaries, ++ testHistogramBoundaries) ++ + static int + testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque) + { +@@ -2958,6 +2966,7 @@ mymain(void) + DO_TEST_GEN(qemuMonitorJSONBlockJobCancel); + DO_TEST_GEN(qemuMonitorJSONSetAction); + DO_TEST_GEN(qemuMonitorJSONSetLaunchSecurityState); ++ DO_TEST_GEN(qemuMonitorJSONBlockLatencyHistogramSet); + DO_TEST(qemuMonitorJSONGetBalloonInfo); + DO_TEST(qemuMonitorJSONGetBlockInfo); + DO_TEST(qemuMonitorJSONGetAllBlockStatsInfo); +-- +2.53.0 diff --git a/libvirt-qemu-monitor-Extract-block-latency-histogram-stats-into-qemuBlockStats.patch b/libvirt-qemu-monitor-Extract-block-latency-histogram-stats-into-qemuBlockStats.patch new file mode 100644 index 0000000..d64ef06 --- /dev/null +++ b/libvirt-qemu-monitor-Extract-block-latency-histogram-stats-into-qemuBlockStats.patch @@ -0,0 +1,168 @@ +From e02f5e7ca63bdaaec62c2fffa681b9354bee0792 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Peter Krempa +Date: Thu, 29 Jan 2026 14:08:18 +0100 +Subject: [PATCH] qemu: monitor: Extract block latency histogram stats into + 'qemuBlockStats' + +Extract the 'rd_latency_histogram', 'wr_latency_histogram', +'zone_append_latency_histogram', and 'flush_latency_histogram' stats +objects into our internal data. + +Rather than storing 'boundaries' between bins we store them as start +points. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 1c77d396ea9704eae09d7fea160cfd1a897beaf3) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + src/qemu/qemu_monitor.c | 20 +++++++++++++ + src/qemu/qemu_monitor.h | 18 ++++++++++++ + src/qemu/qemu_monitor_json.c | 55 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 93 insertions(+) + +diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c +index 504500c864..cdd08004fb 100644 +--- a/src/qemu/qemu_monitor.c ++++ b/src/qemu/qemu_monitor.c +@@ -1986,6 +1986,26 @@ qemuBlockStatsFinalize(GObject *object) + g_free(stats->limits); + g_free(stats->timed_stats); + ++ if (stats->histogram_read) { ++ g_free(stats->histogram_read->bins); ++ g_free(stats->histogram_read); ++ } ++ ++ if (stats->histogram_write) { ++ g_free(stats->histogram_write->bins); ++ g_free(stats->histogram_write); ++ } ++ ++ if (stats->histogram_zone) { ++ g_free(stats->histogram_zone->bins); ++ g_free(stats->histogram_zone); ++ } ++ ++ if (stats->histogram_flush) { ++ g_free(stats->histogram_flush->bins); ++ g_free(stats->histogram_flush); ++ } ++ + G_OBJECT_CLASS(qemu_block_stats_parent_class)->finalize(object); + } + +diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h +index 041aa7bc12..238f7be875 100644 +--- a/src/qemu/qemu_monitor.h ++++ b/src/qemu/qemu_monitor.h +@@ -806,6 +806,18 @@ struct qemuBlockStatsLimits { + }; + + ++struct qemuBlockStatsLatencyHistogramBin { ++ unsigned long long start; ++ unsigned long long value; ++}; ++ ++ ++struct qemuBlockStatsLatencyHistogram { ++ struct qemuBlockStatsLatencyHistogramBin *bins; ++ size_t nbins; ++}; ++ ++ + struct qemuBlockStatsTimed { + unsigned long long interval_length; + +@@ -858,6 +870,12 @@ struct _qemuBlockStats { + /* block accounting/timed stats from qemu - one entry per interval configured */ + size_t n_timed_stats; + struct qemuBlockStatsTimed *timed_stats; ++ ++ /* latency histograms */ ++ struct qemuBlockStatsLatencyHistogram *histogram_read; ++ struct qemuBlockStatsLatencyHistogram *histogram_write; ++ struct qemuBlockStatsLatencyHistogram *histogram_zone; ++ struct qemuBlockStatsLatencyHistogram *histogram_flush; + }; + G_DECLARE_FINAL_TYPE(qemuBlockStats, qemu_block_stats, QEMU, BLOCK_STATS, GObject); + +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index 401a28ff9a..edeea22ee0 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -2425,6 +2425,52 @@ qemuMonitorJSONBlockStatsCollectDataTimed(virJSONValue *timed_stats, + } + + ++static void ++qemuMonitorJSONBlockStatsCollectDataLatencyHistogram(virJSONValue *stats, ++ const char *histogram_field, ++ struct qemuBlockStatsLatencyHistogram **histogram_data) ++{ ++ virJSONValue *hist; ++ virJSONValue *hist_bins; ++ virJSONValue *hist_bounds; ++ g_autofree struct qemuBlockStatsLatencyHistogramBin *bins = NULL; ++ size_t nbins = 0; ++ size_t i; ++ ++ if (!(hist = virJSONValueObjectGetObject(stats, histogram_field))) ++ return; ++ ++ if (!(hist_bins = virJSONValueObjectGetArray(hist, "bins")) || ++ !(hist_bounds = virJSONValueObjectGetArray(hist, "boundaries")) || ++ virJSONValueArraySize(hist_bins) != (virJSONValueArraySize(hist_bounds) + 1)) { ++ VIR_DEBUG("malformed latency histogram container"); ++ return; ++ } ++ ++ nbins = virJSONValueArraySize(hist_bins); ++ bins = g_new0(struct qemuBlockStatsLatencyHistogramBin, nbins); ++ ++ for (i = 0; i < nbins; i++) { ++ virJSONValue *bin = virJSONValueArrayGet(hist_bins, i); ++ virJSONValue *bound = NULL; ++ ++ if (i > 0) ++ bound = virJSONValueArrayGet(hist_bounds, i - 1); ++ ++ if (!bin || ++ virJSONValueGetNumberUlong(bin, &(bins[i].value)) < 0 || ++ (bound && virJSONValueGetNumberUlong(bound, &(bins[i].start)) < 0)) { ++ VIR_DEBUG("malformed latency histogram container"); ++ return; ++ } ++ } ++ ++ *histogram_data = g_new0(struct qemuBlockStatsLatencyHistogram, 1); ++ (*histogram_data)->bins = g_steal_pointer(&bins); ++ (*histogram_data)->nbins = nbins; ++} ++ ++ + static qemuBlockStats * + qemuMonitorJSONBlockStatsCollectData(virJSONValue *dev, + int *nstats) +@@ -2469,6 +2515,15 @@ qemuMonitorJSONBlockStatsCollectData(virJSONValue *dev, + bstats->wr_highest_offset_valid = true; + } + ++ qemuMonitorJSONBlockStatsCollectDataLatencyHistogram(stats, "rd_latency_histogram", ++ &bstats->histogram_read); ++ qemuMonitorJSONBlockStatsCollectDataLatencyHistogram(stats, "wr_latency_histogram", ++ &bstats->histogram_write); ++ qemuMonitorJSONBlockStatsCollectDataLatencyHistogram(stats, "zone_append_latency_histogram", ++ &bstats->histogram_zone); ++ qemuMonitorJSONBlockStatsCollectDataLatencyHistogram(stats, "flush_latency_histogram", ++ &bstats->histogram_flush); ++ + if ((timed_stats = virJSONValueObjectGetArray(stats, "timed_stats")) && + virJSONValueArraySize(timed_stats) > 0) + qemuMonitorJSONBlockStatsCollectDataTimed(timed_stats, bstats); +-- +2.53.0 diff --git a/libvirt-qemu-process-Rename-qemuProcessSetupDiskThrottling-to-qemuProcessSetupDisks.patch b/libvirt-qemu-process-Rename-qemuProcessSetupDiskThrottling-to-qemuProcessSetupDisks.patch new file mode 100644 index 0000000..ba30c18 --- /dev/null +++ b/libvirt-qemu-process-Rename-qemuProcessSetupDiskThrottling-to-qemuProcessSetupDisks.patch @@ -0,0 +1,62 @@ +From 0359b5fcf870f955bbdca998e5a02261e27c40b7 Mon Sep 17 00:00:00 2001 +Message-ID: <0359b5fcf870f955bbdca998e5a02261e27c40b7.1771336681.git.jdenemar@redhat.com> +From: Peter Krempa +Date: Thu, 29 Jan 2026 11:21:38 +0100 +Subject: [PATCH] qemu: process: Rename 'qemuProcessSetupDiskThrottling' to + 'qemuProcessSetupDisks' + +Rename the runtime disk option setup function to be universal. + +Signed-off-by: Peter Krempa +Reviewed-by: Michal Privoznik +(cherry picked from commit 42a39d703d98e4e48f0f9c8779884b6ac107de26) + +https://issues.redhat.com/browse/RHEL-147866 [rhel-9.8] +https://issues.redhat.com/browse/RHEL-131335 [rhel-10.2] +--- + src/qemu/qemu_process.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index c99bb36c93..aadfaa92b0 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7964,21 +7964,19 @@ qemuProcessSetupDiskPropsRuntime(qemuMonitor *mon, + + + /** +- * qemuProcessSetupDiskThrottling: ++ * qemuProcessSetupDisks: + * +- * Sets up disk trottling for -blockdev via block_set_io_throttle monitor +- * command. This hack should be replaced by proper use of the 'throttle' +- * blockdev driver in qemu once it will support changing of the throttle group. +- * Same hack is done in qemuDomainAttachDiskGeneric. ++ * Sets up disk settings available only at runtime: ++ * - trottling for -blockdev via block_set_io_throttle QMP command + */ + static int +-qemuProcessSetupDiskThrottling(virDomainObj *vm, +- virDomainAsyncJob asyncJob) ++qemuProcessSetupDisks(virDomainObj *vm, ++ virDomainAsyncJob asyncJob) + { + size_t i; + int ret = -1; + +- VIR_DEBUG("Setting up disk throttling for -blockdev via block_set_io_throttle"); ++ VIR_DEBUG("Setting up disk config via runtime commands"); + + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) + return -1; +@@ -8575,7 +8573,7 @@ qemuProcessLaunch(virConnectPtr conn, + if (qemuProcessSetupBalloon(vm, asyncJob) < 0) + goto cleanup; + +- if (qemuProcessSetupDiskThrottling(vm, asyncJob) < 0) ++ if (qemuProcessSetupDisks(vm, asyncJob) < 0) + goto cleanup; + + /* Since CPUs were not started yet, the balloon could not return the memory +-- +2.53.0 diff --git a/libvirt.spec b/libvirt.spec index 9737d99..e947f29 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -294,7 +294,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 11.10.0 -Release: 8%{?dist}%{?extra_release} +Release: 9%{?dist}%{?extra_release} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -342,6 +342,19 @@ Patch37: libvirt-tests-qemuxmlconfdata-provide-iommufd-sample-XML-and-CLI-args.p Patch38: libvirt-src-Use-device-alias-when-ifname-is-unset-in-virDomainInterfaceAddresses.patch Patch39: libvirt-src-esx-esx_vi.c-Debug-path-element-comparisons.patch Patch40: libvirt-qemu-Ignore-cmp_legacy-CPU-flag.patch +Patch41: libvirt-qemu-capabilities-Probe-properties-of-scsi-block-and-scsi-generic-devices.patch +Patch42: libvirt-qemu-capabilities-Introduce-QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR.patch +Patch43: libvirt-RHEL-ONLY-backport-test-data-for-migrate-pr-capability-of-scsi-block.patch +Patch44: libvirt-qemu-Implement-support-for-persistent-reservation-migration-control.patch +Patch45: libvirt-qemu-Extract-disk-setup-done-via-QMP-into-a-separate-helper.patch +Patch46: libvirt-qemu-process-Rename-qemuProcessSetupDiskThrottling-to-qemuProcessSetupDisks.patch +Patch47: libvirt-qemu-monitor-Extract-block-latency-histogram-stats-into-qemuBlockStats.patch +Patch48: libvirt-Expose-latency-histograms-via-virConnectGetAllDomainStats.patch +Patch49: libvirt-qemu-monitor-Add-handlers-for-block-latency-histogram-set.patch +Patch50: libvirt-docs-formatdomain-Fix-indentation-of-docs-for-disk-driver-statistics-element.patch +Patch51: libvirt-docs-formatdomain-Reword-section-about-the-statistics-element-under-disk-driver.patch +Patch52: libvirt-Introduce-support-for-disk-operation-latency-histogram-collection.patch +Patch53: libvirt-qemu-Setup-disk-latency-histograms-on-startup-hotplug-update.patch Requires: libvirt-daemon = %{version}-%{release} @@ -2733,6 +2746,21 @@ exit 0 %endif %changelog +* Tue Feb 17 2026 Jiri Denemark - 11.10.0-9 +- qemu: capabilities: Probe properties of 'scsi-block' and 'scsi-generic' devices (RHEL-135115) +- qemu: capabilities: Introduce QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR (RHEL-135115) +- RHEL-ONLY: backport test data for 'migrate-pr' capability of 'scsi-block' (RHEL-135115) +- qemu: Implement support for persistent reservation migration control (RHEL-135115) +- qemu: Extract disk setup done via QMP into a separate helper (RHEL-131335) +- qemu: process: Rename 'qemuProcessSetupDiskThrottling' to 'qemuProcessSetupDisks' (RHEL-131335) +- qemu: monitor: Extract block latency histogram stats into 'qemuBlockStats' (RHEL-131335) +- Expose latency histograms via 'virConnectGetAllDomainStats' (RHEL-131335) +- qemu: monitor: Add handlers for 'block-latency-histogram-set' (RHEL-131335) +- docs: formatdomain: Fix indentation of docs for element (RHEL-131335) +- docs: formatdomain: Reword section about the '' element under disk driver (RHEL-131335) +- Introduce support for disk operation latency histogram collection (RHEL-131335) +- qemu: Setup disk latency histograms on startup/hotplug/update (RHEL-131335) + * Wed Feb 11 2026 Jiri Denemark - 11.10.0-8 - src/esx/esx_vi.c: Debug path element comparisons (RHEL-145080) - qemu: Ignore cmp_legacy CPU flag (RHEL-148494)