Compare commits
No commits in common. "c8-stream-rhel" and "c9-beta" have entirely different histories.
c8-stream-
...
c9-beta
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/libvirt-8.0.0.tar.xz
|
||||
SOURCES/libvirt-11.10.0.tar.xz
|
||||
|
||||
@ -1 +1 @@
|
||||
e440412e9b45d7e24f0ef492d8edf5cf2cbd3f4c SOURCES/libvirt-8.0.0.tar.xz
|
||||
f36316de87378f52ae9c237d936c28b0f3210253 SOURCES/libvirt-11.10.0.tar.xz
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
From 9c2fd182a02d64004e30900c52e3fcdb550de0bd Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <9c2fd182a02d64004e30900c52e3fcdb550de0bd@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 22 Jun 2022 16:35:50 +0200
|
||||
Subject: [PATCH] Add VIR_MIGRATE_ZEROCOPY flag
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The flag can be used to enable zero-copy mechanism for migrating memory
|
||||
pages.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 8744beecb36600e773c8a8c4823db2bf4b3e262d)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2089433
|
||||
|
||||
Conflicts:
|
||||
include/libvirt/libvirt-domain.h
|
||||
- post-copy recovery not backported
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
include/libvirt/libvirt-domain.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
|
||||
index 5f0a9b7572..792973ce2d 100644
|
||||
--- a/include/libvirt/libvirt-domain.h
|
||||
+++ b/include/libvirt/libvirt-domain.h
|
||||
@@ -860,6 +860,14 @@ typedef enum {
|
||||
*/
|
||||
VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES = (1 << 18),
|
||||
|
||||
+ /* Use zero-copy mechanism for migrating memory pages. For QEMU/KVM this
|
||||
+ * means QEMU will be temporarily allowed to lock all guest pages in host's
|
||||
+ * memory, although only those that are queued for transfer will be locked
|
||||
+ * at the same time.
|
||||
+ *
|
||||
+ * Since: 8.5.0
|
||||
+ */
|
||||
+ VIR_MIGRATE_ZEROCOPY = (1 << 20),
|
||||
} virDomainMigrateFlags;
|
||||
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -0,0 +1,248 @@
|
||||
From d3031b230cc8300541a3ec39bf80b78d11ac15d6 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <d3031b230cc8300541a3ec39bf80b78d11ac15d6.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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.<num>.timed_group.<num>.zone_append_queue_depth_avg`` - average number
|
||||
of pending zone append operations in the defined interval
|
||||
+* ``block.<num>.latency_histogram.<type>.bin.count`` - number of bins in
|
||||
+ latency histogram. <type> is one of ``read``, ``write``, ``zone_append``, or
|
||||
+ ``flush``
|
||||
+* ``block.<num>.latency_histogram.<type>.bin.<num>.start`` start boundary of
|
||||
+ a latency histogram bin in nanoseconds of given operation duration
|
||||
+* ``block.<num>.latency_histogram.<type>.bin.<num>.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
|
||||
@ -0,0 +1,73 @@
|
||||
From 7a8f13f443843e8903ab18d5917f6f8bc4192dd6 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <7a8f13f443843e8903ab18d5917f6f8bc4192dd6.1780571167.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 26 May 2026 15:38:59 +0200
|
||||
Subject: [PATCH] Fix documentation of
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES
|
||||
|
||||
The flag is designed for expanding the CPU model used by host-model. But
|
||||
the documentation was sometimes describing it as showing all CPU
|
||||
features supported on the host, which is wrong as the host may support
|
||||
features that would not be enabled in host-model.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 090183a7dc4a64cca83937eff9a4e93a45b4d712)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
docs/manpages/virsh.rst | 5 +++--
|
||||
src/libvirt-domain.c | 6 +++---
|
||||
tools/virsh-host.c | 2 +-
|
||||
3 files changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
|
||||
index 85fa6ab011..7169b6bc05 100644
|
||||
--- a/docs/manpages/virsh.rst
|
||||
+++ b/docs/manpages/virsh.rst
|
||||
@@ -640,8 +640,9 @@ flagged as deprecated for the CPU model by the hypervisor. These
|
||||
features will be paired with the "disable" policy.
|
||||
|
||||
The **--expand-cpu-features** option will cause the host-model CPU definition
|
||||
-to contain all CPU features supported on the host including those implicitly
|
||||
-enabled by the selected CPU model.
|
||||
+to contain all required CPU features including those implicitly enabled by the
|
||||
+selected CPU model. Without this flag features that are part of the CPU model
|
||||
+itself will not be listed.
|
||||
|
||||
|
||||
pool-capabilities
|
||||
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
|
||||
index 034f126dd5..e146fa7e82 100644
|
||||
--- a/src/libvirt-domain.c
|
||||
+++ b/src/libvirt-domain.c
|
||||
@@ -12331,9 +12331,9 @@ virDomainSetUserPassword(virDomainPtr dom,
|
||||
* passthrough and so on.
|
||||
*
|
||||
* If @flags includes VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES,
|
||||
- * libvirt will explicitly list all CPU features (in host-model CPU definition)
|
||||
- * that are supported on the host. Without this flag features that are part of
|
||||
- * the CPU model itself will not be listed.
|
||||
+ * libvirt will explicitly list all CPU features that will be enabled for
|
||||
+ * host-model CPU mode. Without this flag features that are part of the CPU
|
||||
+ * model itself will not be listed.
|
||||
*
|
||||
* Returns NULL in case of error or an XML string
|
||||
* defining the capabilities.
|
||||
diff --git a/tools/virsh-host.c b/tools/virsh-host.c
|
||||
index dd98917fa8..5dbeb54ae5 100644
|
||||
--- a/tools/virsh-host.c
|
||||
+++ b/tools/virsh-host.c
|
||||
@@ -120,7 +120,7 @@ static const vshCmdOptDef opts_domcapabilities[] = {
|
||||
},
|
||||
{.name = "expand-cpu-features",
|
||||
.type = VSH_OT_BOOL,
|
||||
- .help = N_("show all features in host CPU model"),
|
||||
+ .help = N_("expand 'host-model' CPU to also show features enabled by the CPU model"),
|
||||
},
|
||||
{.name = NULL}
|
||||
};
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,54 @@
|
||||
From 9644e7aceda1ca2b88d9eb699a274c5b4eafbda1 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <9644e7aceda1ca2b88d9eb699a274c5b4eafbda1.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 11 Mar 2026 11:31:06 +0100
|
||||
Subject: [PATCH] Introduce EXPAND_CPU_FEATURES flag for domain capabilities
|
||||
|
||||
The new VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flag for
|
||||
virConnectGetDomainCapabilities can be used to request the host-model
|
||||
CPU definition to include all supported features (normally only extra
|
||||
features relative to the selected CPU model are listed).
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 8aa13d1b16b08feea37ecacc85540671e7995bb8)
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-153653
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
include/libvirt/libvirt-domain.h | 2 ++
|
||||
src/libvirt-domain.c | 5 +++++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
|
||||
index 8e62bd23d4..1c5dbdc26e 100644
|
||||
--- a/include/libvirt/libvirt-domain.h
|
||||
+++ b/include/libvirt/libvirt-domain.h
|
||||
@@ -1517,6 +1517,8 @@ int virDomainMigrateStartPostCopy(virDomainPtr domain,
|
||||
typedef enum {
|
||||
/* Report host model with deprecated features disabled. (Since: 11.0.0) */
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0),
|
||||
+ /* Report all host model CPU features. (Since: 12.2.0) */
|
||||
+ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES = (1 << 1),
|
||||
} virConnectGetDomainCapabilitiesFlags;
|
||||
|
||||
char * virConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
|
||||
index c7451fee05..034f126dd5 100644
|
||||
--- a/src/libvirt-domain.c
|
||||
+++ b/src/libvirt-domain.c
|
||||
@@ -12330,6 +12330,11 @@ virDomainSetUserPassword(virDomainPtr dom,
|
||||
* instance, if host, libvirt and qemu is capable of VFIO
|
||||
* passthrough and so on.
|
||||
*
|
||||
+ * If @flags includes VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES,
|
||||
+ * libvirt will explicitly list all CPU features (in host-model CPU definition)
|
||||
+ * that are supported on the host. Without this flag features that are part of
|
||||
+ * the CPU model itself will not be listed.
|
||||
+ *
|
||||
* Returns NULL in case of error or an XML string
|
||||
* defining the capabilities.
|
||||
*
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,59 @@
|
||||
From f4588f45d48037050c88624e37f7b13e15138b0e Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <f4588f45d48037050c88624e37f7b13e15138b0e.1780571167.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 29 May 2026 12:52:39 +0200
|
||||
Subject: [PATCH] Introduce
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag
|
||||
|
||||
Some CPU features may be enabled explicitly, but should not
|
||||
automatically become part of a host-model CPU. Users can now request
|
||||
such features to be shown in the host-model CPU in domain capabilities
|
||||
by VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES flag.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit e1efd79e837456d209115c536fc7e5f14abcbc63)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
include/libvirt/libvirt-domain.h | 3 +++
|
||||
src/libvirt-domain.c | 8 ++++++++
|
||||
2 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
|
||||
index 1c5dbdc26e..4d7c0099ef 100644
|
||||
--- a/include/libvirt/libvirt-domain.h
|
||||
+++ b/include/libvirt/libvirt-domain.h
|
||||
@@ -1519,6 +1519,9 @@ typedef enum {
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0),
|
||||
/* Report all host model CPU features. (Since: 12.2.0) */
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES = (1 << 1),
|
||||
+ /* Report all CPU features supported on the host, even those that will not
|
||||
+ * be enabled by host-model CPU mode. (Since: 12.5.0) */
|
||||
+ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES = (1 << 2),
|
||||
} virConnectGetDomainCapabilitiesFlags;
|
||||
|
||||
char * virConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
|
||||
index e146fa7e82..0ae48654df 100644
|
||||
--- a/src/libvirt-domain.c
|
||||
+++ b/src/libvirt-domain.c
|
||||
@@ -12335,6 +12335,14 @@ virDomainSetUserPassword(virDomainPtr dom,
|
||||
* host-model CPU mode. Without this flag features that are part of the CPU
|
||||
* model itself will not be listed.
|
||||
*
|
||||
+ * Adding VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES to @flags
|
||||
+ * tells libvirt to update the host-model CPU definition with features that are
|
||||
+ * supported on the host, but will not be enabled by default when starting a
|
||||
+ * domain with host-model CPU. Use both
|
||||
+ * VIR_CONNECT_GET_DOMAIN_CAPABILITIES_SUPPORTED_CPU_FEATURES and
|
||||
+ * VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES flags to get a
|
||||
+ * complete list of features that can be enabled on the host.
|
||||
+ *
|
||||
* Returns NULL in case of error or an XML string
|
||||
* defining the capabilities.
|
||||
*
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,422 @@
|
||||
From a26ff56a6bc216751ea6995d63396dfa634407c1 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <a26ff56a6bc216751ea6995d63396dfa634407c1.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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
|
||||
+ ``<latency-histogram>`` sub-element. The histogram is collected for
|
||||
+ the whole runtime of the VM, but can be re-started or reconfigured using
|
||||
+ the `virDomainUpdateDeviceFlags <html/libvirt-libvirt-domain.html#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 ``<latency-histogram>`` has multiple mandatory ``<bin>`` 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::
|
||||
+
|
||||
+ <driver name='qemu'>
|
||||
+ <statistics>
|
||||
+
|
||||
+ <latency-histogram>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='1000'/>
|
||||
+ <bin start='100000'/>
|
||||
+ </latency-histogram>
|
||||
+
|
||||
+ [or for specific operation types]
|
||||
+
|
||||
+ <latency-histogram type='read'>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='1000'/>
|
||||
+ <bin start='100000'/>
|
||||
+ </latency-histogram>
|
||||
+
|
||||
+ </statistics>
|
||||
+ </driver>
|
||||
+
|
||||
+ :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, "<bin start='0'/>\n");
|
||||
+
|
||||
+ for (; *bins > 0; bins++)
|
||||
+ virBufferAsprintf(&histogramChildBuf, "<bin start='%u'/>\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, "<statistic interval='%u'/>\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 @@
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="statistics">
|
||||
- <zeroOrMore>
|
||||
- <element name="statistic">
|
||||
- <attribute name="interval">
|
||||
- <ref name="unsignedInt"/>
|
||||
- </attribute>
|
||||
- </element>
|
||||
- </zeroOrMore>
|
||||
+ <interleave>
|
||||
+ <zeroOrMore>
|
||||
+ <element name="statistic">
|
||||
+ <attribute name="interval">
|
||||
+ <ref name="unsignedInt"/>
|
||||
+ </attribute>
|
||||
+ </element>
|
||||
+ </zeroOrMore>
|
||||
+ <zeroOrMore>
|
||||
+ <element name="latency-histogram">
|
||||
+ <optional>
|
||||
+ <attribute name='type'>
|
||||
+ <choice>
|
||||
+ <value>read</value>
|
||||
+ <value>write</value>
|
||||
+ <value>zone</value>
|
||||
+ <value>flush</value>
|
||||
+ </choice>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
+ <oneOrMore>
|
||||
+ <element name='bin'>
|
||||
+ <attribute name='start'>
|
||||
+ <ref name="unsignedInt"/>
|
||||
+ </attribute>
|
||||
+ </element>
|
||||
+ </oneOrMore>
|
||||
+ </element>
|
||||
+ </zeroOrMore>
|
||||
+ </interleave>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
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 @@
|
||||
<statistics>
|
||||
<statistic interval='3'/>
|
||||
<statistic interval='10'/>
|
||||
+ <latency-histogram>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
</statistics>
|
||||
</driver>
|
||||
<source file='/var/lib/libvirt/images/iothrtest1.img'/>
|
||||
@@ -33,6 +38,30 @@
|
||||
<statistics>
|
||||
<statistic interval='5'/>
|
||||
<statistic interval='15'/>
|
||||
+ <latency-histogram type='read'>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='write'>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='zone'>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='flush'>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
</statistics>
|
||||
</driver>
|
||||
<source file='/var/lib/libvirt/images/iothrtest2.img'/>
|
||||
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 @@
|
||||
<statistics>
|
||||
<statistic interval='3'/>
|
||||
<statistic interval='10'/>
|
||||
+ <latency-histogram>
|
||||
+ <bin start='0'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
</statistics>
|
||||
</driver>
|
||||
<source file='/var/lib/libvirt/images/iothrtest1.img'/>
|
||||
@@ -29,6 +34,26 @@
|
||||
<statistics>
|
||||
<statistic interval='5'/>
|
||||
<statistic interval='15'/>
|
||||
+ <latency-histogram type='read'>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='write'>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='zone'>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
+ <latency-histogram type='flush'>
|
||||
+ <bin start='10'/>
|
||||
+ <bin start='20'/>
|
||||
+ <bin start='30'/>
|
||||
+ </latency-histogram>
|
||||
</statistics>
|
||||
</driver>
|
||||
<source file='/var/lib/libvirt/images/iothrtest2.img'/>
|
||||
--
|
||||
2.53.0
|
||||
@ -1,47 +0,0 @@
|
||||
From f0d0a6a9701522eee013682eb0ef566ef7cdac61 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <f0d0a6a9701522eee013682eb0ef566ef7cdac61@dist-git>
|
||||
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||
Date: Mon, 22 Feb 2016 12:51:51 +0100
|
||||
Subject: [PATCH] RHEL: Add rhel machine types to qemuDomainMachineNeedsFDC
|
||||
|
||||
RHEL-only.
|
||||
|
||||
pc-q35-rhel7.0.0 and pc-q35-rhel7.1.0 do not need an explicit
|
||||
isa-fdc controller.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1227880
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_domain.c | 15 +++++++++++++--
|
||||
1 file changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index a8401bac30..40fe9985e6 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -8767,8 +8767,19 @@ qemuDomainHasBuiltinIDE(const virDomainDef *def)
|
||||
bool
|
||||
qemuDomainNeedsFDC(const virDomainDef *def)
|
||||
{
|
||||
- /* all supported Q35 machines need explicit FDC */
|
||||
- return qemuDomainIsQ35(def);
|
||||
+ const char *p;
|
||||
+
|
||||
+ /* all supported Q35 machines need explicit FDC except for old RHEL-7
|
||||
+ * machine types */
|
||||
+ if (!qemuDomainIsQ35(def))
|
||||
+ return false;
|
||||
+
|
||||
+ if ((p = STRSKIP(def->os.machine, "pc-q35-")) &&
|
||||
+ (STRPREFIX(p, "rhel7.0.0") ||
|
||||
+ STRPREFIX(p, "rhel7.1.0")))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,257 +0,0 @@
|
||||
From b2529d5ff3a18a2b0022da75431cea5bf037819e Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b2529d5ff3a18a2b0022da75431cea5bf037819e@dist-git>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Wed, 28 Jul 2021 17:37:21 +0200
|
||||
Subject: [PATCH] RHEL: Enable usage of x-blockdev-reopen
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RHEL-only
|
||||
|
||||
Introduce a new capability QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API
|
||||
based on the presence of '__com.redhat_rhel-av-8_2_0-api' feature for
|
||||
'x-blockdev-reopen' which states that reopen works for what libvirt
|
||||
is going to use it and wire up code to call the x- prefixed command.
|
||||
|
||||
This implementation will become dormant once qemu starts supporting
|
||||
upstream-stable blockdev-reopen.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1799013
|
||||
|
||||
Starting with libvirt-7.6, upstream has adapted to the new format of
|
||||
arguments so this patch was modified to support blockdev-reopen which
|
||||
takes an array of nodes to reopen.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1929765
|
||||
Message-Id: <3fcde2fc6add36d5276ae224caf18adc8bca7d48.1627486352.git.pkrempa@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_block.c | 24 +++++++++++++++---------
|
||||
src/qemu/qemu_block.h | 3 ++-
|
||||
src/qemu/qemu_capabilities.c | 13 +++++++++++++
|
||||
src/qemu/qemu_capabilities.h | 3 +++
|
||||
src/qemu/qemu_monitor.c | 5 +++--
|
||||
src/qemu/qemu_monitor.h | 3 ++-
|
||||
src/qemu/qemu_monitor_json.c | 12 +++++++++---
|
||||
src/qemu/qemu_monitor_json.h | 3 ++-
|
||||
tests/qemumonitorjsontest.c | 2 +-
|
||||
9 files changed, 50 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
|
||||
index e5ff653a60..aa566d0097 100644
|
||||
--- a/src/qemu/qemu_block.c
|
||||
+++ b/src/qemu/qemu_block.c
|
||||
@@ -3331,7 +3331,8 @@ qemuBlockBitmapsHandleCommitFinish(virStorageSource *topsrc,
|
||||
|
||||
int
|
||||
qemuBlockReopenFormatMon(qemuMonitor *mon,
|
||||
- virStorageSource *src)
|
||||
+ virStorageSource *src,
|
||||
+ bool downstream)
|
||||
{
|
||||
g_autoptr(virJSONValue) reopenprops = NULL;
|
||||
g_autoptr(virJSONValue) srcprops = NULL;
|
||||
@@ -3340,15 +3341,19 @@ qemuBlockReopenFormatMon(qemuMonitor *mon,
|
||||
if (!(srcprops = qemuBlockStorageSourceGetBlockdevProps(src, src->backingStore)))
|
||||
return -1;
|
||||
|
||||
- if (virJSONValueArrayAppend(reopenoptions, &srcprops) < 0)
|
||||
- return -1;
|
||||
+ if (downstream) {
|
||||
+ reopenprops = g_steal_pointer(&srcprops);
|
||||
+ } else {
|
||||
+ if (virJSONValueArrayAppend(reopenoptions, &srcprops) < 0)
|
||||
+ return -1;
|
||||
|
||||
- if (virJSONValueObjectAdd(&reopenprops,
|
||||
- "a:options", &reopenoptions,
|
||||
- NULL) < 0)
|
||||
- return -1;
|
||||
+ if (virJSONValueObjectAdd(&reopenprops,
|
||||
+ "a:options", &reopenoptions,
|
||||
+ NULL) < 0)
|
||||
+ return -1;
|
||||
+ }
|
||||
|
||||
- if (qemuMonitorBlockdevReopen(mon, &reopenprops) < 0)
|
||||
+ if (qemuMonitorBlockdevReopen(mon, &reopenprops, downstream) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@@ -3372,6 +3377,7 @@ qemuBlockReopenFormat(virDomainObj *vm,
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
virQEMUDriver *driver = priv->driver;
|
||||
+ bool downstream = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API);
|
||||
int rc;
|
||||
|
||||
/* If we are lacking the object here, qemu might have opened an image with
|
||||
@@ -3385,7 +3391,7 @@ qemuBlockReopenFormat(virDomainObj *vm,
|
||||
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||
return -1;
|
||||
|
||||
- rc = qemuBlockReopenFormatMon(priv->mon, src);
|
||||
+ rc = qemuBlockReopenFormatMon(priv->mon, src, downstream);
|
||||
|
||||
qemuDomainObjExitMonitor(driver, vm);
|
||||
if (rc < 0)
|
||||
diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h
|
||||
index 184a549d5c..130cfcdefd 100644
|
||||
--- a/src/qemu/qemu_block.h
|
||||
+++ b/src/qemu/qemu_block.h
|
||||
@@ -267,7 +267,8 @@ qemuBlockBitmapsHandleCommitFinish(virStorageSource *topsrc,
|
||||
/* only for use in qemumonitorjsontest */
|
||||
int
|
||||
qemuBlockReopenFormatMon(qemuMonitor *mon,
|
||||
- virStorageSource *src);
|
||||
+ virStorageSource *src,
|
||||
+ bool downstream);
|
||||
|
||||
int
|
||||
qemuBlockReopenReadWrite(virDomainObj *vm,
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 5f1eb5014c..8ae80ef8d7 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -654,6 +654,9 @@ VIR_ENUM_IMPL(virQEMUCaps,
|
||||
"rbd-encryption", /* QEMU_CAPS_RBD_ENCRYPTION */
|
||||
"sev-guest-kernel-hashes", /* QEMU_CAPS_SEV_GUEST_KERNEL_HASHES */
|
||||
"sev-inject-launch-secret", /* QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET */
|
||||
+
|
||||
+ /* 420 */
|
||||
+ "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api", /* QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API */
|
||||
);
|
||||
|
||||
|
||||
@@ -1540,6 +1543,7 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsVhostUserFS[] =
|
||||
/* see documentation for virQEMUQAPISchemaPathGet for the query format */
|
||||
static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
|
||||
{ "block-commit/arg-type/*top", QEMU_CAPS_ACTIVE_COMMIT },
|
||||
+ { "x-blockdev-reopen/$__com.redhat_rhel-av-8_2_0-api", QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API },
|
||||
{ "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
|
||||
{ "blockdev-add/arg-type/+gluster/debug", QEMU_CAPS_GLUSTER_DEBUG_LEVEL},
|
||||
{ "blockdev-add/arg-type/+vxhs", QEMU_CAPS_VXHS},
|
||||
@@ -5235,6 +5239,15 @@ virQEMUCapsInitProcessCaps(virQEMUCaps *qemuCaps)
|
||||
qemuCaps->arch == VIR_ARCH_MIPS)
|
||||
virQEMUCapsSet(qemuCaps, QEMU_CAPS_SCSI_NCR53C90);
|
||||
|
||||
+ /* RHEL-only:
|
||||
+ * - if upstream blockdev-reopen is enabled, clear the downstream flag
|
||||
+ * - if the downstream flag is present but not the upstream, assert the upstream flag too
|
||||
+ */
|
||||
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN))
|
||||
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API);
|
||||
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API))
|
||||
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN);
|
||||
+
|
||||
virQEMUCapsInitProcessCapsInterlock(qemuCaps);
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index e3a3ab4445..cde6c18b4c 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -634,6 +634,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
|
||||
QEMU_CAPS_SEV_GUEST_KERNEL_HASHES, /* sev-guest.kernel-hashes= */
|
||||
QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET, /* 'sev-inject-launch-secret' qmp command present */
|
||||
|
||||
+ /* 420 */
|
||||
+ QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API, /* downstream support for blockdev reopen in rhel-av-8.2.0 */
|
||||
+
|
||||
QEMU_CAPS_LAST /* this must always be the last item */
|
||||
} virQEMUCapsFlags;
|
||||
|
||||
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
||||
index babf9e62fb..23638d3fe8 100644
|
||||
--- a/src/qemu/qemu_monitor.c
|
||||
+++ b/src/qemu/qemu_monitor.c
|
||||
@@ -4247,14 +4247,15 @@ qemuMonitorBlockdevAdd(qemuMonitor *mon,
|
||||
|
||||
int
|
||||
qemuMonitorBlockdevReopen(qemuMonitor *mon,
|
||||
- virJSONValue **props)
|
||||
+ virJSONValue **props,
|
||||
+ bool downstream)
|
||||
{
|
||||
VIR_DEBUG("props=%p (node-name=%s)", *props,
|
||||
NULLSTR(virJSONValueObjectGetString(*props, "node-name")));
|
||||
|
||||
QEMU_CHECK_MONITOR(mon);
|
||||
|
||||
- return qemuMonitorJSONBlockdevReopen(mon, props);
|
||||
+ return qemuMonitorJSONBlockdevReopen(mon, props, downstream);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
||||
index 9b2e4e1421..d2037914be 100644
|
||||
--- a/src/qemu/qemu_monitor.h
|
||||
+++ b/src/qemu/qemu_monitor.h
|
||||
@@ -1426,7 +1426,8 @@ int qemuMonitorBlockdevAdd(qemuMonitor *mon,
|
||||
virJSONValue **props);
|
||||
|
||||
int qemuMonitorBlockdevReopen(qemuMonitor *mon,
|
||||
- virJSONValue **props);
|
||||
+ virJSONValue **props,
|
||||
+ bool downstream);
|
||||
|
||||
int qemuMonitorBlockdevDel(qemuMonitor *mon,
|
||||
const char *nodename);
|
||||
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
||||
index b0b513683b..34a46b9b41 100644
|
||||
--- a/src/qemu/qemu_monitor_json.c
|
||||
+++ b/src/qemu/qemu_monitor_json.c
|
||||
@@ -8051,13 +8051,19 @@ qemuMonitorJSONBlockdevAdd(qemuMonitor *mon,
|
||||
|
||||
int
|
||||
qemuMonitorJSONBlockdevReopen(qemuMonitor *mon,
|
||||
- virJSONValue **props)
|
||||
+ virJSONValue **props,
|
||||
+ bool downstream)
|
||||
{
|
||||
g_autoptr(virJSONValue) cmd = NULL;
|
||||
g_autoptr(virJSONValue) reply = NULL;
|
||||
|
||||
- if (!(cmd = qemuMonitorJSONMakeCommandInternal("blockdev-reopen", props)))
|
||||
- return -1;
|
||||
+ if (downstream) {
|
||||
+ if (!(cmd = qemuMonitorJSONMakeCommandInternal("x-blockdev-reopen", props)))
|
||||
+ return -1;
|
||||
+ } else {
|
||||
+ if (!(cmd = qemuMonitorJSONMakeCommandInternal("blockdev-reopen", props)))
|
||||
+ return -1;
|
||||
+ }
|
||||
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||
return -1;
|
||||
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
|
||||
index 64d9ebdaa3..15ce03d7af 100644
|
||||
--- a/src/qemu/qemu_monitor_json.h
|
||||
+++ b/src/qemu/qemu_monitor_json.h
|
||||
@@ -748,7 +748,8 @@ qemuMonitorJSONBlockdevAdd(qemuMonitor *mon,
|
||||
|
||||
int
|
||||
qemuMonitorJSONBlockdevReopen(qemuMonitor *mon,
|
||||
- virJSONValue **props)
|
||||
+ virJSONValue **props,
|
||||
+ bool downstream)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
||||
|
||||
int
|
||||
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
|
||||
index 48e2a457ab..8624a547b5 100644
|
||||
--- a/tests/qemumonitorjsontest.c
|
||||
+++ b/tests/qemumonitorjsontest.c
|
||||
@@ -2780,7 +2780,7 @@ testQemuMonitorJSONBlockdevReopen(const void *opaque)
|
||||
if (qemuMonitorTestAddItem(test, "blockdev-reopen", "{\"return\":{}}") < 0)
|
||||
return -1;
|
||||
|
||||
- if (qemuBlockReopenFormatMon(qemuMonitorTestGetMonitor(test), src) < 0)
|
||||
+ if (qemuBlockReopenFormatMon(qemuMonitorTestGetMonitor(test), src, false) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
From 29eb7b77805cf5fb756c964cdbe7fb7fb2c01f5f Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <29eb7b77805cf5fb756c964cdbe7fb7fb2c01f5f@dist-git>
|
||||
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||
Date: Mon, 27 Aug 2018 13:09:38 +0200
|
||||
Subject: [PATCH] RHEL: Fix virConnectGetMaxVcpus output
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1092363
|
||||
|
||||
RHEL-only.
|
||||
|
||||
Ignore the maximum vcpu limit (KVM_CAP_MAX_VCPUS) on RHEL,
|
||||
since RHEL QEMU treats the recommended limit (KVM_CAP_NR_VCPUS)
|
||||
as the maximum, see:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=998708
|
||||
|
||||
(cherry picked from commit 7dff909fa34bdd93ad200dbffe70c0c1ee931925)
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
|
||||
https: //bugzilla.redhat.com/show_bug.cgi?id=1582222
|
||||
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
||||
---
|
||||
src/util/virhostcpu.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
|
||||
index a07c00a0e9..35f41daef2 100644
|
||||
--- a/src/util/virhostcpu.c
|
||||
+++ b/src/util/virhostcpu.c
|
||||
@@ -1166,6 +1166,11 @@ virHostCPUGetKVMMaxVCPUs(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
+/* Ignore KVM_CAP_MAX_VCPUS on RHEL - the recommended maximum
|
||||
+ * is treated as a hard limit.
|
||||
+ */
|
||||
+# undef KVM_CAP_MAX_VCPUS
|
||||
+
|
||||
# ifdef KVM_CAP_MAX_VCPUS
|
||||
/* at first try KVM_CAP_MAX_VCPUS to determine the maximum count */
|
||||
if ((ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS)) > 0)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,185 +0,0 @@
|
||||
From 1d93a3944a200b7c955800faa598e0e11da098f8 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <1d93a3944a200b7c955800faa598e0e11da098f8@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 27 Mar 2015 12:48:40 +0100
|
||||
Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs
|
||||
|
||||
RHEL-only
|
||||
|
||||
Upstream tried to solve the change of Broadwell and Haswell CPUs by
|
||||
removing rtm and hle features from the corresponding CPU models for new
|
||||
machine types. Then they reverted this and introduced new *-noTSX models
|
||||
instead. However, the original fix was backported to RHEL.
|
||||
|
||||
This patch makes sure Broadwell and Haswell will always contain rtm and
|
||||
hle features regardless on RHEL version or machine type used.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1199446
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_command.c | 22 +++++++++++++++++++
|
||||
tests/qemuxml2argvdata/cpu-Haswell.args | 2 +-
|
||||
.../qemuxml2argvdata/cpu-host-model-cmt.args | 2 +-
|
||||
.../cpu-translation.x86_64-4.0.0.args | 2 +-
|
||||
.../cpu-translation.x86_64-latest.args | 2 +-
|
||||
tests/qemuxml2argvdata/cpu-tsc-frequency.args | 2 +-
|
||||
tests/qemuxml2argvdata/q35-acpi-nouefi.args | 2 +-
|
||||
tests/qemuxml2argvdata/q35-acpi-uefi.args | 2 +-
|
||||
tests/qemuxml2argvdata/q35-noacpi-nouefi.args | 2 +-
|
||||
9 files changed, 30 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index d822533ccb..6b4647a711 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -6521,6 +6521,8 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
|
||||
{
|
||||
size_t i;
|
||||
virCPUDef *cpu = def->cpu;
|
||||
+ bool hle = false;
|
||||
+ bool rtm = false;
|
||||
|
||||
switch ((virCPUMode) cpu->mode) {
|
||||
case VIR_CPU_MODE_HOST_PASSTHROUGH:
|
||||
@@ -6587,6 +6589,12 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
|
||||
for (i = 0; i < cpu->nfeatures; i++) {
|
||||
const char *featname =
|
||||
virQEMUCapsCPUFeatureToQEMU(qemuCaps, cpu->features[i].name);
|
||||
+
|
||||
+ if (STREQ("rtm", cpu->features[i].name))
|
||||
+ rtm = true;
|
||||
+ if (STREQ("hle", cpu->features[i].name))
|
||||
+ hle = true;
|
||||
+
|
||||
switch ((virCPUFeaturePolicy) cpu->features[i].policy) {
|
||||
case VIR_CPU_FEATURE_FORCE:
|
||||
case VIR_CPU_FEATURE_REQUIRE:
|
||||
@@ -6604,6 +6612,20 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Some versions of qemu-kvm in RHEL provide Broadwell and Haswell CPU
|
||||
+ * models which lack rtm and hle features when used with some machine
|
||||
+ * types. Let's make sure Broadwell and Haswell will always have these
|
||||
+ * features. But only if the features were not explicitly mentioned in
|
||||
+ * the guest CPU definition.
|
||||
+ */
|
||||
+ if (STREQ_NULLABLE(cpu->model, "Broadwell") ||
|
||||
+ STREQ_NULLABLE(cpu->model, "Haswell")) {
|
||||
+ if (!rtm)
|
||||
+ virBufferAddLit(buf, ",rtm=on");
|
||||
+ if (!hle)
|
||||
+ virBufferAddLit(buf, ",hle=on");
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/tests/qemuxml2argvdata/cpu-Haswell.args b/tests/qemuxml2argvdata/cpu-Haswell.args
|
||||
index b57fdfddc5..965274c1f0 100644
|
||||
--- a/tests/qemuxml2argvdata/cpu-Haswell.args
|
||||
+++ b/tests/qemuxml2argvdata/cpu-Haswell.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
|
||||
-machine pc,usb=off,dump-guest-core=off \
|
||||
-accel kvm \
|
||||
--cpu Haswell \
|
||||
+-cpu Haswell,rtm=on,hle=on \
|
||||
-m 214 \
|
||||
-realtime mlock=off \
|
||||
-smp 6,sockets=6,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2argvdata/cpu-host-model-cmt.args b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
|
||||
index 0de04e877d..602f70de86 100644
|
||||
--- a/tests/qemuxml2argvdata/cpu-host-model-cmt.args
|
||||
+++ b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
|
||||
-machine pc,usb=off,dump-guest-core=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \
|
||||
+-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,rtm=on,hle=on \
|
||||
-m 214 \
|
||||
-realtime mlock=off \
|
||||
-smp 6,sockets=6,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
|
||||
index 09141106d5..ace08d5d76 100644
|
||||
--- a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
|
||||
+++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
|
||||
-machine pc-i440fx-4.0,usb=off,dump-guest-core=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
+-cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,rtm=on,hle=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
-m 214 \
|
||||
-overcommit mem-lock=off \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
|
||||
index 2dab572a6b..a9f7c4b910 100644
|
||||
--- a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
|
||||
+++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel tcg \
|
||||
--cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
+-cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,rtm=on,hle=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
-m 214 \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxml2argvdata/cpu-tsc-frequency.args b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
|
||||
index 4a032f5d85..48fb75abcc 100644
|
||||
--- a/tests/qemuxml2argvdata/cpu-tsc-frequency.args
|
||||
+++ b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
|
||||
-machine pc,usb=off,dump-guest-core=off \
|
||||
-accel kvm \
|
||||
--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,tsc-frequency=4567890000 \
|
||||
+-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,rtm=on,hle=on,tsc-frequency=4567890000 \
|
||||
-m 214 \
|
||||
-realtime mlock=off \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2argvdata/q35-acpi-nouefi.args b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
|
||||
index 3faee48c77..a1f742712d 100644
|
||||
--- a/tests/qemuxml2argvdata/q35-acpi-nouefi.args
|
||||
+++ b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
|
||||
-machine q35,usb=off,dump-guest-core=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell \
|
||||
+-cpu Haswell,rtm=on,hle=on \
|
||||
-m 1024 \
|
||||
-realtime mlock=off \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2argvdata/q35-acpi-uefi.args b/tests/qemuxml2argvdata/q35-acpi-uefi.args
|
||||
index 60da1e282a..620056223a 100644
|
||||
--- a/tests/qemuxml2argvdata/q35-acpi-uefi.args
|
||||
+++ b/tests/qemuxml2argvdata/q35-acpi-uefi.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
|
||||
-machine q35,usb=off,dump-guest-core=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell \
|
||||
+-cpu Haswell,rtm=on,hle=on \
|
||||
-drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,readonly=on \
|
||||
-drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,unit=1 \
|
||||
-m 1024 \
|
||||
diff --git a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
|
||||
index 14e5bbc22a..ea66536c2a 100644
|
||||
--- a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
|
||||
+++ b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
|
||||
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
|
||||
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
|
||||
-machine q35,usb=off,dump-guest-core=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell \
|
||||
+-cpu Haswell,rtm=on,hle=on \
|
||||
-m 1024 \
|
||||
-realtime mlock=off \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,125 @@
|
||||
From 91aa454341b6cf9a901405b8e12d4c15a233e05a Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <91aa454341b6cf9a901405b8e12d4c15a233e05a.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
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 <pkrempa@redhat.com>
|
||||
---
|
||||
.../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 @@
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
<flag name='disk-timed-stats'/>
|
||||
<flag name='query-accelerators'/>
|
||||
+ <flag name='scsi-block.migrate-pr'/>
|
||||
<version>10001091</version>
|
||||
<microcodeVersion>43100287</microcodeVersion>
|
||||
<package>v10.2.0-rc1-38-gfb241d0a1f</package>
|
||||
--
|
||||
2.53.0
|
||||
@ -1,89 +0,0 @@
|
||||
From b550b671bace6d979a0763a837ce97ddf72e8fc8 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b550b671bace6d979a0763a837ce97ddf72e8fc8@dist-git>
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Fri, 28 Jan 2022 20:33:12 +0100
|
||||
Subject: [PATCH] RHEL: Remove <glib-2.64.0 workaround for GSource race
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2045879
|
||||
|
||||
This is to accommodate for RHEL 8 downstream glib being fixed with a backport in
|
||||
version 2.56.4-12 (Bug 1948988). Another reason for that is that our workaround
|
||||
does not play nice with a fixed glib, leading to libvirt not properly
|
||||
dereferencing the monitor socket, eventually leading to EMFILE: Too many open
|
||||
files.
|
||||
|
||||
RHEL-only
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
---
|
||||
src/util/glibcompat.c | 46 ++++++++-----------------------------------
|
||||
1 file changed, 8 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/src/util/glibcompat.c b/src/util/glibcompat.c
|
||||
index eb6dcc0111..bf890f10d2 100644
|
||||
--- a/src/util/glibcompat.c
|
||||
+++ b/src/util/glibcompat.c
|
||||
@@ -212,51 +212,21 @@ vir_g_strdup_vprintf(const char *msg, va_list args)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-
|
||||
/*
|
||||
- * If the last reference to a GSource is released in a non-main
|
||||
- * thread we're exposed to a race condition that causes a
|
||||
- * crash:
|
||||
- *
|
||||
- * https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1358
|
||||
+ * This is a leftover of a hack that works around glib older than 2.64.0, but
|
||||
+ * the fix in glib as backported in RHEL-8 to glib2-2.56.4-12 in BZ 1948988:
|
||||
*
|
||||
- * Thus we're using an idle func to release our ref...
|
||||
+ * https://bugzilla.redhat.com/show_bug.cgi?id=1948988
|
||||
*
|
||||
- * ...but this imposes a significant performance penalty on
|
||||
- * I/O intensive workloads which are sensitive to the iterations
|
||||
- * of the event loop, so avoid the workaround if we know we have
|
||||
- * new enough glib.
|
||||
+ * and our workaround coupled with that glib fix started causing leaks, which
|
||||
+ * surfaced with us not unreferencing the qemu monitor socket in BZ 2045879:
|
||||
*
|
||||
- * The function below is used from a header file definition.
|
||||
+ * https://bugzilla.redhat.com/show_bug.cgi?id=2045879
|
||||
*
|
||||
- * Drop when min glib >= 2.64.0
|
||||
+ * Keeping this wrapper makes it easier to follow with other backports without
|
||||
+ * conflicts in callers due to the function name change.
|
||||
*/
|
||||
-#if GLIB_CHECK_VERSION(2, 64, 0)
|
||||
void vir_g_source_unref(GSource *src, GMainContext *ctx G_GNUC_UNUSED)
|
||||
{
|
||||
g_source_unref(src);
|
||||
}
|
||||
-#else
|
||||
-
|
||||
-static gboolean
|
||||
-virEventGLibSourceUnrefIdle(gpointer data)
|
||||
-{
|
||||
- GSource *src = data;
|
||||
-
|
||||
- g_source_unref(src);
|
||||
-
|
||||
- return FALSE;
|
||||
-}
|
||||
-
|
||||
-void vir_g_source_unref(GSource *src, GMainContext *ctx)
|
||||
-{
|
||||
- GSource *idle = g_idle_source_new();
|
||||
-
|
||||
- g_source_set_callback(idle, virEventGLibSourceUnrefIdle, src, NULL);
|
||||
-
|
||||
- g_source_attach(idle, ctx);
|
||||
-
|
||||
- g_source_unref(idle);
|
||||
-}
|
||||
-
|
||||
-#endif
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,81 +0,0 @@
|
||||
From d6956a1aaa8757fab60132c3ee46c2bb199a78a8 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <d6956a1aaa8757fab60132c3ee46c2bb199a78a8@dist-git>
|
||||
From: John Ferlan <jferlan@redhat.com>
|
||||
Date: Mon, 17 Dec 2018 20:42:30 -0500
|
||||
Subject: [PATCH] RHEL: qemu: Add ability to set sgio values for hostdev
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1582424
|
||||
|
||||
RHEL-only
|
||||
|
||||
Add necessary checks in order to allow setting sgio values for a scsi
|
||||
host device
|
||||
|
||||
Signed-off-by: John Ferlan <jferlan@redhat.com>
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_conf.c | 25 ++++++++++++++++---------
|
||||
1 file changed, 16 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
||||
index 6077457ff4..ba85fc6e22 100644
|
||||
--- a/src/qemu/qemu_conf.c
|
||||
+++ b/src/qemu/qemu_conf.c
|
||||
@@ -1841,8 +1841,9 @@ qemuSetUnprivSGIO(virDomainDeviceDef *dev)
|
||||
virDomainDiskDef *disk = NULL;
|
||||
virDomainHostdevDef *hostdev = NULL;
|
||||
g_autofree char *sysfs_path = NULL;
|
||||
+ g_autofree char *hostdev_path = NULL;
|
||||
const char *path = NULL;
|
||||
- int val = -1;
|
||||
+ int val = 0;
|
||||
|
||||
/* "sgio" is only valid for block disk; cdrom
|
||||
* and floopy disk can have empty source.
|
||||
@@ -1858,17 +1859,14 @@ qemuSetUnprivSGIO(virDomainDeviceDef *dev)
|
||||
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
||||
hostdev = dev->data.hostdev;
|
||||
|
||||
- if (!qemuIsSharedHostdev(hostdev))
|
||||
+ if (hostdev->source.subsys.u.scsi.protocol ==
|
||||
+ VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
|
||||
return 0;
|
||||
|
||||
- if (hostdev->source.subsys.u.scsi.sgio) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
- _("'sgio' is not supported for SCSI "
|
||||
- "generic device yet "));
|
||||
+ if (!(hostdev_path = qemuGetHostdevPath(hostdev)))
|
||||
return -1;
|
||||
- }
|
||||
|
||||
- return 0;
|
||||
+ path = hostdev_path;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
@@ -1877,7 +1875,16 @@ qemuSetUnprivSGIO(virDomainDeviceDef *dev)
|
||||
return -1;
|
||||
|
||||
/* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */
|
||||
- val = (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED);
|
||||
+ if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
||||
+ if (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED)
|
||||
+ val = 1;
|
||||
+ } else {
|
||||
+ /* Only settable if <shareable/> was present for hostdev */
|
||||
+ if (qemuIsSharedHostdev(hostdev) &&
|
||||
+ hostdev->source.subsys.u.scsi.sgio ==
|
||||
+ VIR_DOMAIN_DEVICE_SGIO_UNFILTERED)
|
||||
+ val = 1;
|
||||
+ }
|
||||
|
||||
/* Do not do anything if unpriv_sgio is not supported by the kernel and the
|
||||
* whitelist is enabled. But if requesting unfiltered access, always call
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,66 +0,0 @@
|
||||
From f562b4c83d342002291f6bd7c5776eaecbd3147f Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <f562b4c83d342002291f6bd7c5776eaecbd3147f@dist-git>
|
||||
From: John Ferlan <jferlan@redhat.com>
|
||||
Date: Mon, 17 Dec 2018 20:42:31 -0500
|
||||
Subject: [PATCH] RHEL: qemu: Add check for unpriv sgio for SCSI generic host
|
||||
device
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1582424
|
||||
|
||||
RHEL-only
|
||||
|
||||
Check if the hostdev has set the sgio filtered/unfiltered and handle
|
||||
appropriately.
|
||||
|
||||
This restores functionality removed by upstream commit id 'ce346623'
|
||||
to remove sgio support for the SCSI generic host device.
|
||||
|
||||
Signed-off-by: John Ferlan <jferlan@redhat.com>
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_conf.c | 20 ++++++++++++++++++--
|
||||
1 file changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
||||
index ba85fc6e22..28c334761b 100644
|
||||
--- a/src/qemu/qemu_conf.c
|
||||
+++ b/src/qemu/qemu_conf.c
|
||||
@@ -1749,13 +1749,29 @@ qemuSharedHostdevAddRemoveInternal(virQEMUDriver *driver,
|
||||
{
|
||||
g_autofree char *dev_path = NULL;
|
||||
g_autofree char *key = NULL;
|
||||
+ virDomainHostdevSubsysSCSI *scsisrc = &hostdev->source.subsys.u.scsi;
|
||||
+ virDomainHostdevSubsysSCSIHost *scsihostsrc = &scsisrc->u.host;
|
||||
int ret = -1;
|
||||
|
||||
if (!qemuIsSharedHostdev(hostdev))
|
||||
return 0;
|
||||
|
||||
- if (!(dev_path = qemuGetHostdevPath(hostdev)) ||
|
||||
- !(key = qemuGetSharedDeviceKey(dev_path)))
|
||||
+ if (!(dev_path = qemuGetHostdevPath(hostdev)))
|
||||
+ return -1;
|
||||
+
|
||||
+ if ((ret = qemuCheckUnprivSGIO(driver->sharedDevices, dev_path,
|
||||
+ scsisrc->sgio)) < 0) {
|
||||
+ if (ret == -2) {
|
||||
+ virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
+ _("sgio of shared scsi host device '%s-%u-%u-%llu' "
|
||||
+ "conflicts with other active domains"),
|
||||
+ scsihostsrc->adapter, scsihostsrc->bus,
|
||||
+ scsihostsrc->target, scsihostsrc->unit);
|
||||
+ }
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!(key = qemuGetSharedDeviceKey(dev_path)))
|
||||
return -1;
|
||||
|
||||
qemuDriverLock(driver);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
From b6c1f9ca8eb0ca8f7603ab205c7dc95b9f07b5a0 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b6c1f9ca8eb0ca8f7603ab205c7dc95b9f07b5a0@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Mon, 18 Jul 2022 16:01:20 +0200
|
||||
Subject: [PATCH] RHEL: qemu_migration: Fix restoring memlock limit on
|
||||
destination
|
||||
|
||||
Restoring memory locking limit on the destination host only makes sense
|
||||
when migration succeeded as otherwise the QEMU process will be killed
|
||||
anyway. Specifically if the migration fails because the process died,
|
||||
touching the limit would produce rather unhelpful error message instead
|
||||
of the real issue:
|
||||
|
||||
cannot get locked memory limit of process -1: No such file or
|
||||
directory
|
||||
|
||||
This patch is RHEL-only caused by misplacing the call to
|
||||
qemuDomainSetMaxMemLock when the "qemu_migration: Restore original
|
||||
memory locking limit" upstream patch was backported to an older code
|
||||
base.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2107954
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_migration.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||
index db5163e993..11f87296d6 100644
|
||||
--- a/src/qemu/qemu_migration.c
|
||||
+++ b/src/qemu/qemu_migration.c
|
||||
@@ -5895,6 +5895,8 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
|
||||
*/
|
||||
if (inPostCopy)
|
||||
g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
|
||||
+
|
||||
+ qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
|
||||
}
|
||||
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||
@@ -5907,7 +5909,6 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
|
||||
cleanup:
|
||||
g_clear_pointer(&jobInfo, qemuDomainJobInfoFree);
|
||||
virPortAllocatorRelease(port);
|
||||
- qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
|
||||
if (priv->mon)
|
||||
qemuMonitorSetDomainLog(priv->mon, NULL, NULL, NULL);
|
||||
VIR_FREE(priv->origname);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,215 +0,0 @@
|
||||
From 9c5daeb8c99ca12a66387de448f585742887fd75 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <9c5daeb8c99ca12a66387de448f585742887fd75@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Fri, 6 Mar 2020 15:52:21 +0100
|
||||
Subject: [PATCH] RHEL: virscsi: Check device type before getting it's /dev
|
||||
node name
|
||||
|
||||
Not all SCSI devices are block devices, therefore
|
||||
/sys/bus/scsi/devices/X:X:X:X/block/ directory does not always
|
||||
exist. Check if the SCSI device is a block device beforehand.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1808390
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
Message-Id: <20200306145226.1610708-2-abologna@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/util/virscsi.c | 140 ++++++++++++++++++++++++++++++---
|
||||
tests/virscsidata/0-0-0-0/type | 1 +
|
||||
tests/virscsidata/1-0-0-0/type | 1 +
|
||||
3 files changed, 131 insertions(+), 11 deletions(-)
|
||||
create mode 100644 tests/virscsidata/0-0-0-0/type
|
||||
create mode 100644 tests/virscsidata/1-0-0-0/type
|
||||
|
||||
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
|
||||
index 6a90d9002f..770f727cac 100644
|
||||
--- a/src/util/virscsi.c
|
||||
+++ b/src/util/virscsi.c
|
||||
@@ -47,6 +47,32 @@ struct _virUsedByInfo {
|
||||
};
|
||||
typedef struct _virUsedByInfo virUsedByInfo;
|
||||
|
||||
+
|
||||
+/* Keep in sync with scsi/scsi_proto.h */
|
||||
+typedef enum {
|
||||
+ VIR_SCSI_DEVICE_TYPE_NONE = -1,
|
||||
+ VIR_SCSI_DEVICE_TYPE_DISK = 0x00,
|
||||
+ VIR_SCSI_DEVICE_TYPE_TAPE = 0x01,
|
||||
+ VIR_SCSI_DEVICE_TYPE_PRINTER = 0x02,
|
||||
+ VIR_SCSI_DEVICE_TYPE_PROCESSOR = 0x03,
|
||||
+ VIR_SCSI_DEVICE_TYPE_WORM = 0x04,
|
||||
+ VIR_SCSI_DEVICE_TYPE_ROM = 0x05,
|
||||
+ VIR_SCSI_DEVICE_TYPE_SCANNER = 0x06,
|
||||
+ VIR_SCSI_DEVICE_TYPE_MOD = 0x07,
|
||||
+ VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER = 0x08,
|
||||
+ VIR_SCSI_DEVICE_TYPE_COMM = 0x09,
|
||||
+ VIR_SCSI_DEVICE_TYPE_RAID = 0x0c,
|
||||
+ VIR_SCSI_DEVICE_TYPE_ENCLOSURE = 0x0d,
|
||||
+ VIR_SCSI_DEVICE_TYPE_RBC = 0x0e,
|
||||
+ VIR_SCSI_DEVICE_TYPE_OSD = 0x11,
|
||||
+ VIR_SCSI_DEVICE_TYPE_ZBC = 0x14,
|
||||
+ VIR_SCSI_DEVICE_TYPE_WLUN = 0x1e,
|
||||
+ VIR_SCSI_DEVICE_TYPE_NO_LUN = 0x7f,
|
||||
+
|
||||
+ VIR_SCSI_DEVICE_TYPE_LAST,
|
||||
+} virSCSIDeviceType;
|
||||
+
|
||||
+
|
||||
struct _virSCSIDevice {
|
||||
unsigned int adapter;
|
||||
unsigned int bus;
|
||||
@@ -126,6 +152,78 @@ virSCSIDeviceGetSgName(const char *sysfs_prefix,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+
|
||||
+static int
|
||||
+virSCSIDeviceGetType(const char *prefix,
|
||||
+ unsigned int adapter,
|
||||
+ unsigned int bus,
|
||||
+ unsigned int target,
|
||||
+ unsigned long long unit,
|
||||
+ virSCSIDeviceType *type)
|
||||
+{
|
||||
+ int intType;
|
||||
+
|
||||
+ if (virFileReadValueInt(&intType,
|
||||
+ "%s/%d:%u:%u:%llu/type",
|
||||
+ prefix, adapter, bus, target, unit) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ switch (intType) {
|
||||
+ case VIR_SCSI_DEVICE_TYPE_DISK:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_TAPE:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_PRINTER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_PROCESSOR:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_WORM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ROM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_SCANNER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_MOD:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_COMM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_RAID:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ENCLOSURE:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_RBC:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_OSD:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ZBC:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_WLUN:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_NO_LUN:
|
||||
+ *type = intType;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
+ _("unknown SCSI device type: %x"),
|
||||
+ intType);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
+virSCSIDeviceGetDevNameBlock(const char *prefix,
|
||||
+ unsigned int adapter,
|
||||
+ unsigned int bus,
|
||||
+ unsigned int target,
|
||||
+ unsigned long long unit)
|
||||
+{
|
||||
+ g_autoptr(DIR) dir = NULL;
|
||||
+ struct dirent *entry;
|
||||
+ g_autofree char *path = NULL;
|
||||
+
|
||||
+ path = g_strdup_printf("%s/%d:%u:%u:%llu/block",
|
||||
+ prefix, adapter, bus, target, unit);
|
||||
+
|
||||
+ if (virDirOpen(&dir, path) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (virDirRead(dir, &entry, path) > 0)
|
||||
+ return g_strdup(entry->d_name);
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/* Returns device name (e.g. "sdc") on success, or NULL
|
||||
* on failure.
|
||||
*/
|
||||
@@ -136,25 +234,45 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
||||
unsigned int target,
|
||||
unsigned long long unit)
|
||||
{
|
||||
- g_autoptr(DIR) dir = NULL;
|
||||
- struct dirent *entry;
|
||||
- g_autofree char *path = NULL;
|
||||
unsigned int adapter_id;
|
||||
+ virSCSIDeviceType type;
|
||||
const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SCSI_DEVICES;
|
||||
|
||||
if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
|
||||
return NULL;
|
||||
|
||||
- path = g_strdup_printf("%s/%d:%u:%u:%llu/block", prefix, adapter_id, bus,
|
||||
- target, unit);
|
||||
-
|
||||
- if (virDirOpen(&dir, path) < 0)
|
||||
+ if (virSCSIDeviceGetType(prefix, adapter_id,
|
||||
+ bus, target, unit, &type) < 0)
|
||||
return NULL;
|
||||
|
||||
- if (virDirRead(dir, &entry, path) > 0)
|
||||
- return g_strdup(entry->d_name);
|
||||
-
|
||||
- return NULL;
|
||||
+ switch (type) {
|
||||
+ case VIR_SCSI_DEVICE_TYPE_DISK:
|
||||
+ return virSCSIDeviceGetDevNameBlock(prefix, adapter_id, bus, target, unit);
|
||||
+
|
||||
+ case VIR_SCSI_DEVICE_TYPE_TAPE:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_PRINTER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_PROCESSOR:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_WORM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ROM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_SCANNER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_MOD:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_MEDIUM_CHANGER:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_COMM:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_RAID:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ENCLOSURE:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_RBC:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_OSD:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_ZBC:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_WLUN:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_NO_LUN:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_NONE:
|
||||
+ case VIR_SCSI_DEVICE_TYPE_LAST:
|
||||
+ default:
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("unsupported SCSI device type: %x"),
|
||||
+ type);
|
||||
+ return NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
virSCSIDevice *
|
||||
diff --git a/tests/virscsidata/0-0-0-0/type b/tests/virscsidata/0-0-0-0/type
|
||||
new file mode 100644
|
||||
index 0000000000..573541ac97
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/0-0-0-0/type
|
||||
@@ -0,0 +1 @@
|
||||
+0
|
||||
diff --git a/tests/virscsidata/1-0-0-0/type b/tests/virscsidata/1-0-0-0/type
|
||||
new file mode 100644
|
||||
index 0000000000..573541ac97
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/1-0-0-0/type
|
||||
@@ -0,0 +1 @@
|
||||
+0
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,272 +0,0 @@
|
||||
From 1ce4faffcd4616bbcea4d198c3f60cbcfddd784e Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <1ce4faffcd4616bbcea4d198c3f60cbcfddd784e@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Fri, 6 Mar 2020 15:52:23 +0100
|
||||
Subject: [PATCH] RHEL: virscsi: Introduce and use
|
||||
virSCSIDeviceGetUnprivSGIOSysfsPath()
|
||||
|
||||
When constructing a path to the 'unpriv_sgio' file of given SCSI
|
||||
device we don't need to go through /dev/* and major() + minor()
|
||||
path. The generated path points to
|
||||
/sys/dev/block/MAJ:MIN/queue/unpriv_sgio which is wrong if the
|
||||
SCSI device in question is not a block device. We can generate a
|
||||
different path: /sys/bus/scsi/devices/X:X:X:X/unpriv_sgio where
|
||||
the file is directly accessible regardless of the SCSI device
|
||||
type.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1808390
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
Message-Id: <20200306145226.1610708-4-abologna@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/libvirt_private.syms | 1 +
|
||||
src/qemu/qemu_conf.c | 31 +++++++++++++++++++------------
|
||||
src/util/virscsi.c | 19 +++++++++++++++++++
|
||||
src/util/virscsi.h | 5 +++++
|
||||
src/util/virutil.c | 24 ++++++------------------
|
||||
src/util/virutil.h | 2 --
|
||||
6 files changed, 50 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 5b76e66e61..2c42e2a5e8 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -3191,6 +3191,7 @@ virSCSIDeviceGetSgName;
|
||||
virSCSIDeviceGetShareable;
|
||||
virSCSIDeviceGetTarget;
|
||||
virSCSIDeviceGetUnit;
|
||||
+virSCSIDeviceGetUnprivSGIOSysfsPath;
|
||||
virSCSIDeviceIsAvailable;
|
||||
virSCSIDeviceListAdd;
|
||||
virSCSIDeviceListCount;
|
||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
||||
index 28c334761b..a0b8076d6b 100644
|
||||
--- a/src/qemu/qemu_conf.c
|
||||
+++ b/src/qemu/qemu_conf.c
|
||||
@@ -1506,7 +1506,7 @@ qemuCheckUnprivSGIO(GHashTable *sharedDevices,
|
||||
if (!(virHashLookup(sharedDevices, key)))
|
||||
return 0;
|
||||
|
||||
- if (virGetDeviceUnprivSGIO(device_path, NULL, &val) < 0)
|
||||
+ if (virGetDeviceUnprivSGIO(sysfs_path, &val) < 0)
|
||||
return -1;
|
||||
|
||||
/* Error message on failure needs to be handled in caller
|
||||
@@ -1857,39 +1857,46 @@ qemuSetUnprivSGIO(virDomainDeviceDef *dev)
|
||||
virDomainDiskDef *disk = NULL;
|
||||
virDomainHostdevDef *hostdev = NULL;
|
||||
g_autofree char *sysfs_path = NULL;
|
||||
- g_autofree char *hostdev_path = NULL;
|
||||
- const char *path = NULL;
|
||||
int val = 0;
|
||||
|
||||
/* "sgio" is only valid for block disk; cdrom
|
||||
* and floopy disk can have empty source.
|
||||
*/
|
||||
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
||||
+ const char *path;
|
||||
+
|
||||
disk = dev->data.disk;
|
||||
+ path = virDomainDiskGetSource(disk);
|
||||
|
||||
if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
|
||||
!virStorageSourceIsBlockLocal(disk->src))
|
||||
return 0;
|
||||
|
||||
- path = virDomainDiskGetSource(disk);
|
||||
+ if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL)))
|
||||
+ return -1;
|
||||
+
|
||||
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
||||
+ virDomainHostdevSubsysSCSI *scsisrc;
|
||||
+ virDomainHostdevSubsysSCSIHost *scsihostsrc;
|
||||
+
|
||||
hostdev = dev->data.hostdev;
|
||||
+ scsisrc = &hostdev->source.subsys.u.scsi;
|
||||
+ scsihostsrc = &scsisrc->u.host;
|
||||
|
||||
if (hostdev->source.subsys.u.scsi.protocol ==
|
||||
VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
|
||||
return 0;
|
||||
|
||||
- if (!(hostdev_path = qemuGetHostdevPath(hostdev)))
|
||||
+ if (!(sysfs_path = virSCSIDeviceGetUnprivSGIOSysfsPath(NULL,
|
||||
+ scsihostsrc->adapter,
|
||||
+ scsihostsrc->bus,
|
||||
+ scsihostsrc->target,
|
||||
+ scsihostsrc->unit)))
|
||||
return -1;
|
||||
-
|
||||
- path = hostdev_path;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL)))
|
||||
- return -1;
|
||||
-
|
||||
/* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */
|
||||
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
||||
if (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED)
|
||||
@@ -1909,11 +1916,11 @@ qemuSetUnprivSGIO(virDomainDeviceDef *dev)
|
||||
if (virFileExists(sysfs_path) || val == 1) {
|
||||
int curr_val;
|
||||
|
||||
- if (virGetDeviceUnprivSGIO(path, NULL, &curr_val) < 0)
|
||||
+ if (virGetDeviceUnprivSGIO(sysfs_path, &curr_val) < 0)
|
||||
return -1;
|
||||
|
||||
if (curr_val != val &&
|
||||
- virSetDeviceUnprivSGIO(path, NULL, val) < 0) {
|
||||
+ virSetDeviceUnprivSGIO(sysfs_path, val) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
|
||||
index 6165196423..b437fdcac0 100644
|
||||
--- a/src/util/virscsi.c
|
||||
+++ b/src/util/virscsi.c
|
||||
@@ -302,6 +302,25 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
+char *
|
||||
+virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix,
|
||||
+ const char *adapter,
|
||||
+ unsigned int bus,
|
||||
+ unsigned int target,
|
||||
+ unsigned long long unit)
|
||||
+{
|
||||
+ unsigned int adapter_id;
|
||||
+ const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SCSI_DEVICES;
|
||||
+
|
||||
+ if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ return g_strdup_printf("%s/%d:%u:%u:%llu/unpriv_sgio",
|
||||
+ prefix, adapter_id, bus, target, unit);
|
||||
+}
|
||||
+
|
||||
+
|
||||
virSCSIDevice *
|
||||
virSCSIDeviceNew(const char *sysfs_prefix,
|
||||
const char *adapter,
|
||||
diff --git a/src/util/virscsi.h b/src/util/virscsi.h
|
||||
index 65ad15ed76..5721985939 100644
|
||||
--- a/src/util/virscsi.h
|
||||
+++ b/src/util/virscsi.h
|
||||
@@ -40,6 +40,11 @@ char *virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
||||
unsigned int bus,
|
||||
unsigned int target,
|
||||
unsigned long long unit);
|
||||
+char *virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix,
|
||||
+ const char *adapter,
|
||||
+ unsigned int bus,
|
||||
+ unsigned int target,
|
||||
+ unsigned long long unit);
|
||||
|
||||
virSCSIDevice *virSCSIDeviceNew(const char *sysfs_prefix,
|
||||
const char *adapter,
|
||||
diff --git a/src/util/virutil.c b/src/util/virutil.c
|
||||
index e04f1343d8..b1e37b45c5 100644
|
||||
--- a/src/util/virutil.c
|
||||
+++ b/src/util/virutil.c
|
||||
@@ -1377,18 +1377,13 @@ virGetUnprivSGIOSysfsPath(const char *path,
|
||||
|
||||
int
|
||||
virSetDeviceUnprivSGIO(const char *path,
|
||||
- const char *sysfs_dir,
|
||||
int unpriv_sgio)
|
||||
{
|
||||
- char *sysfs_path = NULL;
|
||||
char *val = NULL;
|
||||
int ret = -1;
|
||||
int rc;
|
||||
|
||||
- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, sysfs_dir)))
|
||||
- return -1;
|
||||
-
|
||||
- if (!virFileExists(sysfs_path)) {
|
||||
+ if (!virFileExists(path)) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("unpriv_sgio is not supported by this kernel"));
|
||||
goto cleanup;
|
||||
@@ -1396,38 +1391,32 @@ virSetDeviceUnprivSGIO(const char *path,
|
||||
|
||||
val = g_strdup_printf("%d", unpriv_sgio);
|
||||
|
||||
- if ((rc = virFileWriteStr(sysfs_path, val, 0)) < 0) {
|
||||
- virReportSystemError(-rc, _("failed to set %s"), sysfs_path);
|
||||
+ if ((rc = virFileWriteStr(path, val, 0)) < 0) {
|
||||
+ virReportSystemError(-rc, _("failed to set %s"), path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
- VIR_FREE(sysfs_path);
|
||||
VIR_FREE(val);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
virGetDeviceUnprivSGIO(const char *path,
|
||||
- const char *sysfs_dir,
|
||||
int *unpriv_sgio)
|
||||
{
|
||||
- char *sysfs_path = NULL;
|
||||
char *buf = NULL;
|
||||
char *tmp = NULL;
|
||||
int ret = -1;
|
||||
|
||||
- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, sysfs_dir)))
|
||||
- return -1;
|
||||
-
|
||||
- if (!virFileExists(sysfs_path)) {
|
||||
+ if (!virFileExists(path)) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("unpriv_sgio is not supported by this kernel"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (virFileReadAll(sysfs_path, 1024, &buf) < 0)
|
||||
+ if (virFileReadAll(path, 1024, &buf) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if ((tmp = strchr(buf, '\n')))
|
||||
@@ -1435,13 +1424,12 @@ virGetDeviceUnprivSGIO(const char *path,
|
||||
|
||||
if (virStrToLong_i(buf, NULL, 10, unpriv_sgio) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("failed to parse value of %s"), sysfs_path);
|
||||
+ _("failed to parse value of %s"), path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
- VIR_FREE(sysfs_path);
|
||||
VIR_FREE(buf);
|
||||
return ret;
|
||||
}
|
||||
diff --git a/src/util/virutil.h b/src/util/virutil.h
|
||||
index 854b494890..da267c6446 100644
|
||||
--- a/src/util/virutil.h
|
||||
+++ b/src/util/virutil.h
|
||||
@@ -120,10 +120,8 @@ int virGetDeviceID(const char *path,
|
||||
int *maj,
|
||||
int *min) G_GNUC_NO_INLINE;
|
||||
int virSetDeviceUnprivSGIO(const char *path,
|
||||
- const char *sysfs_dir,
|
||||
int unpriv_sgio);
|
||||
int virGetDeviceUnprivSGIO(const char *path,
|
||||
- const char *sysfs_dir,
|
||||
int *unpriv_sgio);
|
||||
char *virGetUnprivSGIOSysfsPath(const char *path,
|
||||
const char *sysfs_dir);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,200 +0,0 @@
|
||||
From 5b96a8773d33af9822f6b6ccddc8f372841895a6 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <5b96a8773d33af9822f6b6ccddc8f372841895a6@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Fri, 6 Mar 2020 15:52:22 +0100
|
||||
Subject: [PATCH] RHEL: virscsi: Support TAPEs in virSCSIDeviceGetDevName()
|
||||
|
||||
If the SCSI device we want to get /dev node name for is TAPE
|
||||
device we need to look at 'tape' symlink in the sysfs dir
|
||||
corresponding to the device.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1808390
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
Message-Id: <20200306145226.1610708-3-abologna@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/util/virscsi.c | 27 +++++++++++++++
|
||||
tests/virscsidata/2-0-0-0/model | 1 +
|
||||
tests/virscsidata/2-0-0-0/scsi_tape/st0/dev | 1 +
|
||||
tests/virscsidata/2-0-0-0/sg3/dev | 1 +
|
||||
tests/virscsidata/2-0-0-0/tape | 1 +
|
||||
tests/virscsidata/2-0-0-0/type | 1 +
|
||||
tests/virscsidata/2-0-0-0/vendor | 1 +
|
||||
tests/virscsidata/sg3 | 0
|
||||
tests/virscsitest.c | 38 ++++++++++++++++++---
|
||||
9 files changed, 66 insertions(+), 5 deletions(-)
|
||||
create mode 100644 tests/virscsidata/2-0-0-0/model
|
||||
create mode 100644 tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
|
||||
create mode 100644 tests/virscsidata/2-0-0-0/sg3/dev
|
||||
create mode 120000 tests/virscsidata/2-0-0-0/tape
|
||||
create mode 100644 tests/virscsidata/2-0-0-0/type
|
||||
create mode 100644 tests/virscsidata/2-0-0-0/vendor
|
||||
create mode 100644 tests/virscsidata/sg3
|
||||
|
||||
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
|
||||
index 770f727cac..6165196423 100644
|
||||
--- a/src/util/virscsi.c
|
||||
+++ b/src/util/virscsi.c
|
||||
@@ -224,6 +224,31 @@ virSCSIDeviceGetDevNameBlock(const char *prefix,
|
||||
}
|
||||
|
||||
|
||||
+static char *
|
||||
+virSCSIDeviceGetDevNameTape(const char *prefix,
|
||||
+ unsigned int adapter,
|
||||
+ unsigned int bus,
|
||||
+ unsigned int target,
|
||||
+ unsigned long long unit)
|
||||
+{
|
||||
+ g_autofree char *path = NULL;
|
||||
+ g_autofree char *resolvedPath = NULL;
|
||||
+ g_autoptr(GError) err = NULL;
|
||||
+
|
||||
+ path = g_strdup_printf("%s/%d:%u:%u:%llu/tape",
|
||||
+ prefix, adapter, bus, target, unit);
|
||||
+
|
||||
+ if (!(resolvedPath = g_file_read_link(path, &err))) {
|
||||
+ virReportError(VIR_ERR_SYSTEM_ERROR,
|
||||
+ _("Unable to read link: %s"),
|
||||
+ err->message);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return g_path_get_basename(resolvedPath);
|
||||
+}
|
||||
+
|
||||
+
|
||||
/* Returns device name (e.g. "sdc") on success, or NULL
|
||||
* on failure.
|
||||
*/
|
||||
@@ -250,6 +275,8 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
||||
return virSCSIDeviceGetDevNameBlock(prefix, adapter_id, bus, target, unit);
|
||||
|
||||
case VIR_SCSI_DEVICE_TYPE_TAPE:
|
||||
+ return virSCSIDeviceGetDevNameTape(prefix, adapter_id, bus, target, unit);
|
||||
+
|
||||
case VIR_SCSI_DEVICE_TYPE_PRINTER:
|
||||
case VIR_SCSI_DEVICE_TYPE_PROCESSOR:
|
||||
case VIR_SCSI_DEVICE_TYPE_WORM:
|
||||
diff --git a/tests/virscsidata/2-0-0-0/model b/tests/virscsidata/2-0-0-0/model
|
||||
new file mode 100644
|
||||
index 0000000000..d2ab4715c3
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/model
|
||||
@@ -0,0 +1 @@
|
||||
+scsi_debug
|
||||
diff --git a/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
|
||||
new file mode 100644
|
||||
index 0000000000..3dd777e840
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/scsi_tape/st0/dev
|
||||
@@ -0,0 +1 @@
|
||||
+9:0
|
||||
diff --git a/tests/virscsidata/2-0-0-0/sg3/dev b/tests/virscsidata/2-0-0-0/sg3/dev
|
||||
new file mode 100644
|
||||
index 0000000000..b369a59b3e
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/sg3/dev
|
||||
@@ -0,0 +1 @@
|
||||
+21:3
|
||||
diff --git a/tests/virscsidata/2-0-0-0/tape b/tests/virscsidata/2-0-0-0/tape
|
||||
new file mode 120000
|
||||
index 0000000000..6ca7f77539
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/tape
|
||||
@@ -0,0 +1 @@
|
||||
+scsi_tape/st0
|
||||
\ No newline at end of file
|
||||
diff --git a/tests/virscsidata/2-0-0-0/type b/tests/virscsidata/2-0-0-0/type
|
||||
new file mode 100644
|
||||
index 0000000000..d00491fd7e
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/type
|
||||
@@ -0,0 +1 @@
|
||||
+1
|
||||
diff --git a/tests/virscsidata/2-0-0-0/vendor b/tests/virscsidata/2-0-0-0/vendor
|
||||
new file mode 100644
|
||||
index 0000000000..9b075671ea
|
||||
--- /dev/null
|
||||
+++ b/tests/virscsidata/2-0-0-0/vendor
|
||||
@@ -0,0 +1 @@
|
||||
+Linux
|
||||
diff --git a/tests/virscsidata/sg3 b/tests/virscsidata/sg3
|
||||
new file mode 100644
|
||||
index 0000000000..e69de29bb2
|
||||
diff --git a/tests/virscsitest.c b/tests/virscsitest.c
|
||||
index c96699e157..924b77af08 100644
|
||||
--- a/tests/virscsitest.c
|
||||
+++ b/tests/virscsitest.c
|
||||
@@ -33,17 +33,33 @@ VIR_LOG_INIT("tests.scsitest");
|
||||
|
||||
static char *virscsi_prefix;
|
||||
|
||||
+typedef struct {
|
||||
+ const char *adapter;
|
||||
+ unsigned int bus;
|
||||
+ unsigned int target;
|
||||
+ unsigned int unit;
|
||||
+ const char *expectedName;
|
||||
+} testGetDevNameData;
|
||||
+
|
||||
static int
|
||||
-test1(const void *data G_GNUC_UNUSED)
|
||||
+testGetDevName(const void *opaque)
|
||||
{
|
||||
+ const testGetDevNameData *data = opaque;
|
||||
g_autofree char *name = NULL;
|
||||
|
||||
if (!(name = virSCSIDeviceGetDevName(virscsi_prefix,
|
||||
- "scsi_host1", 0, 0, 0)))
|
||||
+ data->adapter,
|
||||
+ data->bus,
|
||||
+ data->target,
|
||||
+ data->unit)))
|
||||
return -1;
|
||||
|
||||
- if (STRNEQ(name, "sdh"))
|
||||
+ if (STRNEQ(name, data->expectedName)) {
|
||||
+ fprintf(stderr,
|
||||
+ "SCSI dev name mismatch, expected %s got %s",
|
||||
+ data->expectedName, name);
|
||||
return -1;
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -200,15 +216,27 @@ mymain(void)
|
||||
|
||||
CREATE_SYMLINK("0-0-0-0", "0:0:0:0");
|
||||
CREATE_SYMLINK("1-0-0-0", "1:0:0:0");
|
||||
+ CREATE_SYMLINK("2-0-0-0", "2:0:0:0");
|
||||
CREATE_SYMLINK("sg0", "sg0");
|
||||
+ CREATE_SYMLINK("sg3", "sg3");
|
||||
CREATE_SYMLINK("sg8", "sg8");
|
||||
|
||||
VIR_FREE(virscsi_prefix);
|
||||
|
||||
virscsi_prefix = g_strdup(tmpdir);
|
||||
|
||||
- if (virTestRun("test1", test1, NULL) < 0)
|
||||
- ret = -1;
|
||||
+#define TEST_GET_DEV_NAME(adapter, bus, target, unit, expectedName) \
|
||||
+ do { \
|
||||
+ testGetDevNameData data = {adapter, bus, target, unit, expectedName}; \
|
||||
+ if (virTestRun("test getDevname " expectedName, \
|
||||
+ testGetDevName, &data) < 0) \
|
||||
+ ret = -1; \
|
||||
+ } while (0)
|
||||
+
|
||||
+ TEST_GET_DEV_NAME("scsi_host0", 0, 0, 0, "sda");
|
||||
+ TEST_GET_DEV_NAME("scsi_host1", 0, 0, 0, "sdh");
|
||||
+ TEST_GET_DEV_NAME("scsi_host2", 0, 0, 0, "st0");
|
||||
+
|
||||
if (virTestRun("test2", test2, NULL) < 0)
|
||||
ret = -1;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
From ac8357ab7dd676af82b971673f8d7e862ff07624 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <ac8357ab7dd676af82b971673f8d7e862ff07624@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Fri, 6 Mar 2020 15:52:24 +0100
|
||||
Subject: [PATCH] RHEL: virutil: Accept non-block devices in virGetDeviceID()
|
||||
|
||||
If a caller wants to learn major or minor number for a device,
|
||||
let them. There's no need to check if the device is a block
|
||||
device here.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1808390
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
Message-Id: <20200306145226.1610708-5-abologna@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/util/virutil.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/src/util/virutil.c b/src/util/virutil.c
|
||||
index b1e37b45c5..ced8493516 100644
|
||||
--- a/src/util/virutil.c
|
||||
+++ b/src/util/virutil.c
|
||||
@@ -1333,9 +1333,6 @@ virGetDeviceID(const char *path, int *maj, int *min)
|
||||
if (stat(path, &sb) < 0)
|
||||
return -errno;
|
||||
|
||||
- if (!S_ISBLK(sb.st_mode))
|
||||
- return -EINVAL;
|
||||
-
|
||||
if (maj)
|
||||
*maj = major(sb.st_rdev);
|
||||
if (min)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -1,103 +0,0 @@
|
||||
From 732113455fb7eadeea178c71cc77f0ffdf639f24 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <732113455fb7eadeea178c71cc77f0ffdf639f24@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Tue, 18 Jan 2022 12:40:09 +0100
|
||||
Subject: [PATCH] Revert "report error when virProcessGetStatInfo() is unable
|
||||
to parse data"
|
||||
|
||||
This reverts commit 938382b60ae5bd1f83b5cb09e1ce68b9a88f679a.
|
||||
|
||||
Turns out, the commit did more harm than good. It changed
|
||||
semantics on some public APIs. For instance, while
|
||||
qemuDomainGetInfo() previously did not returned an error it does
|
||||
now. While the calls to virProcessGetStatInfo() is guarded with
|
||||
virDomainObjIsActive() it doesn't necessarily mean that QEMU's
|
||||
PID is still alive. QEMU might be gone but we just haven't
|
||||
realized it (e.g. because the eof handler thread is waiting for a
|
||||
job).
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2041610
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
||||
(cherry picked from commit 105dace22cc7b5b18d72a4dcad4a2cf386ce5c99)
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/ch/ch_driver.c | 2 ++
|
||||
src/qemu/qemu_driver.c | 7 ++++++-
|
||||
src/util/virprocess.c | 8 ++------
|
||||
3 files changed, 10 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
|
||||
index 3cbc668489..53e0872207 100644
|
||||
--- a/src/ch/ch_driver.c
|
||||
+++ b/src/ch/ch_driver.c
|
||||
@@ -1073,6 +1073,8 @@ chDomainHelperGetVcpus(virDomainObj *vm,
|
||||
if (virProcessGetStatInfo(&vcpuinfo->cpuTime,
|
||||
&vcpuinfo->cpu, NULL,
|
||||
vm->pid, vcpupid) < 0) {
|
||||
+ virReportSystemError(errno, "%s",
|
||||
+ _("cannot get vCPU placement & pCPU time"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index 65ac5ef367..d3d76c003f 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -1359,6 +1359,8 @@ qemuDomainHelperGetVcpus(virDomainObj *vm,
|
||||
if (virProcessGetStatInfo(&vcpuinfo->cpuTime,
|
||||
&vcpuinfo->cpu, NULL,
|
||||
vm->pid, vcpupid) < 0) {
|
||||
+ virReportSystemError(errno, "%s",
|
||||
+ _("cannot get vCPU placement & pCPU time"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -2519,6 +2521,8 @@ qemuDomainGetInfo(virDomainPtr dom,
|
||||
if (virDomainObjIsActive(vm)) {
|
||||
if (virProcessGetStatInfo(&(info->cpuTime), NULL, NULL,
|
||||
vm->pid, 0) < 0) {
|
||||
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
||||
+ _("cannot read cputime for domain"));
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
@@ -10526,7 +10530,8 @@ qemuDomainMemoryStatsInternal(virQEMUDriver *driver,
|
||||
}
|
||||
|
||||
if (virProcessGetStatInfo(NULL, NULL, &rss, vm->pid, 0) < 0) {
|
||||
- virResetLastError();
|
||||
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
||||
+ _("cannot get RSS for domain"));
|
||||
} else {
|
||||
stats[ret].tag = VIR_DOMAIN_MEMORY_STAT_RSS;
|
||||
stats[ret].val = rss;
|
||||
diff --git a/src/util/virprocess.c b/src/util/virprocess.c
|
||||
index 85d8c8e747..b559a4257e 100644
|
||||
--- a/src/util/virprocess.c
|
||||
+++ b/src/util/virprocess.c
|
||||
@@ -1784,10 +1784,7 @@ virProcessGetStatInfo(unsigned long long *cpuTime,
|
||||
virStrToLong_ullp(proc_stat[VIR_PROCESS_STAT_STIME], NULL, 10, &systime) < 0 ||
|
||||
virStrToLong_l(proc_stat[VIR_PROCESS_STAT_RSS], NULL, 10, &rss) < 0 ||
|
||||
virStrToLong_i(proc_stat[VIR_PROCESS_STAT_PROCESSOR], NULL, 10, &cpu) < 0) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("cannot parse process status data for pid '%d/%d'"),
|
||||
- (int) pid, (int) tid);
|
||||
- return -1;
|
||||
+ VIR_WARN("cannot parse process status data");
|
||||
}
|
||||
|
||||
/* We got jiffies
|
||||
@@ -1884,8 +1881,7 @@ virProcessGetStatInfo(unsigned long long *cpuTime G_GNUC_UNUSED,
|
||||
pid_t pid G_GNUC_UNUSED,
|
||||
pid_t tid G_GNUC_UNUSED)
|
||||
{
|
||||
- virReportSystemError(ENOSYS, "%s",
|
||||
- _("Process statistics data is not supported on this platform"));
|
||||
+ errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.0
|
||||
|
||||
@ -1,75 +0,0 @@
|
||||
From b0fb5cbba2e03fbca8471487bf78931b3090b108 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b0fb5cbba2e03fbca8471487bf78931b3090b108@dist-git>
|
||||
From: Jim Fehlig <jfehlig@suse.com>
|
||||
Date: Mon, 10 Jan 2022 11:42:58 -0700
|
||||
Subject: [PATCH] build: Only install libvirt-guests when building libvirtd
|
||||
|
||||
libvirt-guests was already moved to the libvirt daemon package in commit
|
||||
d800c50349. It only needs to be installed when building libvirtd.
|
||||
|
||||
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
||||
(cherry picked from commit 3be5ba11a2c6fcb2dfdffa03ab4f847113f36b85)
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2153688
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
tools/meson.build | 38 ++++++++++++++++++++------------------
|
||||
1 file changed, 20 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/tools/meson.build b/tools/meson.build
|
||||
index 22fa3604ba..2d0aecb90b 100644
|
||||
--- a/tools/meson.build
|
||||
+++ b/tools/meson.build
|
||||
@@ -297,29 +297,31 @@ if conf.has('WITH_SANLOCK')
|
||||
)
|
||||
endif
|
||||
|
||||
-configure_file(
|
||||
- input: 'libvirt-guests.sh.in',
|
||||
- output: '@BASENAME@',
|
||||
- configuration: tools_conf,
|
||||
- install: true,
|
||||
- install_dir: libexecdir,
|
||||
- install_mode: 'rwxrwxr-x',
|
||||
-)
|
||||
-
|
||||
-if init_script == 'systemd'
|
||||
- install_data(
|
||||
- 'libvirt-guests.sysconf',
|
||||
- install_dir: sysconfdir / 'sysconfig',
|
||||
- rename: 'libvirt-guests',
|
||||
- )
|
||||
-
|
||||
+if conf.has('WITH_LIBVIRTD')
|
||||
configure_file(
|
||||
- input: 'libvirt-guests.service.in',
|
||||
+ input: 'libvirt-guests.sh.in',
|
||||
output: '@BASENAME@',
|
||||
configuration: tools_conf,
|
||||
install: true,
|
||||
- install_dir: prefix / 'lib' / 'systemd' / 'system',
|
||||
+ install_dir: libexecdir,
|
||||
+ install_mode: 'rwxrwxr-x',
|
||||
)
|
||||
+
|
||||
+ if init_script == 'systemd'
|
||||
+ install_data(
|
||||
+ 'libvirt-guests.sysconf',
|
||||
+ install_dir: sysconfdir / 'sysconfig',
|
||||
+ rename: 'libvirt-guests',
|
||||
+ )
|
||||
+
|
||||
+ configure_file(
|
||||
+ input: 'libvirt-guests.service.in',
|
||||
+ output: '@BASENAME@',
|
||||
+ configuration: tools_conf,
|
||||
+ install: true,
|
||||
+ install_dir: prefix / 'lib' / 'systemd' / 'system',
|
||||
+ )
|
||||
+ endif
|
||||
endif
|
||||
|
||||
if bash_completion_dep.found()
|
||||
--
|
||||
2.39.0
|
||||
|
||||
@ -0,0 +1,211 @@
|
||||
From ef0dfcf0dea53cc1d8aabc08942a7091c9dbf30c Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <ef0dfcf0dea53cc1d8aabc08942a7091c9dbf30c.1784297532.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Mon, 8 Jun 2026 16:55:05 +0200
|
||||
Subject: [PATCH] conf: Add fields for recording actually-selected virtio video
|
||||
device
|
||||
|
||||
QEMU's commandline generator picks for virtio video between various
|
||||
actual device models not only based on the XML definition but also
|
||||
capabilities present. Since none of the devices is actually ABI
|
||||
compatible we need to record the actually selected device in the XML.
|
||||
|
||||
Introduce 'device' attribute:
|
||||
|
||||
<video>
|
||||
<model type='virtio' heads='1' primary='yes' device='virtio-gpu'/>
|
||||
|
||||
which will record the actually selected model so that we can preserve
|
||||
ABI across restarts on deployment changes but more importantly across
|
||||
migrations where the deployment differs.
|
||||
|
||||
The code specifically avoids an ABI stability check for the new field
|
||||
because there are already possibly broken configurations that the users
|
||||
may want to fix by picking the proper model which could be forbidden.
|
||||
|
||||
Users are instructed to not set the field in the XML.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit b6f7c2d3db28626d4799d00c299e33dae07c5201)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-186019
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177646 (rhel-9.9)
|
||||
---
|
||||
docs/formatdomain.rst | 8 +++++++
|
||||
src/conf/domain_conf.c | 35 +++++++++++++++++++++++++++++++
|
||||
src/conf/domain_conf.h | 15 +++++++++++++
|
||||
src/conf/schemas/domaincommon.rng | 18 +++++++++++++++-
|
||||
src/libvirt_private.syms | 1 +
|
||||
5 files changed, 76 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 225152e0f2..8e7577f3b7 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -7295,6 +7295,14 @@ A video device.
|
||||
guest. The ``edid`` attribute is only valid for model types ``vga``, ``bochs``,
|
||||
and ``virtio``.
|
||||
|
||||
+ :since:`Since 12.5.0` the ``virtio`` video model has an additional attribute
|
||||
+ ``device``, which records the specific virtio device model which was picked
|
||||
+ for the configuration, to preserve guest ABI and migration compatibility.
|
||||
+ Users do not need to set this attribute as aprropriate value is picked and
|
||||
+ filled in automatically. Accepted values are ``virtio-vga``, ``virtio-gpu``,
|
||||
+ ``virtio-vga-gl``, and ``virtio-gpu-gl``, but not all combinations of config
|
||||
+ and this field make sense.
|
||||
+
|
||||
``acceleration``
|
||||
Configure if video acceleration should be enabled.
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index dc19e258dd..47200d27c5 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -909,6 +909,17 @@ VIR_ENUM_IMPL(virDomainVideoVGAConf,
|
||||
"off",
|
||||
);
|
||||
|
||||
+VIR_ENUM_IMPL(virDomainVideoVirtioDevice,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_LAST,
|
||||
+ "",
|
||||
+ "virtio-vga",
|
||||
+ "virtio-gpu",
|
||||
+ "virtio-vga-gl",
|
||||
+ "virtio-gpu-gl",
|
||||
+ "vhost-user-vga",
|
||||
+ "vhost-user-gpu",
|
||||
+);
|
||||
+
|
||||
VIR_ENUM_IMPL(virDomainInput,
|
||||
VIR_DOMAIN_INPUT_TYPE_LAST,
|
||||
"mouse",
|
||||
@@ -13726,6 +13737,14 @@ virDomainVideoModelDefParseXML(virDomainVideoDef *def,
|
||||
VIR_DOMAIN_VIDEO_TYPE_DEFAULT) < 0)
|
||||
return -1;
|
||||
|
||||
+ if (def->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
|
||||
+ if (virXMLPropEnumDefault(node, "device",
|
||||
+ virDomainVideoVirtioDeviceTypeFromString,
|
||||
+ VIR_XML_PROP_NONZERO, &def->virtiodevice,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT) < 0)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
if (virXMLPropUInt(node, "ram", 10, VIR_XML_PROP_NONE, &def->ram) < 0)
|
||||
return -1;
|
||||
|
||||
@@ -21437,6 +21456,18 @@ virDomainVideoDefCheckABIStability(virDomainVideoDef *src,
|
||||
return false;
|
||||
}
|
||||
|
||||
+ /* While 'src->virtiodevice' vs 'dst->virtiodevice' match is considered
|
||||
+ * guest ABI (both the device looks different to the guest OS and qemu
|
||||
+ * refuses to migrate into wrong device) we deliberately omit the check
|
||||
+ * here due to historical reasons.
|
||||
+ *
|
||||
+ * The actual values were not recorded in the XML after picking a device
|
||||
+ * based on capabilities and thus, if the host configuration changes
|
||||
+ * different defaults can be picked. Users might want to fix their
|
||||
+ * saveimage or migration by specifying the proper model which will differ
|
||||
+ * from the one that will be auto-picked via post-parse callback when the
|
||||
+ * XML is loaded for the first time */
|
||||
+
|
||||
if (!virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio))
|
||||
return false;
|
||||
|
||||
@@ -27110,6 +27141,10 @@ virDomainVideoDefFormat(virBuffer *buf,
|
||||
if (def->edid != VIR_TRISTATE_SWITCH_ABSENT)
|
||||
virBufferAsprintf(&modelAttrBuf, " edid='%s'", virTristateSwitchTypeToString(def->edid));
|
||||
|
||||
+ if (def->virtiodevice != VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT)
|
||||
+ virBufferAsprintf(&modelAttrBuf, " device='%s'",
|
||||
+ virDomainVideoVirtioDeviceTypeToString(def->virtiodevice));
|
||||
+
|
||||
virDomainVideoAccelDefFormat(&modelChildBuf, def->accel);
|
||||
virDomainVideoResolutionDefFormat(&modelChildBuf, def->res);
|
||||
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index 8c8c11c0cf..3a1a2fdce1 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -1877,6 +1877,20 @@ typedef enum {
|
||||
|
||||
VIR_ENUM_DECL(virDomainVideoVGAConf);
|
||||
|
||||
+typedef enum {
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT = 0,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VGA,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_GPU,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VGA_GL,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_GPU_GL,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VHOST_USER_VGA,
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VHOST_USER_GPU,
|
||||
+
|
||||
+ VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_LAST
|
||||
+} virDomainVideoVirtioDevice;
|
||||
+
|
||||
+VIR_ENUM_DECL(virDomainVideoVirtioDevice);
|
||||
+
|
||||
struct _virDomainVideoAccelDef {
|
||||
virTristateBool accel2d;
|
||||
virTristateBool accel3d;
|
||||
@@ -1907,6 +1921,7 @@ struct _virDomainVideoDef {
|
||||
virDomainVideoResolutionDef *res;
|
||||
virTristateSwitch blob;
|
||||
virDomainVideoDriverDef *driver;
|
||||
+ virDomainVideoVirtioDevice virtiodevice; /* virtio device frontend */
|
||||
virDomainDeviceInfo info;
|
||||
virDomainVirtioOptions *virtio;
|
||||
virDomainVideoBackendType backend;
|
||||
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
|
||||
index 9fde565d94..b8283f129e 100644
|
||||
--- a/src/conf/schemas/domaincommon.rng
|
||||
+++ b/src/conf/schemas/domaincommon.rng
|
||||
@@ -4812,7 +4812,6 @@
|
||||
<value>vmvga</value>
|
||||
<value>xen</value>
|
||||
<value>vbox</value>
|
||||
- <value>virtio</value>
|
||||
<value>gop</value>
|
||||
<value>none</value>
|
||||
<value>bochs</value>
|
||||
@@ -4839,6 +4838,23 @@
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
+ <group>
|
||||
+ <attribute name="type">
|
||||
+ <value>virtio</value>
|
||||
+ </attribute>
|
||||
+ <optional>
|
||||
+ <attribute name="device">
|
||||
+ <choice>
|
||||
+ <value>virtio-vga</value>
|
||||
+ <value>virtio-vga-gl</value>
|
||||
+ <value>virtio-gpu</value>
|
||||
+ <value>virtio-gpu-gl</value>
|
||||
+ <value>vhost-user-vga</value>
|
||||
+ <value>vhost-user-gpu</value>
|
||||
+ </choice>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
+ </group>
|
||||
</choice>
|
||||
<optional>
|
||||
<attribute name="vram">
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 4a0f9065fa..b9f5056693 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -728,6 +728,7 @@ virDomainVideoTypeFromString;
|
||||
virDomainVideoTypeToString;
|
||||
virDomainVideoVGAConfTypeFromString;
|
||||
virDomainVideoVGAConfTypeToString;
|
||||
+virDomainVideoVirtioDeviceTypeToString;
|
||||
virDomainVirtTypeFromString;
|
||||
virDomainVirtTypeToString;
|
||||
virDomainVsockDefEquals;
|
||||
--
|
||||
2.55.0
|
||||
160
SOURCES/libvirt-conf-Add-iommufd-fdgroup-support.patch
Normal file
160
SOURCES/libvirt-conf-Add-iommufd-fdgroup-support.patch
Normal file
@ -0,0 +1,160 @@
|
||||
From 99ca73f9c43c7a266cf65f0012a5350197d0f229 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <99ca73f9c43c7a266cf65f0012a5350197d0f229.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Fri, 13 Mar 2026 15:28:17 +0100
|
||||
Subject: [PATCH] conf: Add iommufd fdgroup support
|
||||
|
||||
This will allow management applications running libvirt without
|
||||
necessary permissions to pass FD for /dev/iommu with per-process
|
||||
locked memory accounting enabled.
|
||||
|
||||
Kernel uses per-user locked memory accounting by default which may
|
||||
cause error while starting multiple VMs with host devices using IOMMUFD.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 58875a6df679c5272f61028d33bf1380c51b0d5b)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
docs/formatdomain.rst | 8 +++++++-
|
||||
src/conf/domain_conf.c | 6 ++++++
|
||||
src/conf/domain_conf.h | 1 +
|
||||
src/conf/domain_validate.c | 16 ++++++++++++++++
|
||||
src/conf/schemas/domaincommon.rng | 3 +++
|
||||
tests/genericxml2xmlindata/iommufd.xml | 2 +-
|
||||
6 files changed, 34 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 86b3bad903..225152e0f2 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -1368,7 +1368,7 @@ Host Device IOMMUFD
|
||||
|
||||
<domain>
|
||||
...
|
||||
- <iommufd enabled='yes'/>
|
||||
+ <iommufd enabled='yes' fdgroup='iommu'/>
|
||||
...
|
||||
</domain>
|
||||
|
||||
@@ -1382,6 +1382,12 @@ Host Device IOMMUFD
|
||||
This controls IOMMUFD usage for all host devices, each device can change this
|
||||
global default by setting ``iommufd`` attribute for ``driver`` element.
|
||||
|
||||
+ Optional ``fdgroup`` attribute can be used together with
|
||||
+ `virDomainFDAssociate <html/libvirt-libvirt-domain.html#virDomainFDAssociate>`__
|
||||
+ to pass /dev/iommu FD instead of letting libvirt to open it. Caller is
|
||||
+ responsible for setting per-process locked memory accounting otherwise
|
||||
+ starting multiple VMs with host devices using IOMMUFD may fail.
|
||||
+
|
||||
Resource partitioning
|
||||
---------------------
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 1e91561fea..cec0f88f0f 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -4192,6 +4192,8 @@ void virDomainDefFree(virDomainDef *def)
|
||||
g_free(def->kvm_features);
|
||||
g_free(def->tcg_features);
|
||||
|
||||
+ g_free(def->iommufd_fdgroup);
|
||||
+
|
||||
virBlkioDeviceArrayClear(def->blkio.devices,
|
||||
def->blkio.ndevices);
|
||||
g_free(def->blkio.devices);
|
||||
@@ -19765,6 +19767,8 @@ virDomainDefIommufdParse(virDomainDef *def,
|
||||
if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED, &def->iommufd) < 0)
|
||||
return -1;
|
||||
|
||||
+ def->iommufd_fdgroup = virXMLPropString(nodes[0], "fdgroup");
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -27998,6 +28002,8 @@ virDomainDefIommufdFormat(virBuffer *buf,
|
||||
virBufferAsprintf(&attrBuf, " enabled='%s'",
|
||||
virTristateBoolTypeToString(def->iommufd));
|
||||
|
||||
+ virBufferEscapeString(&attrBuf, " fdgroup='%s'", def->iommufd_fdgroup);
|
||||
+
|
||||
virXMLFormatElement(buf, "iommufd", &attrBuf, NULL);
|
||||
}
|
||||
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index e12064a3ab..8c8c11c0cf 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -3232,6 +3232,7 @@ struct _virDomainDef {
|
||||
virDomainFeatureTCG *tcg_features;
|
||||
|
||||
virTristateBool iommufd;
|
||||
+ char *iommufd_fdgroup;
|
||||
|
||||
bool tseg_specified;
|
||||
unsigned long long tseg_size;
|
||||
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
|
||||
index 4558e7b210..3e6ba5e609 100644
|
||||
--- a/src/conf/domain_validate.c
|
||||
+++ b/src/conf/domain_validate.c
|
||||
@@ -1995,6 +1995,19 @@ virDomainDefValidateThrottleGroups(const virDomainDef *def)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virDomainDefValidateIommufd(const virDomainDef *def)
|
||||
+{
|
||||
+ if (def->iommufd == VIR_TRISTATE_BOOL_NO && def->iommufd_fdgroup) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
+ _("Setting 'fdgroup' when 'iommufd' is disabled is not supported."));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
virDomainDefValidateInternal(const virDomainDef *def,
|
||||
virDomainXMLOption *xmlopt)
|
||||
@@ -2056,6 +2069,9 @@ virDomainDefValidateInternal(const virDomainDef *def,
|
||||
if (virDomainDefValidateThrottleGroups(def) < 0)
|
||||
return -1;
|
||||
|
||||
+ if (virDomainDefValidateIommufd(def) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
|
||||
index 81b57a937a..9fde565d94 100644
|
||||
--- a/src/conf/schemas/domaincommon.rng
|
||||
+++ b/src/conf/schemas/domaincommon.rng
|
||||
@@ -1353,6 +1353,9 @@
|
||||
<attribute name="enabled">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
+ <optional>
|
||||
+ <attribute name="fdgroup"/>
|
||||
+ </optional>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmlindata/iommufd.xml
|
||||
index 63ea839383..10d59ca548 100644
|
||||
--- a/tests/genericxml2xmlindata/iommufd.xml
|
||||
+++ b/tests/genericxml2xmlindata/iommufd.xml
|
||||
@@ -4,7 +4,7 @@
|
||||
<memory unit='KiB'>219136</memory>
|
||||
<currentMemory unit='KiB'>219136</currentMemory>
|
||||
<vcpu placement='static'>1</vcpu>
|
||||
- <iommufd enabled='yes'/>
|
||||
+ <iommufd enabled='yes' fdgroup='iommu'/>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
--
|
||||
2.54.0
|
||||
218
SOURCES/libvirt-conf-Introduce-domain-iommufd-element.patch
Normal file
218
SOURCES/libvirt-conf-Introduce-domain-iommufd-element.patch
Normal file
@ -0,0 +1,218 @@
|
||||
From 28b77cb65fd0eedbd017d97d803256265ce3cbf4 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <28b77cb65fd0eedbd017d97d803256265ce3cbf4.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Fri, 13 Mar 2026 11:57:57 +0100
|
||||
Subject: [PATCH] conf: Introduce domain iommufd element
|
||||
|
||||
In addition to configuring IOMMUFD for each host device add
|
||||
configuration for the whole VM. This will be extended to add support for
|
||||
passing FD to libvirt from management applications.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit c03b8f0804f648a2bbc2eb7e957f2f8821b8e167)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
docs/formatdomain.rst | 21 ++++++++++++
|
||||
src/conf/domain_conf.c | 46 ++++++++++++++++++++++++++
|
||||
src/conf/domain_conf.h | 2 ++
|
||||
src/conf/schemas/domaincommon.rng | 12 +++++++
|
||||
tests/genericxml2xmlindata/iommufd.xml | 18 ++++++++++
|
||||
tests/genericxml2xmltest.c | 2 ++
|
||||
6 files changed, 101 insertions(+)
|
||||
create mode 100644 tests/genericxml2xmlindata/iommufd.xml
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 5ec9a41aac..86b3bad903 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -1361,6 +1361,27 @@ Block I/O Tuning
|
||||
``write_iops_sec``
|
||||
Write I/O operations per second limit. :since:`Since 1.2.2`
|
||||
|
||||
+Host Device IOMMUFD
|
||||
+-------------------
|
||||
+
|
||||
+::
|
||||
+
|
||||
+ <domain>
|
||||
+ ...
|
||||
+ <iommufd enabled='yes'/>
|
||||
+ ...
|
||||
+ </domain>
|
||||
+
|
||||
+``iommufd``
|
||||
+ :since:`Since 12.2.0 (QEMU/KVM only)` The optional ``iommufd`` element with
|
||||
+ mandatory ``enabled`` attribute can be used to enable IOMMUFD backend for
|
||||
+ VFIO host devices. This provides an interface to propagate DMA mappings to
|
||||
+ kernel for assigned devices. Libvirt will open the /dev/iommu and VFIO device
|
||||
+ cdev and pass associated file descriptors to QEMU.
|
||||
+
|
||||
+ This controls IOMMUFD usage for all host devices, each device can change this
|
||||
+ global default by setting ``iommufd`` attribute for ``driver`` element.
|
||||
+
|
||||
Resource partitioning
|
||||
---------------------
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 576a1bd79b..1e91561fea 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -19743,6 +19743,31 @@ virDomainDefControllersParse(virDomainDef *def,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int
|
||||
+virDomainDefIommufdParse(virDomainDef *def,
|
||||
+ xmlXPathContextPtr ctxt)
|
||||
+{
|
||||
+ int n;
|
||||
+ g_autofree xmlNodePtr *nodes = NULL;
|
||||
+
|
||||
+ if ((n = virXPathNodeSet("./iommufd", ctxt, &nodes)) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (n > 1) {
|
||||
+ virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
+ _("only one 'iommufd' element is supported"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (n == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED, &def->iommufd) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static virDomainDef *
|
||||
virDomainDefParseXML(xmlXPathContextPtr ctxt,
|
||||
virDomainXMLOption *xmlopt,
|
||||
@@ -19821,6 +19846,9 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt,
|
||||
!virDomainIOThreadIDArrayHasPin(def))
|
||||
def->placement_mode = VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO;
|
||||
|
||||
+ if (virDomainDefIommufdParse(def, ctxt) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
if ((n = virXPathNodeSet("./resource", ctxt, &nodes)) < 0)
|
||||
return NULL;
|
||||
|
||||
@@ -27958,6 +27986,22 @@ virDomainHubDefFormat(virBuffer *buf,
|
||||
}
|
||||
|
||||
|
||||
+static void
|
||||
+virDomainDefIommufdFormat(virBuffer *buf,
|
||||
+ virDomainDef *def)
|
||||
+{
|
||||
+ g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
+
|
||||
+ if (def->iommufd == VIR_TRISTATE_BOOL_ABSENT)
|
||||
+ return;
|
||||
+
|
||||
+ virBufferAsprintf(&attrBuf, " enabled='%s'",
|
||||
+ virTristateBoolTypeToString(def->iommufd));
|
||||
+
|
||||
+ virXMLFormatElement(buf, "iommufd", &attrBuf, NULL);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static void
|
||||
virDomainResourceDefFormat(virBuffer *buf,
|
||||
virDomainResourceDef *def)
|
||||
@@ -29482,6 +29526,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def,
|
||||
if (virDomainNumatuneFormatXML(buf, def->numa) < 0)
|
||||
return -1;
|
||||
|
||||
+ virDomainDefIommufdFormat(buf, def);
|
||||
+
|
||||
virDomainResourceDefFormat(buf, def->resource);
|
||||
|
||||
for (i = 0; i < def->nsysinfo; i++) {
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index f1c8478208..e12064a3ab 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -3231,6 +3231,8 @@ struct _virDomainDef {
|
||||
virTristateSwitch apic_eoi;
|
||||
virDomainFeatureTCG *tcg_features;
|
||||
|
||||
+ virTristateBool iommufd;
|
||||
+
|
||||
bool tseg_specified;
|
||||
unsigned long long tseg_size;
|
||||
|
||||
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
|
||||
index afdf7bfc1a..81b57a937a 100644
|
||||
--- a/src/conf/schemas/domaincommon.rng
|
||||
+++ b/src/conf/schemas/domaincommon.rng
|
||||
@@ -1001,6 +1001,10 @@
|
||||
<ref name="numatune"/>
|
||||
</optional>
|
||||
|
||||
+ <optional>
|
||||
+ <ref name="iommufd"/>
|
||||
+ </optional>
|
||||
+
|
||||
<optional>
|
||||
<ref name="respartition"/>
|
||||
</optional>
|
||||
@@ -1344,6 +1348,14 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
+ <define name="iommufd">
|
||||
+ <element name="iommufd">
|
||||
+ <attribute name="enabled">
|
||||
+ <ref name="virYesNo"/>
|
||||
+ </attribute>
|
||||
+ </element>
|
||||
+ </define>
|
||||
+
|
||||
<define name="respartition">
|
||||
<element name="resource">
|
||||
<optional>
|
||||
diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmlindata/iommufd.xml
|
||||
new file mode 100644
|
||||
index 0000000000..63ea839383
|
||||
--- /dev/null
|
||||
+++ b/tests/genericxml2xmlindata/iommufd.xml
|
||||
@@ -0,0 +1,18 @@
|
||||
+<domain type='kvm'>
|
||||
+ <name>foo</name>
|
||||
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
+ <memory unit='KiB'>219136</memory>
|
||||
+ <currentMemory unit='KiB'>219136</currentMemory>
|
||||
+ <vcpu placement='static'>1</vcpu>
|
||||
+ <iommufd enabled='yes'/>
|
||||
+ <os>
|
||||
+ <type arch='i686' machine='pc'>hvm</type>
|
||||
+ <boot dev='hd'/>
|
||||
+ </os>
|
||||
+ <clock offset='utc'/>
|
||||
+ <on_poweroff>destroy</on_poweroff>
|
||||
+ <on_reboot>restart</on_reboot>
|
||||
+ <on_crash>destroy</on_crash>
|
||||
+ <devices>
|
||||
+ </devices>
|
||||
+</domain>
|
||||
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
|
||||
index 6757fc44de..6be694cac5 100644
|
||||
--- a/tests/genericxml2xmltest.c
|
||||
+++ b/tests/genericxml2xmltest.c
|
||||
@@ -263,6 +263,8 @@ mymain(void)
|
||||
|
||||
DO_TEST("iothreadids");
|
||||
|
||||
+ DO_TEST("iommufd");
|
||||
+
|
||||
virObjectUnref(caps);
|
||||
virObjectUnref(xmlopt);
|
||||
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,69 @@
|
||||
From 18aa061f3b4f2b2c2ed6f07120a990935f56d93e Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <18aa061f3b4f2b2c2ed6f07120a990935f56d93e.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sat, 14 Feb 2026 06:14:20 +0100
|
||||
Subject: [PATCH] conf: Introduce iommufd enum for domaincaps
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 855f8fe9e2454555ba84696750e0e1501dd5ba80)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-138544
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
docs/formatdomaincaps.rst | 7 +++++++
|
||||
src/conf/domain_capabilities.c | 1 +
|
||||
src/conf/domain_capabilities.h | 1 +
|
||||
3 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst
|
||||
index 8b4f0ecff3..6ba7f84f96 100644
|
||||
--- a/docs/formatdomaincaps.rst
|
||||
+++ b/docs/formatdomaincaps.rst
|
||||
@@ -461,6 +461,10 @@ Well, only if the following is enabled:
|
||||
<value>vfio</value>
|
||||
<value>xen</value>
|
||||
</enum>
|
||||
+ <enum name='iommufd'>
|
||||
+ <value>yes</value>
|
||||
+ <value>no</value>
|
||||
+ </enum>
|
||||
</hostdev>
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
@@ -477,6 +481,9 @@ Well, only if the following is enabled:
|
||||
``mode="capabilities"``.
|
||||
``pciBackend``
|
||||
Options for the ``name`` attribute of the <driver/> element.
|
||||
+``iommufd``
|
||||
+ Options for the ``iommufd`` attribute of the <driver/> element.
|
||||
+ :since:`Since 12.1.0`
|
||||
|
||||
RNG device
|
||||
^^^^^^^^^^
|
||||
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
|
||||
index f843124695..49179b97ab 100644
|
||||
--- a/src/conf/domain_capabilities.c
|
||||
+++ b/src/conf/domain_capabilities.c
|
||||
@@ -620,6 +620,7 @@ virDomainCapsDeviceHostdevFormat(virBuffer *buf,
|
||||
ENUM_PROCESS(hostdev, subsysType, virDomainHostdevSubsysTypeToString);
|
||||
ENUM_PROCESS(hostdev, capsType, virDomainHostdevCapsTypeToString);
|
||||
ENUM_PROCESS(hostdev, pciBackend, virDeviceHostdevPCIDriverNameTypeToString);
|
||||
+ ENUM_PROCESS(hostdev, iommufd, virTristateBoolTypeToString);
|
||||
|
||||
FORMAT_EPILOGUE(hostdev);
|
||||
}
|
||||
diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
|
||||
index 437981c711..b10370db8f 100644
|
||||
--- a/src/conf/domain_capabilities.h
|
||||
+++ b/src/conf/domain_capabilities.h
|
||||
@@ -108,6 +108,7 @@ struct _virDomainCapsDeviceHostdev {
|
||||
virDomainCapsEnum subsysType; /* Info about virDomainHostdevSubsysType */
|
||||
virDomainCapsEnum capsType; /* Info about virDomainHostdevCapsType */
|
||||
virDomainCapsEnum pciBackend; /* Info about virDomainHostdevSubsysPCIBackendType */
|
||||
+ virDomainCapsEnum iommufd; /* Info about iommufd:virTristateBool */
|
||||
/* add new fields here */
|
||||
};
|
||||
|
||||
--
|
||||
2.53.0
|
||||
@ -1,155 +0,0 @@
|
||||
From 19f7e6dc950baf346738f462ac5c6b815c04edcc Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <19f7e6dc950baf346738f462ac5c6b815c04edcc@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Mon, 21 Mar 2022 16:49:25 +0100
|
||||
Subject: [PATCH] conf: Introduce memory allocation threads
|
||||
|
||||
Since its v5.0.0 release QEMU is capable of specifying number of
|
||||
threads used to allocate memory. It defaults to 1, which may be
|
||||
too low for humongous guests with gigantic pages.
|
||||
|
||||
In general, on QEMU cmd line level it is possible to use
|
||||
different number of threads per each memory-backend-* object, in
|
||||
practical terms it's not useful. Therefore, use <memoryBacking/>
|
||||
to set guest wide value and let all memory devices 'inherit' it,
|
||||
silently. IOW, don't introduce per device knob because that would
|
||||
only complicate things for a little or no benefit.
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit ba7f98126fa84d354ce72929b77cc111a9a557a9)
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2067126
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
docs/formatdomain.rst | 8 +++++---
|
||||
docs/schemas/domaincommon.rng | 19 +++++++++++++------
|
||||
src/conf/domain_conf.c | 15 ++++++++++++++-
|
||||
src/conf/domain_conf.h | 1 +
|
||||
tests/qemuxml2argvdata/memfd-memory-numa.xml | 2 +-
|
||||
5 files changed, 34 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 8128e43da4..17e89a0c0d 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -977,7 +977,7 @@ Memory Backing
|
||||
<locked/>
|
||||
<source type="file|anonymous|memfd"/>
|
||||
<access mode="shared|private"/>
|
||||
- <allocation mode="immediate|ondemand"/>
|
||||
+ <allocation mode="immediate|ondemand" threads='8'/>
|
||||
<discard/>
|
||||
</memoryBacking>
|
||||
...
|
||||
@@ -1026,8 +1026,10 @@ influence how virtual memory pages are backed by host pages.
|
||||
Using the ``mode`` attribute, specify if the memory is to be "shared" or
|
||||
"private". This can be overridden per numa node by ``memAccess``.
|
||||
``allocation``
|
||||
- Using the ``mode`` attribute, specify when to allocate the memory by
|
||||
- supplying either "immediate" or "ondemand".
|
||||
+ Using the optional ``mode`` attribute, specify when to allocate the memory by
|
||||
+ supplying either "immediate" or "ondemand". :since:`Since 8.2.0` it is
|
||||
+ possible to set the number of threads that hypervisor uses to allocate
|
||||
+ memory via ``threads`` attribute.
|
||||
``discard``
|
||||
When set and supported by hypervisor the memory content is discarded just
|
||||
before guest shuts down (or when DIMM module is unplugged). Please note that
|
||||
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||
index 7fa5c2b8b5..c9c1529979 100644
|
||||
--- a/docs/schemas/domaincommon.rng
|
||||
+++ b/docs/schemas/domaincommon.rng
|
||||
@@ -745,12 +745,19 @@
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="allocation">
|
||||
- <attribute name="mode">
|
||||
- <choice>
|
||||
- <value>immediate</value>
|
||||
- <value>ondemand</value>
|
||||
- </choice>
|
||||
- </attribute>
|
||||
+ <optional>
|
||||
+ <attribute name="mode">
|
||||
+ <choice>
|
||||
+ <value>immediate</value>
|
||||
+ <value>ondemand</value>
|
||||
+ </choice>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
+ <optional>
|
||||
+ <attribute name="threads">
|
||||
+ <ref name="unsignedInt"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 5691b8d2d5..805a15848e 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -19095,6 +19095,13 @@ virDomainDefParseMemory(virDomainDef *def,
|
||||
VIR_FREE(tmp);
|
||||
}
|
||||
|
||||
+ if (virXPathUInt("string(./memoryBacking/allocation/@threads)",
|
||||
+ ctxt, &def->mem.allocation_threads) == -2) {
|
||||
+ virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
+ _("Failed to parse memory allocation threads"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
if (virXPathNode("./memoryBacking/hugepages", ctxt)) {
|
||||
/* hugepages will be used */
|
||||
if ((n = virXPathNodeSet("./memoryBacking/hugepages/page", ctxt, &nodes)) < 0) {
|
||||
@@ -27639,6 +27646,7 @@ virDomainMemorybackingFormat(virBuffer *buf,
|
||||
const virDomainMemtune *mem)
|
||||
{
|
||||
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||
+ g_auto(virBuffer) allocAttrBuf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
if (mem->nhugepages)
|
||||
virDomainHugepagesFormat(&childBuf, mem->hugepages, mem->nhugepages);
|
||||
@@ -27653,8 +27661,13 @@ virDomainMemorybackingFormat(virBuffer *buf,
|
||||
virBufferAsprintf(&childBuf, "<access mode='%s'/>\n",
|
||||
virDomainMemoryAccessTypeToString(mem->access));
|
||||
if (mem->allocation)
|
||||
- virBufferAsprintf(&childBuf, "<allocation mode='%s'/>\n",
|
||||
+ virBufferAsprintf(&allocAttrBuf, " mode='%s'",
|
||||
virDomainMemoryAllocationTypeToString(mem->allocation));
|
||||
+ if (mem->allocation_threads > 0)
|
||||
+ virBufferAsprintf(&allocAttrBuf, " threads='%u'", mem->allocation_threads);
|
||||
+
|
||||
+ virXMLFormatElement(&childBuf, "allocation", &allocAttrBuf, NULL);
|
||||
+
|
||||
if (mem->discard)
|
||||
virBufferAddLit(&childBuf, "<discard/>\n");
|
||||
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index 144ba4dd12..10af94e2e4 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -2677,6 +2677,7 @@ struct _virDomainMemtune {
|
||||
int source; /* enum virDomainMemorySource */
|
||||
int access; /* enum virDomainMemoryAccess */
|
||||
int allocation; /* enum virDomainMemoryAllocation */
|
||||
+ unsigned int allocation_threads;
|
||||
|
||||
virTristateBool discard;
|
||||
};
|
||||
diff --git a/tests/qemuxml2argvdata/memfd-memory-numa.xml b/tests/qemuxml2argvdata/memfd-memory-numa.xml
|
||||
index 1ebcee8939..1ac87e3aef 100644
|
||||
--- a/tests/qemuxml2argvdata/memfd-memory-numa.xml
|
||||
+++ b/tests/qemuxml2argvdata/memfd-memory-numa.xml
|
||||
@@ -10,7 +10,7 @@
|
||||
</hugepages>
|
||||
<source type='memfd'/>
|
||||
<access mode='shared'/>
|
||||
- <allocation mode='immediate'/>
|
||||
+ <allocation mode='immediate' threads='8'/>
|
||||
</memoryBacking>
|
||||
<vcpu placement='static'>8</vcpu>
|
||||
<numatune>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -0,0 +1,132 @@
|
||||
From 748c9648eb88b69e3ed0847126d59d6c7a11eda8 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <748c9648eb88b69e3ed0847126d59d6c7a11eda8.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 15 Feb 2026 18:19:56 +0100
|
||||
Subject: [PATCH] conf: Introduce virDomainDefHasPCIHostdevWithIOMMUFD
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 4b176cfc3877cca882d63ab4ed446794d7a05722)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 14 ++++++++++++++
|
||||
src/conf/domain_conf.h | 3 +++
|
||||
src/libvirt_private.syms | 1 +
|
||||
src/qemu/qemu_command.c | 42 ++++++++++++----------------------------
|
||||
4 files changed, 30 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 9ae48e9abc..cb047e5a3e 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -32482,6 +32482,20 @@ virDomainDefHasPCIHostdev(const virDomainDef *def)
|
||||
}
|
||||
|
||||
|
||||
+bool
|
||||
+virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def)
|
||||
+{
|
||||
+ size_t i;
|
||||
+
|
||||
+ for (i = 0; i < def->nhostdevs; i++) {
|
||||
+ if (virHostdevIsPCIDeviceWithIOMMUFD(def->hostdevs[i]))
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+
|
||||
bool
|
||||
virDomainDefHasMdevHostdev(const virDomainDef *def)
|
||||
{
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index d958ed04f9..69a8e79c6d 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -4655,6 +4655,9 @@ virDomainDefHasNVMeDisk(const virDomainDef *def);
|
||||
bool
|
||||
virDomainDefHasPCIHostdev(const virDomainDef *def);
|
||||
|
||||
+bool
|
||||
+virDomainDefHasPCIHostdevWithIOMMUFD(const virDomainDef *def);
|
||||
+
|
||||
bool
|
||||
virDomainDefHasMdevHostdev(const virDomainDef *def);
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 863e50ec4f..effe44fe57 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -348,6 +348,7 @@ virDomainDefHasNVMeDisk;
|
||||
virDomainDefHasOldStyleROUEFI;
|
||||
virDomainDefHasOldStyleUEFI;
|
||||
virDomainDefHasPCIHostdev;
|
||||
+virDomainDefHasPCIHostdevWithIOMMUFD;
|
||||
virDomainDefHasTimer;
|
||||
virDomainDefHasUSB;
|
||||
virDomainDefHasVcpusOffline;
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 1718097b63..482f8d8ca2 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -5349,43 +5349,25 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
|
||||
const virDomainDef *def,
|
||||
virDomainObj *vm)
|
||||
{
|
||||
- size_t i;
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
g_autofree char *fdstr = g_strdup_printf("%d", priv->iommufd);
|
||||
+ g_autoptr(virJSONValue) props = NULL;
|
||||
|
||||
+ if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
|
||||
+ return 0;
|
||||
|
||||
- for (i = 0; i < def->nhostdevs; i++) {
|
||||
- virDomainHostdevDef *hostdev = def->hostdevs[i];
|
||||
- virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
|
||||
- g_autoptr(virJSONValue) props = NULL;
|
||||
+ virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
|
||||
- if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||
- continue;
|
||||
+ priv->iommufd = -1;
|
||||
|
||||
- if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||
- continue;
|
||||
+ if (qemuMonitorCreateObjectProps(&props, "iommufd",
|
||||
+ "iommufd0",
|
||||
+ "S:fd", fdstr,
|
||||
+ NULL) < 0)
|
||||
+ return -1;
|
||||
|
||||
- if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED)
|
||||
- continue;
|
||||
-
|
||||
- if (subsys->u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES)
|
||||
- continue;
|
||||
-
|
||||
- virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
-
|
||||
- priv->iommufd = -1;
|
||||
-
|
||||
- if (qemuMonitorCreateObjectProps(&props, "iommufd",
|
||||
- "iommufd0",
|
||||
- "S:fd", fdstr,
|
||||
- NULL) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- break;
|
||||
- }
|
||||
+ if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
|
||||
+ return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,89 @@
|
||||
From 3864161a4d28f0ef71d435f2ae1e52e92afaac15 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <3864161a4d28f0ef71d435f2ae1e52e92afaac15.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 15 Feb 2026 18:19:23 +0100
|
||||
Subject: [PATCH] conf: Introduce virHostdevIsPCIDeviceWithIOMMUFD
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 97eed30948e980be8b7552fff637e828768854e4)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 15 +++++++++++++++
|
||||
src/conf/domain_conf.h | 3 +++
|
||||
src/libvirt_private.syms | 1 +
|
||||
src/qemu/qemu_process.c | 5 +----
|
||||
4 files changed, 20 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 83c58ab5ff..9ae48e9abc 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -32758,6 +32758,21 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * virHostdevIsPCIDeviceWithIOMMUFD:
|
||||
+ * @hostdev: host device to check
|
||||
+ *
|
||||
+ * Returns true if @hostdev is a PCI device with IOMMUFD enabled, false otherwise.
|
||||
+ */
|
||||
+bool
|
||||
+virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
+{
|
||||
+ return virHostdevIsPCIDevice(hostdev) &&
|
||||
+ hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO &&
|
||||
+ hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static void
|
||||
virDomainObjGetMessagesIOErrorsSrc(virStorageSource *src,
|
||||
const char *diskdst,
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index b120d4a68e..d958ed04f9 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -4713,6 +4713,9 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev)
|
||||
bool
|
||||
virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
+bool
|
||||
+virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
+ ATTRIBUTE_NONNULL(1);
|
||||
|
||||
void
|
||||
virDomainObjGetMessagesIOErrorsChain(virStorageSource *src,
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 9ae44e31b8..863e50ec4f 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -812,6 +812,7 @@ virDomainQemuMonitorEventNew;
|
||||
virDomainQemuMonitorEventStateRegisterID;
|
||||
virHostdevIsMdevDevice;
|
||||
virHostdevIsPCIDevice;
|
||||
+virHostdevIsPCIDeviceWithIOMMUFD;
|
||||
virHostdevIsSCSIDevice;
|
||||
|
||||
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 7e32325fa0..3bd81c55b3 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7732,10 +7732,7 @@ qemuProcessOpenVfioFds(virDomainObj *vm)
|
||||
for (i = 0; i < vm->def->nhostdevs; i++) {
|
||||
virDomainHostdevDef *hostdev = vm->def->hostdevs[i];
|
||||
|
||||
- if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
||||
- hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
|
||||
- hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO &&
|
||||
- hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
+ if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
|
||||
/* Open VFIO device FD */
|
||||
if (qemuProcessOpenVfioDeviceFd(hostdev) < 0)
|
||||
return -1;
|
||||
--
|
||||
2.53.0
|
||||
@ -1,46 +0,0 @@
|
||||
From 666b68a93006c4299747d159bcacb7164b8c5d91 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <666b68a93006c4299747d159bcacb7164b8c5d91@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Thu, 24 Nov 2022 10:28:59 +0100
|
||||
Subject: [PATCH] conf: Make VIR_DOMAIN_NET_TYPE_ETHERNET not share 'host view'
|
||||
|
||||
When setting up QoS for a domain <interface/>, or when reporting
|
||||
its statistics we may need to swap TX/RX values. This is all
|
||||
explained in comment to virDomainNetTypeSharesHostView().
|
||||
However, this function claims that VIR_DOMAIN_NET_TYPE_ETHERNET
|
||||
also shares the 'host view', meaning the TX/RX values must be
|
||||
swapped. But that's not true.
|
||||
|
||||
An easy reproducer is to start a domain with two <interface/>-s:
|
||||
one type of network, the other of type ethernet and configure the
|
||||
same <bandwidth/> for both. Reversed setting can then be observed
|
||||
(e.g. via tc).
|
||||
|
||||
Reported-by: Oleg Vasilev <oleg.vasilev@virtuozzo.com>
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 0862cb3ce46253a58ca02d36b2b6a6397a60bfc7)
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2172578
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 401ddaa1a0..427e7d1bb5 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -30472,9 +30472,9 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
|
||||
virDomainNetType actualType = virDomainNetGetActualType(net);
|
||||
switch (actualType) {
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
- case VIR_DOMAIN_NET_TYPE_ETHERNET:
|
||||
return true;
|
||||
case VIR_DOMAIN_NET_TYPE_USER:
|
||||
+ case VIR_DOMAIN_NET_TYPE_ETHERNET:
|
||||
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
||||
case VIR_DOMAIN_NET_TYPE_SERVER:
|
||||
case VIR_DOMAIN_NET_TYPE_CLIENT:
|
||||
--
|
||||
2.39.2
|
||||
|
||||
@ -0,0 +1,330 @@
|
||||
From 15b1edcb2dca52b4d2276359c1eeaa97d66ac400 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <15b1edcb2dca52b4d2276359c1eeaa97d66ac400.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Fri, 13 Mar 2026 16:59:01 +0100
|
||||
Subject: [PATCH] conf: Move and rename virStorageSourceFDTuple object
|
||||
|
||||
Associating FD can be used by other parts of VM so rename it to generic
|
||||
virDomainFDTuple.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit f89e3dbce809f64246a8fe5ef0d05a63a28a05c0)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/meson.build | 1 +
|
||||
src/conf/storage_source_conf.c | 42 ---------------------------
|
||||
src/conf/storage_source_conf.h | 24 ++--------------
|
||||
src/conf/virdomainfd.c | 52 ++++++++++++++++++++++++++++++++++
|
||||
src/conf/virdomainfd.h | 27 ++++++++++++++++++
|
||||
src/libvirt_private.syms | 5 +++-
|
||||
src/qemu/qemu_backup.c | 2 +-
|
||||
src/qemu/qemu_domain.c | 2 +-
|
||||
src/qemu/qemu_driver.c | 6 ++--
|
||||
tests/testutilsqemu.c | 2 +-
|
||||
10 files changed, 92 insertions(+), 71 deletions(-)
|
||||
create mode 100644 src/conf/virdomainfd.c
|
||||
create mode 100644 src/conf/virdomainfd.h
|
||||
|
||||
diff --git a/src/conf/meson.build b/src/conf/meson.build
|
||||
index 5116c23fe3..6f95b23cce 100644
|
||||
--- a/src/conf/meson.build
|
||||
+++ b/src/conf/meson.build
|
||||
@@ -20,6 +20,7 @@ domain_conf_sources = [
|
||||
'numa_conf.c',
|
||||
'snapshot_conf.c',
|
||||
'virdomaincheckpointobjlist.c',
|
||||
+ 'virdomainfd.c',
|
||||
'virdomainjob.c',
|
||||
'virdomainmomentobjlist.c',
|
||||
'virdomainobjlist.c',
|
||||
diff --git a/src/conf/storage_source_conf.c b/src/conf/storage_source_conf.c
|
||||
index 24d4b0de6a..493b1411b3 100644
|
||||
--- a/src/conf/storage_source_conf.c
|
||||
+++ b/src/conf/storage_source_conf.c
|
||||
@@ -1413,48 +1413,6 @@ virStorageSourceInitiatorClear(virStorageSourceInitiatorDef *initiator)
|
||||
VIR_FREE(initiator->iqn);
|
||||
}
|
||||
|
||||
-G_DEFINE_TYPE(virStorageSourceFDTuple, vir_storage_source_fd_tuple, G_TYPE_OBJECT);
|
||||
-
|
||||
-static void
|
||||
-vir_storage_source_fd_tuple_init(virStorageSourceFDTuple *fdt G_GNUC_UNUSED)
|
||||
-{
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static void
|
||||
-virStorageSourceFDTupleFinalize(GObject *object)
|
||||
-{
|
||||
- virStorageSourceFDTuple *fdt = VIR_STORAGE_SOURCE_FD_TUPLE(object);
|
||||
- size_t i;
|
||||
-
|
||||
- if (!fdt)
|
||||
- return;
|
||||
-
|
||||
- for (i = 0; i < fdt->nfds; i++)
|
||||
- VIR_FORCE_CLOSE(fdt->fds[i]);
|
||||
-
|
||||
- g_free(fdt->fds);
|
||||
- g_free(fdt->testfds);
|
||||
- g_free(fdt->selinuxLabel);
|
||||
- G_OBJECT_CLASS(vir_storage_source_fd_tuple_parent_class)->finalize(object);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static void
|
||||
-vir_storage_source_fd_tuple_class_init(virStorageSourceFDTupleClass *klass)
|
||||
-{
|
||||
- GObjectClass *obj = G_OBJECT_CLASS(klass);
|
||||
-
|
||||
- obj->finalize = virStorageSourceFDTupleFinalize;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-virStorageSourceFDTuple *
|
||||
-virStorageSourceFDTupleNew(void)
|
||||
-{
|
||||
- return g_object_new(vir_storage_source_fd_tuple_get_type(), NULL);
|
||||
-}
|
||||
-
|
||||
|
||||
/**
|
||||
* virStorageSourceNetworkProtocolPathSplit:
|
||||
diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h
|
||||
index 5a4b088eeb..b47313bae5 100644
|
||||
--- a/src/conf/storage_source_conf.h
|
||||
+++ b/src/conf/storage_source_conf.h
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "storage_encryption_conf.h"
|
||||
#include "virbitmap.h"
|
||||
#include "virconftypes.h"
|
||||
+#include "virdomainfd.h"
|
||||
#include "virenum.h"
|
||||
#include "virobject.h"
|
||||
#include "virpci.h"
|
||||
@@ -268,27 +269,6 @@ struct _virStorageSourceSlice {
|
||||
void
|
||||
virStorageSourceSliceFree(virStorageSourceSlice *slice);
|
||||
|
||||
-struct _virStorageSourceFDTuple {
|
||||
- GObject parent;
|
||||
- int *fds;
|
||||
- size_t nfds;
|
||||
- int *testfds; /* populated by tests to ensure stable FDs */
|
||||
-
|
||||
- bool writable;
|
||||
- bool tryRestoreLabel;
|
||||
-
|
||||
- /* connection this FD tuple is associated with for auto-closing */
|
||||
- virConnect *conn;
|
||||
-
|
||||
- /* original selinux label when we relabel the image */
|
||||
- char *selinuxLabel;
|
||||
-};
|
||||
-G_DECLARE_FINAL_TYPE(virStorageSourceFDTuple, vir_storage_source_fd_tuple, VIR, STORAGE_SOURCE_FD_TUPLE, GObject);
|
||||
-
|
||||
-virStorageSourceFDTuple *
|
||||
-virStorageSourceFDTupleNew(void);
|
||||
-
|
||||
-
|
||||
typedef struct _virStorageSource virStorageSource;
|
||||
|
||||
/* Stores information related to a host resource. In the case of backing
|
||||
@@ -441,7 +421,7 @@ struct _virStorageSource {
|
||||
* one event for it */
|
||||
bool thresholdEventWithIndex;
|
||||
|
||||
- virStorageSourceFDTuple *fdtuple;
|
||||
+ virDomainFDTuple *fdtuple;
|
||||
|
||||
/* Setting 'seclabelSkipRemember' to true will cause the security driver to
|
||||
* not remember the security label even if it otherwise were to be
|
||||
diff --git a/src/conf/virdomainfd.c b/src/conf/virdomainfd.c
|
||||
new file mode 100644
|
||||
index 0000000000..13c3161e6a
|
||||
--- /dev/null
|
||||
+++ b/src/conf/virdomainfd.c
|
||||
@@ -0,0 +1,52 @@
|
||||
+/*
|
||||
+ * SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
+ */
|
||||
+
|
||||
+#include <config.h>
|
||||
+
|
||||
+#include "virdomainfd.h"
|
||||
+
|
||||
+#include "virfile.h"
|
||||
+
|
||||
+G_DEFINE_TYPE(virDomainFDTuple, vir_domain_fd_tuple, G_TYPE_OBJECT);
|
||||
+
|
||||
+
|
||||
+static void
|
||||
+vir_domain_fd_tuple_init(virDomainFDTuple *fdt G_GNUC_UNUSED)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void
|
||||
+virDomainFDTupleFinalize(GObject *object)
|
||||
+{
|
||||
+ virDomainFDTuple *fdt = VIR_DOMAIN_FD_TUPLE(object);
|
||||
+ size_t i;
|
||||
+
|
||||
+ if (!fdt)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < fdt->nfds; i++)
|
||||
+ VIR_FORCE_CLOSE(fdt->fds[i]);
|
||||
+
|
||||
+ g_free(fdt->fds);
|
||||
+ g_free(fdt->testfds);
|
||||
+ g_free(fdt->selinuxLabel);
|
||||
+ G_OBJECT_CLASS(vir_domain_fd_tuple_parent_class)->finalize(object);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void
|
||||
+vir_domain_fd_tuple_class_init(virDomainFDTupleClass *klass)
|
||||
+{
|
||||
+ GObjectClass *obj = G_OBJECT_CLASS(klass);
|
||||
+
|
||||
+ obj->finalize = virDomainFDTupleFinalize;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+virDomainFDTuple *
|
||||
+virDomainFDTupleNew(void)
|
||||
+{
|
||||
+ return g_object_new(vir_domain_fd_tuple_get_type(), NULL);
|
||||
+}
|
||||
diff --git a/src/conf/virdomainfd.h b/src/conf/virdomainfd.h
|
||||
new file mode 100644
|
||||
index 0000000000..0c0d475ed6
|
||||
--- /dev/null
|
||||
+++ b/src/conf/virdomainfd.h
|
||||
@@ -0,0 +1,27 @@
|
||||
+/*
|
||||
+ * SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
+ */
|
||||
+
|
||||
+#pragma once
|
||||
+
|
||||
+#include "internal.h"
|
||||
+
|
||||
+struct _virDomainFDTuple {
|
||||
+ GObject parent;
|
||||
+ int *fds;
|
||||
+ size_t nfds;
|
||||
+ int *testfds; /* populated by tests to ensure stable FDs */
|
||||
+
|
||||
+ bool writable;
|
||||
+ bool tryRestoreLabel;
|
||||
+
|
||||
+ /* connection this FD tuple is associated with for auto-closing */
|
||||
+ virConnect *conn;
|
||||
+
|
||||
+ /* original selinux label when we relabel the image */
|
||||
+ char *selinuxLabel;
|
||||
+};
|
||||
+G_DECLARE_FINAL_TYPE(virDomainFDTuple, vir_domain_fd_tuple, VIR, DOMAIN_FD_TUPLE, GObject);
|
||||
+
|
||||
+virDomainFDTuple *
|
||||
+virDomainFDTupleNew(void);
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index effe44fe57..386e757d81 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -1177,7 +1177,6 @@ virStorageSourceChainHasManagedPR;
|
||||
virStorageSourceChainHasNVMe;
|
||||
virStorageSourceClear;
|
||||
virStorageSourceCopy;
|
||||
-virStorageSourceFDTupleNew;
|
||||
virStorageSourceGetActualType;
|
||||
virStorageSourceGetSecurityLabelDef;
|
||||
virStorageSourceHasBacking;
|
||||
@@ -1230,6 +1229,10 @@ virDomainCheckpointUpdateRelations;
|
||||
virDomainListCheckpoints;
|
||||
|
||||
|
||||
+# conf/virdomainfd.h
|
||||
+virDomainFDTupleNew;
|
||||
+
|
||||
+
|
||||
#conf/virdomainjob.h
|
||||
virDomainAgentJobTypeToString;
|
||||
virDomainAsyncJobTypeFromString;
|
||||
diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
|
||||
index c3566bcd57..eebf6cdc06 100644
|
||||
--- a/src/qemu/qemu_backup.c
|
||||
+++ b/src/qemu/qemu_backup.c
|
||||
@@ -876,7 +876,7 @@ qemuBackupBegin(virDomainObj *vm,
|
||||
priv->backup = g_steal_pointer(&def);
|
||||
|
||||
if (pull && priv->backup->server->fdgroup) {
|
||||
- virStorageSourceFDTuple *fdt = NULL;
|
||||
+ virDomainFDTuple *fdt = NULL;
|
||||
VIR_AUTOCLOSE fdcopy = -1;
|
||||
|
||||
if (!(fdt = virHashLookup(priv->fds, priv->backup->server->fdgroup))) {
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index ccbfc8bac7..5c9f4831fd 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -9835,7 +9835,7 @@ qemuDomainPrepareStorageSourceFDs(virStorageSource *src,
|
||||
{
|
||||
qemuDomainStorageSourcePrivate *srcpriv = NULL;
|
||||
virStorageType actualType = virStorageSourceGetActualType(src);
|
||||
- virStorageSourceFDTuple *fdt = NULL;
|
||||
+ virDomainFDTuple *fdt = NULL;
|
||||
size_t i;
|
||||
|
||||
if (actualType != VIR_STORAGE_TYPE_FILE &&
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index ecd19663ce..8db9cbb6a2 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -20241,7 +20241,7 @@ qemuDomainFDHashCloseConnect(virDomainObj *vm,
|
||||
virConnectPtr conn)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = QEMU_DOMAIN_PRIVATE(vm);
|
||||
- virStorageSourceFDTuple *data;
|
||||
+ virDomainFDTuple *data;
|
||||
GHashTableIter htitr;
|
||||
|
||||
if (!priv->fds)
|
||||
@@ -20265,7 +20265,7 @@ qemuDomainFDAssociate(virDomainPtr domain,
|
||||
{
|
||||
virDomainObj *vm = NULL;
|
||||
qemuDomainObjPrivate *priv;
|
||||
- g_autoptr(virStorageSourceFDTuple) new = NULL;
|
||||
+ g_autoptr(virDomainFDTuple) new = NULL;
|
||||
size_t i;
|
||||
int ret = -1;
|
||||
|
||||
@@ -20283,7 +20283,7 @@ qemuDomainFDAssociate(virDomainPtr domain,
|
||||
|
||||
priv = vm->privateData;
|
||||
|
||||
- new = virStorageSourceFDTupleNew();
|
||||
+ new = virDomainFDTupleNew();
|
||||
new->nfds = nfds;
|
||||
new->fds = g_new0(int, new->nfds);
|
||||
for (i = 0; i < new->nfds; i++) {
|
||||
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
|
||||
index 78ec521266..fc51e0e3df 100644
|
||||
--- a/tests/testutilsqemu.c
|
||||
+++ b/tests/testutilsqemu.c
|
||||
@@ -713,7 +713,7 @@ testQemuInfoSetArgs(testQemuInfo *info,
|
||||
break;
|
||||
|
||||
case ARG_FD_GROUP: {
|
||||
- virStorageSourceFDTuple *new = virStorageSourceFDTupleNew();
|
||||
+ virDomainFDTuple *new = virDomainFDTupleNew();
|
||||
const char *fdname = va_arg(argptr, char *);
|
||||
VIR_AUTOCLOSE fakefd = open("/dev/zero", O_RDWR);
|
||||
bool writable = va_arg(argptr, int);
|
||||
--
|
||||
2.54.0
|
||||
@ -1,91 +0,0 @@
|
||||
From 00c5cab2b92b653edbf491d9ef60359578c3d59a Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <00c5cab2b92b653edbf491d9ef60359578c3d59a@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 11 May 2022 16:27:18 +0200
|
||||
Subject: [PATCH] conf: Move virDomainObj::originalMemlock into
|
||||
qemuDomainObjPrivate
|
||||
|
||||
Since v1.3.0-90-gafbe1d4c56 the original value of memlock limit
|
||||
is stored inside virDomainObj struct directly (under
|
||||
originalMemlock member). This is needless because the value is
|
||||
used only inside QEMU driver and thus can reside in
|
||||
qemuDomainObjPrivate struct.
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 75df6d2c291c48d65c1e54dd93e3d2d3cb0712e7)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2089433
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.h | 3 ---
|
||||
src/qemu/qemu_domain.c | 9 +++++----
|
||||
src/qemu/qemu_domain.h | 3 +++
|
||||
3 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index d0d0fdc815..45976beb2b 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -3031,9 +3031,6 @@ struct _virDomainObj {
|
||||
int taint;
|
||||
size_t ndeprecations;
|
||||
char **deprecations;
|
||||
-
|
||||
- unsigned long long originalMemlock; /* Original RLIMIT_MEMLOCK, zero if no
|
||||
- * restore will be required later */
|
||||
};
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainObj, virObjectUnref);
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 40fe9985e6..86d673dafa 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -9269,6 +9269,7 @@ int
|
||||
qemuDomainAdjustMaxMemLock(virDomainObj *vm,
|
||||
bool forceVFIO)
|
||||
{
|
||||
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||
unsigned long long currentMemLock = 0;
|
||||
unsigned long long desiredMemLock = 0;
|
||||
|
||||
@@ -9281,8 +9282,8 @@ qemuDomainAdjustMaxMemLock(virDomainObj *vm,
|
||||
/* If this is the first time adjusting the limit, save the current
|
||||
* value so that we can restore it once memory locking is no longer
|
||||
* required */
|
||||
- if (vm->originalMemlock == 0) {
|
||||
- vm->originalMemlock = currentMemLock;
|
||||
+ if (priv->originalMemlock == 0) {
|
||||
+ priv->originalMemlock = currentMemLock;
|
||||
}
|
||||
} else {
|
||||
/* If the limit is already high enough, we can assume
|
||||
@@ -9295,8 +9296,8 @@ qemuDomainAdjustMaxMemLock(virDomainObj *vm,
|
||||
} else {
|
||||
/* Once memory locking is no longer required, we can restore the
|
||||
* original, usually very low, limit */
|
||||
- desiredMemLock = vm->originalMemlock;
|
||||
- vm->originalMemlock = 0;
|
||||
+ desiredMemLock = priv->originalMemlock;
|
||||
+ priv->originalMemlock = 0;
|
||||
}
|
||||
|
||||
if (desiredMemLock > 0 &&
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index e5046367e3..e9497d20de 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -241,6 +241,9 @@ struct _qemuDomainObjPrivate {
|
||||
GSList *dbusVMStateIds;
|
||||
/* true if -object dbus-vmstate was added */
|
||||
bool dbusVMState;
|
||||
+
|
||||
+ unsigned long long originalMemlock; /* Original RLIMIT_MEMLOCK, zero if no
|
||||
+ * restore will be required later */
|
||||
};
|
||||
|
||||
#define QEMU_DOMAIN_PRIVATE(vm) \
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -0,0 +1,113 @@
|
||||
From b60749c749a3312148c72471b99bd76469a6aff2 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b60749c749a3312148c72471b99bd76469a6aff2.1780571166.git.jdenemar@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 11 Feb 2026 10:16:28 +0100
|
||||
Subject: [PATCH] conf: Parse hyperv features even for host-model
|
||||
|
||||
As it turns out, some users of the hyperv "host-model" mode might
|
||||
want to override the hypervisor defaults. For instance disable a
|
||||
feature that's on by default, or vice versa. Currently, this is
|
||||
not possible because as soon as our XML parser sees the
|
||||
"host-model" mode it exits early and skips parsing of individual
|
||||
features (for "custom" mode). Well, do not return early and parse
|
||||
the rest.
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 380fb8939009a420f598175e63994a5bf197fd56)
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-151688
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
docs/formatdomain.rst | 3 +++
|
||||
src/conf/domain_conf.c | 3 +--
|
||||
src/conf/schemas/domaincommon.rng | 8 ++++----
|
||||
tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml | 6 +++++-
|
||||
tests/qemuxmlconfdata/hyperv-host-model.xml | 6 +++++-
|
||||
5 files changed, 18 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 31232deb3c..5ec9a41aac 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -2197,6 +2197,9 @@ are:
|
||||
enlightenments are supported by hypervisor and expands them on domain
|
||||
startup into the live XML. In a sense, this is similar to ``host-model``
|
||||
CPU mode (See `CPU model and topology`_). :since:`Since 11.9.0`
|
||||
+ It is also possible to set features, like in ``custom`` mode. These are
|
||||
+ then left untouched and no expansion is done for them. :since:`Since
|
||||
+ 12.1.0`
|
||||
|
||||
The ``mode`` attribute can be omitted and will default to ``custom``.
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index df05d96f01..1f7b1ca340 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -17269,8 +17269,7 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def,
|
||||
|
||||
def->features[VIR_DOMAIN_FEATURE_HYPERV] = mode;
|
||||
|
||||
- if (mode == VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH ||
|
||||
- mode == VIR_DOMAIN_HYPERV_MODE_HOST_MODEL)
|
||||
+ if (mode == VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH)
|
||||
return 0;
|
||||
|
||||
node = xmlFirstElementChild(node);
|
||||
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
|
||||
index 441328a08e..afdf7bfc1a 100644
|
||||
--- a/src/conf/schemas/domaincommon.rng
|
||||
+++ b/src/conf/schemas/domaincommon.rng
|
||||
@@ -8063,13 +8063,13 @@
|
||||
<attribute name="mode">
|
||||
<value>passthrough</value>
|
||||
</attribute>
|
||||
- <attribute name="mode">
|
||||
- <value>host-model</value>
|
||||
- </attribute>
|
||||
<group>
|
||||
<optional>
|
||||
<attribute name="mode">
|
||||
- <value>custom</value>
|
||||
+ <choice>
|
||||
+ <value>custom</value>
|
||||
+ <value>host-model</value>
|
||||
+ </choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
diff --git a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml
|
||||
index 453a43b3c9..9535cee02a 100644
|
||||
--- a/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml
|
||||
+++ b/tests/qemuxmlconfdata/hyperv-host-model.x86_64-latest.xml
|
||||
@@ -10,7 +10,11 @@
|
||||
</os>
|
||||
<features>
|
||||
<acpi/>
|
||||
- <hyperv mode='host-model'/>
|
||||
+ <hyperv mode='host-model'>
|
||||
+ <relaxed state='on'/>
|
||||
+ <spinlocks state='on' retries='8192'/>
|
||||
+ <xmm_input state='off'/>
|
||||
+ </hyperv>
|
||||
</features>
|
||||
<cpu mode='custom' match='exact' check='none'>
|
||||
<model fallback='forbid'>qemu64</model>
|
||||
diff --git a/tests/qemuxmlconfdata/hyperv-host-model.xml b/tests/qemuxmlconfdata/hyperv-host-model.xml
|
||||
index fae00d86dd..473a41892d 100644
|
||||
--- a/tests/qemuxmlconfdata/hyperv-host-model.xml
|
||||
+++ b/tests/qemuxmlconfdata/hyperv-host-model.xml
|
||||
@@ -10,7 +10,11 @@
|
||||
</os>
|
||||
<features>
|
||||
<acpi/>
|
||||
- <hyperv mode='host-model'/>
|
||||
+ <hyperv mode='host-model'>
|
||||
+ <relaxed state='on'/>
|
||||
+ <spinlocks state='on' retries='8192'/>
|
||||
+ <xmm_input state='off'/>
|
||||
+ </hyperv>
|
||||
</features>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
--
|
||||
2.54.0
|
||||
80
SOURCES/libvirt-conf-Refactor-virHostdevIsPCIDevice.patch
Normal file
80
SOURCES/libvirt-conf-Refactor-virHostdevIsPCIDevice.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From 7af5a1f92b63d250922e04b56cae67bfb65fa4f4 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <7af5a1f92b63d250922e04b56cae67bfb65fa4f4.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Wed, 18 Mar 2026 11:47:21 +0100
|
||||
Subject: [PATCH] conf: Refactor virHostdevIsPCIDevice
|
||||
|
||||
Future patches will need to check if the host device uses IOMMUFD or not
|
||||
but we also need to keep a function that will check only if it is PCI device.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit d0afa0a842ce8a6dcb3f881d7dccdf5198f78fa7)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 34 +++++++++++++++++++++++++++++-----
|
||||
1 file changed, 29 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 35de8bab6b..59df028192 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -32782,6 +32782,33 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev)
|
||||
}
|
||||
|
||||
|
||||
+static bool
|
||||
+virHostdevPCIDevHasIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
+{
|
||||
+ return hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO &&
|
||||
+ hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static bool
|
||||
+virHostdevIsPCIDeviceImpl(const virDomainHostdevDef *hostdev,
|
||||
+ virTristateBool iommufd)
|
||||
+{
|
||||
+ if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||
+ return false;
|
||||
+
|
||||
+ if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||
+ return false;
|
||||
+
|
||||
+ if (iommufd != VIR_TRISTATE_BOOL_ABSENT) {
|
||||
+ bool hasIOMMUFD = iommufd == VIR_TRISTATE_BOOL_YES;
|
||||
+ return hasIOMMUFD == virHostdevPCIDevHasIOMMUFD(hostdev);
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/**
|
||||
* virHostdevIsPCIDevice:
|
||||
* @hostdev: host device to check
|
||||
@@ -32791,8 +32818,7 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev)
|
||||
bool
|
||||
virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||
{
|
||||
- return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
||||
- hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
|
||||
+ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_ABSENT);
|
||||
}
|
||||
|
||||
|
||||
@@ -32805,9 +32831,7 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||
bool
|
||||
virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
{
|
||||
- return virHostdevIsPCIDevice(hostdev) &&
|
||||
- hostdev->source.subsys.u.pci.driver.name == VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO &&
|
||||
- hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES;
|
||||
+ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_YES);
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.54.0
|
||||
@ -1,135 +0,0 @@
|
||||
From 7a412cc71a4764f7e80bf475c39d999a584f41aa Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <7a412cc71a4764f7e80bf475c39d999a584f41aa.1749113304.git.jdenemar@redhat.com>
|
||||
From: Collin Walling <walling@linux.ibm.com>
|
||||
Date: Mon, 16 Dec 2024 18:03:58 -0500
|
||||
Subject: [PATCH] conf: add deprecated_features attribute
|
||||
|
||||
Add a new a attribute, deprecated_features='on|off' to the <cpu>
|
||||
element. This is used to toggle features flagged as deprecated on the
|
||||
CPU model on or off. When this attribute is paired with 'on',
|
||||
deprecated features will not be filtered. When paired with 'off', any
|
||||
CPU features that are flagged as deprecated will be listed under the
|
||||
CPU model with the 'disable' policy.
|
||||
|
||||
Example:
|
||||
|
||||
<cpu mode='host-model' check='partial' deprecated_features='off'/>
|
||||
|
||||
The absence of this attribute is equivalent to the 'on' option.
|
||||
|
||||
The deprecated features that will populate the domain XML are the same
|
||||
features that result in the virsh domcapabilities command with the
|
||||
--disable-deprecated-features argument present.
|
||||
|
||||
It is recommended to define a domain XML with this attribute set to
|
||||
'off' to ensure migration to machines that may outright drop these
|
||||
features in the future.
|
||||
|
||||
Signed-off-by: Collin Walling <walling@linux.ibm.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 62658bbf060784c757f96c9de3935f27885834aa)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-88716
|
||||
Conflicts:
|
||||
src/qemu/qemu_process.c
|
||||
(contextual conflict)
|
||||
tests/*
|
||||
(dropped the changes to these files since they are of no use in
|
||||
downstream - upstream testing code changed too much, so it's
|
||||
not possible to get the related tests to work in downstream)
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
docs/schemas/cputypes.rng | 5 +++++
|
||||
src/conf/cpu_conf.c | 11 +++++++++++
|
||||
src/conf/cpu_conf.h | 1 +
|
||||
src/qemu/qemu_process.c | 11 +++++++++++
|
||||
4 files changed, 28 insertions(+)
|
||||
|
||||
diff --git a/docs/schemas/cputypes.rng b/docs/schemas/cputypes.rng
|
||||
index 056e66e1b4..2d831b423c 100644
|
||||
--- a/docs/schemas/cputypes.rng
|
||||
+++ b/docs/schemas/cputypes.rng
|
||||
@@ -395,6 +395,11 @@
|
||||
<optional>
|
||||
<ref name="cpuCheck"/>
|
||||
</optional>
|
||||
+ <optional>
|
||||
+ <attribute name="deprecated_features">
|
||||
+ <ref name="virOnOff"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
<optional>
|
||||
<attribute name="migratable">
|
||||
<ref name="virOnOff"/>
|
||||
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
|
||||
index fbceac1657..1db0c978e2 100644
|
||||
--- a/src/conf/cpu_conf.c
|
||||
+++ b/src/conf/cpu_conf.c
|
||||
@@ -238,6 +238,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu)
|
||||
copy->mode = cpu->mode;
|
||||
copy->match = cpu->match;
|
||||
copy->check = cpu->check;
|
||||
+ copy->deprecated_feats = cpu->deprecated_feats;
|
||||
copy->fallback = cpu->fallback;
|
||||
copy->sockets = cpu->sockets;
|
||||
copy->dies = cpu->dies;
|
||||
@@ -431,6 +432,11 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
|
||||
if (virXMLPropEnum(ctxt->node, "check", virCPUCheckTypeFromString,
|
||||
VIR_XML_PROP_NONE, &def->check) < 0)
|
||||
return -1;
|
||||
+
|
||||
+ if (virXMLPropTristateSwitch(ctxt->node, "deprecated_features",
|
||||
+ VIR_XML_PROP_NONE,
|
||||
+ &def->deprecated_feats) < 0)
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
if (def->type == VIR_CPU_TYPE_HOST) {
|
||||
@@ -707,6 +713,11 @@ virCPUDefFormatBufFull(virBuffer *buf,
|
||||
virBufferAsprintf(&attributeBuf, " migratable='%s'",
|
||||
virTristateSwitchTypeToString(def->migratable));
|
||||
}
|
||||
+
|
||||
+ if (def->deprecated_feats) {
|
||||
+ virBufferAsprintf(&attributeBuf, " deprecated_features='%s'",
|
||||
+ virTristateSwitchTypeToString(def->deprecated_feats));
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Format children */
|
||||
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
|
||||
index b0a81895be..a69ff724ca 100644
|
||||
--- a/src/conf/cpu_conf.h
|
||||
+++ b/src/conf/cpu_conf.h
|
||||
@@ -140,6 +140,7 @@ struct _virCPUDef {
|
||||
virCPUCacheDef *cache;
|
||||
virHostCPUTscInfo *tsc;
|
||||
virTristateSwitch migratable; /* for host-passthrough mode */
|
||||
+ virTristateSwitch deprecated_feats;
|
||||
};
|
||||
|
||||
virCPUDef *virCPUDefNew(void);
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 73d54f01cd..54afcbe53e 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -6143,6 +6143,17 @@ qemuProcessUpdateGuestCPU(virDomainDef *def,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ if (def->cpu->deprecated_feats &&
|
||||
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
+ _("toggling deprecated features for CPU model is unsupported"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) {
|
||||
+ virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, def->cpu);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.49.0
|
||||
@ -1,88 +0,0 @@
|
||||
From 3c65b917f70d556fa1059b0400771c8159b8ca3b Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <3c65b917f70d556fa1059b0400771c8159b8ca3b@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:08 +0200
|
||||
Subject: [PATCH] conf: adjust method name virDomainDeviceCCWAddressParseXML
|
||||
|
||||
Adjust method name virDomainDeviceCCWAddressParseXML to
|
||||
virCCWDeviceAddressParseXML.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 2d9fd19bf5d7a3d33b94e464c335252682edd623)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/conf/device_conf.c | 4 ++--
|
||||
src/conf/device_conf.h | 4 ++--
|
||||
src/conf/domain_conf.c | 3 +--
|
||||
src/libvirt_private.syms | 2 +-
|
||||
4 files changed, 6 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
|
||||
index 958e2f43cc..e93fd57341 100644
|
||||
--- a/src/conf/device_conf.c
|
||||
+++ b/src/conf/device_conf.c
|
||||
@@ -259,8 +259,8 @@ virPCIDeviceAddressFormat(virBuffer *buf,
|
||||
}
|
||||
|
||||
int
|
||||
-virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
|
||||
- virCCWDeviceAddress *addr)
|
||||
+virCCWDeviceAddressParseXML(xmlNodePtr node,
|
||||
+ virCCWDeviceAddress *addr)
|
||||
{
|
||||
int cssid;
|
||||
int ssid;
|
||||
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
|
||||
index 01e2edccc9..910e6b7792 100644
|
||||
--- a/src/conf/device_conf.h
|
||||
+++ b/src/conf/device_conf.h
|
||||
@@ -193,8 +193,8 @@ void virPCIDeviceAddressFormat(virBuffer *buf,
|
||||
virPCIDeviceAddress addr,
|
||||
bool includeTypeInAddr);
|
||||
|
||||
-int virDomainDeviceCCWAddressParseXML(xmlNodePtr node,
|
||||
- virCCWDeviceAddress *addr);
|
||||
+int virCCWDeviceAddressParseXML(xmlNodePtr node,
|
||||
+ virCCWDeviceAddress *addr);
|
||||
|
||||
int virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
|
||||
virDomainDeviceDriveAddress *addr);
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 1e1c7f01b1..401ddaa1a0 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -6630,8 +6630,7 @@ virDomainDeviceAddressParseXML(xmlNodePtr address,
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
|
||||
- if (virDomainDeviceCCWAddressParseXML
|
||||
- (address, &info->addr.ccw) < 0)
|
||||
+ if (virCCWDeviceAddressParseXML(address, &info->addr.ccw) < 0)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 0d3ee4c20a..44b551fb60 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -124,6 +124,7 @@ virCPUModeTypeToString;
|
||||
|
||||
|
||||
# conf/device_conf.h
|
||||
+virCCWDeviceAddressParseXML;
|
||||
virDeviceInfoPCIAddressExtensionIsPresent;
|
||||
virDeviceInfoPCIAddressExtensionIsWanted;
|
||||
virDeviceInfoPCIAddressIsPresent;
|
||||
@@ -131,7 +132,6 @@ virDeviceInfoPCIAddressIsWanted;
|
||||
virDomainDeviceAddressIsValid;
|
||||
virDomainDeviceAddressTypeToString;
|
||||
virDomainDeviceCcidAddressParseXML;
|
||||
-virDomainDeviceCCWAddressParseXML;
|
||||
virDomainDeviceDriveAddressParseXML;
|
||||
virDomainDeviceInfoAddressIsEqual;
|
||||
virDomainDeviceSpaprVioAddressParseXML;
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,151 +0,0 @@
|
||||
From 0c09e4225c511ce1b0ebe22e45962f83d5145e66 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <0c09e4225c511ce1b0ebe22e45962f83d5145e66@dist-git>
|
||||
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||
Date: Fri, 10 Jun 2022 15:10:29 +0200
|
||||
Subject: [PATCH] conf: virtiofs: add thread_pool element
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add an element to configure the thread pool size:
|
||||
|
||||
...
|
||||
<binary>
|
||||
<thread_pool size='16'/>
|
||||
</binary>
|
||||
...
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2072905
|
||||
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 0df2e7df80452f81edbfeb0ee355235b533346a9)
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2079582
|
||||
---
|
||||
docs/formatdomain.rst | 6 ++++++
|
||||
docs/schemas/domaincommon.rng | 9 +++++++++
|
||||
src/conf/domain_conf.c | 15 +++++++++++++++
|
||||
src/conf/domain_conf.h | 1 +
|
||||
.../qemuxml2argvdata/vhost-user-fs-fd-memory.xml | 1 +
|
||||
5 files changed, 32 insertions(+)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 17e89a0c0d..e6cf2ec083 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -3316,6 +3316,7 @@ A directory on the host that can be accessed directly from the guest.
|
||||
<cache mode='always'/>
|
||||
<sandbox mode='namespace'/>
|
||||
<lock posix='on' flock='on'/>
|
||||
+ <thread_pool size='16'/>
|
||||
</binary>
|
||||
<source dir='/path'/>
|
||||
<target dir='mount_tag'/>
|
||||
@@ -3449,6 +3450,11 @@ A directory on the host that can be accessed directly from the guest.
|
||||
``chroot``, see the
|
||||
`virtiofsd documentation <https://qemu.readthedocs.io/en/latest/tools/virtiofsd.html>`__
|
||||
for more details. ( :since:`Since 7.2.0` )
|
||||
+ Element ``thread_pool`` accepts one attribute ``size`` which defines the
|
||||
+ maximum thread pool size. A value of "0" disables the pool.
|
||||
+ The thread pool helps increase the number of requests in flight when used with
|
||||
+ storage that has a higher latency. However, it has an overhead, and so for
|
||||
+ fast, low latency filesystems, it may be best to turn it off. ( :since:`Since 8.5.0` )
|
||||
``source``
|
||||
The resource on the host that is being accessed in the guest. The ``name``
|
||||
attribute must be used with ``type='template'``, and the ``dir`` attribute
|
||||
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||
index c9c1529979..79c8979410 100644
|
||||
--- a/docs/schemas/domaincommon.rng
|
||||
+++ b/docs/schemas/domaincommon.rng
|
||||
@@ -3064,6 +3064,15 @@
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
+ <optional>
|
||||
+ <element name="thread_pool">
|
||||
+ <optional>
|
||||
+ <attribute name="size">
|
||||
+ <data type="integer"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
+ </element>
|
||||
+ </optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 92510973e6..95afd9226e 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -2447,6 +2447,8 @@ virDomainFSDefNew(virDomainXMLOption *xmlopt)
|
||||
|
||||
ret->src = virStorageSourceNew();
|
||||
|
||||
+ ret->thread_pool_size = -1;
|
||||
+
|
||||
if (xmlopt &&
|
||||
xmlopt->privateData.fsNew &&
|
||||
!(ret->privateData = xmlopt->privateData.fsNew()))
|
||||
@@ -9869,6 +9871,7 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
|
||||
if (def->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) {
|
||||
g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt);
|
||||
g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt);
|
||||
+ g_autofree char *thread_pool_size = virXPathString("string(./binary/thread_pool/@size)", ctxt);
|
||||
g_autofree char *xattr = virXPathString("string(./binary/@xattr)", ctxt);
|
||||
g_autofree char *cache = virXPathString("string(./binary/cache/@mode)", ctxt);
|
||||
g_autofree char *sandbox = virXPathString("string(./binary/sandbox/@mode)", ctxt);
|
||||
@@ -9883,6 +9886,14 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
|
||||
goto error;
|
||||
}
|
||||
|
||||
+ if (thread_pool_size &&
|
||||
+ virStrToLong_i(thread_pool_size, NULL, 10, &def->thread_pool_size) < 0) {
|
||||
+ virReportError(VIR_ERR_XML_ERROR,
|
||||
+ _("cannot parse thread pool size '%s' for virtiofs"),
|
||||
+ queue_size);
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
if (binary)
|
||||
def->binary = virFileSanitizePath(binary);
|
||||
|
||||
@@ -24205,6 +24216,10 @@ virDomainFSDefFormat(virBuffer *buf,
|
||||
}
|
||||
|
||||
virXMLFormatElement(&binaryBuf, "lock", &lockAttrBuf, NULL);
|
||||
+
|
||||
+ if (def->thread_pool_size >= 0)
|
||||
+ virBufferAsprintf(&binaryBuf, "<thread_pool size='%d'/>\n", def->thread_pool_size);
|
||||
+
|
||||
}
|
||||
|
||||
virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio);
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index 10af94e2e4..d0d0fdc815 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -892,6 +892,7 @@ struct _virDomainFSDef {
|
||||
virTristateSwitch posix_lock;
|
||||
virTristateSwitch flock;
|
||||
virDomainFSSandboxMode sandbox;
|
||||
+ int thread_pool_size;
|
||||
virDomainVirtioOptions *virtio;
|
||||
virObject *privateData;
|
||||
};
|
||||
diff --git a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
|
||||
index abddf0870b..81de8c0dd7 100644
|
||||
--- a/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
|
||||
+++ b/tests/qemuxml2argvdata/vhost-user-fs-fd-memory.xml
|
||||
@@ -32,6 +32,7 @@
|
||||
<cache mode='always'/>
|
||||
<sandbox mode='chroot'/>
|
||||
<lock posix='off' flock='off'/>
|
||||
+ <thread_pool size='16'/>
|
||||
</binary>
|
||||
<source dir='/path'/>
|
||||
<target dir='mount_tag'/>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
158
SOURCES/libvirt-cpu-Introduce-virCPUUpdateFeatures.patch
Normal file
158
SOURCES/libvirt-cpu-Introduce-virCPUUpdateFeatures.patch
Normal file
@ -0,0 +1,158 @@
|
||||
From 353e7eb26cb922bd342c050273afbcc4ed4dd20e Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <353e7eb26cb922bd342c050273afbcc4ed4dd20e.1780571167.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Mon, 25 May 2026 14:22:58 +0200
|
||||
Subject: [PATCH] cpu: Introduce virCPUUpdateFeatures
|
||||
|
||||
This new API can be used to update an existing CPU definition with
|
||||
features described by CPU data.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 6be1be4938338477bff14ff24c7ed2a05bc1dadc)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu/cpu.c | 34 ++++++++++++++++++++++++++++++++++
|
||||
src/cpu/cpu.h | 12 ++++++++++++
|
||||
src/cpu/cpu_x86.c | 23 +++++++++++++++++++++++
|
||||
src/libvirt_private.syms | 1 +
|
||||
4 files changed, 70 insertions(+)
|
||||
|
||||
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
|
||||
index d81e620a1d..3e9affa1cd 100644
|
||||
--- a/src/cpu/cpu.c
|
||||
+++ b/src/cpu/cpu.c
|
||||
@@ -1359,6 +1359,40 @@ virCPUGetCanonicalModel(virArch arch,
|
||||
}
|
||||
|
||||
|
||||
+/** virCPUUpdateFeatures:
|
||||
+ *
|
||||
+ * @arch: CPU architecture
|
||||
+ * @cpu: CPU definition to update
|
||||
+ * @cpuData: CPU data describing features
|
||||
+ * @policy: to be used by the updated features
|
||||
+ *
|
||||
+ * Updates features described in @cpuData to use the specified @policy. Missing
|
||||
+ * features will be automatically added to the CPU definition.
|
||||
+ *
|
||||
+ * Returns 0 on success, -1 otherwise.
|
||||
+ */
|
||||
+int
|
||||
+virCPUUpdateFeatures(virArch arch,
|
||||
+ virCPUDef *cpu,
|
||||
+ virCPUData *cpuData,
|
||||
+ virCPUFeaturePolicy policy)
|
||||
+{
|
||||
+ struct cpuArchDriver *driver;
|
||||
+
|
||||
+ VIR_DEBUG("arch=%s, cpu=%p, model=%s, policy=%s",
|
||||
+ virArchToString(arch), cpu, NULLSTR(cpu->model),
|
||||
+ virCPUFeaturePolicyTypeToString(policy));
|
||||
+
|
||||
+ if (!(driver = cpuGetSubDriver(arch)))
|
||||
+ return -1;
|
||||
+
|
||||
+ if (!driver->updateFeatures)
|
||||
+ return 0;
|
||||
+
|
||||
+ return driver->updateFeatures(cpu, cpuData, policy);
|
||||
+}
|
||||
+
|
||||
+
|
||||
/**
|
||||
* virCPUArchIsSupported:
|
||||
*
|
||||
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
|
||||
index 36fd123675..65711ac085 100644
|
||||
--- a/src/cpu/cpu.h
|
||||
+++ b/src/cpu/cpu.h
|
||||
@@ -143,6 +143,11 @@ typedef int
|
||||
typedef const char *
|
||||
(*virCPUArchGetCanonicalModel)(const char *model);
|
||||
|
||||
+typedef int
|
||||
+(*virCPUArchUpdateFeatures)(virCPUDef *cpu,
|
||||
+ virCPUData *cpuData,
|
||||
+ virCPUFeaturePolicy policy);
|
||||
+
|
||||
struct cpuArchDriver {
|
||||
const char *name;
|
||||
const virArch *arch;
|
||||
@@ -172,6 +177,7 @@ struct cpuArchDriver {
|
||||
virCPUArchDataGetHost dataGetHost;
|
||||
virCPUArchGetCheckMode getCheckMode;
|
||||
virCPUArchGetCanonicalModel getCanonicalModel;
|
||||
+ virCPUArchUpdateFeatures updateFeatures;
|
||||
};
|
||||
|
||||
|
||||
@@ -332,6 +338,12 @@ const char *
|
||||
virCPUGetCanonicalModel(virArch arch,
|
||||
const char *model);
|
||||
|
||||
+int
|
||||
+virCPUUpdateFeatures(virArch arch,
|
||||
+ virCPUDef *cpu,
|
||||
+ virCPUData *cpuData,
|
||||
+ virCPUFeaturePolicy policy);
|
||||
+
|
||||
bool
|
||||
virCPUArchIsSupported(virArch arch);
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index e5825fbb4d..6e860de458 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -3790,6 +3790,28 @@ virCPUx86GetCanonicalModel(const char *modelName)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virCPUx86UpdateFeatures(virCPUDef *cpu,
|
||||
+ virCPUData *cpuData,
|
||||
+ virCPUFeaturePolicy policy)
|
||||
+{
|
||||
+ virCPUx86Data *data = &cpuData->data.x86;
|
||||
+ virCPUx86Map *map;
|
||||
+ size_t i;
|
||||
+
|
||||
+ if (!(map = virCPUx86GetMap()))
|
||||
+ return -1;
|
||||
+
|
||||
+ for (i = 0; i < map->nfeatures; i++) {
|
||||
+ virCPUx86Feature *feature = map->features[i];
|
||||
+ if (x86DataIsSubset(data, &feature->data))
|
||||
+ virCPUDefUpdateFeature(cpu, feature->name, policy);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
struct cpuArchDriver cpuDriverX86 = {
|
||||
.name = "x86",
|
||||
.arch = archs,
|
||||
@@ -3824,4 +3846,5 @@ struct cpuArchDriver cpuDriverX86 = {
|
||||
#endif
|
||||
.getCheckMode = virCPUx86GetCheckMode,
|
||||
.getCanonicalModel = virCPUx86GetCanonicalModel,
|
||||
+ .updateFeatures = virCPUx86UpdateFeatures,
|
||||
};
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 3eb6943440..4a0f9065fa 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -1586,6 +1586,7 @@ virCPUGetVendorForModel;
|
||||
virCPUProbeHost;
|
||||
virCPUTranslate;
|
||||
virCPUUpdate;
|
||||
+virCPUUpdateFeatures;
|
||||
virCPUUpdateLive;
|
||||
virCPUValidateFeatures;
|
||||
|
||||
--
|
||||
2.54.0
|
||||
109
SOURCES/libvirt-cpu_conf-Introduce-virCPUDefSortFeatures.patch
Normal file
109
SOURCES/libvirt-cpu_conf-Introduce-virCPUDefSortFeatures.patch
Normal file
@ -0,0 +1,109 @@
|
||||
From 6a2bd2d2e74d8c07266558c62d3fb724e677e256 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <6a2bd2d2e74d8c07266558c62d3fb724e677e256.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 29 May 2026 13:00:10 +0200
|
||||
Subject: [PATCH] cpu_conf: Introduce virCPUDefSortFeatures
|
||||
|
||||
Separate the sorting code from virCPUExpandFeatures into a standalone
|
||||
function.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 0900cc4f2dca2c17e8854330d45dffa4cc7952c4)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/conf/cpu_conf.c | 20 ++++++++++++++++++++
|
||||
src/conf/cpu_conf.h | 3 +++
|
||||
src/cpu/cpu.c | 15 +--------------
|
||||
src/libvirt_private.syms | 1 +
|
||||
4 files changed, 25 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
|
||||
index 7aeedf64f5..f5a2004ee6 100644
|
||||
--- a/src/conf/cpu_conf.c
|
||||
+++ b/src/conf/cpu_conf.c
|
||||
@@ -1277,3 +1277,23 @@ virCPUDefListFree(virCPUDef **cpus)
|
||||
|
||||
g_free(cpus);
|
||||
}
|
||||
+
|
||||
+
|
||||
+static int
|
||||
+virCPUFeatureDefCompare(const void *p1,
|
||||
+ const void *p2,
|
||||
+ void *opaque G_GNUC_UNUSED)
|
||||
+{
|
||||
+ const virCPUFeatureDef *f1 = p1;
|
||||
+ const virCPUFeatureDef *f2 = p2;
|
||||
+
|
||||
+ return strcmp(f1->name, f2->name);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void
|
||||
+virCPUDefSortFeatures(virCPUDef *cpu)
|
||||
+{
|
||||
+ g_qsort_with_data(cpu->features, cpu->nfeatures, sizeof(*cpu->features),
|
||||
+ virCPUFeatureDefCompare, NULL);
|
||||
+}
|
||||
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
|
||||
index cfb8f1a461..0cac1a1489 100644
|
||||
--- a/src/conf/cpu_conf.h
|
||||
+++ b/src/conf/cpu_conf.h
|
||||
@@ -280,3 +280,6 @@ virCPUDefListParse(const char **xmlCPUs,
|
||||
virCPUType cpuType);
|
||||
void
|
||||
virCPUDefListFree(virCPUDef **cpus);
|
||||
+
|
||||
+void
|
||||
+virCPUDefSortFeatures(virCPUDef *cpu);
|
||||
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
|
||||
index 233686485d..d81e620a1d 100644
|
||||
--- a/src/cpu/cpu.c
|
||||
+++ b/src/cpu/cpu.c
|
||||
@@ -1125,18 +1125,6 @@ virCPUConvertLegacy(virArch arch,
|
||||
}
|
||||
|
||||
|
||||
-static int
|
||||
-virCPUFeatureCompare(const void *p1,
|
||||
- const void *p2,
|
||||
- void *opaque G_GNUC_UNUSED)
|
||||
-{
|
||||
- const virCPUFeatureDef *f1 = p1;
|
||||
- const virCPUFeatureDef *f2 = p2;
|
||||
-
|
||||
- return strcmp(f1->name, f2->name);
|
||||
-}
|
||||
-
|
||||
-
|
||||
/**
|
||||
* virCPUExpandFeatures:
|
||||
*
|
||||
@@ -1168,8 +1156,7 @@ virCPUExpandFeatures(virArch arch,
|
||||
driver->expandFeatures(cpu) < 0)
|
||||
return -1;
|
||||
|
||||
- g_qsort_with_data(cpu->features, cpu->nfeatures, sizeof(*cpu->features),
|
||||
- virCPUFeatureCompare, NULL);
|
||||
+ virCPUDefSortFeatures(cpu);
|
||||
|
||||
VIR_DEBUG("nfeatures=%zu", cpu->nfeatures);
|
||||
return 0;
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index d2563e587a..1733286bad 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -118,6 +118,7 @@ virCPUDefNew;
|
||||
virCPUDefParseXML;
|
||||
virCPUDefParseXMLString;
|
||||
virCPUDefRef;
|
||||
+virCPUDefSortFeatures;
|
||||
virCPUDefStealModel;
|
||||
virCPUDefUpdateFeature;
|
||||
virCPUMaxPhysAddrModeTypeFromString;
|
||||
--
|
||||
2.54.0
|
||||
@ -1,60 +0,0 @@
|
||||
From 46f4cfe513f0f893c862dca7f02ed7d7932b2115 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <46f4cfe513f0f893c862dca7f02ed7d7932b2115@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 26 Apr 2022 12:50:41 +0200
|
||||
Subject: [PATCH] cpu_map: Disable cpu64-rhel* for host-model and baseline
|
||||
|
||||
These ancient RHEL-only CPU models should not really be used by any CPU
|
||||
definition created by libvirt. We keep them just for backwards
|
||||
compatibility with domains which might still be using them.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit d2e4d66be35cd04da72e5f5129a8a4da6a931505)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu_map/x86_cpu64-rhel5.xml | 2 +-
|
||||
src/cpu_map/x86_cpu64-rhel6.xml | 2 +-
|
||||
tests/cputestdata/x86_64-baseline-no-vendor-result.xml | 3 ++-
|
||||
3 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/cpu_map/x86_cpu64-rhel5.xml b/src/cpu_map/x86_cpu64-rhel5.xml
|
||||
index be6bcdb7a6..7402b7603c 100644
|
||||
--- a/src/cpu_map/x86_cpu64-rhel5.xml
|
||||
+++ b/src/cpu_map/x86_cpu64-rhel5.xml
|
||||
@@ -1,6 +1,6 @@
|
||||
<cpus>
|
||||
<model name='cpu64-rhel5'>
|
||||
- <decode host='on' guest='on'/>
|
||||
+ <decode host='off' guest='off'/>
|
||||
<feature name='apic'/>
|
||||
<feature name='clflush'/>
|
||||
<feature name='cmov'/>
|
||||
diff --git a/src/cpu_map/x86_cpu64-rhel6.xml b/src/cpu_map/x86_cpu64-rhel6.xml
|
||||
index c62b1b5575..061939c733 100644
|
||||
--- a/src/cpu_map/x86_cpu64-rhel6.xml
|
||||
+++ b/src/cpu_map/x86_cpu64-rhel6.xml
|
||||
@@ -1,6 +1,6 @@
|
||||
<cpus>
|
||||
<model name='cpu64-rhel6'>
|
||||
- <decode host='on' guest='on'/>
|
||||
+ <decode host='off' guest='off'/>
|
||||
<feature name='apic'/>
|
||||
<feature name='clflush'/>
|
||||
<feature name='cmov'/>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-no-vendor-result.xml b/tests/cputestdata/x86_64-baseline-no-vendor-result.xml
|
||||
index 00e03b2152..4b4921cf93 100644
|
||||
--- a/tests/cputestdata/x86_64-baseline-no-vendor-result.xml
|
||||
+++ b/tests/cputestdata/x86_64-baseline-no-vendor-result.xml
|
||||
@@ -1,3 +1,4 @@
|
||||
<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>cpu64-rhel6</model>
|
||||
+ <model fallback='allow'>kvm64</model>
|
||||
+ <feature policy='require' name='lahf_lm'/>
|
||||
</cpu>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,75 +0,0 @@
|
||||
From 99a298a4a0575bf0072f504c4b8e4551400c44c0 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <99a298a4a0575bf0072f504c4b8e4551400c44c0@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 26 Apr 2022 11:58:07 +0200
|
||||
Subject: [PATCH] cpu_x86: Consolidate signature match in x86DecodeUseCandidate
|
||||
|
||||
Checking the signature in two different places makes no sense since the
|
||||
code in between can only mark the candidate as the best option so far,
|
||||
which is what the second signature match does as well.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 35ce086667e68e8f546cf36473591dd7c19c72eb)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu/cpu_x86.c | 31 ++++++++++++++-----------------
|
||||
1 file changed, 14 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index 5cb9caef8a..f007487824 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -2020,15 +2020,22 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
}
|
||||
|
||||
/* Ideally we want to select a model with family/model equal to
|
||||
- * family/model of the real CPU. Once we found such model, we only
|
||||
+ * family/model of the real CPU and once we found such model, we only
|
||||
* consider candidates with matching family/model.
|
||||
*/
|
||||
- if (signature &&
|
||||
- virCPUx86SignaturesMatch(current->signatures, signature) &&
|
||||
- !virCPUx86SignaturesMatch(candidate->signatures, signature)) {
|
||||
- VIR_DEBUG("%s differs in signature from matching %s",
|
||||
- cpuCandidate->model, cpuCurrent->model);
|
||||
- return 0;
|
||||
+ if (signature) {
|
||||
+ if (virCPUx86SignaturesMatch(current->signatures, signature) &&
|
||||
+ !virCPUx86SignaturesMatch(candidate->signatures, signature)) {
|
||||
+ VIR_DEBUG("%s differs in signature from matching %s",
|
||||
+ cpuCandidate->model, cpuCurrent->model);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!virCPUx86SignaturesMatch(current->signatures, signature) &&
|
||||
+ virCPUx86SignaturesMatch(candidate->signatures, signature)) {
|
||||
+ VIR_DEBUG("%s provides matching signature", cpuCandidate->model);
|
||||
+ return 1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (cpuCurrent->nfeatures > cpuCandidate->nfeatures) {
|
||||
@@ -2037,16 +2044,6 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
return 1;
|
||||
}
|
||||
|
||||
- /* Prefer a candidate with matching signature even though it would
|
||||
- * result in longer list of features.
|
||||
- */
|
||||
- if (signature &&
|
||||
- virCPUx86SignaturesMatch(candidate->signatures, signature) &&
|
||||
- !virCPUx86SignaturesMatch(current->signatures, signature)) {
|
||||
- VIR_DEBUG("%s provides matching signature", cpuCandidate->model);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
VIR_DEBUG("%s does not result in shorter feature list than %s",
|
||||
cpuCandidate->model, cpuCurrent->model);
|
||||
return 0;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,272 +0,0 @@
|
||||
From 752c74eeae67d41e7550991cb3bbe289984ec9d3 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <752c74eeae67d41e7550991cb3bbe289984ec9d3@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 29 Apr 2022 10:35:02 +0200
|
||||
Subject: [PATCH] cpu_x86: Ignore enabled features for input models in
|
||||
x86DecodeUseCandidate
|
||||
|
||||
While we don't want to aim for the shortest list of disabled features in
|
||||
the baseline result (it would select a very old model), we want to do so
|
||||
while looking at any of the input models for which we're trying to
|
||||
compute a baseline CPU model. Given a set of input models, we always
|
||||
want to take the least capable one of them (i.e., the one with shortest
|
||||
list of disabled features) or a better model which is not one of the
|
||||
input models.
|
||||
|
||||
So when considering an input model, we just check whether its list of
|
||||
disabled features is shorter than the currently best one. When looking
|
||||
at other models we check both enabled and disabled features while
|
||||
penalizing disabled features as implemented by the previous patch.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit bb6cedd2082599323257ee0df18c93a6e0551b0b)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu/cpu_x86.c | 66 ++++++++++++-------
|
||||
...4-baseline-Westmere+Nehalem-migratable.xml | 8 ++-
|
||||
...86_64-baseline-Westmere+Nehalem-result.xml | 8 ++-
|
||||
...-cpuid-baseline-Cooperlake+Cascadelake.xml | 13 ++--
|
||||
4 files changed, 64 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index ebcd96edb1..7b59dad8bf 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -1975,7 +1975,8 @@ virCPUx86Compare(virCPUDef *host,
|
||||
|
||||
static int
|
||||
virCPUx86CompareCandidateFeatureList(virCPUDef *cpuCurrent,
|
||||
- virCPUDef *cpuCandidate)
|
||||
+ virCPUDef *cpuCandidate,
|
||||
+ bool isPreferred)
|
||||
{
|
||||
size_t current = cpuCurrent->nfeatures;
|
||||
size_t enabledCurrent = current;
|
||||
@@ -2017,6 +2018,14 @@ virCPUx86CompareCandidateFeatureList(virCPUDef *cpuCurrent,
|
||||
return 1;
|
||||
}
|
||||
|
||||
+ if (isPreferred && disabled < disabledCurrent) {
|
||||
+ VIR_DEBUG("%s is in the list of preferred models and provides fewer "
|
||||
+ "disabled features than %s: %zu < %zu",
|
||||
+ cpuCandidate->model, cpuCurrent->model,
|
||||
+ disabled, disabledCurrent);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
VIR_DEBUG("%s is not better than %s: %zu (%zu, %zu) >= %zu (%zu, %zu)",
|
||||
cpuCandidate->model, cpuCurrent->model,
|
||||
candidate, enabled, disabled,
|
||||
@@ -2039,8 +2048,10 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
virCPUx86Model *candidate,
|
||||
virCPUDef *cpuCandidate,
|
||||
uint32_t signature,
|
||||
- const char *preferred)
|
||||
+ const char **preferred)
|
||||
{
|
||||
+ bool isPreferred = false;
|
||||
+
|
||||
if (cpuCandidate->type == VIR_CPU_TYPE_HOST &&
|
||||
!candidate->decodeHost) {
|
||||
VIR_DEBUG("%s is not supposed to be used for host CPU definition",
|
||||
@@ -2064,9 +2075,13 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
}
|
||||
}
|
||||
|
||||
- if (preferred && STREQ(cpuCandidate->model, preferred)) {
|
||||
- VIR_DEBUG("%s is the preferred model", cpuCandidate->model);
|
||||
- return 2;
|
||||
+ if (preferred) {
|
||||
+ isPreferred = g_strv_contains(preferred, cpuCandidate->model);
|
||||
+
|
||||
+ if (isPreferred && !preferred[1]) {
|
||||
+ VIR_DEBUG("%s is the preferred model", cpuCandidate->model);
|
||||
+ return 2;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!cpuCurrent) {
|
||||
@@ -2093,7 +2108,8 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
}
|
||||
}
|
||||
|
||||
- return virCPUx86CompareCandidateFeatureList(cpuCurrent, cpuCandidate);
|
||||
+ return virCPUx86CompareCandidateFeatureList(cpuCurrent, cpuCandidate,
|
||||
+ isPreferred);
|
||||
}
|
||||
|
||||
|
||||
@@ -2136,7 +2152,7 @@ static int
|
||||
x86Decode(virCPUDef *cpu,
|
||||
const virCPUx86Data *cpuData,
|
||||
virDomainCapsCPUModels *models,
|
||||
- const char *preferred,
|
||||
+ const char **preferred,
|
||||
bool migratable)
|
||||
{
|
||||
virCPUx86Map *map;
|
||||
@@ -2169,6 +2185,9 @@ x86Decode(virCPUDef *cpu,
|
||||
|
||||
x86DataFilterTSX(&data, vendor, map);
|
||||
|
||||
+ if (preferred && !preferred[0])
|
||||
+ preferred = NULL;
|
||||
+
|
||||
/* Walk through the CPU models in reverse order to check newest
|
||||
* models first.
|
||||
*/
|
||||
@@ -2176,16 +2195,18 @@ x86Decode(virCPUDef *cpu,
|
||||
candidate = map->models[i];
|
||||
if (models &&
|
||||
!(hvModel = virDomainCapsCPUModelsGet(models, candidate->name))) {
|
||||
- if (preferred && STREQ(candidate->name, preferred)) {
|
||||
+ if (preferred &&
|
||||
+ !preferred[1] &&
|
||||
+ STREQ(candidate->name, preferred[0])) {
|
||||
if (cpu->fallback != VIR_CPU_FALLBACK_ALLOW) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("CPU model %s is not supported by hypervisor"),
|
||||
- preferred);
|
||||
+ preferred[0]);
|
||||
return -1;
|
||||
} else {
|
||||
VIR_WARN("Preferred CPU model %s not allowed by"
|
||||
" hypervisor; closest supported model will be"
|
||||
- " used", preferred);
|
||||
+ " used", preferred[0]);
|
||||
}
|
||||
} else {
|
||||
VIR_DEBUG("CPU model %s not allowed by hypervisor; ignoring",
|
||||
@@ -2793,8 +2814,8 @@ virCPUx86Baseline(virCPUDef **cpus,
|
||||
size_t i;
|
||||
virCPUx86Vendor *vendor = NULL;
|
||||
bool outputVendor = true;
|
||||
- const char *modelName;
|
||||
- bool matchingNames = true;
|
||||
+ g_autofree char **modelNames = NULL;
|
||||
+ size_t namesLen = 0;
|
||||
g_autoptr(virCPUData) featData = NULL;
|
||||
|
||||
if (!(map = virCPUx86GetMap()))
|
||||
@@ -2816,19 +2837,17 @@ virCPUx86Baseline(virCPUDef **cpus,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- modelName = cpus[0]->model;
|
||||
+ modelNames = g_new0(char *, ncpus + 1);
|
||||
+ if (cpus[0]->model)
|
||||
+ modelNames[namesLen++] = cpus[0]->model;
|
||||
+
|
||||
for (i = 1; i < ncpus; i++) {
|
||||
g_autoptr(virCPUx86Model) model = NULL;
|
||||
const char *vn = NULL;
|
||||
|
||||
- if (matchingNames && cpus[i]->model) {
|
||||
- if (!modelName) {
|
||||
- modelName = cpus[i]->model;
|
||||
- } else if (STRNEQ(modelName, cpus[i]->model)) {
|
||||
- modelName = NULL;
|
||||
- matchingNames = false;
|
||||
- }
|
||||
- }
|
||||
+ if (cpus[i]->model &&
|
||||
+ !g_strv_contains((const char **) modelNames, cpus[i]->model))
|
||||
+ modelNames[namesLen++] = cpus[i]->model;
|
||||
|
||||
if (!(model = x86ModelFromCPU(cpus[i], map, -1)))
|
||||
return NULL;
|
||||
@@ -2891,10 +2910,11 @@ virCPUx86Baseline(virCPUDef **cpus,
|
||||
virCPUx86DataAddItem(&base_model->data, &vendor->data) < 0)
|
||||
return NULL;
|
||||
|
||||
- if (x86Decode(cpu, &base_model->data, models, modelName, migratable) < 0)
|
||||
+ if (x86Decode(cpu, &base_model->data, models,
|
||||
+ (const char **) modelNames, migratable) < 0)
|
||||
return NULL;
|
||||
|
||||
- if (STREQ_NULLABLE(cpu->model, modelName))
|
||||
+ if (namesLen == 1 && STREQ(cpu->model, modelNames[0]))
|
||||
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
|
||||
|
||||
if (!outputVendor)
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml
|
||||
index 775a27de2e..f5846b1619 100644
|
||||
--- a/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml
|
||||
+++ b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml
|
||||
@@ -1,10 +1,14 @@
|
||||
<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>SandyBridge</model>
|
||||
+ <model fallback='allow'>Westmere</model>
|
||||
<vendor>Intel</vendor>
|
||||
<feature policy='require' name='vme'/>
|
||||
<feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='pclmuldq'/>
|
||||
<feature policy='require' name='pcid'/>
|
||||
+ <feature policy='require' name='x2apic'/>
|
||||
+ <feature policy='require' name='tsc-deadline'/>
|
||||
+ <feature policy='require' name='xsave'/>
|
||||
<feature policy='require' name='osxsave'/>
|
||||
+ <feature policy='require' name='avx'/>
|
||||
<feature policy='require' name='hypervisor'/>
|
||||
- <feature policy='disable' name='rdtscp'/>
|
||||
</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml
|
||||
index cafca97d62..166833276c 100644
|
||||
--- a/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml
|
||||
+++ b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml
|
||||
@@ -1,11 +1,15 @@
|
||||
<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>SandyBridge</model>
|
||||
+ <model fallback='allow'>Westmere</model>
|
||||
<vendor>Intel</vendor>
|
||||
<feature policy='require' name='vme'/>
|
||||
<feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='pclmuldq'/>
|
||||
<feature policy='require' name='pcid'/>
|
||||
+ <feature policy='require' name='x2apic'/>
|
||||
+ <feature policy='require' name='tsc-deadline'/>
|
||||
+ <feature policy='require' name='xsave'/>
|
||||
<feature policy='require' name='osxsave'/>
|
||||
+ <feature policy='require' name='avx'/>
|
||||
<feature policy='require' name='hypervisor'/>
|
||||
<feature policy='require' name='invtsc'/>
|
||||
- <feature policy='disable' name='rdtscp'/>
|
||||
</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
index 46c32c996f..ecac749b97 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
@@ -1,17 +1,22 @@
|
||||
<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>Cooperlake</model>
|
||||
+ <model fallback='allow'>Cascadelake-Server</model>
|
||||
<vendor>Intel</vendor>
|
||||
<feature policy='require' name='ss'/>
|
||||
<feature policy='require' name='vmx'/>
|
||||
<feature policy='require' name='hypervisor'/>
|
||||
<feature policy='require' name='tsc_adjust'/>
|
||||
- <feature policy='require' name='mpx'/>
|
||||
<feature policy='require' name='umip'/>
|
||||
+ <feature policy='require' name='pku'/>
|
||||
<feature policy='require' name='md-clear'/>
|
||||
+ <feature policy='require' name='stibp'/>
|
||||
+ <feature policy='require' name='arch-capabilities'/>
|
||||
<feature policy='require' name='xsaves'/>
|
||||
<feature policy='require' name='ibpb'/>
|
||||
<feature policy='require' name='amd-ssbd'/>
|
||||
+ <feature policy='require' name='rdctl-no'/>
|
||||
+ <feature policy='require' name='ibrs-all'/>
|
||||
+ <feature policy='require' name='skip-l1dfl-vmentry'/>
|
||||
+ <feature policy='require' name='mds-no'/>
|
||||
+ <feature policy='require' name='pschange-mc-no'/>
|
||||
<feature policy='require' name='tsx-ctrl'/>
|
||||
- <feature policy='disable' name='avx512-bf16'/>
|
||||
- <feature policy='disable' name='taa-no'/>
|
||||
</cpu>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
109
SOURCES/libvirt-cpu_x86-Introduce-virCPUx86DataAddMSR.patch
Normal file
109
SOURCES/libvirt-cpu_x86-Introduce-virCPUx86DataAddMSR.patch
Normal file
@ -0,0 +1,109 @@
|
||||
From d34cc77ac31f6df5195dad6b53d5aed00bda7dd7 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <d34cc77ac31f6df5195dad6b53d5aed00bda7dd7.1780571167.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Mon, 25 May 2026 13:17:47 +0200
|
||||
Subject: [PATCH] cpu_x86: Introduce virCPUx86DataAddMSR
|
||||
|
||||
This just makes the relevant part of virCPUx86GetHost reusable in other
|
||||
places.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit a8952076d8e5062a2fac08e11597ad47871c2236)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu/cpu_x86.c | 40 ++++++++++++++++++++++++++++------------
|
||||
src/cpu/cpu_x86.h | 4 ++++
|
||||
src/libvirt_private.syms | 1 +
|
||||
3 files changed, 33 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index 0f7eb8f48b..e5825fbb4d 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -2912,18 +2912,8 @@ virCPUx86GetHost(virCPUDef *cpu,
|
||||
/* This is best effort since there might be no way to read the MSR
|
||||
* when we are not running as root. */
|
||||
for (i = 0; i < nmsrs; i++) {
|
||||
- if (virHostCPUGetMSR(msrs[i], &msr) == 0) {
|
||||
- virCPUx86DataItem item = {
|
||||
- .type = VIR_CPU_X86_DATA_MSR,
|
||||
- .data.msr = {
|
||||
- .index = msrs[i],
|
||||
- .eax = msr & 0xffffffff,
|
||||
- .edx = msr >> 32,
|
||||
- },
|
||||
- };
|
||||
-
|
||||
- virCPUx86DataAdd(cpuData, &item);
|
||||
- }
|
||||
+ if (virHostCPUGetMSR(msrs[i], &msr) == 0)
|
||||
+ virCPUx86DataAddMSR(cpuData, msrs[i], msr);
|
||||
}
|
||||
|
||||
ret = x86DecodeCPUData(cpu, cpuData, models);
|
||||
@@ -3461,6 +3451,32 @@ virCPUx86DataAdd(virCPUData *cpuData,
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * virCPUx86DataAddMSR:
|
||||
+ * @cpuData: CPU data to update
|
||||
+ * @index: MSR index
|
||||
+ * @value: content of the @index MSR
|
||||
+ *
|
||||
+ * Adds the specified MSR content to CPU data.
|
||||
+ */
|
||||
+void
|
||||
+virCPUx86DataAddMSR(virCPUData *cpuData,
|
||||
+ uint32_t index,
|
||||
+ uint64_t value)
|
||||
+{
|
||||
+ virCPUx86DataItem item = {
|
||||
+ .type = VIR_CPU_X86_DATA_MSR,
|
||||
+ .data.msr = {
|
||||
+ .index = index,
|
||||
+ .eax = value & 0xffffffff,
|
||||
+ .edx = value >> 32,
|
||||
+ },
|
||||
+ };
|
||||
+
|
||||
+ virCPUx86DataAdd(cpuData, &item);
|
||||
+}
|
||||
+
|
||||
+
|
||||
void
|
||||
virCPUx86DataSetSignature(virCPUData *cpuData,
|
||||
unsigned int family,
|
||||
diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h
|
||||
index 2cd965fea4..bbc2a16447 100644
|
||||
--- a/src/cpu/cpu_x86.h
|
||||
+++ b/src/cpu/cpu_x86.h
|
||||
@@ -28,6 +28,10 @@ extern struct cpuArchDriver cpuDriverX86;
|
||||
void virCPUx86DataAdd(virCPUData *cpuData,
|
||||
const virCPUx86DataItem *cpuid);
|
||||
|
||||
+void virCPUx86DataAddMSR(virCPUData *cpuData,
|
||||
+ uint32_t index,
|
||||
+ uint64_t value);
|
||||
+
|
||||
void virCPUx86DataSetSignature(virCPUData *cpuData,
|
||||
unsigned int family,
|
||||
unsigned int model,
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 3eca15f066..3eb6943440 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -1592,6 +1592,7 @@ virCPUValidateFeatures;
|
||||
|
||||
# cpu/cpu_x86.h
|
||||
virCPUx86DataAdd;
|
||||
+virCPUx86DataAddMSR;
|
||||
virCPUx86DataGetSignature;
|
||||
virCPUx86DataSetSignature;
|
||||
virCPUx86DataSetVendor;
|
||||
--
|
||||
2.54.0
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,73 +0,0 @@
|
||||
From 3d7a4041d31e403dc9e762b34f7faf36f7f20a28 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <3d7a4041d31e403dc9e762b34f7faf36f7f20a28@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 26 Apr 2022 15:02:51 +0200
|
||||
Subject: [PATCH] cpu_x86: Refactor feature list comparison in
|
||||
x86DecodeUseCandidate
|
||||
|
||||
It will become more complicated and so it deserves to be separated into
|
||||
a new function.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 1d6ca40ac23c039abc4392b668f256d0eda33280)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/cpu/cpu_x86.c | 31 ++++++++++++++++++++++---------
|
||||
1 file changed, 22 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index f007487824..81c2441b8b 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -1970,6 +1970,27 @@ virCPUx86Compare(virCPUDef *host,
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virCPUx86CompareCandidateFeatureList(virCPUDef *cpuCurrent,
|
||||
+ virCPUDef *cpuCandidate)
|
||||
+{
|
||||
+ size_t current = cpuCurrent->nfeatures;
|
||||
+ size_t candidate = cpuCandidate->nfeatures;
|
||||
+
|
||||
+ if (candidate < current) {
|
||||
+ VIR_DEBUG("%s is better than %s: %zu < %zu",
|
||||
+ cpuCandidate->model, cpuCurrent->model,
|
||||
+ candidate, current);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ VIR_DEBUG("%s is not better than %s: %zu >= %zu",
|
||||
+ cpuCandidate->model, cpuCurrent->model,
|
||||
+ candidate, current);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/*
|
||||
* Checks whether a candidate model is a better fit for the CPU data than the
|
||||
* current model.
|
||||
@@ -2038,15 +2059,7 @@ x86DecodeUseCandidate(virCPUx86Model *current,
|
||||
}
|
||||
}
|
||||
|
||||
- if (cpuCurrent->nfeatures > cpuCandidate->nfeatures) {
|
||||
- VIR_DEBUG("%s results in shorter feature list than %s",
|
||||
- cpuCandidate->model, cpuCurrent->model);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- VIR_DEBUG("%s does not result in shorter feature list than %s",
|
||||
- cpuCandidate->model, cpuCurrent->model);
|
||||
- return 0;
|
||||
+ return virCPUx86CompareCandidateFeatureList(cpuCurrent, cpuCandidate);
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,498 +0,0 @@
|
||||
From b37a398da4323407de24d19afac937eac80170cc Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b37a398da4323407de24d19afac937eac80170cc@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Thu, 21 Apr 2022 18:25:15 +0200
|
||||
Subject: [PATCH] cputest: Add some real world baseline tests
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 63d633b9a4fc42da7e2acaf45501914607d968a5)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
tests/cputest.c | 118 +++++++++++++++---
|
||||
...id-baseline-Broadwell-IBRS+Cascadelake.xml | 11 ++
|
||||
..._64-cpuid-baseline-Cascadelake+Icelake.xml | 14 +++
|
||||
...puid-baseline-Cascadelake+Skylake-IBRS.xml | 12 ++
|
||||
..._64-cpuid-baseline-Cascadelake+Skylake.xml | 8 ++
|
||||
...-cpuid-baseline-Cooperlake+Cascadelake.xml | 17 +++
|
||||
...6_64-cpuid-baseline-Cooperlake+Icelake.xml | 14 +++
|
||||
.../x86_64-cpuid-baseline-EPYC+Rome.xml | 13 ++
|
||||
.../x86_64-cpuid-baseline-Haswell+Skylake.xml | 14 +++
|
||||
...-baseline-Haswell-noTSX-IBRS+Broadwell.xml | 14 +++
|
||||
...seline-Haswell-noTSX-IBRS+Skylake-IBRS.xml | 14 +++
|
||||
...id-baseline-Haswell-noTSX-IBRS+Skylake.xml | 14 +++
|
||||
.../x86_64-cpuid-baseline-Ryzen+Rome.xml | 13 ++
|
||||
...4-cpuid-baseline-Skylake-Client+Server.xml | 9 ++
|
||||
14 files changed, 271 insertions(+), 14 deletions(-)
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
|
||||
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index b939e20718..b39ec7e18b 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -58,6 +58,8 @@ struct data {
|
||||
const char *name;
|
||||
virDomainCapsCPUModels *models;
|
||||
const char *modelsName;
|
||||
+ const char **cpus;
|
||||
+ int ncpus;
|
||||
unsigned int flags;
|
||||
int result;
|
||||
};
|
||||
@@ -561,6 +563,60 @@ cpuTestCPUID(bool guest, const void *arg)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+cpuTestCPUIDBaseline(const void *arg)
|
||||
+{
|
||||
+ const struct data *data = arg;
|
||||
+ int ret = -1;
|
||||
+ virCPUDef **cpus = NULL;
|
||||
+ virCPUDef *baseline = NULL;
|
||||
+ g_autofree char *result = NULL;
|
||||
+ size_t i;
|
||||
+
|
||||
+ cpus = g_new0(virCPUDef *, data->ncpus);
|
||||
+ for (i = 0; i < data->ncpus; i++) {
|
||||
+ g_autofree char *name = NULL;
|
||||
+
|
||||
+ name = g_strdup_printf("cpuid-%s-json", data->cpus[i]);
|
||||
+ if (!(cpus[i] = cpuTestLoadXML(data->arch, name)))
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
+ baseline = virCPUBaseline(data->arch, cpus, data->ncpus, NULL, NULL, false);
|
||||
+ if (!baseline)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ result = g_strdup_printf("cpuid-baseline-%s", data->name);
|
||||
+
|
||||
+ if (cpuTestCompareXML(data->arch, baseline, result) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ for (i = 0; i < data->ncpus; i++) {
|
||||
+ virCPUCompareResult cmp;
|
||||
+
|
||||
+ cmp = virCPUCompare(data->arch, cpus[i], baseline, false);
|
||||
+ if (cmp != VIR_CPU_COMPARE_SUPERSET &&
|
||||
+ cmp != VIR_CPU_COMPARE_IDENTICAL) {
|
||||
+ VIR_TEST_VERBOSE("\nbaseline CPU is incompatible with CPU %zu", i);
|
||||
+ VIR_TEST_VERBOSE("%74s", "... ");
|
||||
+ ret = -1;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ret = 0;
|
||||
+
|
||||
+ cleanup:
|
||||
+ if (cpus) {
|
||||
+ for (i = 0; i < data->ncpus; i++)
|
||||
+ virCPUDefFree(cpus[i]);
|
||||
+ VIR_FREE(cpus);
|
||||
+ }
|
||||
+ virCPUDefFree(baseline);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
cpuTestHostCPUID(const void *arg)
|
||||
{
|
||||
@@ -888,13 +944,13 @@ mymain(void)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
-#define DO_TEST(arch, api, name, host, cpu, \
|
||||
+#define DO_TEST(arch, api, name, host, cpu, cpus, ncpus, \
|
||||
models, flags, result) \
|
||||
do { \
|
||||
struct data data = { \
|
||||
arch, host, cpu, models, \
|
||||
models == NULL ? NULL : #models, \
|
||||
- flags, result \
|
||||
+ cpus, ncpus, flags, result \
|
||||
}; \
|
||||
g_autofree char *testLabel = NULL; \
|
||||
\
|
||||
@@ -907,12 +963,12 @@ mymain(void)
|
||||
#define DO_TEST_COMPARE(arch, host, cpu, result) \
|
||||
DO_TEST(arch, cpuTestCompare, \
|
||||
host "/" cpu " (" #result ")", \
|
||||
- host, cpu, NULL, 0, result)
|
||||
+ host, cpu, NULL, 0, NULL, 0, result)
|
||||
|
||||
#define DO_TEST_UPDATE_ONLY(arch, host, cpu) \
|
||||
DO_TEST(arch, cpuTestUpdate, \
|
||||
cpu " on " host, \
|
||||
- host, cpu, NULL, 0, 0)
|
||||
+ host, cpu, NULL, 0, NULL, 0, 0)
|
||||
|
||||
#define DO_TEST_UPDATE(arch, host, cpu, result) \
|
||||
do { \
|
||||
@@ -930,31 +986,31 @@ mymain(void)
|
||||
suffix = " (migratable)"; \
|
||||
label = g_strdup_printf("%s%s", name, suffix); \
|
||||
DO_TEST(arch, cpuTestBaseline, label, NULL, \
|
||||
- "baseline-" name, NULL, flags, result); \
|
||||
+ "baseline-" name, NULL, 0, NULL, flags, result); \
|
||||
} while (0)
|
||||
|
||||
#define DO_TEST_HASFEATURE(arch, host, feature, result) \
|
||||
DO_TEST(arch, cpuTestHasFeature, \
|
||||
host "/" feature " (" #result ")", \
|
||||
- host, feature, NULL, 0, result)
|
||||
+ host, feature, NULL, 0, NULL, 0, result)
|
||||
|
||||
#define DO_TEST_GUESTCPU(arch, host, cpu, models, result) \
|
||||
DO_TEST(arch, cpuTestGuestCPU, \
|
||||
host "/" cpu " (" #models ")", \
|
||||
- host, cpu, models, 0, result)
|
||||
+ host, cpu, NULL, 0, models, 0, result)
|
||||
|
||||
#if WITH_QEMU
|
||||
# define DO_TEST_JSON(arch, host, json) \
|
||||
do { \
|
||||
if (json == JSON_MODELS) { \
|
||||
DO_TEST(arch, cpuTestGuestCPUID, host, host, \
|
||||
- NULL, NULL, 0, 0); \
|
||||
+ NULL, NULL, 0, NULL, 0, 0); \
|
||||
} \
|
||||
if (json != JSON_NONE) { \
|
||||
DO_TEST(arch, cpuTestJSONCPUID, host, host, \
|
||||
- NULL, NULL, json, 0); \
|
||||
+ NULL, NULL, 0, NULL, json, 0); \
|
||||
DO_TEST(arch, cpuTestJSONSignature, host, host, \
|
||||
- NULL, NULL, 0, 0); \
|
||||
+ NULL, NULL, 0, NULL, 0, 0); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
@@ -964,18 +1020,26 @@ mymain(void)
|
||||
#define DO_TEST_CPUID(arch, host, json) \
|
||||
do { \
|
||||
DO_TEST(arch, cpuTestHostCPUID, host, host, \
|
||||
- NULL, NULL, 0, 0); \
|
||||
+ NULL, NULL, 0, NULL, 0, 0); \
|
||||
DO_TEST(arch, cpuTestGuestCPUID, host, host, \
|
||||
- NULL, NULL, json, 0); \
|
||||
+ NULL, NULL, 0, NULL, json, 0); \
|
||||
DO_TEST(arch, cpuTestCPUIDSignature, host, host, \
|
||||
- NULL, NULL, 0, 0); \
|
||||
+ NULL, NULL, 0, NULL, 0, 0); \
|
||||
DO_TEST_JSON(arch, host, json); \
|
||||
if (json != JSON_NONE) { \
|
||||
DO_TEST(arch, cpuTestUpdateLive, host, host, \
|
||||
- NULL, NULL, json, 0); \
|
||||
+ NULL, NULL, 0, NULL, json, 0); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
+#define DO_TEST_CPUID_BASELINE(arch, label, cpu1, cpu2) \
|
||||
+ do { \
|
||||
+ const char *cpus[] = {cpu1, cpu2}; \
|
||||
+ DO_TEST(arch, cpuTestCPUIDBaseline, \
|
||||
+ label " (" cpu1 ", " cpu2 ")", \
|
||||
+ NULL, label, cpus, 2, NULL, 0, 0); \
|
||||
+ } while (0)
|
||||
+
|
||||
/* host to host comparison */
|
||||
DO_TEST_COMPARE(VIR_ARCH_X86_64, "host", "host", VIR_CPU_COMPARE_IDENTICAL);
|
||||
DO_TEST_COMPARE(VIR_ARCH_X86_64, "host", "host-better", VIR_CPU_COMPARE_INCOMPATIBLE);
|
||||
@@ -1157,6 +1221,32 @@ mymain(void)
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Ice-Lake-Server", JSON_MODELS);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Cooperlake", JSON_MODELS);
|
||||
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Ryzen+Rome",
|
||||
+ "Ryzen-7-1800X-Eight-Core", "Ryzen-9-3900X-12-Core");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "EPYC+Rome",
|
||||
+ "EPYC-7601-32-Core", "EPYC-7502-32-Core");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Skylake",
|
||||
+ "Xeon-E5-2609-v3", "Xeon-Gold-6148");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Skylake-IBRS",
|
||||
+ "Xeon-E5-2609-v3", "Xeon-Gold-6130");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Broadwell-IBRS+Cascadelake",
|
||||
+ "Xeon-E5-2623-v4", "Xeon-Platinum-8268");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Skylake-IBRS",
|
||||
+ "Xeon-Platinum-8268", "Xeon-Gold-6130");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Skylake",
|
||||
+ "Xeon-Platinum-9242", "Xeon-Gold-6148");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Icelake",
|
||||
+ "Xeon-Platinum-9242", "Ice-Lake-Server");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cooperlake+Icelake",
|
||||
+ "Cooperlake", "Ice-Lake-Server");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cooperlake+Cascadelake",
|
||||
+ "Cooperlake", "Xeon-Platinum-9242");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Skylake-Client+Server",
|
||||
+ "Core-i5-6600", "Xeon-Gold-6148");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Broadwell",
|
||||
+ "Xeon-E5-2609-v3", "Xeon-E5-2650-v4");
|
||||
+ DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell+Skylake",
|
||||
+ "Xeon-E7-8890-v3", "Xeon-Gold-5115");
|
||||
cleanup:
|
||||
#if WITH_QEMU
|
||||
qemuTestDriverFree(&driver);
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..4e3f253e9b
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
|
||||
@@ -0,0 +1,11 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Skylake-Client-IBRS</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='disable' name='mpx'/>
|
||||
+ <feature policy='disable' name='xsavec'/>
|
||||
+ <feature policy='disable' name='xgetbv1'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..e372a3e446
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Cooperlake</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='mpx'/>
|
||||
+ <feature policy='require' name='umip'/>
|
||||
+ <feature policy='require' name='xsaves'/>
|
||||
+ <feature policy='disable' name='avx512-bf16'/>
|
||||
+ <feature policy='disable' name='mds-no'/>
|
||||
+ <feature policy='disable' name='pschange-mc-no'/>
|
||||
+ <feature policy='disable' name='taa-no'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
|
||||
new file mode 100644
|
||||
index 0000000000..e559e01583
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
|
||||
@@ -0,0 +1,12 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Cascadelake-Server</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='umip'/>
|
||||
+ <feature policy='require' name='pku'/>
|
||||
+ <feature policy='require' name='xsaves'/>
|
||||
+ <feature policy='require' name='skip-l1dfl-vmentry'/>
|
||||
+ <feature policy='disable' name='avx512vnni'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..906259df0b
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
|
||||
@@ -0,0 +1,8 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Skylake-Server</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='clflushopt'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..46c32c996f
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
|
||||
@@ -0,0 +1,17 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Cooperlake</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='vmx'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='mpx'/>
|
||||
+ <feature policy='require' name='umip'/>
|
||||
+ <feature policy='require' name='md-clear'/>
|
||||
+ <feature policy='require' name='xsaves'/>
|
||||
+ <feature policy='require' name='ibpb'/>
|
||||
+ <feature policy='require' name='amd-ssbd'/>
|
||||
+ <feature policy='require' name='tsx-ctrl'/>
|
||||
+ <feature policy='disable' name='avx512-bf16'/>
|
||||
+ <feature policy='disable' name='taa-no'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..e372a3e446
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Cooperlake</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='mpx'/>
|
||||
+ <feature policy='require' name='umip'/>
|
||||
+ <feature policy='require' name='xsaves'/>
|
||||
+ <feature policy='disable' name='avx512-bf16'/>
|
||||
+ <feature policy='disable' name='mds-no'/>
|
||||
+ <feature policy='disable' name='pschange-mc-no'/>
|
||||
+ <feature policy='disable' name='taa-no'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml b/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
|
||||
new file mode 100644
|
||||
index 0000000000..e1984b2890
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
|
||||
@@ -0,0 +1,13 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>EPYC</model>
|
||||
+ <vendor>AMD</vendor>
|
||||
+ <feature policy='require' name='x2apic'/>
|
||||
+ <feature policy='require' name='tsc-deadline'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='cmp_legacy'/>
|
||||
+ <feature policy='require' name='npt'/>
|
||||
+ <feature policy='require' name='nrip-save'/>
|
||||
+ <feature policy='disable' name='svm'/>
|
||||
+ <feature policy='disable' name='monitor'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..e687a679b3
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Haswell</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='vme'/>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='f16c'/>
|
||||
+ <feature policy='require' name='rdrand'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='arat'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='xsaveopt'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='require' name='abm'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
|
||||
new file mode 100644
|
||||
index 0000000000..651457b17a
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Haswell-noTSX</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='vme'/>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='f16c'/>
|
||||
+ <feature policy='require' name='rdrand'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='arat'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='xsaveopt'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='require' name='abm'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
|
||||
new file mode 100644
|
||||
index 0000000000..8bda1c02e2
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Haswell-noTSX-IBRS</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='vme'/>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='f16c'/>
|
||||
+ <feature policy='require' name='rdrand'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='arat'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='xsaveopt'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='require' name='abm'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
|
||||
new file mode 100644
|
||||
index 0000000000..651457b17a
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
|
||||
@@ -0,0 +1,14 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Haswell-noTSX</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='vme'/>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='f16c'/>
|
||||
+ <feature policy='require' name='rdrand'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='arat'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='xsaveopt'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='require' name='abm'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml b/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
|
||||
new file mode 100644
|
||||
index 0000000000..051402b9d5
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
|
||||
@@ -0,0 +1,13 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>EPYC</model>
|
||||
+ <vendor>AMD</vendor>
|
||||
+ <feature policy='require' name='x2apic'/>
|
||||
+ <feature policy='require' name='tsc-deadline'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='cmp_legacy'/>
|
||||
+ <feature policy='require' name='npt'/>
|
||||
+ <feature policy='require' name='nrip-save'/>
|
||||
+ <feature policy='disable' name='sha-ni'/>
|
||||
+ <feature policy='disable' name='monitor'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml b/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
|
||||
new file mode 100644
|
||||
index 0000000000..d46ff26eeb
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
|
||||
@@ -0,0 +1,9 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='allow'>Skylake-Client</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='clflushopt'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+</cpu>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,334 +0,0 @@
|
||||
From 50d94f13286ca19ef1f457be72debdbf77547df6 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <50d94f13286ca19ef1f457be72debdbf77547df6@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 4 May 2022 16:21:38 +0200
|
||||
Subject: [PATCH] cputest: Drop some old artificial baseline tests
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 6aff36019bbaf643f451779621c6c88cab0e64a7)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
tests/cputest.c | 6 ---
|
||||
.../cputestdata/x86_64-baseline-1-result.xml | 5 --
|
||||
tests/cputestdata/x86_64-baseline-1.xml | 20 --------
|
||||
.../cputestdata/x86_64-baseline-2-result.xml | 4 --
|
||||
tests/cputestdata/x86_64-baseline-2.xml | 22 ---------
|
||||
.../x86_64-baseline-5-expanded.xml | 47 -------------------
|
||||
.../cputestdata/x86_64-baseline-5-result.xml | 10 ----
|
||||
tests/cputestdata/x86_64-baseline-5.xml | 35 --------------
|
||||
.../cputestdata/x86_64-baseline-7-result.xml | 4 --
|
||||
tests/cputestdata/x86_64-baseline-7.xml | 24 ----------
|
||||
.../cputestdata/x86_64-baseline-8-result.xml | 4 --
|
||||
tests/cputestdata/x86_64-baseline-8.xml | 28 -----------
|
||||
12 files changed, 209 deletions(-)
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-1-result.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-1.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-2-result.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-2.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-5-expanded.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-5-result.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-5.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-7-result.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-7.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-8-result.xml
|
||||
delete mode 100644 tests/cputestdata/x86_64-baseline-8.xml
|
||||
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index 0f0621292a..20d56836be 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -1051,18 +1051,12 @@ mymain(void)
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "incompatible-vendors", 0, -1);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "no-vendor", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "some-vendors", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "1", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "2", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "3", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "3", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "4", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "4", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "5", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "5", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "6", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "6", VIR_CONNECT_BASELINE_CPU_MIGRATABLE, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "7", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "8", 0, 0);
|
||||
|
||||
DO_TEST_BASELINE(VIR_ARCH_PPC64, "incompatible-vendors", 0, -1);
|
||||
DO_TEST_BASELINE(VIR_ARCH_PPC64, "no-vendor", 0, 0);
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-1-result.xml b/tests/cputestdata/x86_64-baseline-1-result.xml
|
||||
deleted file mode 100644
|
||||
index 96c4f43b3d..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-1-result.xml
|
||||
+++ /dev/null
|
||||
@@ -1,5 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>Conroe</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <feature policy='disable' name='lahf_lm'/>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-1.xml b/tests/cputestdata/x86_64-baseline-1.xml
|
||||
deleted file mode 100644
|
||||
index 509e6a85d2..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-1.xml
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-<cpuTest>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Penryn</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='2' cores='4' threads='1'/>
|
||||
-</cpu>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Conroe</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='1' threads='1'/>
|
||||
-</cpu>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>core2duo</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='1' threads='1'/>
|
||||
-</cpu>
|
||||
-</cpuTest>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-2-result.xml b/tests/cputestdata/x86_64-baseline-2-result.xml
|
||||
deleted file mode 100644
|
||||
index a11352d0b1..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-2-result.xml
|
||||
+++ /dev/null
|
||||
@@ -1,4 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>core2duo</model>
|
||||
- <feature policy='disable' name='nx'/>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-2.xml b/tests/cputestdata/x86_64-baseline-2.xml
|
||||
deleted file mode 100644
|
||||
index 055223fd34..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-2.xml
|
||||
+++ /dev/null
|
||||
@@ -1,22 +0,0 @@
|
||||
-<cpuTest>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>core2duo</model>
|
||||
- <topology sockets='1' cores='2' threads='1'/>
|
||||
-</cpu>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>pentiumpro</model>
|
||||
- <topology sockets='1' cores='2' threads='1'/>
|
||||
- <feature name='mtrr'/>
|
||||
- <feature name='clflush'/>
|
||||
- <feature name='mca'/>
|
||||
- <feature name='vme'/>
|
||||
- <feature name='pse36'/>
|
||||
- <feature name='pni'/>
|
||||
- <feature name='monitor'/>
|
||||
- <feature name='ssse3'/>
|
||||
- <feature name='lm'/>
|
||||
- <feature name='syscall'/>
|
||||
-</cpu>
|
||||
-</cpuTest>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-5-expanded.xml b/tests/cputestdata/x86_64-baseline-5-expanded.xml
|
||||
deleted file mode 100644
|
||||
index 2c1b400150..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-5-expanded.xml
|
||||
+++ /dev/null
|
||||
@@ -1,47 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>SandyBridge</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <feature policy='require' name='aes'/>
|
||||
- <feature policy='require' name='apic'/>
|
||||
- <feature policy='require' name='avx'/>
|
||||
- <feature policy='require' name='clflush'/>
|
||||
- <feature policy='require' name='cmov'/>
|
||||
- <feature policy='require' name='cx16'/>
|
||||
- <feature policy='require' name='cx8'/>
|
||||
- <feature policy='require' name='de'/>
|
||||
- <feature policy='require' name='fpu'/>
|
||||
- <feature policy='require' name='fxsr'/>
|
||||
- <feature policy='require' name='hypervisor'/>
|
||||
- <feature policy='require' name='lahf_lm'/>
|
||||
- <feature policy='require' name='lm'/>
|
||||
- <feature policy='require' name='mca'/>
|
||||
- <feature policy='require' name='mce'/>
|
||||
- <feature policy='require' name='mmx'/>
|
||||
- <feature policy='require' name='msr'/>
|
||||
- <feature policy='require' name='mtrr'/>
|
||||
- <feature policy='require' name='nx'/>
|
||||
- <feature policy='require' name='osxsave'/>
|
||||
- <feature policy='require' name='pae'/>
|
||||
- <feature policy='require' name='pat'/>
|
||||
- <feature policy='require' name='pcid'/>
|
||||
- <feature policy='require' name='pclmuldq'/>
|
||||
- <feature policy='require' name='pge'/>
|
||||
- <feature policy='require' name='pni'/>
|
||||
- <feature policy='require' name='popcnt'/>
|
||||
- <feature policy='require' name='pse'/>
|
||||
- <feature policy='require' name='pse36'/>
|
||||
- <feature policy='disable' name='rdtscp'/>
|
||||
- <feature policy='require' name='sep'/>
|
||||
- <feature policy='require' name='ss'/>
|
||||
- <feature policy='require' name='sse'/>
|
||||
- <feature policy='require' name='sse2'/>
|
||||
- <feature policy='require' name='sse4.1'/>
|
||||
- <feature policy='require' name='sse4.2'/>
|
||||
- <feature policy='require' name='ssse3'/>
|
||||
- <feature policy='require' name='syscall'/>
|
||||
- <feature policy='require' name='tsc'/>
|
||||
- <feature policy='require' name='tsc-deadline'/>
|
||||
- <feature policy='require' name='vme'/>
|
||||
- <feature policy='require' name='x2apic'/>
|
||||
- <feature policy='require' name='xsave'/>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-5-result.xml b/tests/cputestdata/x86_64-baseline-5-result.xml
|
||||
deleted file mode 100644
|
||||
index 775a27de2e..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-5-result.xml
|
||||
+++ /dev/null
|
||||
@@ -1,10 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>SandyBridge</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <feature policy='require' name='vme'/>
|
||||
- <feature policy='require' name='ss'/>
|
||||
- <feature policy='require' name='pcid'/>
|
||||
- <feature policy='require' name='osxsave'/>
|
||||
- <feature policy='require' name='hypervisor'/>
|
||||
- <feature policy='disable' name='rdtscp'/>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-5.xml b/tests/cputestdata/x86_64-baseline-5.xml
|
||||
deleted file mode 100644
|
||||
index 80cd533ca4..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-5.xml
|
||||
+++ /dev/null
|
||||
@@ -1,35 +0,0 @@
|
||||
-<cpuTest>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Westmere</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='4' cores='1' threads='1'/>
|
||||
- <feature name='hypervisor'/>
|
||||
- <feature name='avx'/>
|
||||
- <feature name='osxsave'/>
|
||||
- <feature name='xsave'/>
|
||||
- <feature name='tsc-deadline'/>
|
||||
- <feature name='x2apic'/>
|
||||
- <feature name='pcid'/>
|
||||
- <feature name='pclmuldq'/>
|
||||
- <feature name='ss'/>
|
||||
- <feature name='vme'/>
|
||||
-</cpu>
|
||||
-<cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Nehalem</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='4' cores='1' threads='1'/>
|
||||
- <feature name='aes'/>
|
||||
- <feature name='hypervisor'/>
|
||||
- <feature name='avx'/>
|
||||
- <feature name='osxsave'/>
|
||||
- <feature name='xsave'/>
|
||||
- <feature name='tsc-deadline'/>
|
||||
- <feature name='x2apic'/>
|
||||
- <feature name='pcid'/>
|
||||
- <feature name='pclmuldq'/>
|
||||
- <feature name='ss'/>
|
||||
- <feature name='vme'/>
|
||||
-</cpu>
|
||||
-</cpuTest>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-7-result.xml b/tests/cputestdata/x86_64-baseline-7-result.xml
|
||||
deleted file mode 100644
|
||||
index 2af549e77a..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-7-result.xml
|
||||
+++ /dev/null
|
||||
@@ -1,4 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>Haswell-noTSX</model>
|
||||
- <vendor>Intel</vendor>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-7.xml b/tests/cputestdata/x86_64-baseline-7.xml
|
||||
deleted file mode 100644
|
||||
index b7e61b160c..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-7.xml
|
||||
+++ /dev/null
|
||||
@@ -1,24 +0,0 @@
|
||||
-<cpuTest>
|
||||
- <cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>SandyBridge</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='2' threads='2'/>
|
||||
- <feature name='invpcid'/>
|
||||
- <feature name='erms'/>
|
||||
- <feature name='bmi2'/>
|
||||
- <feature name='smep'/>
|
||||
- <feature name='avx2'/>
|
||||
- <feature name='bmi1'/>
|
||||
- <feature name='fsgsbase'/>
|
||||
- <feature name='movbe'/>
|
||||
- <feature name='pcid'/>
|
||||
- <feature name='fma'/>
|
||||
- </cpu>
|
||||
- <cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Haswell-noTSX</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='2' threads='2'/>
|
||||
- </cpu>
|
||||
-</cpuTest>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-8-result.xml b/tests/cputestdata/x86_64-baseline-8-result.xml
|
||||
deleted file mode 100644
|
||||
index 88226b3dab..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-8-result.xml
|
||||
+++ /dev/null
|
||||
@@ -1,4 +0,0 @@
|
||||
-<cpu mode='custom' match='exact'>
|
||||
- <model fallback='allow'>Broadwell-noTSX</model>
|
||||
- <vendor>Intel</vendor>
|
||||
-</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-8.xml b/tests/cputestdata/x86_64-baseline-8.xml
|
||||
deleted file mode 100644
|
||||
index f1ee67d542..0000000000
|
||||
--- a/tests/cputestdata/x86_64-baseline-8.xml
|
||||
+++ /dev/null
|
||||
@@ -1,28 +0,0 @@
|
||||
-<cpuTest>
|
||||
- <cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>SandyBridge</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='2' threads='2'/>
|
||||
- <feature name='invpcid'/>
|
||||
- <feature name='erms'/>
|
||||
- <feature name='bmi2'/>
|
||||
- <feature name='smep'/>
|
||||
- <feature name='avx2'/>
|
||||
- <feature name='bmi1'/>
|
||||
- <feature name='fsgsbase'/>
|
||||
- <feature name='movbe'/>
|
||||
- <feature name='pcid'/>
|
||||
- <feature name='fma'/>
|
||||
- <feature name='3dnowprefetch'/>
|
||||
- <feature name='rdseed'/>
|
||||
- <feature name='adx'/>
|
||||
- <feature name='smap'/>
|
||||
- </cpu>
|
||||
- <cpu>
|
||||
- <arch>x86_64</arch>
|
||||
- <model>Broadwell-noTSX</model>
|
||||
- <vendor>Intel</vendor>
|
||||
- <topology sockets='1' cores='2' threads='2'/>
|
||||
- </cpu>
|
||||
-</cpuTest>
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,97 +0,0 @@
|
||||
From 6cf9cd8f6d9e90eadd58d8a37129e7401876e4e8 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <6cf9cd8f6d9e90eadd58d8a37129e7401876e4e8@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 4 May 2022 16:28:03 +0200
|
||||
Subject: [PATCH] cputest: Give better names to baseline tests
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 3daa68e26514dc114d71f4c44f7d728e93a53cd0)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1851227
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
tests/cputest.c | 12 ++++++------
|
||||
... x86_64-baseline-Westmere+Nehalem-migratable.xml} | 0
|
||||
...l => x86_64-baseline-Westmere+Nehalem-result.xml} | 0
|
||||
...ne-6.xml => x86_64-baseline-Westmere+Nehalem.xml} | 0
|
||||
...ded.xml => x86_64-baseline-features-expanded.xml} | 0
|
||||
...esult.xml => x86_64-baseline-features-result.xml} | 0
|
||||
...4-baseline-4.xml => x86_64-baseline-features.xml} | 0
|
||||
...anded.xml => x86_64-baseline-simple-expanded.xml} | 0
|
||||
...-result.xml => x86_64-baseline-simple-result.xml} | 0
|
||||
..._64-baseline-3.xml => x86_64-baseline-simple.xml} | 0
|
||||
10 files changed, 6 insertions(+), 6 deletions(-)
|
||||
rename tests/cputestdata/{x86_64-baseline-6-migratable.xml => x86_64-baseline-Westmere+Nehalem-migratable.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-6-result.xml => x86_64-baseline-Westmere+Nehalem-result.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-6.xml => x86_64-baseline-Westmere+Nehalem.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-4-expanded.xml => x86_64-baseline-features-expanded.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-4-result.xml => x86_64-baseline-features-result.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-4.xml => x86_64-baseline-features.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-3-expanded.xml => x86_64-baseline-simple-expanded.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-3-result.xml => x86_64-baseline-simple-result.xml} (100%)
|
||||
rename tests/cputestdata/{x86_64-baseline-3.xml => x86_64-baseline-simple.xml} (100%)
|
||||
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index 20d56836be..b939e20718 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -1051,12 +1051,12 @@ mymain(void)
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "incompatible-vendors", 0, -1);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "no-vendor", 0, 0);
|
||||
DO_TEST_BASELINE(VIR_ARCH_X86_64, "some-vendors", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "3", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "3", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "4", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "4", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "6", 0, 0);
|
||||
- DO_TEST_BASELINE(VIR_ARCH_X86_64, "6", VIR_CONNECT_BASELINE_CPU_MIGRATABLE, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "simple", 0, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "simple", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "features", 0, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "features", VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "Westmere+Nehalem", 0, 0);
|
||||
+ DO_TEST_BASELINE(VIR_ARCH_X86_64, "Westmere+Nehalem", VIR_CONNECT_BASELINE_CPU_MIGRATABLE, 0);
|
||||
|
||||
DO_TEST_BASELINE(VIR_ARCH_PPC64, "incompatible-vendors", 0, -1);
|
||||
DO_TEST_BASELINE(VIR_ARCH_PPC64, "no-vendor", 0, 0);
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-6-migratable.xml b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-6-migratable.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-Westmere+Nehalem-migratable.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-6-result.xml b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-6-result.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-Westmere+Nehalem-result.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-6.xml b/tests/cputestdata/x86_64-baseline-Westmere+Nehalem.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-6.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-Westmere+Nehalem.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-4-expanded.xml b/tests/cputestdata/x86_64-baseline-features-expanded.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-4-expanded.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-features-expanded.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-4-result.xml b/tests/cputestdata/x86_64-baseline-features-result.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-4-result.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-features-result.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-4.xml b/tests/cputestdata/x86_64-baseline-features.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-4.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-features.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-3-expanded.xml b/tests/cputestdata/x86_64-baseline-simple-expanded.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-3-expanded.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-simple-expanded.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-3-result.xml b/tests/cputestdata/x86_64-baseline-simple-result.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-3-result.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-simple-result.xml
|
||||
diff --git a/tests/cputestdata/x86_64-baseline-3.xml b/tests/cputestdata/x86_64-baseline-simple.xml
|
||||
similarity index 100%
|
||||
rename from tests/cputestdata/x86_64-baseline-3.xml
|
||||
rename to tests/cputestdata/x86_64-baseline-simple.xml
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
From 4c6ab1e34ea5e57dc0f9880f178354538adf55f7 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <4c6ab1e34ea5e57dc0f9880f178354538adf55f7.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 11 Mar 2026 12:13:45 +0100
|
||||
Subject: [PATCH] docs: Clarify host-model description in domain capabilities
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 0b54c9d535b9b7c832ff8422dca28c84eb75ed2e)
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-153653
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
docs/formatdomaincaps.rst | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst
|
||||
index 6ba7f84f96..add550a4a5 100644
|
||||
--- a/docs/formatdomaincaps.rst
|
||||
+++ b/docs/formatdomaincaps.rst
|
||||
@@ -244,6 +244,10 @@ more details about it:
|
||||
reports physical address size of the host CPU if this value is available and
|
||||
applicable for the requested domain type. This is useful for computing
|
||||
baseline CPU definition which should be compatible with several hosts.
|
||||
+ Consistently with all other CPU definitions used by libvirt, features
|
||||
+ implicitly enabled by the selected CPU model (in ``model`` sub element) are
|
||||
+ not listed. Use ``--expand-cpu-features`` virsh option or the equivalent API
|
||||
+ flag to request all supported features to be listed in the CPU definition.
|
||||
``custom``
|
||||
The ``mode`` element contains a list of supported CPU models, each described
|
||||
by a dedicated ``model`` element. The ``usable`` attribute specifies whether
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,62 @@
|
||||
From b2fc2869c2b5fa6b2c05b3d05b63d1b4761788e4 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b2fc2869c2b5fa6b2c05b3d05b63d1b4761788e4.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Fri, 30 Jan 2026 17:47:46 +0100
|
||||
Subject: [PATCH] docs: formatdomain: Fix indentation of docs for
|
||||
<disk><driver><statistics> element
|
||||
|
||||
All other paragraphs in this section use 2 spaces after hyphen, fix the
|
||||
recently added section.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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.
|
||||
</iothreads>
|
||||
</driver>
|
||||
|
||||
- - The optional ``statistics`` sub-element allows configuring statistics
|
||||
- collection in configurable intervals for the given disk. Intervals are
|
||||
- configured by ``<statistic>`` 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 ``<statistic>`` sub-elements with ``interval`` attribute
|
||||
+ configuring the collection window duration in seconds. The statistics
|
||||
+ are available via the bulk statistics API.
|
||||
|
||||
- Example::
|
||||
+ Example::
|
||||
|
||||
- <driver name='qemu'>
|
||||
- <statistics>
|
||||
- <statistic interval='1'/>
|
||||
- <statistic interval='10'/>
|
||||
- </statistics>
|
||||
- </driver>
|
||||
+ <driver name='qemu'>
|
||||
+ <statistics>
|
||||
+ <statistic interval='1'/>
|
||||
+ <statistic interval='10'/>
|
||||
+ </statistics>
|
||||
+ </driver>
|
||||
|
||||
- :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
|
||||
@ -0,0 +1,51 @@
|
||||
From b87a18dada6e991dc2389c822cde38d4abc267fa Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b87a18dada6e991dc2389c822cde38d4abc267fa.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Fri, 30 Jan 2026 17:37:48 +0100
|
||||
Subject: [PATCH] docs: formatdomain: Reword section about the '<statistics>'
|
||||
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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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.
|
||||
</iothreads>
|
||||
</driver>
|
||||
|
||||
- - The optional ``statistics`` sub-element allows configuring statistics
|
||||
- collection in configurable intervals for the given disk. Intervals are
|
||||
- configured by ``<statistic>`` 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 <html/libvirt-libvirt-domain.html#VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_PREFIX>`__
|
||||
+ typed parameter prefix returned by the
|
||||
+ `virConnectGetAllDomainStats <html/libvirt-libvirt-domain.html#virConnectGetAllDomainStats>`__
|
||||
+ API are collected based on one or more configurable intervals. An interval
|
||||
+ of collection is configured by ``<statistic>`` sub-elements with
|
||||
+ ``interval`` attribute configuring the collection window duration in
|
||||
+ seconds.
|
||||
|
||||
Example::
|
||||
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,94 @@
|
||||
From 51ada853c575b6361d013e1b594d918d862f873b Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <51ada853c575b6361d013e1b594d918d862f873b.1772815374.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Thu, 26 Feb 2026 10:18:23 +0100
|
||||
Subject: [PATCH] domain_conf: initialize network hostdev private data
|
||||
|
||||
Currently virDomainNetDef and virDomainActualNetDef use
|
||||
virDomainHostdevDef directly as structure and the code doesn't call
|
||||
virDomainHostdevDefNew() that would initialize private data.
|
||||
|
||||
This is hackish quick fix to solve a crash that happens in two
|
||||
scenarios:
|
||||
|
||||
1. attaching any interface with hostdev backend
|
||||
|
||||
0x0000fffbfc0e2a90 in qemuDomainAttachHostPCIDevice (driver=0xfffbb4006750, vm=0xfffbf001f790, hostdev=0xfffbf400b150) at ../src/qemu/qemu_hotplug.c:1652
|
||||
1652 if ((ret = qemuFDPassDirectTransferMonitor(hostdevPriv->vfioDeviceFd, priv->mon)) < 0)
|
||||
|
||||
2. starting VM with interface with hostdev backend using iommufd
|
||||
|
||||
0x00007f6638d5b9ca in qemuProcessOpenVfioDeviceFd (hostdev=hostdev@entry=0x7f6634425ee0) at ../src/qemu/qemu_process.c:7719
|
||||
7719 hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd);
|
||||
|
||||
Proper fix for this issue is to refactor network code to use pointer and to
|
||||
use virDomainHostdevDefNew().
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit fe782ed334ea0d4373e6dad093f5815fc925a56b)
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-151953
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 23 +++++++++++++++++++++--
|
||||
1 file changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index cb047e5a3e..df05d96f01 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -3489,6 +3489,20 @@ void virDomainVideoDefFree(virDomainVideoDef *def)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virDomainHostdevDefPrivateDataNew(virDomainHostdevDef *def,
|
||||
+ virDomainXMLOption *xmlopt)
|
||||
+{
|
||||
+ if (!xmlopt || !xmlopt->privateData.hostdevNew)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!(def->privateData = xmlopt->privateData.hostdevNew()))
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
virDomainHostdevDef *
|
||||
virDomainHostdevDefNew(virDomainXMLOption *xmlopt)
|
||||
{
|
||||
@@ -3498,8 +3512,7 @@ virDomainHostdevDefNew(virDomainXMLOption *xmlopt)
|
||||
|
||||
def->info = g_new0(virDomainDeviceInfo, 1);
|
||||
|
||||
- if (xmlopt && xmlopt->privateData.hostdevNew &&
|
||||
- !(def->privateData = xmlopt->privateData.hostdevNew())) {
|
||||
+ if (virDomainHostdevDefPrivateDataNew(def, xmlopt) < 0) {
|
||||
VIR_FREE(def->info);
|
||||
VIR_FREE(def);
|
||||
return NULL;
|
||||
@@ -9653,6 +9666,9 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
|
||||
virDomainHostdevDef *hostdev = &actual->data.hostdev.def;
|
||||
int type;
|
||||
|
||||
+ if (virDomainHostdevDefPrivateDataNew(hostdev, xmlopt) < 0)
|
||||
+ goto error;
|
||||
+
|
||||
hostdev->parentnet = parent;
|
||||
hostdev->info = &parent->info;
|
||||
/* The helper function expects type to already be found and
|
||||
@@ -10346,6 +10362,9 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
||||
g_autofree char *addrtype = virXPathString("string(./source/address/@type)", ctxt);
|
||||
int type;
|
||||
|
||||
+ if (virDomainHostdevDefPrivateDataNew(&def->data.hostdev.def, xmlopt) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
def->data.hostdev.def.parentnet = def;
|
||||
def->data.hostdev.def.info = &def->info;
|
||||
def->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
|
||||
--
|
||||
2.53.0
|
||||
@ -1,111 +0,0 @@
|
||||
From 296343c5a950668d790f9cd5ebd7b466e8156d03 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <296343c5a950668d790f9cd5ebd7b466e8156d03@dist-git>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Tue, 14 Jun 2022 13:23:29 +0200
|
||||
Subject: [PATCH] domain_validate: Split out validation of disk startup policy
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Move the code into 'virDomainDiskDefValidateStartupPolicy' which will be
|
||||
later reused in the qemu driver.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 3603a18bcec18842cedecbd8329723062b87795c)
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2095758
|
||||
---
|
||||
src/conf/domain_validate.c | 45 ++++++++++++++++++++++++--------------
|
||||
src/conf/domain_validate.h | 2 ++
|
||||
src/libvirt_private.syms | 1 +
|
||||
3 files changed, 31 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
|
||||
index 452742e67c..bfff7339ef 100644
|
||||
--- a/src/conf/domain_validate.c
|
||||
+++ b/src/conf/domain_validate.c
|
||||
@@ -598,6 +598,32 @@ virDomainDiskDefSourceLUNValidate(const virStorageSource *src)
|
||||
}
|
||||
|
||||
|
||||
+int
|
||||
+virDomainDiskDefValidateStartupPolicy(const virDomainDiskDef *disk)
|
||||
+{
|
||||
+ if (disk->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_DEFAULT)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (disk->src->type == VIR_STORAGE_TYPE_NETWORK) {
|
||||
+ virReportError(VIR_ERR_XML_ERROR,
|
||||
+ _("disk startupPolicy '%s' is not allowed for disk of '%s' type"),
|
||||
+ virDomainStartupPolicyTypeToString(disk->startupPolicy),
|
||||
+ virStorageTypeToString(disk->src->type));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM &&
|
||||
+ disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
|
||||
+ disk->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_REQUISITE) {
|
||||
+ virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
+ _("disk startupPolicy 'requisite' is allowed only for cdrom or floppy"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
virDomainDiskDefValidate(const virDomainDef *def,
|
||||
const virDomainDiskDef *disk)
|
||||
@@ -775,23 +801,8 @@ virDomainDiskDefValidate(const virDomainDef *def,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (disk->startupPolicy != VIR_DOMAIN_STARTUP_POLICY_DEFAULT) {
|
||||
- if (disk->src->type == VIR_STORAGE_TYPE_NETWORK) {
|
||||
- virReportError(VIR_ERR_XML_ERROR,
|
||||
- _("disk startupPolicy '%s' is not allowed for disk of '%s' type"),
|
||||
- virDomainStartupPolicyTypeToString(disk->startupPolicy),
|
||||
- virStorageTypeToString(disk->src->type));
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM &&
|
||||
- disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
|
||||
- disk->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_REQUISITE) {
|
||||
- virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
- _("disk startupPolicy 'requisite' is allowed only for cdrom or floppy"));
|
||||
- return -1;
|
||||
- }
|
||||
- }
|
||||
+ if (virDomainDiskDefValidateStartupPolicy(disk) < 0)
|
||||
+ return -1;
|
||||
|
||||
if (disk->wwn && !virValidateWWN(disk->wwn))
|
||||
return -1;
|
||||
diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h
|
||||
index 430d61fd3c..07b99195e3 100644
|
||||
--- a/src/conf/domain_validate.h
|
||||
+++ b/src/conf/domain_validate.h
|
||||
@@ -41,4 +41,6 @@ int virDomainDeviceDefValidate(const virDomainDeviceDef *dev,
|
||||
|
||||
int virDomainDiskDefValidateSource(const virStorageSource *src);
|
||||
|
||||
+int virDomainDiskDefValidateStartupPolicy(const virDomainDiskDef *disk);
|
||||
+
|
||||
int virDomainDiskDefSourceLUNValidate(const virStorageSource *src);
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 2c42e2a5e8..5b7a056151 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -777,6 +777,7 @@ virDomainActualNetDefValidate;
|
||||
virDomainDefValidate;
|
||||
virDomainDeviceValidateAliasForHotplug;
|
||||
virDomainDiskDefSourceLUNValidate;
|
||||
+virDomainDiskDefValidateStartupPolicy;
|
||||
|
||||
|
||||
# conf/interface_conf.h
|
||||
--
|
||||
2.35.1
|
||||
|
||||
24245
SOURCES/libvirt-domaincapstest-Test-EXPAND_CPU_FEATURES-flag.patch
Normal file
24245
SOURCES/libvirt-domaincapstest-Test-EXPAND_CPU_FEATURES-flag.patch
Normal file
File diff suppressed because it is too large
Load Diff
22680
SOURCES/libvirt-domaincapstest-Test-SUPPORTED_CPU_FEATURES-flag.patch
Normal file
22680
SOURCES/libvirt-domaincapstest-Test-SUPPORTED_CPU_FEATURES-flag.patch
Normal file
File diff suppressed because it is too large
Load Diff
59
SOURCES/libvirt-esx-URI-encode-inventory-objects-twice.patch
Normal file
59
SOURCES/libvirt-esx-URI-encode-inventory-objects-twice.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From 0431af4412aab6aadcde893a7eacf1ae24771590 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <0431af4412aab6aadcde893a7eacf1ae24771590.1768317034.git.jdenemar@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Tue, 6 Jan 2026 17:18:03 +0100
|
||||
Subject: [PATCH] esx: URI encode inventory objects twice
|
||||
|
||||
While discouraged by a KB article to use special characters in
|
||||
inventory object names [1], ESX won't stop you. And thus users
|
||||
can end up with a datastore named "datastore2+", for instance.
|
||||
The datastore name (and datacenter path) are important when
|
||||
fetching/uploading a .vmx file (used in APIs like
|
||||
virDomainGetXMLDesc() or virDomainDefineXML()). And while we do
|
||||
URI encode both (dcPath and dsName), encoding them once is not
|
||||
enough. Cole Robinson discovered [2] that they need to be
|
||||
URI-encoded twice. Use newly introduced
|
||||
esxUtil_EscapeInventoryObject() helper to encode them twice.
|
||||
|
||||
1: https://knowledge.broadcom.com/external/article/386368/vcenter-inventory-object-name-with-speci.html
|
||||
2: https://issues.redhat.com/browse/RHEL-133729#comment-28604072
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-134127
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
(cherry picked from commit 6c9d2591c668732eb05cf17d27c9102ef3d40b39)
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/esx/esx_driver.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
|
||||
index 9f965811b1..02f30c2b19 100644
|
||||
--- a/src/esx/esx_driver.c
|
||||
+++ b/src/esx/esx_driver.c
|
||||
@@ -2567,9 +2567,9 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
|
||||
domain->conn->uri->server, domain->conn->uri->port);
|
||||
virBufferURIEncodeString(&buffer, directoryAndFileName);
|
||||
virBufferAddLit(&buffer, "?dcPath=");
|
||||
- virBufferURIEncodeString(&buffer, priv->primary->datacenterPath);
|
||||
+ esxUtil_EscapeInventoryObject(&buffer, priv->primary->datacenterPath);
|
||||
virBufferAddLit(&buffer, "&dsName=");
|
||||
- virBufferURIEncodeString(&buffer, datastoreName);
|
||||
+ esxUtil_EscapeInventoryObject(&buffer, datastoreName);
|
||||
|
||||
url = virBufferContentAndReset(&buffer);
|
||||
|
||||
@@ -3002,9 +3002,9 @@ esxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
|
||||
|
||||
virBufferURIEncodeString(&buffer, escapedName);
|
||||
virBufferAddLit(&buffer, ".vmx?dcPath=");
|
||||
- virBufferURIEncodeString(&buffer, priv->primary->datacenterPath);
|
||||
+ esxUtil_EscapeInventoryObject(&buffer, priv->primary->datacenterPath);
|
||||
virBufferAddLit(&buffer, "&dsName=");
|
||||
- virBufferURIEncodeString(&buffer, datastoreName);
|
||||
+ esxUtil_EscapeInventoryObject(&buffer, datastoreName);
|
||||
|
||||
url = virBufferContentAndReset(&buffer);
|
||||
|
||||
--
|
||||
2.52.0
|
||||
@ -0,0 +1,76 @@
|
||||
From 3a1f8bb838db0f412205e2918fc2eb4213f323ad Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <3a1f8bb838db0f412205e2918fc2eb4213f323ad.1768317034.git.jdenemar@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 7 Jan 2026 10:34:25 +0100
|
||||
Subject: [PATCH] esx_util: Introduce esxUtil_EscapeInventoryObject()
|
||||
|
||||
The aim of this helper function is to URI-encode given string
|
||||
twice. There's a bug (fixed in next commit) in which we're unable
|
||||
to fetch .vmx file for a domain if corresponding datastore
|
||||
contains some special characters (like +). Cole Robinson
|
||||
discovered that encoding datastore twice enables libvirt to work
|
||||
around the issue [2]. Well, this function does exactly that.
|
||||
It was tested with the following inputs and all worked
|
||||
flawlessly: "datastore", "datastore2", "datastore2+",
|
||||
"datastore3+-@", "data store2+".
|
||||
|
||||
1: https://issues.redhat.com/browse/RHEL-134127
|
||||
2: https://issues.redhat.com/browse/RHEL-133729#comment-28604072
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
(cherry picked from commit ffe74c7c551bd641cbcaa2512ed0ad4a25d3980b)
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-134127
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/esx/esx_util.c | 18 ++++++++++++++++++
|
||||
src/esx/esx_util.h | 3 +++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
diff --git a/src/esx/esx_util.c b/src/esx/esx_util.c
|
||||
index 7ee0e5f7c0..9b714d90ba 100644
|
||||
--- a/src/esx/esx_util.c
|
||||
+++ b/src/esx/esx_util.c
|
||||
@@ -448,3 +448,21 @@ esxUtil_EscapeForXml(const char *string)
|
||||
|
||||
return virBufferContentAndReset(&buffer);
|
||||
}
|
||||
+
|
||||
+
|
||||
+/* esxUtil_EscapeInventoryObject:
|
||||
+ * @buf: the buffer to append to
|
||||
+ * @string: the string argument which will be URI-encoded
|
||||
+ *
|
||||
+ * URI-encode given @string TWICE and append the result to the @buf. This is
|
||||
+ * to be used with inventory objects (like 'dcPath' and 'dsName') to work
|
||||
+ * around a VMware bug in which once round of URI-encoding is not enough.
|
||||
+ */
|
||||
+void
|
||||
+esxUtil_EscapeInventoryObject(virBuffer *buf, const char *string)
|
||||
+{
|
||||
+ g_autoptr(GString) escaped = g_string_new(NULL);
|
||||
+
|
||||
+ g_string_append_uri_escaped(escaped, string, NULL, false);
|
||||
+ virBufferURIEncodeString(buf, escaped->str);
|
||||
+}
|
||||
diff --git a/src/esx/esx_util.h b/src/esx/esx_util.h
|
||||
index 58bc44e744..29f01e0c15 100644
|
||||
--- a/src/esx/esx_util.h
|
||||
+++ b/src/esx/esx_util.h
|
||||
@@ -22,6 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "internal.h"
|
||||
+#include "virbuffer.h"
|
||||
#include "viruri.h"
|
||||
|
||||
#define ESX_VI_CHECK_ARG_LIST(val) \
|
||||
@@ -67,3 +68,5 @@ void esxUtil_ReplaceSpecialWindowsPathChars(char *string);
|
||||
char *esxUtil_EscapeDatastoreItem(const char *string);
|
||||
|
||||
char *esxUtil_EscapeForXml(const char *string);
|
||||
+
|
||||
+void esxUtil_EscapeInventoryObject(virBuffer *buf, const char *string);
|
||||
--
|
||||
2.52.0
|
||||
@ -0,0 +1,45 @@
|
||||
From b338719eb9908c7dfd493d5ab4a1b0bcc2258d9b Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b338719eb9908c7dfd493d5ab4a1b0bcc2258d9b.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Thu, 26 Mar 2026 14:32:36 +0100
|
||||
Subject: [PATCH] hypervisor: Call virWaitForDevices() after detaching host
|
||||
devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On systems with selinux enabled starting a VM with managed host device
|
||||
using IOMMUFD backend can run into race-condition where both libvirt and
|
||||
udev are setting selinux label on /dev/vfio/devices/vfioX device. If
|
||||
udev is the last one to set selinux label starting VM fails with:
|
||||
|
||||
error: internal error: QEMU unexpectedly closed the monitor (vm='test'): 2026-03-26T15:47:36.620422Z qemu-kvm: -device {"driver":"vfio-pci","id":"hostdev0","iommufd":"iommufd0","fd":"20","bus":"pci.7","addr":"0x0"}: vfio hostdev0: Failed to add fd 20 to KVM VFIO device: Invalid argument
|
||||
|
||||
We need to wait for udev to finish processing all events.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit b96ea4db3aabac4790d6e1d53e2f309f5e73efae)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/hypervisor/virhostdev.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
|
||||
index 43155ceb6c..981ca4cd20 100644
|
||||
--- a/src/hypervisor/virhostdev.c
|
||||
+++ b/src/hypervisor/virhostdev.c
|
||||
@@ -782,6 +782,9 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Step 2.5: Wait for udev to handle all events for devices. */
|
||||
+ virWaitForDevices();
|
||||
+
|
||||
/* At this point, all devices are attached to the stub driver and have
|
||||
* been marked as inactive */
|
||||
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,98 @@
|
||||
From 2f8eef47f391248abf5253c6836520100d5d49c1 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <2f8eef47f391248abf5253c6836520100d5d49c1.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Wed, 18 Mar 2026 11:57:43 +0100
|
||||
Subject: [PATCH] hypervisor: Fix virHostdevNeedsVFIO detection
|
||||
|
||||
Function virHostdevNeedsVFIO is used only in QEMU to figure out if the
|
||||
host device needs access to /dev/vfio/vfio, for PCI host devices that is
|
||||
true only if libvirt is not using IOMMUFD.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit ffa8020d3665f7ff27c6b82e88d3a93674155c8d)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 13 +++++++++++++
|
||||
src/conf/domain_conf.h | 3 +++
|
||||
src/hypervisor/virhostdev.c | 9 ++++++++-
|
||||
src/libvirt_private.syms | 1 +
|
||||
4 files changed, 25 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 59df028192..99d2a0aa53 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -32835,6 +32835,19 @@ virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * virHostdevIsPCIDeviceWithIOMMUFD:
|
||||
+ * @hostdev: host device to check
|
||||
+ *
|
||||
+ * Returns true if @hostdev is a PCI device with IOMMUFD disabled, false otherwise.
|
||||
+ */
|
||||
+bool
|
||||
+virHostdevIsPCIDeviceWithoutIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
+{
|
||||
+ return virHostdevIsPCIDeviceImpl(hostdev, VIR_TRISTATE_BOOL_NO);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static void
|
||||
virDomainObjGetMessagesIOErrorsSrc(virStorageSource *src,
|
||||
const char *diskdst,
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index 69a8e79c6d..8f5780ee4c 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -4719,6 +4719,9 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||
bool
|
||||
virHostdevIsPCIDeviceWithIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
+bool
|
||||
+virHostdevIsPCIDeviceWithoutIOMMUFD(const virDomainHostdevDef *hostdev)
|
||||
+ ATTRIBUTE_NONNULL(1);
|
||||
|
||||
void
|
||||
virDomainObjGetMessagesIOErrorsChain(virStorageSource *src,
|
||||
diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
|
||||
index 7d7df4418d..43155ceb6c 100644
|
||||
--- a/src/hypervisor/virhostdev.c
|
||||
+++ b/src/hypervisor/virhostdev.c
|
||||
@@ -2510,10 +2510,17 @@ virHostdevUpdateActiveNVMeDevices(virHostdevManager *hostdev_mgr,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * virHostdevNeedsVFIO:
|
||||
+ * @hostdev: host device to check
|
||||
+ *
|
||||
+ * Returns true if using the @hostdev requires access to /dev/vfio/vfio,
|
||||
+ * otherwise false.
|
||||
+ */
|
||||
bool
|
||||
virHostdevNeedsVFIO(const virDomainHostdevDef *hostdev)
|
||||
{
|
||||
- return virHostdevIsPCIDevice(hostdev) ||
|
||||
+ return virHostdevIsPCIDeviceWithoutIOMMUFD(hostdev) ||
|
||||
virHostdevIsMdevDevice(hostdev);
|
||||
}
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 386e757d81..ea1e2d8586 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -814,6 +814,7 @@ virDomainQemuMonitorEventStateRegisterID;
|
||||
virHostdevIsMdevDevice;
|
||||
virHostdevIsPCIDevice;
|
||||
virHostdevIsPCIDeviceWithIOMMUFD;
|
||||
+virHostdevIsPCIDeviceWithoutIOMMUFD;
|
||||
virHostdevIsSCSIDevice;
|
||||
|
||||
|
||||
--
|
||||
2.54.0
|
||||
38
SOURCES/libvirt-iommufd-fix-FD-leak-in-case-of-error.patch
Normal file
38
SOURCES/libvirt-iommufd-fix-FD-leak-in-case-of-error.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 05df8c7309ca3c7db2f5a3c4eb1d07a48aaab486 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <05df8c7309ca3c7db2f5a3c4eb1d07a48aaab486.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Tue, 17 Feb 2026 08:38:07 +0100
|
||||
Subject: [PATCH] iommufd: fix FD leak in case of error
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reported-by: coverity
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit f37e14119c257281eab4fd1fed1b1018fe4f63b1)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/util/viriommufd.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/util/viriommufd.c b/src/util/viriommufd.c
|
||||
index 1f3353eab4..b62d59241d 100644
|
||||
--- a/src/util/viriommufd.c
|
||||
+++ b/src/util/viriommufd.c
|
||||
@@ -87,8 +87,10 @@ virIOMMUFDOpenDevice(void)
|
||||
if ((fd = open(VIR_IOMMU_DEV_PATH, O_RDWR | O_CLOEXEC)) < 0)
|
||||
virReportSystemError(errno, "%s", _("cannot open IOMMUFD device"));
|
||||
|
||||
- if (virIOMMUFDSetRLimitMode(fd, true) < 0)
|
||||
+ if (virIOMMUFDSetRLimitMode(fd, true) < 0) {
|
||||
+ VIR_FORCE_CLOSE(fd);
|
||||
return -1;
|
||||
+ }
|
||||
|
||||
return fd;
|
||||
}
|
||||
--
|
||||
2.53.0
|
||||
@ -1,77 +0,0 @@
|
||||
From 08ddc711a2e6d94a0fce55fec8e012a434655d2c Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <08ddc711a2e6d94a0fce55fec8e012a434655d2c.1690812875.git.jdenemar@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Fri, 1 Apr 2022 14:30:05 +0200
|
||||
Subject: [PATCH] lib: Set up cpuset controller for restrictive numatune
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The aim of 'restrictive' numatune mode is to rely solely on
|
||||
CGroups to have QEMU running on configured NUMA nodes. However,
|
||||
we were never setting the cpuset controller when a domain was
|
||||
starting up. We are doing so only when
|
||||
virDomainSetNumaParameters() is called (aka live pinning).
|
||||
|
||||
This is obviously wrong. Fortunately, fix is simple as
|
||||
'restrictive' is similar to 'strict' - every location where
|
||||
VIR_DOMAIN_NUMATUNE_MEM_STRICT occurs can be audited and
|
||||
VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE case can be added.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2070380
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 629282d8845407c1aff9a26f5dc026e15121f8cd)
|
||||
|
||||
Conflicts:
|
||||
- src/ch/ch_process.c: The CH driver diverged because it's
|
||||
unsupported downstream. Just drop the conflicting hunk from
|
||||
there.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2223464
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/lxc/lxc_controller.c | 3 ++-
|
||||
src/qemu/qemu_process.c | 6 ++++--
|
||||
2 files changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
|
||||
index 3c930eaacd..6fd8373256 100644
|
||||
--- a/src/lxc/lxc_controller.c
|
||||
+++ b/src/lxc/lxc_controller.c
|
||||
@@ -812,7 +812,8 @@ static int virLXCControllerSetupResourceLimits(virLXCController *ctrl)
|
||||
virDomainNumatuneMemMode mode;
|
||||
|
||||
if (virDomainNumatuneGetMode(ctrl->def->numa, -1, &mode) == 0) {
|
||||
- if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||
+ if ((mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT ||
|
||||
+ mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) &&
|
||||
virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) {
|
||||
/* Use virNuma* API iff necessary. Once set and child is exec()-ed,
|
||||
* there's no way for us to change it. Rely on cgroups (if available
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 0fb665bc82..73d54f01cd 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -2645,7 +2645,8 @@ qemuProcessSetupPid(virDomainObj *vm,
|
||||
virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
|
||||
|
||||
if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
|
||||
- mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||
+ (mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT ||
|
||||
+ mem_mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) &&
|
||||
virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
|
||||
priv->autoNodeset,
|
||||
&mem_mask, -1) < 0)
|
||||
@@ -3162,7 +3163,8 @@ static int qemuProcessHook(void *data)
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainNumatuneGetMode(h->vm->def->numa, -1, &mode) == 0) {
|
||||
- if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
|
||||
+ if ((mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT ||
|
||||
+ mode == VIR_DOMAIN_NUMATUNE_MEM_RESTRICTIVE) &&
|
||||
h->cfg->cgroupControllers & (1 << VIR_CGROUP_CONTROLLER_CPUSET) &&
|
||||
virCgroupControllerAvailable(VIR_CGROUP_CONTROLLER_CPUSET)) {
|
||||
/* Use virNuma* API iff necessary. Once set and child is exec()-ed,
|
||||
--
|
||||
2.41.0
|
||||
@ -1,58 +0,0 @@
|
||||
From a47232facc446039ed509100f80ebb7de621fffa Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <a47232facc446039ed509100f80ebb7de621fffa.1749113303.git.jdenemar@redhat.com>
|
||||
From: Collin Walling <walling@linux.ibm.com>
|
||||
Date: Mon, 16 Dec 2024 18:03:55 -0500
|
||||
Subject: [PATCH] libvirt-domain: introduce
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES
|
||||
|
||||
Introduce domain flag used to filter deprecated features from the
|
||||
domain's CPU model.
|
||||
|
||||
Signed-off-by: Collin Walling <walling@linux.ibm.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 4e2c8de2047e21d98443944a2bfe94529b269efa)
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-88716
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
include/libvirt/libvirt-domain.h | 12 ++++++++++++
|
||||
src/libvirt-domain.c | 2 +-
|
||||
2 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
|
||||
index 792973ce2d..d3101b112b 100644
|
||||
--- a/include/libvirt/libvirt-domain.h
|
||||
+++ b/include/libvirt/libvirt-domain.h
|
||||
@@ -1160,6 +1160,18 @@ int virDomainMigrateGetMaxSpeed(virDomainPtr domain,
|
||||
int virDomainMigrateStartPostCopy(virDomainPtr domain,
|
||||
unsigned int flags);
|
||||
|
||||
+/**
|
||||
+ * virConnectGetDomainCapabilitiesFlags:
|
||||
+ *
|
||||
+ * Domain capabilities flags.
|
||||
+ *
|
||||
+ * Since: 11.0.0
|
||||
+ */
|
||||
+typedef enum {
|
||||
+ /* Report host model with deprecated features disabled. (Since: 11.0.0) */
|
||||
+ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0),
|
||||
+} virConnectGetDomainCapabilitiesFlags;
|
||||
+
|
||||
char * virConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
const char *emulatorbin,
|
||||
const char *arch,
|
||||
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
|
||||
index 5912551a49..7083f10f04 100644
|
||||
--- a/src/libvirt-domain.c
|
||||
+++ b/src/libvirt-domain.c
|
||||
@@ -11573,7 +11573,7 @@ virDomainSetUserPassword(virDomainPtr dom,
|
||||
* @arch: domain architecture
|
||||
* @machine: machine type
|
||||
* @virttype: virtualization type
|
||||
- * @flags: extra flags; not used yet, so callers should always pass 0
|
||||
+ * @flags: extra flags; bitwise-OR of virConnectGetDomainCapabilitiesFlags
|
||||
*
|
||||
* Prior creating a domain (for instance via virDomainCreateXML
|
||||
* or virDomainDefineXML) it may be suitable to know what the
|
||||
--
|
||||
2.49.0
|
||||
@ -1,84 +0,0 @@
|
||||
From 71a79a215d278d83f3cd3da330e0378209983b6b Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <71a79a215d278d83f3cd3da330e0378209983b6b@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 26 Jan 2022 14:00:13 +0100
|
||||
Subject: [PATCH] node_device: Rework udevKludgeStorageType()
|
||||
|
||||
The udevKludgeStorageType() function looks at devlink name
|
||||
(/dev/XXX) and guesses the type of the (storage) device using a
|
||||
series of STRPREFIX() calls. Well those can be turn into an array
|
||||
and a for() loop, especially if we are about to add a new case
|
||||
(in the next commit).
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit ec9e2adb961f2e1a121f47e7985142e827f3347b)
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2056673
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/node_device/node_device_udev.c | 43 ++++++++++++++++--------------
|
||||
1 file changed, 23 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
|
||||
index cd1722f934..dd18401e78 100644
|
||||
--- a/src/node_device/node_device_udev.c
|
||||
+++ b/src/node_device/node_device_udev.c
|
||||
@@ -890,32 +890,35 @@ udevProcessDASD(struct udev_device *device,
|
||||
static int
|
||||
udevKludgeStorageType(virNodeDeviceDef *def)
|
||||
{
|
||||
+ size_t i;
|
||||
+ const struct {
|
||||
+ const char *prefix;
|
||||
+ const char *subst;
|
||||
+ } fixups[] = {
|
||||
+ /* virtio disk */
|
||||
+ { "/dev/vd", "disk" },
|
||||
+
|
||||
+ /* For Direct Access Storage Devices (DASDs) there are
|
||||
+ * currently no identifiers in udev besides ID_PATH. Since
|
||||
+ * ID_TYPE=disk does not exist on DASDs they fall through
|
||||
+ * the udevProcessStorage detection logic. */
|
||||
+ { "/dev/dasd", "dasd" },
|
||||
+ };
|
||||
+
|
||||
VIR_DEBUG("Could not find definitive storage type for device "
|
||||
"with sysfs path '%s', trying to guess it",
|
||||
def->sysfs_path);
|
||||
|
||||
- /* virtio disk */
|
||||
- if (STRPREFIX(def->caps->data.storage.block, "/dev/vd")) {
|
||||
- def->caps->data.storage.drive_type = g_strdup("disk");
|
||||
- VIR_DEBUG("Found storage type '%s' for device "
|
||||
- "with sysfs path '%s'",
|
||||
- def->caps->data.storage.drive_type,
|
||||
- def->sysfs_path);
|
||||
- return 0;
|
||||
+ for (i = 0; i < G_N_ELEMENTS(fixups); i++) {
|
||||
+ if (STRPREFIX(def->caps->data.storage.block, fixups[i].prefix)) {
|
||||
+ def->caps->data.storage.drive_type = g_strdup(fixups[i].subst);
|
||||
+ VIR_DEBUG("Found storage type '%s' for device with sysfs path '%s'",
|
||||
+ def->caps->data.storage.drive_type,
|
||||
+ def->sysfs_path);
|
||||
+ return 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
- /* For Direct Access Storage Devices (DASDs) there are
|
||||
- * currently no identifiers in udev besides ID_PATH. Since
|
||||
- * ID_TYPE=disk does not exist on DASDs they fall through
|
||||
- * the udevProcessStorage detection logic. */
|
||||
- if (STRPREFIX(def->caps->data.storage.block, "/dev/dasd")) {
|
||||
- def->caps->data.storage.drive_type = g_strdup("dasd");
|
||||
- VIR_DEBUG("Found storage type '%s' for device "
|
||||
- "with sysfs path '%s'",
|
||||
- def->caps->data.storage.drive_type,
|
||||
- def->sysfs_path);
|
||||
- return 0;
|
||||
- }
|
||||
VIR_DEBUG("Could not determine storage type "
|
||||
"for device with sysfs path '%s'", def->sysfs_path);
|
||||
return -1;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
From c04c7a986bd3514730e4169bf1a70bbec1fda006 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <c04c7a986bd3514730e4169bf1a70bbec1fda006@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 26 Jan 2022 13:47:33 +0100
|
||||
Subject: [PATCH] node_device: Treat NVMe disks as regular disks
|
||||
|
||||
Unfortunately, udev doesn't set ID_TYPE attribute for NVMe disks,
|
||||
therefore we have to add another case into udevKludgeStorageType()
|
||||
to treat /dev/nvme* devlinks as any other disk.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2045953
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit f103976ff34a52298df1810d82ececa3e7da4291)
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2056673
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/node_device/node_device_udev.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
|
||||
index dd18401e78..a9e8bf10da 100644
|
||||
--- a/src/node_device/node_device_udev.c
|
||||
+++ b/src/node_device/node_device_udev.c
|
||||
@@ -903,6 +903,11 @@ udevKludgeStorageType(virNodeDeviceDef *def)
|
||||
* ID_TYPE=disk does not exist on DASDs they fall through
|
||||
* the udevProcessStorage detection logic. */
|
||||
{ "/dev/dasd", "dasd" },
|
||||
+
|
||||
+ /* NVMe disk. While strictly speaking /dev/nvme is a
|
||||
+ * controller not a disk, this function is called if and
|
||||
+ * only if @def is of VIR_NODE_DEV_CAP_STORAGE type. */
|
||||
+ { "/dev/nvme", "disk" },
|
||||
};
|
||||
|
||||
VIR_DEBUG("Could not find definitive storage type for device "
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
From 989a569c9c9da0fbf89aab7f292669366b2503f1 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <989a569c9c9da0fbf89aab7f292669366b2503f1@dist-git>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Wed, 30 Nov 2022 14:53:21 +0100
|
||||
Subject: [PATCH] node_device_conf: Avoid memleak in
|
||||
virNodeDeviceGetPCIVPDDynamicCap()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The virNodeDeviceGetPCIVPDDynamicCap() function is called from
|
||||
virNodeDeviceGetPCIDynamicCaps() and therefore has to be a wee
|
||||
bit more clever about adding VPD capability. Namely, it has to
|
||||
remove the old one before adding a new one. This is how other
|
||||
functions called from virNodeDeviceGetPCIDynamicCaps() behave
|
||||
as well.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2143235
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 64d32118540aca3d42bc5ee21c8b780cafe04bfa)
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2023-2700
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
---
|
||||
src/conf/node_device_conf.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index 16b9497faf..eee94a3900 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -3100,6 +3100,9 @@ virNodeDeviceGetPCIVPDDynamicCap(virNodeDevCapPCIDev *devCapPCIDev)
|
||||
virPCIDeviceAddress devAddr;
|
||||
g_autoptr(virPCIVPDResource) res = NULL;
|
||||
|
||||
+ g_clear_pointer(&devCapPCIDev->vpd, virPCIVPDResourceFree);
|
||||
+ devCapPCIDev->flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_VPD;
|
||||
+
|
||||
devAddr.domain = devCapPCIDev->domain;
|
||||
devAddr.bus = devCapPCIDev->bus;
|
||||
devAddr.slot = devCapPCIDev->slot;
|
||||
@@ -3113,8 +3116,6 @@ virNodeDeviceGetPCIVPDDynamicCap(virNodeDevCapPCIDev *devCapPCIDev)
|
||||
if ((res = virPCIDeviceGetVPD(pciDev))) {
|
||||
devCapPCIDev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VPD;
|
||||
devCapPCIDev->vpd = g_steal_pointer(&res);
|
||||
- } else {
|
||||
- virPCIVPDResourceFree(g_steal_pointer(&devCapPCIDev->vpd));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
--
|
||||
2.40.1
|
||||
@ -1,151 +0,0 @@
|
||||
From 5921eeddf0a284ccbec04896901c9bd4177de6dd Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <5921eeddf0a284ccbec04896901c9bd4177de6dd@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:15 +0200
|
||||
Subject: [PATCH] nodedev: add optional device address of channel device to css
|
||||
device
|
||||
|
||||
Add the new introduced sysfs attribute dev_busid which provides the address
|
||||
of the device in the subchannel independent from the bound device driver.
|
||||
It is added if available in the sysfs as optional channel_dev_addr element into
|
||||
the css device capabilty providing the ccw deivce address attributes cssid,
|
||||
ssid and devno.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 122b975e4004c83b6fc442ec6cdfd71eb5b55cc4)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
docs/schemas/nodedev.rng | 5 +++++
|
||||
src/conf/node_device_conf.c | 28 ++++++++++++++++++++++++++++
|
||||
src/conf/node_device_conf.h | 2 ++
|
||||
src/node_device/node_device_udev.c | 8 ++++++++
|
||||
4 files changed, 43 insertions(+)
|
||||
|
||||
diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng
|
||||
index 29515d2d7e..43f1abc247 100644
|
||||
--- a/docs/schemas/nodedev.rng
|
||||
+++ b/docs/schemas/nodedev.rng
|
||||
@@ -677,6 +677,11 @@
|
||||
<value>css</value>
|
||||
</attribute>
|
||||
<ref name="capccwaddress"/>
|
||||
+ <optional>
|
||||
+ <element name="channel_dev_addr">
|
||||
+ <ref name="capccwaddress"/>
|
||||
+ </element>
|
||||
+ </optional>
|
||||
<optional>
|
||||
<ref name="mdev_types"/>
|
||||
</optional>
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index fcb5be24e1..16b9497faf 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -643,6 +643,17 @@ virNodeDeviceCapCSSDefFormat(virBuffer *buf,
|
||||
|
||||
virNodeDeviceCapCCWDefFormat(buf, data);
|
||||
|
||||
+ if (ccw_dev.channel_dev_addr) {
|
||||
+ virCCWDeviceAddress *ccw = ccw_dev.channel_dev_addr;
|
||||
+ virBufferAddLit(buf, "<channel_dev_addr>\n");
|
||||
+ virBufferAdjustIndent(buf, 2);
|
||||
+ virBufferAsprintf(buf, "<cssid>0x%x</cssid>\n", ccw->cssid);
|
||||
+ virBufferAsprintf(buf, "<ssid>0x%x</ssid>\n", ccw->ssid);
|
||||
+ virBufferAsprintf(buf, "<devno>0x%04x</devno>\n", ccw->devno);
|
||||
+ virBufferAdjustIndent(buf, -2);
|
||||
+ virBufferAddLit(buf, "</channel_dev_addr>\n");
|
||||
+ }
|
||||
+
|
||||
if (ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV)
|
||||
virNodeDeviceCapMdevTypesFormat(buf,
|
||||
ccw_dev.mdev_types,
|
||||
@@ -1255,6 +1266,7 @@ virNodeDevCapCSSParseXML(xmlXPathContextPtr ctxt,
|
||||
g_autofree xmlNodePtr *nodes = NULL;
|
||||
int n = 0;
|
||||
size_t i = 0;
|
||||
+ xmlNodePtr channel_ddno = NULL;
|
||||
|
||||
ctxt->node = node;
|
||||
|
||||
@@ -1269,6 +1281,21 @@ virNodeDevCapCSSParseXML(xmlXPathContextPtr ctxt,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* channel_dev_addr is optional */
|
||||
+ if ((channel_ddno = virXPathNode("./channel_dev_addr[1]", ctxt))) {
|
||||
+ g_autofree virCCWDeviceAddress *channel_dev = NULL;
|
||||
+
|
||||
+ channel_dev = g_new0(virCCWDeviceAddress, 1);
|
||||
+
|
||||
+ if (virNodeDevCCWDeviceAddressParseXML(ctxt,
|
||||
+ channel_ddno,
|
||||
+ def->name,
|
||||
+ channel_dev) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ ccw_dev->channel_dev_addr = g_steal_pointer(&channel_dev);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2637,6 +2664,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDef *caps)
|
||||
for (i = 0; i < data->ccw_dev.nmdev_types; i++)
|
||||
virMediatedDeviceTypeFree(data->ccw_dev.mdev_types[i]);
|
||||
g_free(data->ccw_dev.mdev_types);
|
||||
+ g_free(data->ccw_dev.channel_dev_addr);
|
||||
break;
|
||||
case VIR_NODE_DEV_CAP_AP_MATRIX:
|
||||
g_free(data->ap_matrix.addr);
|
||||
diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
|
||||
index e4d1f67d53..d1751ed874 100644
|
||||
--- a/src/conf/node_device_conf.h
|
||||
+++ b/src/conf/node_device_conf.h
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "internal.h"
|
||||
#include "virbitmap.h"
|
||||
+#include "virccw.h"
|
||||
#include "virpcivpd.h"
|
||||
#include "virscsihost.h"
|
||||
#include "virpci.h"
|
||||
@@ -279,6 +280,7 @@ struct _virNodeDevCapCCW {
|
||||
unsigned int flags; /* enum virNodeDevCCWCapFlags */
|
||||
virMediatedDeviceType **mdev_types;
|
||||
size_t nmdev_types;
|
||||
+ virCCWDeviceAddress *channel_dev_addr;
|
||||
};
|
||||
|
||||
typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA;
|
||||
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
|
||||
index ffcb3e8640..611a2592ca 100644
|
||||
--- a/src/node_device/node_device_udev.c
|
||||
+++ b/src/node_device/node_device_udev.c
|
||||
@@ -1128,6 +1128,8 @@ static int
|
||||
udevProcessCSS(struct udev_device *device,
|
||||
virNodeDeviceDef *def)
|
||||
{
|
||||
+ g_autofree char *dev_busid = NULL;
|
||||
+
|
||||
/* only process IO subchannel and vfio-ccw devices to keep the list sane */
|
||||
if (!def->driver ||
|
||||
(STRNEQ(def->driver, "io_subchannel") &&
|
||||
@@ -1139,6 +1141,12 @@ udevProcessCSS(struct udev_device *device,
|
||||
|
||||
udevGenerateDeviceName(device, def, NULL);
|
||||
|
||||
+ /* process optional channel devices information */
|
||||
+ udevGetStringSysfsAttr(device, "dev_busid", &dev_busid);
|
||||
+
|
||||
+ if (dev_busid != NULL)
|
||||
+ def->caps->data.ccw_dev.channel_dev_addr = virCCWDeviceAddressFromString(dev_busid);
|
||||
+
|
||||
if (virNodeDeviceGetCSSDynamicCaps(def->sysfs_path, &def->caps->data.ccw_dev) < 0)
|
||||
return -1;
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,149 +0,0 @@
|
||||
From ea4976de7bccfe8016950d040629a6818a58db4e Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <ea4976de7bccfe8016950d040629a6818a58db4e@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:16 +0200
|
||||
Subject: [PATCH] nodedev: add tests for optional device address to css device
|
||||
|
||||
Add nodedev schema parsing and format tests for the optional new device
|
||||
address on the css devices.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 127fda5e84790af2c5a16b61a87e339391cccb3b)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
.../css_0_0_10000-invalid.xml | 10 +++++++++
|
||||
...s_0_0_fffe_mdev_types_channel_dev_addr.xml | 22 +++++++++++++++++++
|
||||
.../css_0_0_ffff_channel_dev_addr-invalid.xml | 15 +++++++++++++
|
||||
.../css_0_0_ffff_channel_dev_addr.xml | 15 +++++++++++++
|
||||
...s_0_0_fffe_mdev_types_channel_dev_addr.xml | 1 +
|
||||
.../css_0_0_ffff_channel_dev_addr.xml | 1 +
|
||||
tests/nodedevxml2xmltest.c | 2 ++
|
||||
7 files changed, 66 insertions(+)
|
||||
create mode 100644 tests/nodedevschemadata/css_0_0_10000-invalid.xml
|
||||
create mode 100644 tests/nodedevschemadata/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
create mode 100644 tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr-invalid.xml
|
||||
create mode 100644 tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr.xml
|
||||
create mode 120000 tests/nodedevxml2xmlout/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
create mode 120000 tests/nodedevxml2xmlout/css_0_0_ffff_channel_dev_addr.xml
|
||||
|
||||
diff --git a/tests/nodedevschemadata/css_0_0_10000-invalid.xml b/tests/nodedevschemadata/css_0_0_10000-invalid.xml
|
||||
new file mode 100644
|
||||
index 0000000000..740bb489a7
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevschemadata/css_0_0_10000-invalid.xml
|
||||
@@ -0,0 +1,10 @@
|
||||
+<device>
|
||||
+ <name>css_0_0_10000</name>
|
||||
+ <path>/sys/devices/css0/0.0.10000</path>
|
||||
+ <parent>computer</parent>
|
||||
+ <capability type='css'>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0x10000</devno>
|
||||
+ </capability>
|
||||
+</device>
|
||||
diff --git a/tests/nodedevschemadata/css_0_0_fffe_mdev_types_channel_dev_addr.xml b/tests/nodedevschemadata/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
new file mode 100644
|
||||
index 0000000000..198dcb0cb0
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevschemadata/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
@@ -0,0 +1,22 @@
|
||||
+<device>
|
||||
+ <name>css_0_0_fffe</name>
|
||||
+ <path>/sys/devices/css0/0.0.fffe</path>
|
||||
+ <parent>computer</parent>
|
||||
+ <capability type='css'>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0xfffe</devno>
|
||||
+ <channel_dev_addr>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0x0815</devno>
|
||||
+ </channel_dev_addr>
|
||||
+ <capability type='mdev_types'>
|
||||
+ <type id='vfio_ccw-io'>
|
||||
+ <name>I/O subchannel (Non-QDIO)</name>
|
||||
+ <deviceAPI>vfio-ccw</deviceAPI>
|
||||
+ <availableInstances>1</availableInstances>
|
||||
+ </type>
|
||||
+ </capability>
|
||||
+ </capability>
|
||||
+</device>
|
||||
diff --git a/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr-invalid.xml b/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr-invalid.xml
|
||||
new file mode 100644
|
||||
index 0000000000..3f2c5558c7
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr-invalid.xml
|
||||
@@ -0,0 +1,15 @@
|
||||
+<device>
|
||||
+ <name>css_0_0_ffff</name>
|
||||
+ <path>/sys/devices/css0/0.0.ffff</path>
|
||||
+ <parent>computer</parent>
|
||||
+ <capability type='css'>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0xffff</devno>
|
||||
+ <channel_dev_addr>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0x10000</devno>
|
||||
+ </channel_dev_addr>
|
||||
+ </capability>
|
||||
+</device>
|
||||
diff --git a/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr.xml b/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr.xml
|
||||
new file mode 100644
|
||||
index 0000000000..17a77cb282
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevschemadata/css_0_0_ffff_channel_dev_addr.xml
|
||||
@@ -0,0 +1,15 @@
|
||||
+<device>
|
||||
+ <name>css_0_0_ffff</name>
|
||||
+ <path>/sys/devices/css0/0.0.ffff</path>
|
||||
+ <parent>computer</parent>
|
||||
+ <capability type='css'>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0xffff</devno>
|
||||
+ <channel_dev_addr>
|
||||
+ <cssid>0x0</cssid>
|
||||
+ <ssid>0x0</ssid>
|
||||
+ <devno>0x0815</devno>
|
||||
+ </channel_dev_addr>
|
||||
+ </capability>
|
||||
+</device>
|
||||
diff --git a/tests/nodedevxml2xmlout/css_0_0_fffe_mdev_types_channel_dev_addr.xml b/tests/nodedevxml2xmlout/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
new file mode 120000
|
||||
index 0000000000..65ab582ee8
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevxml2xmlout/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
@@ -0,0 +1 @@
|
||||
+../nodedevschemadata/css_0_0_fffe_mdev_types_channel_dev_addr.xml
|
||||
\ No newline at end of file
|
||||
diff --git a/tests/nodedevxml2xmlout/css_0_0_ffff_channel_dev_addr.xml b/tests/nodedevxml2xmlout/css_0_0_ffff_channel_dev_addr.xml
|
||||
new file mode 120000
|
||||
index 0000000000..cbfe719777
|
||||
--- /dev/null
|
||||
+++ b/tests/nodedevxml2xmlout/css_0_0_ffff_channel_dev_addr.xml
|
||||
@@ -0,0 +1 @@
|
||||
+../nodedevschemadata/css_0_0_ffff_channel_dev_addr.xml
|
||||
\ No newline at end of file
|
||||
diff --git a/tests/nodedevxml2xmltest.c b/tests/nodedevxml2xmltest.c
|
||||
index 557347fb07..ad9562cc82 100644
|
||||
--- a/tests/nodedevxml2xmltest.c
|
||||
+++ b/tests/nodedevxml2xmltest.c
|
||||
@@ -125,7 +125,9 @@ mymain(void)
|
||||
DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b");
|
||||
DO_TEST("ccw_0_0_ffff");
|
||||
DO_TEST("css_0_0_ffff");
|
||||
+ DO_TEST("css_0_0_ffff_channel_dev_addr");
|
||||
DO_TEST("css_0_0_fffe_mdev_types");
|
||||
+ DO_TEST("css_0_0_fffe_mdev_types_channel_dev_addr");
|
||||
DO_TEST("ap_card07");
|
||||
DO_TEST("ap_07_0038");
|
||||
DO_TEST("ap_matrix");
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,32 +0,0 @@
|
||||
From d82e4473a66da27d2c6f41f8ecadacbd00f44430 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <d82e4473a66da27d2c6f41f8ecadacbd00f44430@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:00 +0200
|
||||
Subject: [PATCH] nodedev: fix reported error msg in css cap XML parsing
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Marc Hartmayer <mhartmay@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 78094a4bd1562fec73ae99c67ddcbedd83953d5c)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/conf/node_device_conf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index 0bac0fde8d..a6ebf4b66f 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -1193,7 +1193,7 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
|
||||
if (virStrToLong_uip(ssid, NULL, 0, &ccw_dev->ssid) < 0) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("invalid ssid value '%s' for '%s'"),
|
||||
- cssid, def->name);
|
||||
+ ssid, def->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,35 +0,0 @@
|
||||
From 7c60078d7a6442dc8cb5a711876d28f70d892bff Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <7c60078d7a6442dc8cb5a711876d28f70d892bff@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Mon, 23 May 2022 17:56:21 +0200
|
||||
Subject: [PATCH] nodedev: prevent internal error on dev_busid parse
|
||||
|
||||
As "none" is a legal value represented in the sysfs attribute dev_busid
|
||||
this patch prevents libvirt from incorrectly reporting an internal error.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Suggested-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit e37c39747be0792d03c450e56ddb3c78d08cbf3e)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/node_device/node_device_udev.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
|
||||
index 611a2592ca..b76e3de681 100644
|
||||
--- a/src/node_device/node_device_udev.c
|
||||
+++ b/src/node_device/node_device_udev.c
|
||||
@@ -1144,7 +1144,7 @@ udevProcessCSS(struct udev_device *device,
|
||||
/* process optional channel devices information */
|
||||
udevGetStringSysfsAttr(device, "dev_busid", &dev_busid);
|
||||
|
||||
- if (dev_busid != NULL)
|
||||
+ if (dev_busid != NULL && STRNEQ(dev_busid, "none"))
|
||||
def->caps->data.ccw_dev.channel_dev_addr = virCCWDeviceAddressFromString(dev_busid);
|
||||
|
||||
if (virNodeDeviceGetCSSDynamicCaps(def->sysfs_path, &def->caps->data.ccw_dev) < 0)
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,140 +0,0 @@
|
||||
From ef8c30a091b5b0f08f9405878b49c21c5525dd0a Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <ef8c30a091b5b0f08f9405878b49c21c5525dd0a@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:12 +0200
|
||||
Subject: [PATCH] nodedev: refactor ccw device address parsing from XML
|
||||
|
||||
Move ccw device address XML parsing into new method for later reuse.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 4402295d371a62ab8632d23002283b8a7721e6a7)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/conf/node_device_conf.c | 96 ++++++++++++++++++++++---------------
|
||||
1 file changed, 58 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index 1e00f65717..8982368465 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -1141,6 +1141,58 @@ virNodeDevAPMatrixCapabilityParseXML(xmlXPathContextPtr ctxt,
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virNodeDevCCWDeviceAddressParseXML(xmlXPathContextPtr ctxt,
|
||||
+ xmlNodePtr node,
|
||||
+ const char *dev_name,
|
||||
+ virCCWDeviceAddress *ccw_addr)
|
||||
+{
|
||||
+ VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
||||
+ g_autofree char *cssid = NULL;
|
||||
+ g_autofree char *ssid = NULL;
|
||||
+ g_autofree char *devno = NULL;
|
||||
+
|
||||
+ ctxt->node = node;
|
||||
+
|
||||
+ if (!(cssid = virXPathString("string(./cssid[1])", ctxt))) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("missing cssid value for '%s'"), dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (virStrToLong_uip(cssid, NULL, 0, &ccw_addr->cssid) < 0) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("invalid cssid value '%s' for '%s'"),
|
||||
+ cssid, dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!(ssid = virXPathString("string(./ssid[1])", ctxt))) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("missing ssid value for '%s'"), dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (virStrToLong_uip(ssid, NULL, 0, &ccw_addr->ssid) < 0) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("invalid ssid value '%s' for '%s'"),
|
||||
+ ssid, dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!(devno = virXPathString("string(./devno[1])", ctxt))) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("missing devno value for '%s'"), dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (virStrToLong_uip(devno, NULL, 16, &ccw_addr->devno) < 0) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("invalid devno value '%s' for '%s'"),
|
||||
+ devno, dev_name);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
virNodeDevCSSCapabilityParseXML(xmlXPathContextPtr ctxt,
|
||||
xmlNodePtr node,
|
||||
@@ -1178,50 +1230,18 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
|
||||
g_autofree xmlNodePtr *nodes = NULL;
|
||||
int n = 0;
|
||||
size_t i = 0;
|
||||
- g_autofree char *cssid = NULL;
|
||||
- g_autofree char *ssid = NULL;
|
||||
- g_autofree char *devno = NULL;
|
||||
+ g_autofree virCCWDeviceAddress *ccw_addr = NULL;
|
||||
|
||||
ctxt->node = node;
|
||||
|
||||
- if (!(cssid = virXPathString("string(./cssid[1])", ctxt))) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("missing cssid value for '%s'"), def->name);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (virStrToLong_uip(cssid, NULL, 0, &ccw_dev->cssid) < 0) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("invalid cssid value '%s' for '%s'"),
|
||||
- cssid, def->name);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (!(ssid = virXPathString("string(./ssid[1])", ctxt))) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("missing ssid value for '%s'"), def->name);
|
||||
- return -1;
|
||||
- }
|
||||
+ ccw_addr = g_new0(virCCWDeviceAddress, 1);
|
||||
|
||||
- if (virStrToLong_uip(ssid, NULL, 0, &ccw_dev->ssid) < 0) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("invalid ssid value '%s' for '%s'"),
|
||||
- ssid, def->name);
|
||||
+ if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0)
|
||||
return -1;
|
||||
- }
|
||||
|
||||
- if (!(devno = virXPathString("string(./devno[1])", ctxt))) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("missing devno value for '%s'"), def->name);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (virStrToLong_uip(devno, NULL, 16, &ccw_dev->devno) < 0) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
- _("invalid devno value '%s' for '%s'"),
|
||||
- devno, def->name);
|
||||
- return -1;
|
||||
- }
|
||||
+ ccw_dev->cssid = ccw_addr->cssid;
|
||||
+ ccw_dev->ssid = ccw_addr->ssid;
|
||||
+ ccw_dev->devno = ccw_addr->devno;
|
||||
|
||||
if ((n = virXPathNodeSet("./capability", ctxt, &nodes)) < 0)
|
||||
return -1;
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,99 +0,0 @@
|
||||
From 286c821eee3b682d6aa4aeaa13aad92382708803 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <286c821eee3b682d6aa4aeaa13aad92382708803@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:13 +0200
|
||||
Subject: [PATCH] nodedev: refactor css XML parsing from ccw XML parsing
|
||||
|
||||
In preparation for easier extension later.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 245ff2d6634b3afb0dbf0d295051e458095bfc80)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/conf/node_device_conf.c | 40 +++++++++++++++++++++++++++----------
|
||||
1 file changed, 30 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index 8982368465..fcb5be24e1 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -1193,6 +1193,31 @@ virNodeDevCCWDeviceAddressParseXML(xmlXPathContextPtr ctxt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+
|
||||
+static int
|
||||
+virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
|
||||
+ virNodeDeviceDef *def,
|
||||
+ xmlNodePtr node,
|
||||
+ virNodeDevCapCCW *ccw_dev)
|
||||
+{
|
||||
+ VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
||||
+ g_autofree virCCWDeviceAddress *ccw_addr = NULL;
|
||||
+
|
||||
+ ctxt->node = node;
|
||||
+
|
||||
+ ccw_addr = g_new0(virCCWDeviceAddress, 1);
|
||||
+
|
||||
+ if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ ccw_dev->cssid = ccw_addr->cssid;
|
||||
+ ccw_dev->ssid = ccw_addr->ssid;
|
||||
+ ccw_dev->devno = ccw_addr->devno;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
virNodeDevCSSCapabilityParseXML(xmlXPathContextPtr ctxt,
|
||||
xmlNodePtr node,
|
||||
@@ -1221,7 +1246,7 @@ virNodeDevCSSCapabilityParseXML(xmlXPathContextPtr ctxt,
|
||||
|
||||
|
||||
static int
|
||||
-virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
|
||||
+virNodeDevCapCSSParseXML(xmlXPathContextPtr ctxt,
|
||||
virNodeDeviceDef *def,
|
||||
xmlNodePtr node,
|
||||
virNodeDevCapCCW *ccw_dev)
|
||||
@@ -1230,19 +1255,12 @@ virNodeDevCapCCWParseXML(xmlXPathContextPtr ctxt,
|
||||
g_autofree xmlNodePtr *nodes = NULL;
|
||||
int n = 0;
|
||||
size_t i = 0;
|
||||
- g_autofree virCCWDeviceAddress *ccw_addr = NULL;
|
||||
|
||||
ctxt->node = node;
|
||||
|
||||
- ccw_addr = g_new0(virCCWDeviceAddress, 1);
|
||||
-
|
||||
- if (virNodeDevCCWDeviceAddressParseXML(ctxt, node, def->name, ccw_addr) < 0)
|
||||
+ if (virNodeDevCapCCWParseXML(ctxt, def, node, ccw_dev) < 0)
|
||||
return -1;
|
||||
|
||||
- ccw_dev->cssid = ccw_addr->cssid;
|
||||
- ccw_dev->ssid = ccw_addr->ssid;
|
||||
- ccw_dev->devno = ccw_addr->devno;
|
||||
-
|
||||
if ((n = virXPathNodeSet("./capability", ctxt, &nodes)) < 0)
|
||||
return -1;
|
||||
|
||||
@@ -2282,9 +2300,11 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt,
|
||||
ret = virNodeDevCapMdevParseXML(ctxt, def, node, &caps->data.mdev);
|
||||
break;
|
||||
case VIR_NODE_DEV_CAP_CCW_DEV:
|
||||
- case VIR_NODE_DEV_CAP_CSS_DEV:
|
||||
ret = virNodeDevCapCCWParseXML(ctxt, def, node, &caps->data.ccw_dev);
|
||||
break;
|
||||
+ case VIR_NODE_DEV_CAP_CSS_DEV:
|
||||
+ ret = virNodeDevCapCSSParseXML(ctxt, def, node, &caps->data.ccw_dev);
|
||||
+ break;
|
||||
case VIR_NODE_DEV_CAP_AP_CARD:
|
||||
ret = virNodeDevCapAPCardParseXML(ctxt, def, node,
|
||||
&caps->data.ap_card);
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,62 +0,0 @@
|
||||
From d370e2e984b4501060ea0d7a10629db0bfe51ef2 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <d370e2e984b4501060ea0d7a10629db0bfe51ef2@dist-git>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Fri, 13 May 2022 12:31:11 +0200
|
||||
Subject: [PATCH] nodedev: refactor css format from ccw format method
|
||||
|
||||
In preparation for easier extension later.
|
||||
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit c5864885060b136214b4bcef25d604cc3d147014)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165011
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
src/conf/node_device_conf.c | 21 +++++++++++++++++----
|
||||
1 file changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
|
||||
index a6ebf4b66f..1e00f65717 100644
|
||||
--- a/src/conf/node_device_conf.c
|
||||
+++ b/src/conf/node_device_conf.c
|
||||
@@ -632,10 +632,21 @@ virNodeDeviceCapCCWDefFormat(virBuffer *buf,
|
||||
data->ccw_dev.ssid);
|
||||
virBufferAsprintf(buf, "<devno>0x%04x</devno>\n",
|
||||
data->ccw_dev.devno);
|
||||
- if (data->ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void
|
||||
+virNodeDeviceCapCSSDefFormat(virBuffer *buf,
|
||||
+ const virNodeDevCapData *data)
|
||||
+{
|
||||
+ virNodeDevCapCCW ccw_dev = data->ccw_dev;
|
||||
+
|
||||
+ virNodeDeviceCapCCWDefFormat(buf, data);
|
||||
+
|
||||
+ if (ccw_dev.flags & VIR_NODE_DEV_CAP_FLAG_CSS_MDEV)
|
||||
virNodeDeviceCapMdevTypesFormat(buf,
|
||||
- data->ccw_dev.mdev_types,
|
||||
- data->ccw_dev.nmdev_types);
|
||||
+ ccw_dev.mdev_types,
|
||||
+ ccw_dev.nmdev_types);
|
||||
}
|
||||
|
||||
|
||||
@@ -724,9 +735,11 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def)
|
||||
virNodeDeviceCapMdevDefFormat(&buf, data);
|
||||
break;
|
||||
case VIR_NODE_DEV_CAP_CCW_DEV:
|
||||
- case VIR_NODE_DEV_CAP_CSS_DEV:
|
||||
virNodeDeviceCapCCWDefFormat(&buf, data);
|
||||
break;
|
||||
+ case VIR_NODE_DEV_CAP_CSS_DEV:
|
||||
+ virNodeDeviceCapCSSDefFormat(&buf, data);
|
||||
+ break;
|
||||
case VIR_NODE_DEV_CAP_VDPA:
|
||||
virNodeDeviceCapVDPADefFormat(&buf, data);
|
||||
break;
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@ -1,79 +0,0 @@
|
||||
From aebcc09c7060f6eace93821c6a782031cf107d85 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <aebcc09c7060f6eace93821c6a782031cf107d85.1687452713.git.jdenemar@redhat.com>
|
||||
From: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Date: Mon, 8 May 2023 19:10:46 +0200
|
||||
Subject: [PATCH] nodedev: update transient mdevs
|
||||
|
||||
Instead of updating defined mdevs only add another update for active
|
||||
devices as well to cover transient mdev devices as well.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2143158
|
||||
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
||||
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2143160
|
||||
|
||||
(cherry picked from commit 44a0f2f0c8ff5e78c238013ed297b8fce223ac5a)
|
||||
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
|
||||
---
|
||||
src/node_device/node_device_driver.c | 31 ++++++++++++++++++++++++++++
|
||||
1 file changed, 31 insertions(+)
|
||||
|
||||
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
|
||||
index e6ab4bb94c..943f6121a0 100644
|
||||
--- a/src/node_device/node_device_driver.c
|
||||
+++ b/src/node_device/node_device_driver.c
|
||||
@@ -1651,6 +1651,24 @@ virMdevctlListDefined(virNodeDeviceDef ***devs, char **errmsg)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virMdevctlListActive(virNodeDeviceDef ***devs, char **errmsg)
|
||||
+{
|
||||
+ int status;
|
||||
+ g_autofree char *output = NULL;
|
||||
+ g_autoptr(virCommand) cmd = nodeDeviceGetMdevctlListCommand(false, &output, errmsg);
|
||||
+
|
||||
+ if (virCommandRun(cmd, &status) < 0 || status != 0) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!output)
|
||||
+ return -1;
|
||||
+
|
||||
+ return nodeDeviceParseMdevctlJSON(output, devs);
|
||||
+}
|
||||
+
|
||||
+
|
||||
typedef struct _virMdevctlForEachData virMdevctlForEachData;
|
||||
struct _virMdevctlForEachData {
|
||||
int ndefs;
|
||||
@@ -1712,6 +1730,8 @@ int
|
||||
nodeDeviceUpdateMediatedDevices(void)
|
||||
{
|
||||
g_autofree virNodeDeviceDef **defs = NULL;
|
||||
+ g_autofree virNodeDeviceDef **act_defs = NULL;
|
||||
+ int act_ndefs = 0;
|
||||
g_autofree char *errmsg = NULL;
|
||||
g_autofree char *mdevctl = NULL;
|
||||
virMdevctlForEachData data = { 0, };
|
||||
@@ -1738,6 +1758,17 @@ nodeDeviceUpdateMediatedDevices(void)
|
||||
if (nodeDeviceUpdateMediatedDevice(defs[i]) < 0)
|
||||
return -1;
|
||||
|
||||
+ /* Update active/transient mdev devices */
|
||||
+ if ((act_ndefs = virMdevctlListActive(&act_defs, &errmsg)) < 0) {
|
||||
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
+ _("failed to query mdevs from mdevctl: %1$s"), errmsg);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < act_ndefs; i++)
|
||||
+ if (nodeDeviceUpdateMediatedDevice(act_defs[i]) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.41.0
|
||||
@ -1,55 +0,0 @@
|
||||
From dc6ab8b51ff53ba22abfb84f24641aa87320038a Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <dc6ab8b51ff53ba22abfb84f24641aa87320038a@dist-git>
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 8 Mar 2022 17:28:38 +0000
|
||||
Subject: [PATCH] nwfilter: fix crash when counting number of network filters
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The virNWFilterObjListNumOfNWFilters method iterates over the
|
||||
driver->nwfilters, accessing virNWFilterObj instances. As such
|
||||
it needs to be protected against concurrent modification of
|
||||
the driver->nwfilters object.
|
||||
|
||||
This API allows unprivileged users to connect, so users with
|
||||
read-only access to libvirt can cause a denial of service
|
||||
crash if they are able to race with a call of virNWFilterUndefine.
|
||||
Since network filters are usually statically defined, this is
|
||||
considered a low severity problem.
|
||||
|
||||
This is assigned CVE-2022-0897.
|
||||
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit a4947e8f63c3e6b7b067b444f3d6cf674c0d7f36)
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2063902
|
||||
---
|
||||
src/nwfilter/nwfilter_driver.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
|
||||
index 200451d6b1..956aca6421 100644
|
||||
--- a/src/nwfilter/nwfilter_driver.c
|
||||
+++ b/src/nwfilter/nwfilter_driver.c
|
||||
@@ -478,11 +478,15 @@ nwfilterLookupByName(virConnectPtr conn,
|
||||
static int
|
||||
nwfilterConnectNumOfNWFilters(virConnectPtr conn)
|
||||
{
|
||||
+ int ret;
|
||||
if (virConnectNumOfNWFiltersEnsureACL(conn) < 0)
|
||||
return -1;
|
||||
|
||||
- return virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn,
|
||||
- virConnectNumOfNWFiltersCheckACL);
|
||||
+ nwfilterDriverLock();
|
||||
+ ret = virNWFilterObjListNumOfNWFilters(driver->nwfilters, conn,
|
||||
+ virConnectNumOfNWFiltersCheckACL);
|
||||
+ nwfilterDriverUnlock();
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -1,155 +0,0 @@
|
||||
From 2595c7716b19214b2729b41b86656f96a2cd18bc Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <2595c7716b19214b2729b41b86656f96a2cd18bc@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 22 Jun 2022 15:21:30 +0200
|
||||
Subject: [PATCH] qemu: Add qemuDomainSetMaxMemLock helper
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
qemuDomainAdjustMaxMemLock combined computing the desired limit with
|
||||
applying it. This patch separates the code to apply a memory locking
|
||||
limit to a new qemuDomainSetMaxMemLock helper for better reusability.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit dff51c7f5760ded8235076f55d082fe4363f2f78)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2089433
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_domain.c | 95 ++++++++++++++++++++++++++----------------
|
||||
src/qemu/qemu_domain.h | 3 ++
|
||||
2 files changed, 61 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index ee7d310903..a81789f194 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -9261,6 +9261,61 @@ qemuDomainGetMemLockLimitBytes(virDomainDef *def,
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * qemuDomainSetMaxMemLock:
|
||||
+ * @vm: domain
|
||||
+ * @limit: the desired memory locking limit
|
||||
+ * @origPtr: where to store (or load from) the original value of the limit
|
||||
+ *
|
||||
+ * Set the memory locking limit for @vm unless it's already big enough. If
|
||||
+ * @origPtr is non-NULL, the original value of the limit will be store there
|
||||
+ * and can be restored by calling this function with @limit == 0.
|
||||
+ *
|
||||
+ * Returns: 0 on success, -1 otherwise.
|
||||
+ */
|
||||
+int
|
||||
+qemuDomainSetMaxMemLock(virDomainObj *vm,
|
||||
+ unsigned long long limit,
|
||||
+ unsigned long long *origPtr)
|
||||
+{
|
||||
+ unsigned long long current = 0;
|
||||
+
|
||||
+ if (virProcessGetMaxMemLock(vm->pid, ¤t) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (limit > 0) {
|
||||
+ VIR_DEBUG("Requested memory lock limit: %llu", limit);
|
||||
+ /* If the limit is already high enough, we can assume
|
||||
+ * that some external process is taking care of managing
|
||||
+ * process limits and we shouldn't do anything ourselves:
|
||||
+ * we're probably running in a containerized environment
|
||||
+ * where we don't have enough privilege anyway */
|
||||
+ if (current >= limit) {
|
||||
+ VIR_DEBUG("Current limit %llu is big enough", current);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* If this is the first time adjusting the limit, save the current
|
||||
+ * value so that we can restore it once memory locking is no longer
|
||||
+ * required */
|
||||
+ if (origPtr && *origPtr == 0)
|
||||
+ *origPtr = current;
|
||||
+ } else {
|
||||
+ /* Once memory locking is no longer required, we can restore the
|
||||
+ * original, usually very low, limit. But only if we actually stored
|
||||
+ * the original limit before. */
|
||||
+ if (!origPtr || *origPtr == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ limit = *origPtr;
|
||||
+ *origPtr = 0;
|
||||
+ VIR_DEBUG("Resetting memory lock limit back to %llu", limit);
|
||||
+ }
|
||||
+
|
||||
+ return virProcessSetMaxMemLock(vm->pid, limit);
|
||||
+}
|
||||
+
|
||||
+
|
||||
/**
|
||||
* qemuDomainAdjustMaxMemLock:
|
||||
* @vm: domain
|
||||
@@ -9282,43 +9337,9 @@ int
|
||||
qemuDomainAdjustMaxMemLock(virDomainObj *vm,
|
||||
bool forceVFIO)
|
||||
{
|
||||
- qemuDomainObjPrivate *priv = vm->privateData;
|
||||
- unsigned long long currentMemLock = 0;
|
||||
- unsigned long long desiredMemLock = 0;
|
||||
-
|
||||
- desiredMemLock = qemuDomainGetMemLockLimitBytes(vm->def, forceVFIO);
|
||||
- if (virProcessGetMaxMemLock(vm->pid, ¤tMemLock) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (desiredMemLock > 0) {
|
||||
- if (currentMemLock < desiredMemLock) {
|
||||
- /* If this is the first time adjusting the limit, save the current
|
||||
- * value so that we can restore it once memory locking is no longer
|
||||
- * required */
|
||||
- if (priv->originalMemlock == 0) {
|
||||
- priv->originalMemlock = currentMemLock;
|
||||
- }
|
||||
- } else {
|
||||
- /* If the limit is already high enough, we can assume
|
||||
- * that some external process is taking care of managing
|
||||
- * process limits and we shouldn't do anything ourselves:
|
||||
- * we're probably running in a containerized environment
|
||||
- * where we don't have enough privilege anyway */
|
||||
- desiredMemLock = 0;
|
||||
- }
|
||||
- } else {
|
||||
- /* Once memory locking is no longer required, we can restore the
|
||||
- * original, usually very low, limit */
|
||||
- desiredMemLock = priv->originalMemlock;
|
||||
- priv->originalMemlock = 0;
|
||||
- }
|
||||
-
|
||||
- if (desiredMemLock > 0 &&
|
||||
- virProcessSetMaxMemLock(vm->pid, desiredMemLock) < 0) {
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
+ return qemuDomainSetMaxMemLock(vm,
|
||||
+ qemuDomainGetMemLockLimitBytes(vm->def, forceVFIO),
|
||||
+ &QEMU_DOMAIN_PRIVATE(vm)->originalMemlock);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index e9497d20de..6d1d23439a 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -789,6 +789,9 @@ int qemuDomainAdjustMaxMemLock(virDomainObj *vm,
|
||||
bool forceVFIO);
|
||||
int qemuDomainAdjustMaxMemLockHostdev(virDomainObj *vm,
|
||||
virDomainHostdevDef *hostdev);
|
||||
+int qemuDomainSetMaxMemLock(virDomainObj *vm,
|
||||
+ unsigned long long limit,
|
||||
+ unsigned long long *origPtr);
|
||||
|
||||
int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
|
||||
const virDomainMemoryDef *mem);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@ -0,0 +1,194 @@
|
||||
From 8ceddabb12d1b32fbcffe9697885462af133d309 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <8ceddabb12d1b32fbcffe9697885462af133d309.1784297531.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Thu, 11 Jun 2026 12:00:45 +0200
|
||||
Subject: [PATCH] qemu: Allow reuse of 'qemuProcessStartUpdateCustomCaps'
|
||||
|
||||
Move and rename the function to 'qemuDomainUpdateCustomCapabilities' and
|
||||
modify the arguments so that it will be possible to reuse it also in the
|
||||
post-parse and validation code which ought to base decisions on the same
|
||||
logic as VM startup would.
|
||||
|
||||
Since copying of the qemu capabilities object is very expensive (I've
|
||||
observed an almost 4x slowdown of qemuxmlconftest)
|
||||
'qemuDomainUpdateCustomCapabilities' copies the capabilities only when
|
||||
necessary.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 9ec26e2c4f7c60a1ba62a90948a51a7ac0f582d8)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-186019
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177646 (rhel-9.9)
|
||||
---
|
||||
src/qemu/qemu_domain.c | 79 +++++++++++++++++++++++++++++++++++++++++
|
||||
src/qemu/qemu_domain.h | 6 ++++
|
||||
src/qemu/qemu_process.c | 42 +---------------------
|
||||
3 files changed, 86 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 495cbd4f7d..7699d1000f 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -11769,3 +11769,82 @@ qemuDomainMachineSupportsFloppy(const char *machine,
|
||||
|
||||
return true;
|
||||
}
|
||||
+
|
||||
+
|
||||
+/**
|
||||
+ * qemuDomainUpdateCustomCapabilities:
|
||||
+ * @def: domain definition
|
||||
+ * @qemuCaps: qemu capabilities
|
||||
+ * @qemuCapsCopy: if non-NULL filled filled with a valid virQEMUCaps pointer (see below)
|
||||
+ *
|
||||
+ * Updates @qemuCaps based on the qemu namespace XML config for modifying
|
||||
+ * capabilities:
|
||||
+ *
|
||||
+ * <domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
|
||||
+ * <qemu:capabilities>
|
||||
+ * <qemu:add capability='blockdev'/>
|
||||
+ * <qemu:del capability='drive'/>
|
||||
+ * </qemu:capabilities>
|
||||
+ * </domain>
|
||||
+ *
|
||||
+ * If @qemuCapsCopy is NULL, @qemuCaps is directly modified.
|
||||
+ *
|
||||
+ * If @qemuCapsCopy is non-NULL, it's always filled with a virQEMUCaps instance
|
||||
+ * that the caller needs to unref. The following applies:
|
||||
+ * - no caps modification needed: @qemuCaps is ref'd and filled into @qemuCapsCopy
|
||||
+ * - caps modifications are needed: @qemuCaps is copied into @qemuCapsCopy and
|
||||
+ * modifications happen on the copy
|
||||
+ *
|
||||
+ * Returns 0 on success (including when no modification was needed), -1 on
|
||||
+ * error and reports libvirt errors.
|
||||
+ */
|
||||
+int
|
||||
+qemuDomainUpdateCustomCapabilities(const virDomainDef *def,
|
||||
+ virQEMUCaps *qemuCaps,
|
||||
+ virQEMUCaps **qemuCapsCopy)
|
||||
+{
|
||||
+ qemuDomainXmlNsDef *nsdef = def->namespaceData;
|
||||
+ char **next;
|
||||
+ int tmp;
|
||||
+
|
||||
+ if (!nsdef ||
|
||||
+ (!nsdef->capsadd && !nsdef->capsdel)) {
|
||||
+
|
||||
+ if (qemuCapsCopy)
|
||||
+ *qemuCapsCopy = virObjectRef(qemuCaps);
|
||||
+
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (qemuCapsCopy) {
|
||||
+ *qemuCapsCopy = virQEMUCapsNewCopy(qemuCaps);
|
||||
+
|
||||
+ qemuCaps = *qemuCapsCopy;
|
||||
+ }
|
||||
+
|
||||
+ for (next = nsdef->capsadd; next && *next; next++) {
|
||||
+ if ((tmp = virQEMUCapsTypeFromString(*next)) < 0) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("invalid qemu namespace capability '%1$s'"),
|
||||
+ *next);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ virQEMUCapsSet(qemuCaps, tmp);
|
||||
+ }
|
||||
+
|
||||
+ for (next = nsdef->capsdel; next && *next; next++) {
|
||||
+ if ((tmp = virQEMUCapsTypeFromString(*next)) < 0) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
+ _("invalid qemu namespace capability '%1$s'"),
|
||||
+ *next);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ virQEMUCapsClear(qemuCaps, tmp);
|
||||
+ }
|
||||
+
|
||||
+ virQEMUCapsInitProcessCapsInterlock(qemuCaps);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index 8cd221062c..ff26885ffe 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -1197,3 +1197,9 @@ qemuDomainMachineSupportsFloppy(const char *machine,
|
||||
|
||||
virObject *
|
||||
qemuDomainHostdevPrivateNew(void);
|
||||
+
|
||||
+int
|
||||
+qemuDomainUpdateCustomCapabilities(const virDomainDef *def,
|
||||
+ virQEMUCaps *qemuCaps,
|
||||
+ virQEMUCaps **qemuCapsCopy)
|
||||
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 7d9f754fc2..1540c74087 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -5823,43 +5823,6 @@ qemuProcessStartValidate(virQEMUDriver *driver,
|
||||
}
|
||||
|
||||
|
||||
-static int
|
||||
-qemuProcessStartUpdateCustomCaps(virDomainObj *vm)
|
||||
-{
|
||||
- qemuDomainObjPrivate *priv = vm->privateData;
|
||||
- qemuDomainXmlNsDef *nsdef = vm->def->namespaceData;
|
||||
-
|
||||
- if (nsdef) {
|
||||
- char **next;
|
||||
- int tmp;
|
||||
-
|
||||
- for (next = nsdef->capsadd; next && *next; next++) {
|
||||
- if ((tmp = virQEMUCapsTypeFromString(*next)) < 0) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("invalid qemu namespace capability '%1$s'"),
|
||||
- *next);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- virQEMUCapsSet(priv->qemuCaps, tmp);
|
||||
- }
|
||||
-
|
||||
- for (next = nsdef->capsdel; next && *next; next++) {
|
||||
- if ((tmp = virQEMUCapsTypeFromString(*next)) < 0) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("invalid qemu namespace capability '%1$s'"),
|
||||
- *next);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- virQEMUCapsClear(priv->qemuCaps, tmp);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-
|
||||
/**
|
||||
* qemuProcessPrepareQEMUCaps:
|
||||
* @vm: domain object
|
||||
@@ -5883,12 +5846,9 @@ qemuProcessPrepareQEMUCaps(virDomainObj *vm,
|
||||
return -1;
|
||||
|
||||
/* Update qemu capabilities according to lists passed in via namespace */
|
||||
- if (qemuProcessStartUpdateCustomCaps(vm) < 0)
|
||||
+ if (qemuDomainUpdateCustomCapabilities(vm->def, priv->qemuCaps, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
- /* re-process capability lockouts since we might have removed capabilities */
|
||||
- virQEMUCapsInitProcessCapsInterlock(priv->qemuCaps);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.55.0
|
||||
125
SOURCES/libvirt-qemu-Convert-IOMMUFD-to-qemuFDPassDirect.patch
Normal file
125
SOURCES/libvirt-qemu-Convert-IOMMUFD-to-qemuFDPassDirect.patch
Normal file
@ -0,0 +1,125 @@
|
||||
From ca83d49a04eb50ecb5bff8dde9928a9c15764fee Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <ca83d49a04eb50ecb5bff8dde9928a9c15764fee.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 15 Feb 2026 19:42:39 +0100
|
||||
Subject: [PATCH] qemu: Convert IOMMUFD to qemuFDPassDirect
|
||||
|
||||
This cleans up creating QEMU command line and makes it easier when
|
||||
adding hotplug support.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit df59beed37db5451a44955c1c440eebc474bffb2)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_command.c | 7 ++-----
|
||||
src/qemu/qemu_domain.c | 4 ++--
|
||||
src/qemu/qemu_domain.h | 2 +-
|
||||
src/qemu/qemu_process.c | 6 ++++--
|
||||
tests/qemuxmlconftest.c | 6 ++++--
|
||||
5 files changed, 13 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 482f8d8ca2..0057934cc6 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -5350,19 +5350,16 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
|
||||
virDomainObj *vm)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
- g_autofree char *fdstr = g_strdup_printf("%d", priv->iommufd);
|
||||
g_autoptr(virJSONValue) props = NULL;
|
||||
|
||||
if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
|
||||
return 0;
|
||||
|
||||
- virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
-
|
||||
- priv->iommufd = -1;
|
||||
+ qemuFDPassDirectTransferCommand(priv->iommufd, cmd);
|
||||
|
||||
if (qemuMonitorCreateObjectProps(&props, "iommufd",
|
||||
"iommufd0",
|
||||
- "S:fd", fdstr,
|
||||
+ "S:fd", qemuFDPassDirectGetPath(priv->iommufd),
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 64b01e524f..d9cd9324e0 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -1975,7 +1975,7 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
|
||||
|
||||
priv->migrationRecoverSetup = false;
|
||||
|
||||
- VIR_FORCE_CLOSE(priv->iommufd);
|
||||
+ g_clear_pointer(&priv->iommufd, qemuFDPassDirectFree);
|
||||
|
||||
g_clear_pointer(&priv->memoryBackingDir, g_free);
|
||||
}
|
||||
@@ -2044,7 +2044,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
|
||||
priv->blockjobs = virHashNew(virObjectUnref);
|
||||
priv->fds = virHashNew(g_object_unref);
|
||||
|
||||
- priv->iommufd = -1;
|
||||
+ priv->iommufd = NULL;
|
||||
priv->pidMonitored = -1;
|
||||
|
||||
/* agent commands block by default, user can choose different behavior */
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index 30ca67bf76..a5403ecc93 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -264,7 +264,7 @@ struct _qemuDomainObjPrivate {
|
||||
/* named file descriptor groups associated with the VM */
|
||||
GHashTable *fds;
|
||||
|
||||
- int iommufd;
|
||||
+ qemuFDPassDirect *iommufd;
|
||||
|
||||
char *memoryBackingDir;
|
||||
};
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 3729edcd7e..91167d73bc 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7685,13 +7685,15 @@ static int
|
||||
qemuProcessOpenIommuFd(virDomainObj *vm)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
+ int iommufd;
|
||||
|
||||
VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name);
|
||||
|
||||
- if ((priv->iommufd = virIOMMUFDOpenDevice()) < 0)
|
||||
+ if ((iommufd = virIOMMUFDOpenDevice()) < 0)
|
||||
return -1;
|
||||
|
||||
- VIR_DEBUG("Opened IOMMU FD %d for domain %s", priv->iommufd, vm->def->name);
|
||||
+ priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
|
||||
index 885512a38c..eeb9298b2e 100644
|
||||
--- a/tests/qemuxmlconftest.c
|
||||
+++ b/tests/qemuxmlconftest.c
|
||||
@@ -406,8 +406,10 @@ testQemuPrepareHostdev(virDomainObj *vm)
|
||||
}
|
||||
}
|
||||
|
||||
- if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def))
|
||||
- priv->iommufd = 0;
|
||||
+ if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) {
|
||||
+ int iommufd = 0;
|
||||
+ priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,129 @@
|
||||
From 24b8d8f936dcff1a78dda3253876f9242b3ec98b Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <24b8d8f936dcff1a78dda3253876f9242b3ec98b.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 15 Feb 2026 19:28:16 +0100
|
||||
Subject: [PATCH] qemu: Convert vfioDeviceFd to qemuFDPassDirect
|
||||
|
||||
This cleans up creating QEMU command line and makes it easier when
|
||||
adding hotplug support.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 4611f227c7882c8b9237da5e2fab21932ef6bd51)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_command.c | 15 +++++----------
|
||||
src/qemu/qemu_domain.c | 4 ++--
|
||||
src/qemu/qemu_domain.h | 2 +-
|
||||
src/qemu/qemu_process.c | 6 +++++-
|
||||
tests/qemuxmlconftest.c | 4 +++-
|
||||
5 files changed, 16 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 0057934cc6..8038aa3115 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -4811,12 +4811,10 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
|
||||
pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev);
|
||||
|
||||
- if (hostdevPriv->vfioDeviceFd != -1) {
|
||||
- g_autofree char *fdstr = g_strdup_printf("%d", hostdevPriv->vfioDeviceFd);
|
||||
- if (virJSONValueObjectAdd(&props, "S:fd", fdstr, NULL) < 0)
|
||||
- return NULL;
|
||||
- hostdevPriv->vfioDeviceFd = -1;
|
||||
- }
|
||||
+ if (virJSONValueObjectAdd(&props,
|
||||
+ "S:fd", qemuFDPassDirectGetPath(hostdevPriv->vfioDeviceFd),
|
||||
+ NULL) < 0)
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
|
||||
@@ -5266,10 +5264,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
|
||||
if (subsys->u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
|
||||
- if (hostdevPriv->vfioDeviceFd != -1) {
|
||||
- virCommandPassFD(cmd, hostdevPriv->vfioDeviceFd,
|
||||
- VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
- }
|
||||
+ qemuFDPassDirectTransferCommand(hostdevPriv->vfioDeviceFd, cmd);
|
||||
}
|
||||
|
||||
if (!(devprops = qemuBuildPCIHostdevDevProps(def, hostdev)))
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index d9cd9324e0..ada9d3431c 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -1245,7 +1245,7 @@ qemuDomainHostdevPrivateDispose(void *obj)
|
||||
{
|
||||
qemuDomainHostdevPrivate *priv = obj;
|
||||
|
||||
- VIR_FORCE_CLOSE(priv->vfioDeviceFd);
|
||||
+ g_clear_pointer(&priv->vfioDeviceFd, qemuFDPassDirectFree);
|
||||
}
|
||||
|
||||
|
||||
@@ -1271,7 +1271,7 @@ qemuDomainHostdevPrivateNew(void)
|
||||
if (!(priv = virObjectNew(qemuDomainHostdevPrivateClass)))
|
||||
return NULL;
|
||||
|
||||
- priv->vfioDeviceFd = -1;
|
||||
+ priv->vfioDeviceFd = NULL;
|
||||
|
||||
return (virObject *) priv;
|
||||
}
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index a5403ecc93..8aa94fc25b 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -471,7 +471,7 @@ struct _qemuDomainHostdevPrivate {
|
||||
virObject parent;
|
||||
|
||||
/* VFIO device file descriptor for iommufd passthrough */
|
||||
- int vfioDeviceFd;
|
||||
+ qemuFDPassDirect *vfioDeviceFd;
|
||||
};
|
||||
|
||||
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 91167d73bc..59fff1aa19 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7710,10 +7710,14 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev)
|
||||
{
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci;
|
||||
+ g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
|
||||
+ int vfioDeviceFd;
|
||||
|
||||
- if ((hostdevPriv->vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
|
||||
+ if ((vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
|
||||
return -1;
|
||||
|
||||
+ hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
|
||||
index eeb9298b2e..aa877bf16a 100644
|
||||
--- a/tests/qemuxmlconftest.c
|
||||
+++ b/tests/qemuxmlconftest.c
|
||||
@@ -357,8 +357,10 @@ testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev)
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
|
||||
if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
|
||||
+ g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
|
||||
/* Use a placeholder FD value for tests */
|
||||
- hostdevPriv->vfioDeviceFd = 0;
|
||||
+ int vfioDeviceFD = 0;
|
||||
+ hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFD);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,119 @@
|
||||
From 36c833cacb0d001ab43ba9662fe432922491c3b5 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <36c833cacb0d001ab43ba9662fe432922491c3b5.1782911963.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Mon, 15 Jun 2026 13:01:01 +0200
|
||||
Subject: [PATCH] qemu: Ensure proper shutdown ordering of virtlockd/virtlogd
|
||||
daemons
|
||||
|
||||
For socket activation to work our systemd unit files use the following
|
||||
pattern:
|
||||
|
||||
[virtlogd.socket] <----(After)--- [virtlogd.service]
|
||||
[virtqemud.socket] <----(After)--- [virtqemud.service]
|
||||
|
||||
Now the qemu daemon also wants to use the services provided by those
|
||||
daemons so we have dependency between the two too:
|
||||
|
||||
[virtlogd.socket] <----(After)--- [virtlogd.service]
|
||||
^
|
||||
+-------------(After+Requires)-------+
|
||||
|
|
||||
[virtqemud.socket] <----(After)--- [virtqemud.service]
|
||||
|
||||
Now on startup everything is fine, because with socket activation, when
|
||||
'virtqemud.service' wants to use 'virtlogd' services the socket is
|
||||
already up due to the dependency+ordering and opening a connection will
|
||||
cause 'virtlogd.service' to be socket-activated.
|
||||
|
||||
On shutdown though there's no transitive 'After' ordering between
|
||||
'virtqemud.service' and 'virtlogd.service' and thus nothing explicitly
|
||||
telling systemd that if virtlogd was started. In fact systemd is free to
|
||||
translate it that 'virtlogd' and 'virtqemud' need to be stopped before
|
||||
stopping 'virtlogd.socket'.
|
||||
|
||||
To illustrate what happens consider the following scenario:
|
||||
|
||||
A host is running a VM under virtqemud. 'virtqemud' is configured to
|
||||
attempt shutdown on the VMs before killing them (daemon-based guest
|
||||
shutdown, but the same reproduces also with libvirt-guests). The host
|
||||
is being rebooted.
|
||||
|
||||
(virtqemud attempts to shut down guests, but guest takes more than the
|
||||
configured shutdown inhibition timeout, journald output follows):
|
||||
|
||||
06:44:02 fedora systemd-logind[664]: Delay lock is active (UID 0/root, PID 991/virtqemud) but inhibitor timeout is reached.
|
||||
06:44:02 fedora systemd-logind[664]: System is rebooting.
|
||||
[...]
|
||||
06:44:02 fedora virtlogd[802]: 802: debug : virSystemdNotify:667 : Notify 'STOPPING=1'
|
||||
06:44:02 fedora systemd[1]: Stopping virtlogd.service - libvirt logging daemon...
|
||||
06:44:02 fedora systemd[1]: Stopping virtqemud.service - libvirt QEMU daemon...
|
||||
06:44:02 fedora virtqemud[991]: 991: debug : virSystemdNotify:667 : Notify 'STOPPING=1'
|
||||
06:44:02 fedora systemd[1]: virtlogd.service: Deactivated successfully.
|
||||
06:44:02 fedora systemd[1]: Stopped virtlogd.service - libvirt logging daemon.
|
||||
|
||||
(the shutdown times out, virtqemud kills the unresponsive vm)
|
||||
|
||||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessStop:8916 : Shutting down vm=0x7f71ac032670 name=virt-vm1 id=1 pid=805, reason=destroyed, asyncJob=none, flags=0x0
|
||||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuDomainLogAppendMessage:5757 : Append log message (vm='virt-vm1' message='2026-06-15 10:44:27.427+0000: shutting down, reason=destroyed
|
||||
) stdioLogD=1
|
||||
06:44:27 fedora virtqemud[991]: 1053: error : virNetSocketReadWire:1767 : Cannot recv data: Connection reset by peer
|
||||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessKill:8811 : vm=0x7f71ac032670 name=virt-vm1 pid=805 flags=0x5
|
||||
|
||||
Now the log shows that we want to add VM log file message in
|
||||
'qemuDomainLogAppendMessage' but it fails because virtlogd is dead
|
||||
already.
|
||||
|
||||
Now the same happens also with 'virtlockd' but with much worse outcome,
|
||||
especially if the configured action is to save the VMs because shutdown
|
||||
of 'virtlockd' when locks are held ends up 'fencing' the VMs by killing
|
||||
them.
|
||||
|
||||
The same also happens when libvirt-guests is used to shutdown the guests
|
||||
instead.
|
||||
|
||||
This patch adds an explicit 'After=virtlo[ck|g]d.service' to the daemons
|
||||
containing the qemu driver to ensure that the shutdown ordering makes
|
||||
sense. This doesn't break socket activation (e.g. the log/lock daemons
|
||||
are not started unless first invoked).
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120)
|
||||
https://redhat.atlassian.net/browse/RHEL-180876
|
||||
---
|
||||
src/qemu/virtqemud.service.extra.in | 4 ++++
|
||||
src/remote/libvirtd.service.in | 4 ++++
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/src/qemu/virtqemud.service.extra.in b/src/qemu/virtqemud.service.extra.in
|
||||
index cc16b6a9bb..3cc2edcfd0 100644
|
||||
--- a/src/qemu/virtqemud.service.extra.in
|
||||
+++ b/src/qemu/virtqemud.service.extra.in
|
||||
@@ -6,6 +6,10 @@ Requires=virtlogd.socket
|
||||
Wants=virtlockd.socket
|
||||
After=virtlogd.socket
|
||||
After=virtlockd.socket
|
||||
+# To ensure that our helper daemons are not shut down before the main daemon
|
||||
+# shuts down we need also explicit ordering with the .service unit
|
||||
+After=virtlogd.service
|
||||
+After=virtlock.service
|
||||
Wants=systemd-machined.service
|
||||
After=systemd-machined.service
|
||||
After=remote-fs.target
|
||||
diff --git a/src/remote/libvirtd.service.in b/src/remote/libvirtd.service.in
|
||||
index b0a062e885..f26494d646 100644
|
||||
--- a/src/remote/libvirtd.service.in
|
||||
+++ b/src/remote/libvirtd.service.in
|
||||
@@ -15,6 +15,10 @@ Requires=virtlogd.socket
|
||||
Wants=virtlockd.socket
|
||||
After=virtlogd.socket
|
||||
After=virtlockd.socket
|
||||
+# To ensure that our helper daemons are not shut down before the main daemon
|
||||
+# shuts down we need also explicit ordering with the .service unit
|
||||
+After=virtlogd.service
|
||||
+After=virtlock.service
|
||||
Wants=systemd-machined.service
|
||||
After=network.target
|
||||
After=dbus.service
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,51 @@
|
||||
From 5512f4ffa8f4ea8a4afd354e4592b69dc5c39c61 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <5512f4ffa8f4ea8a4afd354e4592b69dc5c39c61.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Wed, 18 Mar 2026 12:52:05 +0100
|
||||
Subject: [PATCH] qemu: Expand call to qemuDomainNeedsVFIO
|
||||
|
||||
The function qemuDomainNeedsVFIO() was originally used by other parts
|
||||
of qemu code to figure out if the VM needs /dev/vfio/vfio.
|
||||
|
||||
Later it was also used by code calculating locked memory limit for all
|
||||
architectures, and after that change again and used only for PPC64.
|
||||
|
||||
Now it needs to be changed again due to IOMMUFD support, the
|
||||
/dev/vfio/vfio device is used by QEMU only if IOMMUFD is not used
|
||||
but for accounting we still need consider all PCI host devices
|
||||
because if IOMMUFD is used it still requires increasing locked
|
||||
memory limit.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit c89b2bf1a80e3261bd18cdb352be1ffce9f4639e)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_domain.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 5c9f4831fd..57f18a02b6 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -8259,8 +8259,14 @@ getPPC64MemLockLimitBytes(virDomainDef *def)
|
||||
passthroughLimit = maxMemory +
|
||||
128 * (1ULL<<30) / 512 * nPCIHostBridges +
|
||||
8192;
|
||||
- } else if (qemuDomainNeedsVFIO(def) || virDomainDefHasVDPANet(def)) {
|
||||
- /* For regular (non-NVLink2 present) VFIO passthrough, the value
|
||||
+ } else if (virDomainDefHasPCIHostdev(def) ||
|
||||
+ virDomainDefHasMdevHostdev(def) ||
|
||||
+ virDomainDefHasNVMeDisk(def) ||
|
||||
+ virDomainDefHasVDPANet(def)) {
|
||||
+ /* Not using qemuDomainNeedsVFIO() as that doesn't take PCI host
|
||||
+ * devices with IOMMFD into account.
|
||||
+ *
|
||||
+ * For regular (non-NVLink2 present) VFIO passthrough, the value
|
||||
* of passthroughLimit is:
|
||||
*
|
||||
* passthroughLimit := max( 2 GiB * #PHBs, (c)
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,144 @@
|
||||
From 1b76214345d8ffb9f3238a9804b2bef342112018 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <1b76214345d8ffb9f3238a9804b2bef342112018.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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
|
||||
1257
SOURCES/libvirt-qemu-Fill-iommufd-domain-capability.patch
Normal file
1257
SOURCES/libvirt-qemu-Fill-iommufd-domain-capability.patch
Normal file
File diff suppressed because it is too large
Load Diff
245
SOURCES/libvirt-qemu-Fix-IOMMUFD-and-VFIO-security-labels.patch
Normal file
245
SOURCES/libvirt-qemu-Fix-IOMMUFD-and-VFIO-security-labels.patch
Normal file
@ -0,0 +1,245 @@
|
||||
From 39dd90e66f661ce816592c1ee7cfd5bba54ea6f5 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <39dd90e66f661ce816592c1ee7cfd5bba54ea6f5.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Fri, 27 Feb 2026 17:55:34 +0100
|
||||
Subject: [PATCH] qemu: Fix IOMMUFD and VFIO security labels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When IOMMUFD support was introduced it incorrectly tried to label
|
||||
`/dev/iommu` and `/dev/vfio/devices/vfioX` but they are not added to
|
||||
QEMU namespace because libvirt opens FDs and passes these FDs to QEMU.
|
||||
|
||||
We need to label these FDs instead.
|
||||
|
||||
Fixes: 7d2f91f9cb572ab95d0916bdd1a46dd198874529
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 03f2672ab4eff8ee01410c9acba6288bfb4fa231)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-159902
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_hotplug.c | 2 +-
|
||||
src/qemu/qemu_process.c | 16 ++++++++++++----
|
||||
src/qemu/qemu_process.h | 3 ++-
|
||||
src/security/security_apparmor.c | 12 ------------
|
||||
src/security/security_dac.c | 27 ---------------------------
|
||||
src/security/security_selinux.c | 23 -----------------------
|
||||
6 files changed, 15 insertions(+), 68 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
|
||||
index 845f42bf20..994cc749f6 100644
|
||||
--- a/src/qemu/qemu_hotplug.c
|
||||
+++ b/src/qemu/qemu_hotplug.c
|
||||
@@ -1621,7 +1621,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver,
|
||||
}
|
||||
|
||||
if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
|
||||
- if (qemuProcessOpenVfioDeviceFd(hostdev) < 0)
|
||||
+ if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0)
|
||||
goto error;
|
||||
|
||||
if (!priv->iommufdState) {
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 29601683a0..0a69063a4b 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7691,13 +7691,16 @@ int
|
||||
qemuProcessOpenIommuFd(virDomainObj *vm)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
- int iommufd;
|
||||
+ VIR_AUTOCLOSE iommufd = -1;
|
||||
|
||||
VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name);
|
||||
|
||||
if ((iommufd = virIOMMUFDOpenDevice()) < 0)
|
||||
return -1;
|
||||
|
||||
+ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
|
||||
|
||||
return 0;
|
||||
@@ -7712,16 +7715,21 @@ qemuProcessOpenIommuFd(virDomainObj *vm)
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int
|
||||
-qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev)
|
||||
+qemuProcessOpenVfioDeviceFd(virDomainObj *vm,
|
||||
+ virDomainHostdevDef *hostdev)
|
||||
{
|
||||
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci;
|
||||
g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
|
||||
- int vfioDeviceFd;
|
||||
+ VIR_AUTOCLOSE vfioDeviceFd = -1;
|
||||
|
||||
if ((vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
|
||||
return -1;
|
||||
|
||||
+ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, vfioDeviceFd) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd);
|
||||
|
||||
return 0;
|
||||
@@ -7739,7 +7747,7 @@ qemuProcessPrepareHostHostdev(virDomainObj *vm)
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
||||
if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
|
||||
/* Open VFIO device FD */
|
||||
- if (qemuProcessOpenVfioDeviceFd(hostdev) < 0)
|
||||
+ if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0)
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
|
||||
index 1023b7cb25..dc16622ed9 100644
|
||||
--- a/src/qemu/qemu_process.h
|
||||
+++ b/src/qemu/qemu_process.h
|
||||
@@ -136,7 +136,8 @@ int qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm,
|
||||
|
||||
int qemuProcessOpenIommuFd(virDomainObj *vm);
|
||||
|
||||
-int qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev);
|
||||
+int qemuProcessOpenVfioDeviceFd(virDomainObj *vm,
|
||||
+ virDomainHostdevDef *hostdev);
|
||||
|
||||
int qemuProcessPrepareHost(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
|
||||
index 1c3496893c..40f13ec1a5 100644
|
||||
--- a/src/security/security_apparmor.c
|
||||
+++ b/src/security/security_apparmor.c
|
||||
@@ -45,7 +45,6 @@
|
||||
#include "virstring.h"
|
||||
#include "virscsi.h"
|
||||
#include "virmdev.h"
|
||||
-#include "viriommufd.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
||||
|
||||
@@ -856,17 +855,6 @@ AppArmorSetSecurityHostdevLabel(virSecurityManager *mgr,
|
||||
|
||||
if (AppArmorSetSecurityPCILabel(pci, vfioGroupDev, ptr) < 0)
|
||||
return -1;
|
||||
- } else {
|
||||
- g_autofree char *vfiofdDev = NULL;
|
||||
-
|
||||
- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (AppArmorSetSecurityPCILabel(pci, vfiofdDev, ptr) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (AppArmorSetSecurityPCILabel(pci, VIR_IOMMU_DEV_PATH, ptr) < 0)
|
||||
- return -1;
|
||||
}
|
||||
} else {
|
||||
if (virPCIDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr) < 0)
|
||||
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
|
||||
index 2a4c7f6a3c..d8cf117fc4 100644
|
||||
--- a/src/security/security_dac.c
|
||||
+++ b/src/security/security_dac.c
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "virscsivhost.h"
|
||||
#include "virstring.h"
|
||||
#include "virutil.h"
|
||||
-#include "viriommufd.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
||||
|
||||
@@ -1295,17 +1294,6 @@ virSecurityDACSetHostdevLabel(virSecurityManager *mgr,
|
||||
&cbdata) < 0) {
|
||||
return -1;
|
||||
}
|
||||
- } else {
|
||||
- g_autofree char *vfiofdDev = NULL;
|
||||
-
|
||||
- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecurityDACSetHostdevLabelHelper(vfiofdDev, false, &cbdata) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecurityDACSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &cbdata) < 0)
|
||||
- return -1;
|
||||
}
|
||||
} else {
|
||||
if (virPCIDeviceFileIterate(pci,
|
||||
@@ -1476,21 +1464,6 @@ virSecurityDACRestoreHostdevLabel(virSecurityManager *mgr,
|
||||
vfioGroupDev, false) < 0) {
|
||||
return -1;
|
||||
}
|
||||
- } else {
|
||||
- g_autofree char *vfiofdDev = NULL;
|
||||
-
|
||||
- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecurityDACRestoreFileLabelInternal(mgr, NULL,
|
||||
- vfiofdDev, false) < 0) {
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (virSecurityDACRestoreFileLabelInternal(mgr, NULL,
|
||||
- VIR_IOMMU_DEV_PATH, false) < 0) {
|
||||
- return -1;
|
||||
- }
|
||||
}
|
||||
} else {
|
||||
if (virPCIDeviceFileIterate(pci, virSecurityDACRestorePCILabel, mgr) < 0)
|
||||
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
|
||||
index 96ca59a7a4..0fa50630f7 100644
|
||||
--- a/src/security/security_selinux.c
|
||||
+++ b/src/security/security_selinux.c
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "virconf.h"
|
||||
#include "virtpm.h"
|
||||
#include "virstring.h"
|
||||
-#include "viriommufd.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
||||
|
||||
@@ -2267,17 +2266,6 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManager *mgr,
|
||||
&data) < 0) {
|
||||
return -1;
|
||||
}
|
||||
- } else {
|
||||
- g_autofree char *vfiofdDev = NULL;
|
||||
-
|
||||
- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecuritySELinuxSetHostdevLabelHelper(vfiofdDev, false, &data) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecuritySELinuxSetHostdevLabelHelper(VIR_IOMMU_DEV_PATH, false, &data) < 0)
|
||||
- return -1;
|
||||
}
|
||||
} else {
|
||||
if (virPCIDeviceFileIterate(pci, virSecuritySELinuxSetPCILabel, &data) < 0)
|
||||
@@ -2519,17 +2507,6 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManager *mgr,
|
||||
|
||||
if (virSecuritySELinuxRestoreFileLabel(mgr, vfioGroupDev, false, false) < 0)
|
||||
return -1;
|
||||
- } else {
|
||||
- g_autofree char *vfiofdDev = NULL;
|
||||
-
|
||||
- if (virPCIDeviceGetVfioPath(pci, &vfiofdDev) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecuritySELinuxRestoreFileLabel(mgr, vfiofdDev, false, false) < 0)
|
||||
- return -1;
|
||||
-
|
||||
- if (virSecuritySELinuxRestoreFileLabel(mgr, VIR_IOMMU_DEV_PATH, false, false) < 0)
|
||||
- return -1;
|
||||
}
|
||||
} else {
|
||||
if (virPCIDeviceFileIterate(pci, virSecuritySELinuxRestorePCILabel, mgr) < 0)
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,60 @@
|
||||
From 0c8a23f5f3e063b35b890d5538e5497f51d1095c Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <0c8a23f5f3e063b35b890d5538e5497f51d1095c.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Mon, 23 Feb 2026 16:23:10 +0100
|
||||
Subject: [PATCH] qemu: Fix job handling when domain dies in post-copy
|
||||
migration
|
||||
|
||||
When a domain is in post-copy migration phase, we need to keep the job
|
||||
active if something fails to protect the domain from changes.
|
||||
Unfortunately, there is a race between migration code and
|
||||
qemuProcessStop that can cause the job to stay active even when the
|
||||
domain is gone and thus preventing the domain from being started again
|
||||
(until virtqemud is restarted). The race is caused by unlocking the vm
|
||||
object when calling virConnectUnregisterCloseCallback. While the domain
|
||||
is unlocked qemuProcessStop can finish its work and the domain may no
|
||||
longer be active when we get the lock back. The post-copy path does not
|
||||
properly check if a domain is still active.
|
||||
|
||||
Instead of adding the virDomainObjIsActive check in all places where
|
||||
this could happen, we can add it in virDomainObjIsPostcopy and
|
||||
virDomainObjIsFailedPostcopy and let the code take the pre-copy cleanup
|
||||
path. Clearly an inactive domain can never be in (failed) post-copy
|
||||
migration.
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-145179
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 3d1e6d92de784e5c9d2a5e4bc18829c92278343a)
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/conf/domain_conf.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 1f7b1ca340..35de8bab6b 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -30493,6 +30493,9 @@ bool
|
||||
virDomainObjIsFailedPostcopy(virDomainObj *dom,
|
||||
virDomainJobObj *job)
|
||||
{
|
||||
+ if (!virDomainObjIsActive(dom))
|
||||
+ return false;
|
||||
+
|
||||
if (job && job->asyncPaused &&
|
||||
(job->asyncJob == VIR_ASYNC_JOB_MIGRATION_IN ||
|
||||
job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT))
|
||||
@@ -30509,6 +30512,9 @@ bool
|
||||
virDomainObjIsPostcopy(virDomainObj *dom,
|
||||
virDomainJobObj *job)
|
||||
{
|
||||
+ if (!virDomainObjIsActive(dom))
|
||||
+ return false;
|
||||
+
|
||||
if (virDomainObjIsFailedPostcopy(dom, job))
|
||||
return true;
|
||||
|
||||
--
|
||||
2.54.0
|
||||
713
SOURCES/libvirt-qemu-Ignore-cmp_legacy-CPU-flag.patch
Normal file
713
SOURCES/libvirt-qemu-Ignore-cmp_legacy-CPU-flag.patch
Normal file
@ -0,0 +1,713 @@
|
||||
From c55379ad99a087d70a2bc34e2c32c1f6bf27f9ed Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <c55379ad99a087d70a2bc34e2c32c1f6bf27f9ed.1770824869.git.jdenemar@redhat.com>
|
||||
From: Jean-Louis Dupond <jean-louis@dupond.be>
|
||||
Date: Thu, 5 Feb 2026 14:18:42 +0100
|
||||
Subject: [PATCH] qemu: Ignore cmp_legacy CPU flag
|
||||
|
||||
Since commit 99a637a8 in qemu 10.0, the way the cmp_legacy flag is
|
||||
reported changed. The same way as happend with the 'ht' flag in commit
|
||||
c6bd2dd634208, which was fixed in libvirt since commit ba16113c.
|
||||
|
||||
This causes migrations from a hypervisor running a qemu version before
|
||||
that commit to a hypervisor running qemu after that commit fails
|
||||
with the following error:
|
||||
guest CPU doesn't match specification: extra features: cmp_legacy
|
||||
|
||||
We can just ignore this flag, just like we did with the 'ht' flag.
|
||||
|
||||
Signed-off-by: Jean-Louis Dupond <jean-louis@dupond.be>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit fc5840b4980045a05b8973900cdbe36162e48331)
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-146629
|
||||
|
||||
Conflicts:
|
||||
tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-latest.args
|
||||
tests/qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args
|
||||
tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-latest.args
|
||||
- upstream commit v11.10.0-78-g380764992d
|
||||
(qemucapabilitiesdata: Re-generate 'caps_10.2.0_x86_64')
|
||||
that added rdseed=off to test files is not backported
|
||||
|
||||
tests/qemuxmlconfdata/memory-hotplug-numa-preferred.x86_64-latest.args
|
||||
- missing downstream, it was added upstream after the last
|
||||
rebase
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 1 +
|
||||
.../cpu-host-model-fallback-kvm.x86_64-10.0.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-10.1.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-6.2.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-7.0.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-7.1.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-7.2.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-8.0.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-8.1.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-8.2.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-9.0.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-9.1.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-9.2.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-kvm.x86_64-latest.args | 2 +-
|
||||
.../cpu-host-model-fallback-tcg.x86_64-10.1.0.args | 2 +-
|
||||
.../cpu-host-model-fallback-tcg.x86_64-latest.args | 2 +-
|
||||
.../qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.0.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.1.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-6.2.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.0.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.1.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.2.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.0.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.1.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.2.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.0.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.1.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.2.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-10.0.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-10.1.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-6.2.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-7.0.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-7.1.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-7.2.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-8.0.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-8.1.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-8.2.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-9.0.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-9.1.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-9.2.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-kvm.x86_64-latest.args | 2 +-
|
||||
.../cpu-host-model-nofallback-tcg.x86_64-10.1.0.args | 2 +-
|
||||
.../cpu-host-model-nofallback-tcg.x86_64-latest.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-10.1.0.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-latest.args | 2 +-
|
||||
tests/qemuxmlconfdata/cpu-translation.x86_64-latest.args | 2 +-
|
||||
48 files changed, 48 insertions(+), 47 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 92b863a826..d738805ee8 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -3772,6 +3772,7 @@ const char *ignoredFeatures[] = {
|
||||
"vmx-ept-uc", "vmx-ept-wb", /* never supported by QEMU */
|
||||
"vmx-invvpid-single-context", /* never supported by QEMU */
|
||||
"ht", /* ignored by QEMU, set according to topology */
|
||||
+ "cmp_legacy", /* ignored by QEMU, set according to topology */
|
||||
};
|
||||
|
||||
bool
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.0.0.args
|
||||
index edd334dd8b..08f37274b2 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.1.0.args
|
||||
index 57982574eb..e4044a0c64 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-6.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-6.2.0.args
|
||||
index 4aa9011fe8..e8a9aceb4a 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-6.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-6.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.0.0.args
|
||||
index e944e69cfd..0df6ce9e3d 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.0,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.1.0.args
|
||||
index d9edda2733..b4a91fa921 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.1,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.2.0.args
|
||||
index 1d1839b7fa..5d69199876 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-7.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.0.0.args
|
||||
index 8278629ee7..e7b424819e 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.1.0.args
|
||||
index 3b733a3c5d..58ad565dba 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.2.0.args
|
||||
index 73296c7df0..fa1b674fa5 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-8.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.0.0.args
|
||||
index 8f8b74fa56..fc9985f901 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.1.0.args
|
||||
index c2f394bf09..1db86cb31e 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.2.0.args
|
||||
index 35c8d397c4..4dcd9332cb 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-9.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-latest.args
|
||||
index 6afa8a4c2d..e5b0acb87b 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,cmp-legacy=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
+-cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-10.1.0.args
|
||||
index 3b93ed510d..0b67c7f158 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-latest.args
|
||||
index 01cf90bb67..443de62f69 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args
|
||||
index ce60a39acc..52f636fa77 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-features.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,cmp-legacy=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off,abm=on,ds=on,invtsc=off \
|
||||
+-cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off,abm=on,ds=on,invtsc=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.0.0.args
|
||||
index a1c034ec51..7dd5723b98 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-10.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.1.0.args
|
||||
index ddf940f75c..987baa9b30 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-6.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-6.2.0.args
|
||||
index f65444948e..4402bad82d 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-6.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-6.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.0.0.args
|
||||
index 8f8b1645d5..d6dfadc3b2 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-7.0,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.1.0.args
|
||||
index df03bafab3..09e220487d 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-7.1,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.2.0.args
|
||||
index 7a796812fa..7e90b309a9 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-7.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-7.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.0.0.args
|
||||
index d63438e81c..fc02c9a7e0 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-8.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.1.0.args
|
||||
index 901f279a02..8360dc02ef 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-8.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.2.0.args
|
||||
index d141aca9f0..b00138933c 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-8.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-8.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.0.0.args
|
||||
index 49575ff4d9..3b42130bd2 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-9.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.1.0.args
|
||||
index fd25e4cd23..c451426cdd 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-9.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.2.0.args
|
||||
index 4b69f59064..1da6e508ff 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-9.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-9.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args
|
||||
index 2bf920b9c7..30010edb3b 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine q35,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,cmp-legacy=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
+-cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.0.0.args
|
||||
index edd334dd8b..08f37274b2 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.1.0.args
|
||||
index 57982574eb..e4044a0c64 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-6.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-6.2.0.args
|
||||
index 4aa9011fe8..e8a9aceb4a 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-6.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-6.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.0.0.args
|
||||
index e944e69cfd..0df6ce9e3d 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.0,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.1.0.args
|
||||
index d9edda2733..b4a91fa921 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.1,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,tsc-scale=on,vmcb-clean=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.2.0.args
|
||||
index 1d1839b7fa..5d69199876 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-7.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-7.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.0.0.args
|
||||
index 8278629ee7..e7b424819e 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,xsaves=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.1.0.args
|
||||
index 3b733a3c5d..58ad565dba 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.2.0.args
|
||||
index 73296c7df0..fa1b674fa5 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-8.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-8.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.0.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.0.0.args
|
||||
index 8f8b74fa56..fc9985f901 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.0.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.0.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.0,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.1.0.args
|
||||
index c2f394bf09..1db86cb31e 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.2.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.2.0.args
|
||||
index 35c8d397c4..4dcd9332cb 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.2.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-9.2.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-9.2,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,cmp-legacy=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
+-cpu EPYC-Rome,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,stibp=on,arch-capabilities=on,ssbd=on,overflow-recov=on,succor=on,amd-ssbd=on,virt-ssbd=on,lbrv=on,tsc-scale=on,vmcb-clean=on,flushbyasid=on,pause-filter=on,pfthreshold=on,v-vmsave-vmload=on,vgif=on,svme-addr-chk=on,lfence-always-serializing=on,null-sel-clr-base=on,ibpb-brtype=on,rdctl-no=on,skip-l1dfl-vmentry=on,mds-no=on,pschange-mc-no=on,gds-no=on,rfds-no=on,xsaves=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-latest.args
|
||||
index 6afa8a4c2d..e5b0acb87b 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel kvm \
|
||||
--cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,cmp-legacy=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
+-cpu EPYC-Turin,x2apic=on,tsc-deadline=on,hypervisor=on,tsc-adjust=on,spec-ctrl=on,stibp=on,flush-l1d=on,ssbd=on,virt-ssbd=on,tsa-sq-no=on,tsa-l1-no=on,pcid=off,la57=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-10.1.0.args
|
||||
index 3b93ed510d..0b67c7f158 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-i440fx-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-latest.args
|
||||
index 01cf90bb67..443de62f69 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-10.1.0.args b/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-10.1.0.args
|
||||
index 4defeceac3..d12cb96786 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-10.1.0.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-10.1.0.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc-q35-10.1,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-latest.args
|
||||
index 479266659a..688a217c3c 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine q35,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,cmp-legacy=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
+-cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,no-nested-data-bp=on,null-sel-clr-base=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
diff --git a/tests/qemuxmlconfdata/cpu-translation.x86_64-latest.args b/tests/qemuxmlconfdata/cpu-translation.x86_64-latest.args
|
||||
index 49e1b590dd..d425866c67 100644
|
||||
--- a/tests/qemuxmlconfdata/cpu-translation.x86_64-latest.args
|
||||
+++ b/tests/qemuxmlconfdata/cpu-translation.x86_64-latest.args
|
||||
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||
-accel tcg \
|
||||
--cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
+-cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
|
||||
-m size=219136k \
|
||||
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||
-overcommit mem-lock=off \
|
||||
--
|
||||
2.53.0
|
||||
@ -1,38 +0,0 @@
|
||||
From 08fef741d85ecfb3493c47f5f1334f91c30e3233 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <08fef741d85ecfb3493c47f5f1334f91c30e3233@dist-git>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 9 Feb 2022 11:08:42 +0100
|
||||
Subject: [PATCH] qemu: Ignore missing vm.unprivileged_userfaultfd sysctl
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Older kernels did not support this sysctl, but they did not restrict
|
||||
userfaultfd in any way so everything worked as if
|
||||
vm.unprivileged_userfaultfd was set to 1. Thus we can safely ignore
|
||||
errors when setting the value.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 558f00397a0d46ad22bf53a22a40ed6fc4fdb5eb)
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2148578
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/postcopy-migration.sysctl | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu/postcopy-migration.sysctl b/src/qemu/postcopy-migration.sysctl
|
||||
index aa8f015ae0..db3f11e49f 100644
|
||||
--- a/src/qemu/postcopy-migration.sysctl
|
||||
+++ b/src/qemu/postcopy-migration.sysctl
|
||||
@@ -3,4 +3,4 @@
|
||||
# privileged processes.
|
||||
# It can be safely overridden by a file in /etc/sysctl.d/ in case post-copy
|
||||
# migration is not used on the host.
|
||||
-vm.unprivileged_userfaultfd = 1
|
||||
+-vm.unprivileged_userfaultfd = 1
|
||||
--
|
||||
2.39.0
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
From eccea5104691012040f130ee0d400c2cc0b174f7 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <eccea5104691012040f130ee0d400c2cc0b174f7.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 11 Mar 2026 12:12:40 +0100
|
||||
Subject: [PATCH] qemu: Implement
|
||||
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 3215fee34967c49f37a965154879fc5860293cac)
|
||||
|
||||
https://issues.redhat.com/browse/RHEL-153653
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_driver.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index f3e7410f9e..ecd19663ce 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -16720,7 +16720,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
virDomainVirtType virttype;
|
||||
g_autoptr(virDomainCaps) domCaps = NULL;
|
||||
|
||||
- virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES,
|
||||
+ virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES |
|
||||
+ VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES,
|
||||
NULL);
|
||||
|
||||
if (virConnectGetDomainCapabilitiesEnsureACL(conn) < 0)
|
||||
@@ -16746,6 +16747,12 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
VIR_CPU_FEATURE_DISABLE);
|
||||
}
|
||||
|
||||
+ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) {
|
||||
+ virCPUDef *cpu = domCaps->cpu.hostModel;
|
||||
+ if (cpu && virCPUExpandFeatures(arch, cpu) < 0)
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
return virDomainCapsFormat(domCaps);
|
||||
}
|
||||
|
||||
--
|
||||
2.54.0
|
||||
127
SOURCES/libvirt-qemu-Implement-iommufd-fdgroup.patch
Normal file
127
SOURCES/libvirt-qemu-Implement-iommufd-fdgroup.patch
Normal file
@ -0,0 +1,127 @@
|
||||
From 8cdc3bb132898c37fe17762aba7dabb59819ce0a Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <8cdc3bb132898c37fe17762aba7dabb59819ce0a.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Mon, 16 Mar 2026 15:29:32 +0100
|
||||
Subject: [PATCH] qemu: Implement iommufd fdgroup
|
||||
|
||||
When fdgroup is used for iommufd we will start QEMU with -object iommufd
|
||||
even if the VM has no host device. When virDomainFDAssociate() is used
|
||||
the FD libvirt is holding is closed with connection.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit 0a83b28795f0c18592f9d842927528f0676cc56d)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_command.c | 4 +++-
|
||||
src/qemu/qemu_hotplug.c | 4 ++--
|
||||
src/qemu/qemu_process.c | 47 ++++++++++++++++++++++++++++++++++++++---
|
||||
3 files changed, 49 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 23e799de3c..db72407ecc 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -5360,8 +5360,10 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
g_autoptr(virJSONValue) props = NULL;
|
||||
|
||||
- if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
|
||||
+ if (!virDomainDefHasPCIHostdevWithIOMMUFD(def) &&
|
||||
+ !def->iommufd_fdgroup) {
|
||||
return 0;
|
||||
+ }
|
||||
|
||||
qemuFDPassDirectTransferCommand(priv->iommufd, cmd);
|
||||
|
||||
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
|
||||
index 25fe699bb3..8944062aa4 100644
|
||||
--- a/src/qemu/qemu_hotplug.c
|
||||
+++ b/src/qemu/qemu_hotplug.c
|
||||
@@ -1624,7 +1624,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver,
|
||||
if (qemuProcessOpenVfioDeviceFd(vm, hostdev) < 0)
|
||||
goto error;
|
||||
|
||||
- if (!priv->iommufdState) {
|
||||
+ if (!priv->iommufdState && !vm->def->iommufd_fdgroup) {
|
||||
if (qemuProcessOpenIommuFd(vm) < 0)
|
||||
goto error;
|
||||
|
||||
@@ -5031,7 +5031,7 @@ qemuDomainRemoveHostDevice(virQEMUDriver *driver,
|
||||
}
|
||||
}
|
||||
|
||||
- if (priv->iommufdState &&
|
||||
+ if (priv->iommufdState && !vm->def->iommufd_fdgroup &&
|
||||
!virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) {
|
||||
qemuDomainObjEnterMonitor(vm);
|
||||
ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false));
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index d13bce8fcf..e4746374f6 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7706,6 +7706,44 @@ qemuProcessOpenIommuFd(virDomainObj *vm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * qemuProcessGetPassedIommuFd:
|
||||
+ * @vm: domain object
|
||||
+ *
|
||||
+ * Find passed FD via virDomainFDAssociate() API for the VM.
|
||||
+ *
|
||||
+ * Returns: 0 on success, -1 on failure
|
||||
+ */
|
||||
+static int
|
||||
+qemuProcessGetPassedIommuFd(virDomainObj *vm)
|
||||
+{
|
||||
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||
+ virDomainFDTuple *fdt = virHashLookup(priv->fds, vm->def->iommufd_fdgroup);
|
||||
+ VIR_AUTOCLOSE iommufd = -1;
|
||||
+
|
||||
+ if (!fdt) {
|
||||
+ virReportError(VIR_ERR_INVALID_ARG,
|
||||
+ _("file descriptor group '%1$s' was not associated with the domain"),
|
||||
+ vm->def->iommufd_fdgroup);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (fdt->nfds != 1) {
|
||||
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||
+ _("Only one file descriptor needs to be associated with iommufd"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ iommufd = dup(fdt->fds[0]);
|
||||
+
|
||||
+ if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, iommufd) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* qemuProcessOpenVfioDeviceFd:
|
||||
* @hostdev: host device definition
|
||||
@@ -7761,9 +7799,12 @@ qemuProcessPrepareHostHostdev(virDomainObj *vm)
|
||||
}
|
||||
|
||||
/* Open IOMMU FD */
|
||||
- if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def) &&
|
||||
- qemuProcessOpenIommuFd(vm) < 0) {
|
||||
- return -1;
|
||||
+ if (vm->def->iommufd_fdgroup) {
|
||||
+ if (qemuProcessGetPassedIommuFd(vm) < 0)
|
||||
+ return -1;
|
||||
+ } else if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) {
|
||||
+ if (qemuProcessOpenIommuFd(vm) < 0)
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
--
|
||||
2.54.0
|
||||
119
SOURCES/libvirt-qemu-Implement-iommufd.patch
Normal file
119
SOURCES/libvirt-qemu-Implement-iommufd.patch
Normal file
@ -0,0 +1,119 @@
|
||||
From e52edf2ed7f3e1e379fb85ae0c0870113912c9d6 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <e52edf2ed7f3e1e379fb85ae0c0870113912c9d6.1780571166.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Wed, 18 Mar 2026 17:59:01 +0100
|
||||
Subject: [PATCH] qemu: Implement iommufd
|
||||
|
||||
Ideally this should be done in qemuDomainHostdevDefPostParse but that
|
||||
would require a lot of refactoring mainly due to how interface backed by
|
||||
hostdev works.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit fc516031ed865f78d590068424ada19a941046ba)
|
||||
|
||||
Resolves: https://redhat.atlassian.net/browse/RHEL-156803
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_domain.c | 12 +++++++++---
|
||||
src/qemu/qemu_domain.h | 3 ++-
|
||||
src/qemu/qemu_hotplug.c | 2 +-
|
||||
src/qemu/qemu_process.c | 4 ++--
|
||||
4 files changed, 14 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index a61939aa15..495cbd4f7d 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -10120,10 +10120,12 @@ qemuDomainPrepareHostdevSCSI(virDomainHostdevDef *hostdev,
|
||||
|
||||
|
||||
static int
|
||||
-qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev,
|
||||
+qemuDomainPrepareHostdevPCI(const virDomainDef *def,
|
||||
+ virDomainHostdevDef *hostdev,
|
||||
virQEMUCaps *qemuCaps)
|
||||
{
|
||||
virDeviceHostdevPCIDriverName *driverName = &hostdev->source.subsys.u.pci.driver.name;
|
||||
+ virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci;
|
||||
|
||||
/* assign defaults for hostdev passthrough */
|
||||
switch (*driverName) {
|
||||
@@ -10160,12 +10162,16 @@ qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ if (pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_ABSENT)
|
||||
+ pcisrc->driver.iommufd = def->iommufd;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
|
||||
+qemuDomainPrepareHostdev(const virDomainDef *def,
|
||||
+ virDomainHostdevDef *hostdev,
|
||||
qemuDomainObjPrivate *priv)
|
||||
{
|
||||
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||
@@ -10175,7 +10181,7 @@ qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
|
||||
return qemuDomainPrepareHostdevSCSI(hostdev, priv);
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
||||
- return qemuDomainPrepareHostdevPCI(hostdev, priv->qemuCaps);
|
||||
+ return qemuDomainPrepareHostdevPCI(def, hostdev, priv->qemuCaps);
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index 62c5252b9f..8cd221062c 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -1048,7 +1048,8 @@ qemuDomainDiskCachemodeFlags(virDomainDiskCache cachemode,
|
||||
bool *noflush);
|
||||
|
||||
int
|
||||
-qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
|
||||
+qemuDomainPrepareHostdev(const virDomainDef *def,
|
||||
+ virDomainHostdevDef *hostdev,
|
||||
qemuDomainObjPrivate *priv);
|
||||
|
||||
char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivate *priv);
|
||||
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
|
||||
index 994cc749f6..25fe699bb3 100644
|
||||
--- a/src/qemu/qemu_hotplug.c
|
||||
+++ b/src/qemu/qemu_hotplug.c
|
||||
@@ -2900,7 +2900,7 @@ qemuDomainAttachHostDevice(virQEMUDriver *driver,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (qemuDomainPrepareHostdev(hostdev, vm->privateData) < 0)
|
||||
+ if (qemuDomainPrepareHostdev(vm->def, hostdev, vm->privateData) < 0)
|
||||
return -1;
|
||||
|
||||
switch (hostdev->source.subsys.type) {
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 9b8b378b1f..d13bce8fcf 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -6050,7 +6050,7 @@ qemuProcessPrepareDomainNetwork(virDomainObj *vm)
|
||||
/* For hostdev present in qemuProcessPrepareDomain() phase this was
|
||||
* done already, but this code runs after that, so we have to call
|
||||
* it ourselves. */
|
||||
- if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
|
||||
+ if (qemuDomainPrepareHostdev(def, hostdev, priv) < 0)
|
||||
return -1;
|
||||
|
||||
virDomainHostdevInsert(def, hostdev);
|
||||
@@ -6838,7 +6838,7 @@ qemuProcessPrepareDomainHostdevs(virDomainObj *vm,
|
||||
for (i = 0; i < vm->def->nhostdevs; i++) {
|
||||
virDomainHostdevDef *hostdev = vm->def->hostdevs[i];
|
||||
|
||||
- if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
|
||||
+ if (qemuDomainPrepareHostdev(vm->def, hostdev, priv) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.54.0
|
||||
@ -0,0 +1,190 @@
|
||||
From 3a5fc3778cb4ff0f09567f80947e000f74d513b4 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <3a5fc3778cb4ff0f09567f80947e000f74d513b4.1770383236.git.jdenemar@redhat.com>
|
||||
From: Nathan Chen <nathanc@nvidia.com>
|
||||
Date: Fri, 30 Jan 2026 10:59:12 -0800
|
||||
Subject: [PATCH] qemu: Implement support for associating iommufd to hostdev
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Implement a new iommufd attribute under hostdevs' PCI
|
||||
subsystem driver that can be used to specify associated
|
||||
iommufd object when launching a qemu VM.
|
||||
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
(cherry picked from commit fd113055bb174c7284081731d16959f73796e3d7)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-126345
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
docs/formatdomain.rst | 6 +++++
|
||||
src/conf/device_conf.c | 11 ++++++++
|
||||
src/conf/device_conf.h | 1 +
|
||||
src/conf/schemas/basictypes.rng | 5 ++++
|
||||
src/qemu/qemu_command.c | 46 +++++++++++++++++++++++++++++++++
|
||||
5 files changed, 69 insertions(+)
|
||||
|
||||
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
|
||||
index 1467fc7e10..167912348e 100644
|
||||
--- a/docs/formatdomain.rst
|
||||
+++ b/docs/formatdomain.rst
|
||||
@@ -4907,6 +4907,12 @@ or:
|
||||
found is "problematic" in some way, the generic vfio-pci driver
|
||||
similarly be forced.
|
||||
|
||||
+ :since:`Since 12.1.0 (QEMU and KVM only)`, the ``iommufd`` element
|
||||
+ can be used to enable IOMMUFD backend for VFIO device. This
|
||||
+ provides an interface to propagate DMA mappings to kernel for
|
||||
+ assigned devices. Libvirt will open the /dev/iommu and VFIO device
|
||||
+ cdev and pass associated file descriptors to QEMU.
|
||||
+
|
||||
(Note: :since:`Since 1.0.5`, the ``name`` attribute has been
|
||||
described to be used to select the type of PCI device assignment
|
||||
("vfio", "kvm", or "xen"), but those values have been mostly
|
||||
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
|
||||
index c278b81652..d68232a4f4 100644
|
||||
--- a/src/conf/device_conf.c
|
||||
+++ b/src/conf/device_conf.c
|
||||
@@ -67,6 +67,11 @@ virDeviceHostdevPCIDriverInfoParseXML(xmlNodePtr node,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ if (virXMLPropTristateBool(node, "iommufd",
|
||||
+ VIR_XML_PROP_NONE,
|
||||
+ &driver->iommufd) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
driver->model = virXMLPropString(node, "model");
|
||||
return 0;
|
||||
}
|
||||
@@ -93,6 +98,12 @@ virDeviceHostdevPCIDriverInfoFormat(virBuffer *buf,
|
||||
|
||||
virBufferEscapeString(&driverAttrBuf, " model='%s'", driver->model);
|
||||
|
||||
+ if (driver->iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
+ virBufferAddLit(&driverAttrBuf, " iommufd='yes'");
|
||||
+ } else if (driver->iommufd == VIR_TRISTATE_BOOL_NO) {
|
||||
+ virBufferAddLit(&driverAttrBuf, " iommufd='no'");
|
||||
+ }
|
||||
+
|
||||
virXMLFormatElement(buf, "driver", &driverAttrBuf, NULL);
|
||||
return 0;
|
||||
}
|
||||
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
|
||||
index e570f51824..116b959143 100644
|
||||
--- a/src/conf/device_conf.h
|
||||
+++ b/src/conf/device_conf.h
|
||||
@@ -47,6 +47,7 @@ VIR_ENUM_DECL(virDeviceHostdevPCIDriverName);
|
||||
struct _virDeviceHostdevPCIDriverInfo {
|
||||
virDeviceHostdevPCIDriverName name;
|
||||
char *model;
|
||||
+ virTristateBool iommufd;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
diff --git a/src/conf/schemas/basictypes.rng b/src/conf/schemas/basictypes.rng
|
||||
index 5689170fad..381e0ac24f 100644
|
||||
--- a/src/conf/schemas/basictypes.rng
|
||||
+++ b/src/conf/schemas/basictypes.rng
|
||||
@@ -673,6 +673,11 @@
|
||||
<ref name="genericName"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
+ <optional>
|
||||
+ <attribute name="iommufd">
|
||||
+ <ref name="virYesNo"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index b69fe23236..96cd6edbfc 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -4754,6 +4754,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
|
||||
g_autofree char *host = virPCIDeviceAddressAsString(&pcisrc->addr);
|
||||
const char *failover_pair_id = NULL;
|
||||
const char *driver = NULL;
|
||||
+ const char *iommufdId = NULL;
|
||||
/* 'ramfb' property must be omitted unless it's to be enabled */
|
||||
bool ramfb = pcisrc->ramfb == VIR_TRISTATE_SWITCH_ON;
|
||||
|
||||
@@ -4787,6 +4788,9 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
|
||||
teaming->persistent)
|
||||
failover_pair_id = teaming->persistent;
|
||||
|
||||
+ if (pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES)
|
||||
+ iommufdId = "iommufd0";
|
||||
+
|
||||
if (virJSONValueObjectAdd(&props,
|
||||
"s:driver", driver,
|
||||
"s:host", host,
|
||||
@@ -4795,6 +4799,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
|
||||
"S:failover_pair_id", failover_pair_id,
|
||||
"S:display", qemuOnOffAuto(pcisrc->display),
|
||||
"B:ramfb", ramfb,
|
||||
+ "S:iommufd", iommufdId,
|
||||
NULL) < 0)
|
||||
return NULL;
|
||||
|
||||
@@ -5314,6 +5319,44 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+qemuBuildIOMMUFDCommandLine(virCommand *cmd,
|
||||
+ const virDomainDef *def)
|
||||
+{
|
||||
+ size_t i;
|
||||
+
|
||||
+ for (i = 0; i < def->nhostdevs; i++) {
|
||||
+ virDomainHostdevDef *hostdev = def->hostdevs[i];
|
||||
+ virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
|
||||
+ g_autoptr(virJSONValue) props = NULL;
|
||||
+
|
||||
+ if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||
+ continue;
|
||||
+
|
||||
+ if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||
+ continue;
|
||||
+
|
||||
+ if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED)
|
||||
+ continue;
|
||||
+
|
||||
+ if (subsys->u.pci.driver.iommufd != VIR_TRISTATE_BOOL_YES)
|
||||
+ continue;
|
||||
+
|
||||
+ if (qemuMonitorCreateObjectProps(&props, "iommufd",
|
||||
+ "iommufd0",
|
||||
+ NULL) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
qemuBuildMonitorCommandLine(virCommand *cmd,
|
||||
qemuDomainObjPrivate *priv)
|
||||
@@ -10926,6 +10969,9 @@ qemuBuildCommandLine(virDomainObj *vm,
|
||||
if (qemuBuildRedirdevCommandLine(cmd, def, qemuCaps) < 0)
|
||||
return NULL;
|
||||
|
||||
+ if (qemuBuildIOMMUFDCommandLine(cmd, def) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps) < 0)
|
||||
return NULL;
|
||||
|
||||
--
|
||||
2.52.0
|
||||
@ -0,0 +1,220 @@
|
||||
From f283dd92c79286f822eaddea072cc6a54231dbbc Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <f283dd92c79286f822eaddea072cc6a54231dbbc.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Thu, 11 Dec 2025 19:47:16 +0100
|
||||
Subject: [PATCH] qemu: Implement support for persistent reservation migration
|
||||
control
|
||||
|
||||
The 'migration' attribute for the '<reservations>' 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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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 @@
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
+ <optional>
|
||||
+ <attribute name="migration">
|
||||
+ <ref name="virYesNo"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
<optional>
|
||||
<ref name="unixSocketSource"/>
|
||||
</optional>
|
||||
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, "<reservations managed='%s'",
|
||||
virTristateBoolTypeToString(prd->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 807529f670..1718097b63 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 66c59c3696..9ab285f768 100644
|
||||
--- a/src/qemu/qemu_validate.c
|
||||
+++ b/src/qemu/qemu_validate.c
|
||||
@@ -3224,6 +3224,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 @@
|
||||
<disk type='block' device='lun'>
|
||||
<driver name='qemu' type='raw'/>
|
||||
<source dev='/dev/HostVG/QEMUGuest2'>
|
||||
- <reservations managed='no'>
|
||||
+ <reservations managed='no' migration='yes'>
|
||||
<source type='unix' path='/path/to/qemu-pr-helper.sock' mode='client'/>
|
||||
</reservations>
|
||||
</source>
|
||||
--
|
||||
2.53.0
|
||||
266
SOURCES/libvirt-qemu-Introduce-QEMU_CAPS_OBJECT_IOMMUFD.patch
Normal file
266
SOURCES/libvirt-qemu-Introduce-QEMU_CAPS_OBJECT_IOMMUFD.patch
Normal file
@ -0,0 +1,266 @@
|
||||
From 634e8902ffca6246e5066816d52063f3c82dddb7 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <634e8902ffca6246e5066816d52063f3c82dddb7.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Mon, 16 Feb 2026 08:59:39 +0100
|
||||
Subject: [PATCH] qemu: Introduce QEMU_CAPS_OBJECT_IOMMUFD
|
||||
|
||||
Detect if QEMU was compiled with IOMMUFD.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 4a0ea9bcf13ea05c90f294ba70c767bc79e2ebbe)
|
||||
|
||||
Conflicts:
|
||||
These files don't exist in downstream:
|
||||
tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml
|
||||
tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
|
||||
tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
|
||||
tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 4 ++++
|
||||
src/qemu/qemu_capabilities.h | 3 +++
|
||||
src/qemu/qemu_validate.c | 8 ++++++++
|
||||
tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 1 +
|
||||
.../qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml | 1 +
|
||||
tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 1 +
|
||||
17 files changed, 29 insertions(+)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 2c8bd62c99..c23ff5539a 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -756,6 +756,9 @@ VIR_ENUM_IMPL(virQEMUCaps,
|
||||
"query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */
|
||||
"mshv", /* QEMU_CAPS_MSHV */
|
||||
"scsi-block.migrate-pr", /* QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR */
|
||||
+
|
||||
+ /* 490 */
|
||||
+ "iommufd", /* QEMU_CAPS_OBJECT_IOMMUFD */
|
||||
);
|
||||
|
||||
|
||||
@@ -1463,6 +1466,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
|
||||
{ "tpm-emulator", QEMU_CAPS_DEVICE_TPM_EMULATOR },
|
||||
{ "tpm-passthrough", QEMU_CAPS_DEVICE_TPM_PASSTHROUGH },
|
||||
{ "acpi-generic-initiator", QEMU_CAPS_ACPI_GENERIC_INITIATOR },
|
||||
+ { "iommufd", QEMU_CAPS_OBJECT_IOMMUFD },
|
||||
};
|
||||
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index 0c76f2edda..f7c8680f94 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -732,6 +732,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
|
||||
QEMU_CAPS_MSHV, /* -accel mshv */
|
||||
QEMU_CAPS_DEVICE_SCSI_BLOCK_MIGRATE_PR, /* persistent reservation migration support */
|
||||
|
||||
+ /* 490 */
|
||||
+ QEMU_CAPS_OBJECT_IOMMUFD, /* -object iommufd */
|
||||
+
|
||||
QEMU_CAPS_LAST /* this must always be the last item */
|
||||
} virQEMUCapsFlags;
|
||||
|
||||
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
|
||||
index 9ab285f768..9886ddaf1d 100644
|
||||
--- a/src/qemu/qemu_validate.c
|
||||
+++ b/src/qemu/qemu_validate.c
|
||||
@@ -2720,6 +2720,14 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||
_("VFIO PCI device assignment is not supported by this version of qemu"));
|
||||
return -1;
|
||||
}
|
||||
+
|
||||
+ if (hostdev->source.subsys.u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_IOMMUFD)) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
+ _("IOMMUFD is not supported by this version of qemu"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
if (hostdev->writeFiltering != VIR_TRISTATE_BOOL_ABSENT) {
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
|
||||
index 90e8d868cc..bbb8b33cde 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
|
||||
@@ -163,6 +163,7 @@
|
||||
<flag name='nvme-ns'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10000000</version>
|
||||
<microcodeVersion>61700285</microcodeVersion>
|
||||
<package>v10.0.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
|
||||
index 82a66a6524..cf00ac4ea0 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
|
||||
@@ -136,6 +136,7 @@
|
||||
<flag name='nvme'/>
|
||||
<flag name='nvme-ns'/>
|
||||
<flag name='usb-bot'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10000000</version>
|
||||
<microcodeVersion>39100285</microcodeVersion>
|
||||
<package>v10.0.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
|
||||
index cfce1c963d..5acd1a33fd 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
|
||||
@@ -209,6 +209,7 @@
|
||||
<flag name='amd-iommu'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10000000</version>
|
||||
<microcodeVersion>43100285</microcodeVersion>
|
||||
<package>v10.0.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
|
||||
index f94c8388d6..50f58791e6 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
|
||||
@@ -209,6 +209,7 @@
|
||||
<flag name='amd-iommu.pci-id'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10000000</version>
|
||||
<microcodeVersion>43100285</microcodeVersion>
|
||||
<package>v10.0.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
|
||||
index 8e989a139f..e321c352a3 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
|
||||
@@ -191,6 +191,7 @@
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='tdx-guest'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10000050</version>
|
||||
<microcodeVersion>43100286</microcodeVersion>
|
||||
<package>v10.0.0-1724-gf9a3def17b</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
|
||||
index 520a3d8ee8..2d52659520 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
|
||||
@@ -214,6 +214,7 @@
|
||||
<flag name='tdx-guest'/>
|
||||
<flag name='qom-list-get'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10001000</version>
|
||||
<microcodeVersion>43100286</microcodeVersion>
|
||||
<package>v10.1.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
|
||||
index 874fd7bddb..eb2ab001a6 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
|
||||
@@ -201,6 +201,7 @@
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
<flag name='query-accelerators'/>
|
||||
<flag name='mshv'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10001050</version>
|
||||
<microcodeVersion>43100287</microcodeVersion>
|
||||
<package>v10.1.0-1778-ge090e0312d</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
|
||||
index 7d5a75ce88..c4ea924c1f 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
|
||||
@@ -216,6 +216,7 @@
|
||||
<flag name='disk-timed-stats'/>
|
||||
<flag name='query-accelerators'/>
|
||||
<flag name='scsi-block.migrate-pr'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>10001091</version>
|
||||
<microcodeVersion>43100287</microcodeVersion>
|
||||
<package>v10.2.0-rc1-38-gfb241d0a1f</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
|
||||
index 1f2e27a218..88bd502fee 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
|
||||
@@ -204,6 +204,7 @@
|
||||
<flag name='amd-iommu'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9000000</version>
|
||||
<microcodeVersion>43100245</microcodeVersion>
|
||||
<package>v9.0.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
|
||||
index b961f79808..3d2692b02c 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
|
||||
@@ -126,6 +126,7 @@
|
||||
<flag name='nvme'/>
|
||||
<flag name='nvme-ns'/>
|
||||
<flag name='usb-bot'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9001000</version>
|
||||
<microcodeVersion>39100246</microcodeVersion>
|
||||
<package>v9.1.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
|
||||
index 35ddf30736..66578099a7 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
|
||||
@@ -203,6 +203,7 @@
|
||||
<flag name='amd-iommu'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9001000</version>
|
||||
<microcodeVersion>43100246</microcodeVersion>
|
||||
<package>v9.1.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
|
||||
index e9f79261f7..9f95ed891e 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
|
||||
@@ -129,6 +129,7 @@
|
||||
<flag name='nvme'/>
|
||||
<flag name='nvme-ns'/>
|
||||
<flag name='usb-bot'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9002000</version>
|
||||
<microcodeVersion>39100247</microcodeVersion>
|
||||
<package>v9.2.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
|
||||
index 0e52c3e23d..6636346bc5 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
|
||||
@@ -207,6 +207,7 @@
|
||||
<flag name='amd-iommu'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9002000</version>
|
||||
<microcodeVersion>43100247</microcodeVersion>
|
||||
<package>v9.2.0</package>
|
||||
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
|
||||
index 95f8a4d878..dee30415aa 100644
|
||||
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
|
||||
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
|
||||
@@ -205,6 +205,7 @@
|
||||
<flag name='amd-iommu'/>
|
||||
<flag name='usb-bot'/>
|
||||
<flag name='acpi-generic-initiator'/>
|
||||
+ <flag name='iommufd'/>
|
||||
<version>9002000</version>
|
||||
<microcodeVersion>43100247</microcodeVersion>
|
||||
<package>v9.2.0</package>
|
||||
--
|
||||
2.53.0
|
||||
276
SOURCES/libvirt-qemu-Introduce-privateData-for-hostdevs.patch
Normal file
276
SOURCES/libvirt-qemu-Introduce-privateData-for-hostdevs.patch
Normal file
@ -0,0 +1,276 @@
|
||||
From 7478247b414df910fc319aa3c1d016f81e510fd9 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <7478247b414df910fc319aa3c1d016f81e510fd9.1770383236.git.jdenemar@redhat.com>
|
||||
From: Nathan Chen <nathanc@nvidia.com>
|
||||
Date: Fri, 30 Jan 2026 10:59:13 -0800
|
||||
Subject: [PATCH] qemu: Introduce privateData for hostdevs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Introduce private data for hostdevs and allocate hostdev
|
||||
private data by default.
|
||||
|
||||
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
(cherry picked from commit 1043e04e17ed4be59b46e925089204333c08f05e)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-126345
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/bhyve/bhyve_parse_command.c | 2 +-
|
||||
src/conf/domain_conf.c | 13 +++++++++--
|
||||
src/conf/domain_conf.h | 5 ++++-
|
||||
src/libxl/xen_common.c | 2 +-
|
||||
src/libxl/xen_xl.c | 2 +-
|
||||
src/lxc/lxc_native.c | 2 +-
|
||||
src/qemu/qemu_domain.c | 40 +++++++++++++++++++++++++++++++++
|
||||
src/qemu/qemu_domain.h | 15 +++++++++++++
|
||||
src/vbox/vbox_common.c | 2 +-
|
||||
tests/virhostdevtest.c | 2 +-
|
||||
10 files changed, 76 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
|
||||
index d62ea64beb..8b405206bd 100644
|
||||
--- a/src/bhyve/bhyve_parse_command.c
|
||||
+++ b/src/bhyve/bhyve_parse_command.c
|
||||
@@ -687,7 +687,7 @@ bhyveParsePassthru(virDomainDef *def G_GNUC_UNUSED,
|
||||
return -1;
|
||||
}
|
||||
|
||||
- hostdev = virDomainHostdevDefNew();
|
||||
+ hostdev = virDomainHostdevDefNew(NULL);
|
||||
hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
|
||||
hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
|
||||
|
||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||
index 541dad5bdc..f950f7c75d 100644
|
||||
--- a/src/conf/domain_conf.c
|
||||
+++ b/src/conf/domain_conf.c
|
||||
@@ -2733,6 +2733,8 @@ virDomainHostdevDefClear(virDomainHostdevDef *def)
|
||||
case VIR_DOMAIN_HOSTDEV_MODE_LAST:
|
||||
break;
|
||||
}
|
||||
+
|
||||
+ g_clear_pointer(&def->privateData, virObjectUnref);
|
||||
}
|
||||
|
||||
|
||||
@@ -3483,7 +3485,7 @@ void virDomainVideoDefFree(virDomainVideoDef *def)
|
||||
|
||||
|
||||
virDomainHostdevDef *
|
||||
-virDomainHostdevDefNew(void)
|
||||
+virDomainHostdevDefNew(virDomainXMLOption *xmlopt)
|
||||
{
|
||||
virDomainHostdevDef *def;
|
||||
|
||||
@@ -3491,6 +3493,13 @@ virDomainHostdevDefNew(void)
|
||||
|
||||
def->info = g_new0(virDomainDeviceInfo, 1);
|
||||
|
||||
+ if (xmlopt && xmlopt->privateData.hostdevNew &&
|
||||
+ !(def->privateData = xmlopt->privateData.hostdevNew())) {
|
||||
+ VIR_FREE(def->info);
|
||||
+ VIR_FREE(def);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
return def;
|
||||
}
|
||||
|
||||
@@ -13678,7 +13687,7 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xmlopt,
|
||||
|
||||
ctxt->node = node;
|
||||
|
||||
- def = virDomainHostdevDefNew();
|
||||
+ def = virDomainHostdevDefNew(xmlopt);
|
||||
|
||||
if (virXMLPropEnumDefault(node, "mode", virDomainHostdevModeTypeFromString,
|
||||
VIR_XML_PROP_NONE,
|
||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
||||
index cb35ff06bd..8f53ed96c0 100644
|
||||
--- a/src/conf/domain_conf.h
|
||||
+++ b/src/conf/domain_conf.h
|
||||
@@ -364,6 +364,8 @@ struct _virDomainHostdevDef {
|
||||
*/
|
||||
virDomainNetDef *parentnet;
|
||||
|
||||
+ virObject *privateData;
|
||||
+
|
||||
virDomainHostdevMode mode;
|
||||
virDomainStartupPolicy startupPolicy;
|
||||
bool managed;
|
||||
@@ -3588,6 +3590,7 @@ struct _virDomainXMLPrivateDataCallbacks {
|
||||
virDomainXMLPrivateDataNewFunc vsockNew;
|
||||
virDomainXMLPrivateDataNewFunc cryptoNew;
|
||||
virDomainXMLPrivateDataNewFunc graphicsNew;
|
||||
+ virDomainXMLPrivateDataNewFunc hostdevNew;
|
||||
virDomainXMLPrivateDataNewFunc networkNew;
|
||||
virDomainXMLPrivateDataNetParseFunc networkParse;
|
||||
virDomainXMLPrivateDataNetFormatFunc networkFormat;
|
||||
@@ -3797,7 +3800,7 @@ virDomainVideoDef *virDomainVideoDefNew(virDomainXMLOption *xmlopt);
|
||||
void virDomainVideoDefFree(virDomainVideoDef *def);
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainVideoDef, virDomainVideoDefFree);
|
||||
void virDomainVideoDefClear(virDomainVideoDef *def);
|
||||
-virDomainHostdevDef *virDomainHostdevDefNew(void);
|
||||
+virDomainHostdevDef *virDomainHostdevDefNew(virDomainXMLOption *xmlopt);
|
||||
void virDomainHostdevDefFree(virDomainHostdevDef *def);
|
||||
void virDomainHubDefFree(virDomainHubDef *def);
|
||||
void virDomainRedirdevDefFree(virDomainRedirdevDef *def);
|
||||
diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
|
||||
index 666c6cae20..f19e4f6abb 100644
|
||||
--- a/src/libxl/xen_common.c
|
||||
+++ b/src/libxl/xen_common.c
|
||||
@@ -445,7 +445,7 @@ xenParsePCI(char *entry)
|
||||
}
|
||||
}
|
||||
|
||||
- hostdev = virDomainHostdevDefNew();
|
||||
+ hostdev = virDomainHostdevDefNew(NULL);
|
||||
hostdev->managed = false;
|
||||
hostdev->writeFiltering = filtered;
|
||||
hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
|
||||
diff --git a/src/libxl/xen_xl.c b/src/libxl/xen_xl.c
|
||||
index b2ff0edcf2..e62302736b 100644
|
||||
--- a/src/libxl/xen_xl.c
|
||||
+++ b/src/libxl/xen_xl.c
|
||||
@@ -930,7 +930,7 @@ xenParseXLUSB(virConf *conf, virDomainDef *def)
|
||||
key = nextkey;
|
||||
}
|
||||
|
||||
- hostdev = virDomainHostdevDefNew();
|
||||
+ hostdev = virDomainHostdevDefNew(NULL);
|
||||
hostdev->managed = false;
|
||||
hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB;
|
||||
hostdev->source.subsys.u.usb.bus = busNum;
|
||||
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
|
||||
index 7700804429..a94427b027 100644
|
||||
--- a/src/lxc/lxc_native.c
|
||||
+++ b/src/lxc/lxc_native.c
|
||||
@@ -376,7 +376,7 @@ lxcCreateNetDef(const char *type,
|
||||
static virDomainHostdevDef *
|
||||
lxcCreateHostdevDef(const char *data)
|
||||
{
|
||||
- virDomainHostdevDef *hostdev = virDomainHostdevDefNew();
|
||||
+ virDomainHostdevDef *hostdev = virDomainHostdevDefNew(NULL);
|
||||
hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES;
|
||||
hostdev->source.caps.type = VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET;
|
||||
hostdev->source.caps.u.net.ifname = g_strdup(data);
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 486a0e7913..3366214677 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -1238,6 +1238,45 @@ qemuDomainNetworkPrivateFormat(const virDomainNetDef *net,
|
||||
}
|
||||
|
||||
|
||||
+static virClass *qemuDomainHostdevPrivateClass;
|
||||
+
|
||||
+static void
|
||||
+qemuDomainHostdevPrivateDispose(void *obj)
|
||||
+{
|
||||
+ qemuDomainHostdevPrivate *priv = obj;
|
||||
+
|
||||
+ VIR_FORCE_CLOSE(priv->vfioDeviceFd);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int
|
||||
+qemuDomainHostdevPrivateOnceInit(void)
|
||||
+{
|
||||
+ if (!VIR_CLASS_NEW(qemuDomainHostdevPrivate, virClassForObject()))
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+VIR_ONCE_GLOBAL_INIT(qemuDomainHostdevPrivate);
|
||||
+
|
||||
+virObject *
|
||||
+qemuDomainHostdevPrivateNew(void)
|
||||
+{
|
||||
+ qemuDomainHostdevPrivate *priv;
|
||||
+
|
||||
+ if (qemuDomainHostdevPrivateInitialize() < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (!(priv = virObjectNew(qemuDomainHostdevPrivateClass)))
|
||||
+ return NULL;
|
||||
+
|
||||
+ priv->vfioDeviceFd = -1;
|
||||
+
|
||||
+ return (virObject *) priv;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/* qemuDomainSecretInfoSetup:
|
||||
* @priv: pointer to domain private object
|
||||
* @alias: alias of the secret
|
||||
@@ -3563,6 +3602,7 @@ virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = {
|
||||
.chrSourceNew = qemuDomainChrSourcePrivateNew,
|
||||
.vsockNew = qemuDomainVsockPrivateNew,
|
||||
.graphicsNew = qemuDomainGraphicsPrivateNew,
|
||||
+ .hostdevNew = qemuDomainHostdevPrivateNew,
|
||||
.networkNew = qemuDomainNetworkPrivateNew,
|
||||
.networkParse = qemuDomainNetworkPrivateParse,
|
||||
.networkFormat = qemuDomainNetworkPrivateFormat,
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index b9bb338682..88c8416aa4 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -461,6 +461,18 @@ struct _qemuDomainTPMPrivate {
|
||||
};
|
||||
|
||||
|
||||
+#define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev) \
|
||||
+ ((qemuDomainHostdevPrivate *) (hostdev)->privateData)
|
||||
+
|
||||
+typedef struct _qemuDomainHostdevPrivate qemuDomainHostdevPrivate;
|
||||
+struct _qemuDomainHostdevPrivate {
|
||||
+ virObject parent;
|
||||
+
|
||||
+ /* VFIO device file descriptor for iommufd passthrough */
|
||||
+ int vfioDeviceFd;
|
||||
+};
|
||||
+
|
||||
+
|
||||
void
|
||||
qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate *priv);
|
||||
|
||||
@@ -1175,3 +1187,6 @@ qemuDomainCheckCPU(virArch arch,
|
||||
bool
|
||||
qemuDomainMachineSupportsFloppy(const char *machine,
|
||||
virQEMUCaps *qemuCaps);
|
||||
+
|
||||
+virObject *
|
||||
+qemuDomainHostdevPrivateNew(void);
|
||||
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
|
||||
index 26c5fdfef6..d2a8cf8da4 100644
|
||||
--- a/src/vbox/vbox_common.c
|
||||
+++ b/src/vbox/vbox_common.c
|
||||
@@ -3090,7 +3090,7 @@ vboxHostDeviceGetXMLDesc(struct _vboxDriver *data, virDomainDef *def, IMachine *
|
||||
def->hostdevs = g_new0(virDomainHostdevDef *, def->nhostdevs);
|
||||
|
||||
for (i = 0; i < def->nhostdevs; i++)
|
||||
- def->hostdevs[i] = virDomainHostdevDefNew();
|
||||
+ def->hostdevs[i] = virDomainHostdevDefNew(NULL);
|
||||
|
||||
for (i = 0; i < deviceFilters.count; i++) {
|
||||
PRBool active = PR_FALSE;
|
||||
diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c
|
||||
index aec474a148..a35c1d9402 100644
|
||||
--- a/tests/virhostdevtest.c
|
||||
+++ b/tests/virhostdevtest.c
|
||||
@@ -124,7 +124,7 @@ myInit(void)
|
||||
|
||||
for (i = 0; i < nhostdevs; i++) {
|
||||
virDomainHostdevSubsys *subsys;
|
||||
- hostdevs[i] = virDomainHostdevDefNew();
|
||||
+ hostdevs[i] = virDomainHostdevDefNew(NULL);
|
||||
if (!hostdevs[i])
|
||||
goto cleanup;
|
||||
hostdevs[i]->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
|
||||
--
|
||||
2.52.0
|
||||
@ -1,105 +0,0 @@
|
||||
From 85b7d8295d72214b08f0fff93c473baaa88a569b Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <85b7d8295d72214b08f0fff93c473baaa88a569b@dist-git>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Mon, 14 Feb 2022 15:57:21 +0100
|
||||
Subject: [PATCH] qemu: Make 'struct _qemuMonitorMessage' private
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Move the declaration of the struct into 'qemu_monitor_priv.h' as other
|
||||
code has no business in peeking into the monitor messages.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit f9ae469a6ebb17e0990096e826f049c1c46cd760)
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2170472
|
||||
---
|
||||
src/qemu/qemu_monitor.h | 14 --------------
|
||||
src/qemu/qemu_monitor_json.c | 3 +++
|
||||
src/qemu/qemu_monitor_priv.h | 16 ++++++++++++++++
|
||||
tests/qemucapsprobemock.c | 3 +++
|
||||
4 files changed, 22 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
||||
index a4a4edf5a6..d00967d84f 100644
|
||||
--- a/src/qemu/qemu_monitor.h
|
||||
+++ b/src/qemu/qemu_monitor.h
|
||||
@@ -34,21 +34,7 @@
|
||||
#include "virenum.h"
|
||||
|
||||
typedef struct _qemuMonitor qemuMonitor;
|
||||
-
|
||||
typedef struct _qemuMonitorMessage qemuMonitorMessage;
|
||||
-struct _qemuMonitorMessage {
|
||||
- int txFD;
|
||||
-
|
||||
- const char *txBuffer;
|
||||
- int txOffset;
|
||||
- int txLength;
|
||||
-
|
||||
- /* Used by the JSON monitor to hold reply / error */
|
||||
- void *rxObject;
|
||||
-
|
||||
- /* True if rxObject is ready, or a fatal error occurred on the monitor channel */
|
||||
- bool finished;
|
||||
-};
|
||||
|
||||
typedef enum {
|
||||
QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE = 0,
|
||||
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
||||
index 34a46b9b41..7d8755246f 100644
|
||||
--- a/src/qemu/qemu_monitor_json.c
|
||||
+++ b/src/qemu/qemu_monitor_json.c
|
||||
@@ -44,6 +44,9 @@
|
||||
# include "libvirt_qemu_probes.h"
|
||||
#endif
|
||||
|
||||
+#define LIBVIRT_QEMU_MONITOR_PRIV_H_ALLOW
|
||||
+#include "qemu_monitor_priv.h"
|
||||
+
|
||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
||||
|
||||
VIR_LOG_INIT("qemu.qemu_monitor_json");
|
||||
diff --git a/src/qemu/qemu_monitor_priv.h b/src/qemu/qemu_monitor_priv.h
|
||||
index 31bb3526b9..6115f830de 100644
|
||||
--- a/src/qemu/qemu_monitor_priv.h
|
||||
+++ b/src/qemu/qemu_monitor_priv.h
|
||||
@@ -24,5 +24,21 @@
|
||||
|
||||
#include "qemu_monitor.h"
|
||||
|
||||
+
|
||||
+struct _qemuMonitorMessage {
|
||||
+ int txFD;
|
||||
+
|
||||
+ const char *txBuffer;
|
||||
+ int txOffset;
|
||||
+ int txLength;
|
||||
+
|
||||
+ /* Used by the JSON monitor to hold reply / error */
|
||||
+ void *rxObject;
|
||||
+
|
||||
+ /* True if rxObject is ready, or a fatal error occurred on the monitor channel */
|
||||
+ bool finished;
|
||||
+};
|
||||
+
|
||||
+
|
||||
void
|
||||
qemuMonitorResetCommandID(qemuMonitor *mon);
|
||||
diff --git a/tests/qemucapsprobemock.c b/tests/qemucapsprobemock.c
|
||||
index 915036d178..2717ed5d84 100644
|
||||
--- a/tests/qemucapsprobemock.c
|
||||
+++ b/tests/qemucapsprobemock.c
|
||||
@@ -25,6 +25,9 @@
|
||||
#include "qemu/qemu_monitor.h"
|
||||
#include "qemu/qemu_monitor_json.h"
|
||||
|
||||
+#define LIBVIRT_QEMU_MONITOR_PRIV_H_ALLOW
|
||||
+#include "qemu/qemu_monitor_priv.h"
|
||||
+
|
||||
#define REAL_SYM(realFunc) \
|
||||
do { \
|
||||
if (!realFunc && !(realFunc = dlsym(RTLD_NEXT, __FUNCTION__))) { \
|
||||
--
|
||||
2.40.1
|
||||
@ -0,0 +1,111 @@
|
||||
From 38c43950b3f6327e5d51e6751415208e5a467bed Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <38c43950b3f6327e5d51e6751415208e5a467bed.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Mon, 16 Feb 2026 09:12:02 +0100
|
||||
Subject: [PATCH] qemu: Move IOMMUFD validation to qemu_validate
|
||||
|
||||
Fail early if kernel doesn't support IOMMUFD.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 0c1af67be554d4daa2facfb647ce6e9914da2f06)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/libvirt_private.syms | 1 +
|
||||
src/qemu/qemu_process.c | 8 +-------
|
||||
src/qemu/qemu_validate.c | 7 +++++++
|
||||
src/util/viriommufd.c | 13 +++++++++++++
|
||||
src/util/viriommufd.h | 2 ++
|
||||
5 files changed, 24 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index e2a7a16347..0904265459 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -2654,6 +2654,7 @@ virInitctlSetRunLevel;
|
||||
|
||||
# util/viriommufd.h
|
||||
virIOMMUFDSetRLimitMode;
|
||||
+virIOMMUFDSupported;
|
||||
|
||||
# util/viriscsi.h
|
||||
virISCSIConnectionLogin;
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 37e688018c..479437fb34 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -7690,13 +7690,7 @@ qemuProcessOpenIommuFd(virDomainObj *vm)
|
||||
VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name);
|
||||
|
||||
if ((fd = open(VIR_IOMMU_DEV_PATH, O_RDWR | O_CLOEXEC)) < 0) {
|
||||
- if (errno == ENOENT) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
- _("IOMMU FD support requires /dev/iommu device"));
|
||||
- } else {
|
||||
- virReportSystemError(errno, "%s",
|
||||
- _("cannot open /dev/iommu"));
|
||||
- }
|
||||
+ virReportSystemError(errno, "%s", _("cannot open /dev/iommu"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
|
||||
index 9886ddaf1d..5c8c21335d 100644
|
||||
--- a/src/qemu/qemu_validate.c
|
||||
+++ b/src/qemu/qemu_validate.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "qemu_process.h"
|
||||
#include "domain_conf.h"
|
||||
#include "virbitmap.h"
|
||||
+#include "viriommufd.h"
|
||||
#include "virlog.h"
|
||||
#include "virutil.h"
|
||||
|
||||
@@ -2727,6 +2728,12 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
|
||||
_("IOMMUFD is not supported by this version of qemu"));
|
||||
return -1;
|
||||
}
|
||||
+
|
||||
+ if (!virIOMMUFDSupported()) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
+ _("IOMMUFD is not supported by host kernel"));
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/util/viriommufd.c b/src/util/viriommufd.c
|
||||
index 5af097683d..44b30029a5 100644
|
||||
--- a/src/util/viriommufd.c
|
||||
+++ b/src/util/viriommufd.c
|
||||
@@ -88,3 +88,16 @@ int virIOMMUFDSetRLimitMode(int fd G_GNUC_UNUSED,
|
||||
}
|
||||
|
||||
#endif
|
||||
+
|
||||
+/**
|
||||
+ * virIOMMUFDSupported:
|
||||
+ *
|
||||
+ * Check the presence of IOMMU device.
|
||||
+ *
|
||||
+ * Retruns: true if it exists, false otherwise
|
||||
+ */
|
||||
+bool
|
||||
+virIOMMUFDSupported(void)
|
||||
+{
|
||||
+ return virFileExists(VIR_IOMMU_DEV_PATH);
|
||||
+}
|
||||
diff --git a/src/util/viriommufd.h b/src/util/viriommufd.h
|
||||
index ebecfe3633..ec6be9fa66 100644
|
||||
--- a/src/util/viriommufd.h
|
||||
+++ b/src/util/viriommufd.h
|
||||
@@ -23,3 +23,5 @@
|
||||
#define VIR_IOMMU_DEV_PATH "/dev/iommu"
|
||||
|
||||
int virIOMMUFDSetRLimitMode(int fd, bool processAccounting);
|
||||
+
|
||||
+bool virIOMMUFDSupported(void);
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,196 @@
|
||||
From 9ec1c8fc52cd3150712f5ada134e070fbdabb7bb Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <9ec1c8fc52cd3150712f5ada134e070fbdabb7bb.1780571166.git.jdenemar@redhat.com>
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Thu, 21 May 2026 12:36:48 +0200
|
||||
Subject: [PATCH] qemu: Move domain caps flags handling to
|
||||
virQEMUCapsFillDomainCPUHostModel
|
||||
|
||||
We will need to generate the capabilities in a different way based on
|
||||
the flags.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
(cherry picked from commit b4d3572198848e6a2886352e1a48b46afa37bec1)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177364
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 34 ++++++++++++++++++++++++----------
|
||||
src/qemu/qemu_capabilities.h | 3 ++-
|
||||
src/qemu/qemu_conf.c | 6 ++++--
|
||||
src/qemu/qemu_conf.h | 3 ++-
|
||||
src/qemu/qemu_driver.c | 15 ++-------------
|
||||
tests/domaincapstest.c | 2 +-
|
||||
6 files changed, 35 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 0b32296cc8..c17b55420d 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -6584,14 +6584,26 @@ virQEMUCapsFillDomainCPUMaximum(virDomainCaps *domCaps)
|
||||
|
||||
static void
|
||||
virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps,
|
||||
- virDomainCaps *domCaps)
|
||||
+ virDomainCaps *domCaps,
|
||||
+ unsigned int flags)
|
||||
{
|
||||
- virCPUDef *cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
|
||||
- VIR_QEMU_CAPS_HOST_CPU_REPORTED);
|
||||
+ virQEMUCapsHostCPUType cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED;
|
||||
+ virCPUDef *cpu;
|
||||
|
||||
- domCaps->cpu.hostModel = virCPUDefCopy(cpu);
|
||||
- domCaps->cpu.hostModel->addr = virQEMUCapsGetHostPhysAddr(qemuCaps,
|
||||
- domCaps->virttype);
|
||||
+ cpu = virCPUDefCopy(virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
|
||||
+ cpuType));
|
||||
+
|
||||
+ cpu->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, domCaps->virttype);
|
||||
+
|
||||
+ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) {
|
||||
+ virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, domCaps->virttype,
|
||||
+ cpu, VIR_CPU_FEATURE_DISABLE);
|
||||
+ }
|
||||
+
|
||||
+ if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES)
|
||||
+ virCPUExpandFeatures(domCaps->arch, cpu);
|
||||
+
|
||||
+ domCaps->cpu.hostModel = cpu;
|
||||
}
|
||||
|
||||
|
||||
@@ -6616,7 +6628,8 @@ virQEMUCapsFillDomainCPUCustom(virQEMUCaps *qemuCaps,
|
||||
static void
|
||||
virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps,
|
||||
virArch hostarch,
|
||||
- virDomainCaps *domCaps)
|
||||
+ virDomainCaps *domCaps,
|
||||
+ unsigned int flags)
|
||||
{
|
||||
if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
|
||||
VIR_CPU_MODE_HOST_PASSTHROUGH,
|
||||
@@ -6633,7 +6646,7 @@ virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps,
|
||||
if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
|
||||
VIR_CPU_MODE_HOST_MODEL,
|
||||
domCaps->machine)) {
|
||||
- virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps);
|
||||
+ virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps, flags);
|
||||
}
|
||||
|
||||
if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
|
||||
@@ -7263,7 +7276,8 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
|
||||
virQEMUCaps *qemuCaps,
|
||||
virArch hostarch,
|
||||
virDomainCaps *domCaps,
|
||||
- bool privileged)
|
||||
+ bool privileged,
|
||||
+ unsigned int flags)
|
||||
{
|
||||
virDomainCapsOS *os = &domCaps->os;
|
||||
virDomainCapsDeviceDisk *disk = &domCaps->disk;
|
||||
@@ -7305,7 +7319,7 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
|
||||
firmwares, nfirmwares) < 0)
|
||||
return -1;
|
||||
|
||||
- virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps);
|
||||
+ virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps, flags);
|
||||
virQEMUCapsFillDomainMemoryBackingCaps(qemuCaps, memoryBacking);
|
||||
virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk);
|
||||
virQEMUCapsFillDomainDeviceGraphicsCaps(cfg, qemuCaps, graphics);
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index f7c8680f94..bc3ecbb89f 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -896,7 +896,8 @@ int virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
|
||||
virQEMUCaps *qemuCaps,
|
||||
virArch hostarch,
|
||||
virDomainCaps *domCaps,
|
||||
- bool privileged);
|
||||
+ bool privileged,
|
||||
+ unsigned int flags);
|
||||
|
||||
void virQEMUCapsFillDomainMemoryBackingCaps(virQEMUCaps *qemuCaps,
|
||||
virDomainCapsMemoryBacking *memoryBacking);
|
||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
||||
index 242955200a..5e40635871 100644
|
||||
--- a/src/qemu/qemu_conf.c
|
||||
+++ b/src/qemu/qemu_conf.c
|
||||
@@ -1708,7 +1708,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
|
||||
virQEMUCaps *qemuCaps,
|
||||
const char *machine,
|
||||
virArch arch,
|
||||
- virDomainVirtType virttype)
|
||||
+ virDomainVirtType virttype,
|
||||
+ unsigned int flags)
|
||||
{
|
||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||
g_autoptr(virDomainCaps) domCaps = NULL;
|
||||
@@ -1742,7 +1743,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
|
||||
qemuCaps,
|
||||
driver->hostarch,
|
||||
domCaps,
|
||||
- driver->privileged) < 0)
|
||||
+ driver->privileged,
|
||||
+ flags) < 0)
|
||||
return NULL;
|
||||
|
||||
return g_steal_pointer(&domCaps);
|
||||
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
|
||||
index edb65c99f4..36d7808e10 100644
|
||||
--- a/src/qemu/qemu_conf.h
|
||||
+++ b/src/qemu/qemu_conf.h
|
||||
@@ -375,7 +375,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
|
||||
virQEMUCaps *qemuCaps,
|
||||
const char *machine,
|
||||
virArch arch,
|
||||
- virDomainVirtType virttype);
|
||||
+ virDomainVirtType virttype,
|
||||
+ unsigned int flags);
|
||||
|
||||
int qemuDriverAllocateID(virQEMUDriver *driver);
|
||||
virDomainXMLOption *virQEMUDriverCreateXMLConf(virQEMUDriver *driver,
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index 8db9cbb6a2..0a61f97666 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -16738,21 +16738,10 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
|
||||
if (!(domCaps = virQEMUDriverGetDomainCapabilities(driver,
|
||||
qemuCaps, machine,
|
||||
- arch, virttype)))
|
||||
+ arch, virttype,
|
||||
+ flags)))
|
||||
return NULL;
|
||||
|
||||
- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) {
|
||||
- virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, virttype,
|
||||
- domCaps->cpu.hostModel,
|
||||
- VIR_CPU_FEATURE_DISABLE);
|
||||
- }
|
||||
-
|
||||
- if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) {
|
||||
- virCPUDef *cpu = domCaps->cpu.hostModel;
|
||||
- if (cpu && virCPUExpandFeatures(arch, cpu) < 0)
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
return virDomainCapsFormat(domCaps);
|
||||
}
|
||||
|
||||
diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c
|
||||
index 5b2fc80f0a..f2248c2435 100644
|
||||
--- a/tests/domaincapstest.c
|
||||
+++ b/tests/domaincapstest.c
|
||||
@@ -101,7 +101,7 @@ fillQemuCaps(virDomainCaps *domCaps,
|
||||
|
||||
if (virQEMUCapsFillDomainCaps(cfg,
|
||||
qemuCaps, domCaps->arch, domCaps,
|
||||
- false) < 0)
|
||||
+ false, 0) < 0)
|
||||
return -1;
|
||||
|
||||
/* As of f05b6a918e28 we are expecting to see OVMF_CODE.fd file which
|
||||
--
|
||||
2.54.0
|
||||
64
SOURCES/libvirt-qemu-Remove-qemuDomainSupportsVideoVga.patch
Normal file
64
SOURCES/libvirt-qemu-Remove-qemuDomainSupportsVideoVga.patch
Normal file
@ -0,0 +1,64 @@
|
||||
From 5b39266bbc99576fec79c1dc9e24823a9aaa3602 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <5b39266bbc99576fec79c1dc9e24823a9aaa3602.1784297532.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
Date: Tue, 9 Jun 2026 22:58:54 +0200
|
||||
Subject: [PATCH] qemu: Remove 'qemuDomainSupportsVideoVga'
|
||||
|
||||
The function is unused remove it.
|
||||
|
||||
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit a95619316406b43457c0fb1436031042d5e25bec)
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-186019
|
||||
|
||||
https://redhat.atlassian.net/browse/RHEL-177646 (rhel-9.9)
|
||||
---
|
||||
src/qemu/qemu_domain.c | 17 -----------------
|
||||
src/qemu/qemu_domain.h | 3 ---
|
||||
2 files changed, 20 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 7699d1000f..78587e2574 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -9267,23 +9267,6 @@ qemuDomainVcpuPersistOrder(virDomainDef *def)
|
||||
}
|
||||
|
||||
|
||||
-bool
|
||||
-qemuDomainSupportsVideoVga(const virDomainVideoDef *video,
|
||||
- virQEMUCaps *qemuCaps)
|
||||
-{
|
||||
- if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
|
||||
- if (video->backend == VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER) {
|
||||
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VHOST_USER_VGA))
|
||||
- return false;
|
||||
- } else if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_VGA)) {
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-
|
||||
/**
|
||||
* qemuDomainNeedsVFIO:
|
||||
* @def: domain definition to check
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index ff26885ffe..a8bf301d51 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -985,9 +985,6 @@ bool qemuDomainVcpuHotplugIsInOrder(virDomainDef *def)
|
||||
void qemuDomainVcpuPersistOrder(virDomainDef *def)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
|
||||
-bool qemuDomainSupportsVideoVga(const virDomainVideoDef *video,
|
||||
- virQEMUCaps *qemuCaps);
|
||||
-
|
||||
bool qemuDomainNeedsVFIO(const virDomainDef *def);
|
||||
|
||||
int qemuDomainGetHostdevPath(virDomainHostdevDef *dev,
|
||||
--
|
||||
2.55.0
|
||||
@ -0,0 +1,79 @@
|
||||
From c061be3f01ee2e1b6138a440bbd137bdb71e785f Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <c061be3f01ee2e1b6138a440bbd137bdb71e785f.1771423832.git.jdenemar@redhat.com>
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sat, 14 Feb 2026 17:54:57 +0100
|
||||
Subject: [PATCH] qemu: Save IOMMUFD state into status XML
|
||||
|
||||
We need to track if iommufd object was added to the VM when we add
|
||||
hotplug support.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit b21b6dcc72f1853f103f3cfbe1ebbcfbf128b458)
|
||||
|
||||
Resolves: https://issues.redhat.com/browse/RHEL-150353
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_command.c | 2 ++
|
||||
src/qemu/qemu_domain.c | 6 ++++++
|
||||
src/qemu/qemu_domain.h | 1 +
|
||||
3 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 445d328358..b866c690ae 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -5359,6 +5359,8 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
|
||||
if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0)
|
||||
return -1;
|
||||
|
||||
+ priv->iommufdState = true;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index ada9d3431c..ccbfc8bac7 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -1976,6 +1976,7 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
|
||||
priv->migrationRecoverSetup = false;
|
||||
|
||||
g_clear_pointer(&priv->iommufd, qemuFDPassDirectFree);
|
||||
+ priv->iommufdState = false;
|
||||
|
||||
g_clear_pointer(&priv->memoryBackingDir, g_free);
|
||||
}
|
||||
@@ -2844,6 +2845,9 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf,
|
||||
priv->preMigrationMemlock);
|
||||
}
|
||||
|
||||
+ if (priv->iommufdState)
|
||||
+ virBufferAddLit(buf, "<iommufd/>\n");
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3582,6 +3586,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ priv->iommufdState = virXPathBoolean("boolean(./iommufd)", ctxt) == 1;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
||||
index 8aa94fc25b..62c5252b9f 100644
|
||||
--- a/src/qemu/qemu_domain.h
|
||||
+++ b/src/qemu/qemu_domain.h
|
||||
@@ -265,6 +265,7 @@ struct _qemuDomainObjPrivate {
|
||||
GHashTable *fds;
|
||||
|
||||
qemuFDPassDirect *iommufd;
|
||||
+ bool iommufdState; /* true if --object iommufd was added */
|
||||
|
||||
char *memoryBackingDir;
|
||||
};
|
||||
--
|
||||
2.53.0
|
||||
@ -0,0 +1,132 @@
|
||||
From 8ea558c6eff6cc3b968b1124ad4e005bb3844d74 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <8ea558c6eff6cc3b968b1124ad4e005bb3844d74.1771336751.git.jdenemar@redhat.com>
|
||||
From: Peter Krempa <pkrempa@redhat.com>
|
||||
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 <pkrempa@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user