forked from rpms/libvirt
Import rpm: 4aa5c416e0e962f82ce124cae00474e2f39d7d2e
This commit is contained in:
commit
b41b044289
31
.abignore
Normal file
31
.abignore
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
[suppress_function]
|
||||||
|
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||||
|
soname_regexp = libvirt\\.so.*
|
||||||
|
|
||||||
|
[suppress_function]
|
||||||
|
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||||
|
soname_regexp = libvirt-admin\\.so.*
|
||||||
|
|
||||||
|
[suppress_variable]
|
||||||
|
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||||
|
soname_regexp = libvirt\\.so.*
|
||||||
|
|
||||||
|
[suppress_variable]
|
||||||
|
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||||
|
soname_regexp = libvirt-admin\\.so.*
|
||||||
|
|
||||||
|
[suppress_function]
|
||||||
|
symbol_version_regexp = .*
|
||||||
|
soname_regexp = libvirt_storage_.*\\.so.*
|
||||||
|
|
||||||
|
[suppress_variable]
|
||||||
|
symbol_version_regexp = .*
|
||||||
|
soname_regexp = libvirt_storage_.*\\.so.*
|
||||||
|
|
||||||
|
[suppress_function]
|
||||||
|
symbol_version_regexp = .*
|
||||||
|
soname_regexp = libvirt_driver_.*\\.so.*
|
||||||
|
|
||||||
|
[suppress_variable]
|
||||||
|
symbol_version_regexp = .*
|
||||||
|
soname_regexp = libvirt_driver_.*\\.so.*
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
SOURCES/libvirt-8.0.0.tar.xz
|
9
gating.yaml
Normal file
9
gating.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# recipients: libvirt-qe
|
||||||
|
--- !Policy
|
||||||
|
product_versions:
|
||||||
|
- rhel-9
|
||||||
|
decision_context: osci_compose_gate
|
||||||
|
subject_type: brew-build
|
||||||
|
rules:
|
||||||
|
- !PassingTestCaseRule {test_case_name: libvirt-ci.libvirt.brew-build.gating.x86_64.tier1.functional}
|
||||||
|
- !PassingTestCaseRule {test_case_name: libvirt-ci.libvirt-python.brew-build.gating.x86_64.tier1.functional}
|
@ -0,0 +1,47 @@
|
|||||||
|
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
|
||||||
|
|
257
libvirt-RHEL-Enable-usage-of-x-blockdev-reopen.patch
Normal file
257
libvirt-RHEL-Enable-usage-of-x-blockdev-reopen.patch
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
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
|
||||||
|
|
46
libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch
Normal file
46
libvirt-RHEL-Fix-virConnectGetMaxVcpus-output.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
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
|
||||||
|
|
185
libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch
Normal file
185
libvirt-RHEL-Hack-around-changed-Broadwell-Haswell-CPUs.patch
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
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,89 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,81 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,66 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,215 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,272 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,200 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,103 @@
|
|||||||
|
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
|
||||||
|
|
155
libvirt-conf-Introduce-memory-allocation-threads.patch
Normal file
155
libvirt-conf-Introduce-memory-allocation-threads.patch
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
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
|
||||||
|
|
62
libvirt-docs-Document-TPM-portion-of-domcaps.patch
Normal file
62
libvirt-docs-Document-TPM-portion-of-domcaps.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
From b5a226f307b01bb1b58a88c95d29da34c246757f Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <b5a226f307b01bb1b58a88c95d29da34c246757f@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Tue, 12 Jul 2022 16:10:08 +0200
|
||||||
|
Subject: [PATCH] docs: Document TPM portion of domcaps
|
||||||
|
|
||||||
|
Surprisingly, we don't document TPM part of domain capabilities.
|
||||||
|
Fortunately, the information exposed is pretty much self
|
||||||
|
explanatory, but we should document it regardless.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit 6a00c565c4d0f0ec970e043ea2686bd30396ed79)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
docs/formatdomaincaps.rst | 29 +++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 29 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst
|
||||||
|
index 933469b2a2..3c425a9a4a 100644
|
||||||
|
--- a/docs/formatdomaincaps.rst
|
||||||
|
+++ b/docs/formatdomaincaps.rst
|
||||||
|
@@ -494,6 +494,35 @@ instance:
|
||||||
|
``driverType``
|
||||||
|
Options for the ``type`` attribute of the <filesystem><driver> element.
|
||||||
|
|
||||||
|
+TPM device
|
||||||
|
+^^^^^^^^^^
|
||||||
|
+
|
||||||
|
+TPM device capabilities are exposed under the ``tpm`` element. For instance:
|
||||||
|
+
|
||||||
|
+::
|
||||||
|
+
|
||||||
|
+ <domainCapabilities>
|
||||||
|
+ ...
|
||||||
|
+ <devices>
|
||||||
|
+ <tpm supported='yes'>
|
||||||
|
+ <enum name='model'>
|
||||||
|
+ <value>tpm-tis</value>
|
||||||
|
+ <value>tpm-crb</value>
|
||||||
|
+ </enum>
|
||||||
|
+ <enum name='backendModel'>
|
||||||
|
+ <value>passthrough</value>
|
||||||
|
+ <value>emulator</value>
|
||||||
|
+ </enum>
|
||||||
|
+ </tpm>
|
||||||
|
+ ...
|
||||||
|
+ </devices>
|
||||||
|
+ </domainCapabilities>
|
||||||
|
+
|
||||||
|
+``model``
|
||||||
|
+ Options for the ``model`` attribute of the ``<tpm/>`` element.
|
||||||
|
+``backendModel``
|
||||||
|
+ Options for the ``type`` attribute of the ``<tpm><backend/>`` element.
|
||||||
|
+
|
||||||
|
Features
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
96
libvirt-domain_conf-Format-defaultiothread-more-often.patch
Normal file
96
libvirt-domain_conf-Format-defaultiothread-more-often.patch
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
From a39ce54007de67ce6909c1770a7759b09c41bfd6 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <a39ce54007de67ce6909c1770a7759b09c41bfd6@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Thu, 7 Jul 2022 16:29:18 +0200
|
||||||
|
Subject: [PATCH] domain_conf: Format <defaultiothread/> more often
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The <defaultiothread/> element is formatted inside
|
||||||
|
virDomainDefaultIOThreadDefFormat() which is called only from
|
||||||
|
virDomainDefIOThreadsFormat() (so that IOThread related stuff is
|
||||||
|
formatted calling one function). However, when there are no
|
||||||
|
<iothreadids/> defined (or only autoallocated ones are present),
|
||||||
|
then the outer formatting function exits early never calling the
|
||||||
|
<defaultiothread/> formatter.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 24fa7004e47ce86b92bc23c1f2ef9c3d6152c3a8)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/conf/domain_conf.c | 46 ++++++++++++++++++++----------------------
|
||||||
|
1 file changed, 22 insertions(+), 24 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||||
|
index 709ca53790..207a45d9ae 100644
|
||||||
|
--- a/src/conf/domain_conf.c
|
||||||
|
+++ b/src/conf/domain_conf.c
|
||||||
|
@@ -27763,40 +27763,38 @@ static void
|
||||||
|
virDomainDefIOThreadsFormat(virBuffer *buf,
|
||||||
|
const virDomainDef *def)
|
||||||
|
{
|
||||||
|
- g_auto(virBuffer) childrenBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||||
|
- size_t i;
|
||||||
|
-
|
||||||
|
- if (def->niothreadids == 0)
|
||||||
|
- return;
|
||||||
|
+ if (def->niothreadids > 0) {
|
||||||
|
+ virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n",
|
||||||
|
+ def->niothreadids);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n",
|
||||||
|
- def->niothreadids);
|
||||||
|
+ if (virDomainDefIothreadShouldFormat(def)) {
|
||||||
|
+ g_auto(virBuffer) childrenBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||||
|
+ size_t i;
|
||||||
|
|
||||||
|
- if (!virDomainDefIothreadShouldFormat(def))
|
||||||
|
- return;
|
||||||
|
+ for (i = 0; i < def->niothreadids; i++) {
|
||||||
|
+ virDomainIOThreadIDDef *iothread = def->iothreadids[i];
|
||||||
|
+ g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
|
||||||
|
- for (i = 0; i < def->niothreadids; i++) {
|
||||||
|
- virDomainIOThreadIDDef *iothread = def->iothreadids[i];
|
||||||
|
- g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
+ virBufferAsprintf(&attrBuf, " id='%u'",
|
||||||
|
+ iothread->iothread_id);
|
||||||
|
|
||||||
|
- virBufferAsprintf(&attrBuf, " id='%u'",
|
||||||
|
- iothread->iothread_id);
|
||||||
|
+ if (iothread->thread_pool_min >= 0) {
|
||||||
|
+ virBufferAsprintf(&attrBuf, " thread_pool_min='%d'",
|
||||||
|
+ iothread->thread_pool_min);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (iothread->thread_pool_min >= 0) {
|
||||||
|
- virBufferAsprintf(&attrBuf, " thread_pool_min='%d'",
|
||||||
|
- iothread->thread_pool_min);
|
||||||
|
- }
|
||||||
|
+ if (iothread->thread_pool_max >= 0) {
|
||||||
|
+ virBufferAsprintf(&attrBuf, " thread_pool_max='%d'",
|
||||||
|
+ iothread->thread_pool_max);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (iothread->thread_pool_max >= 0) {
|
||||||
|
- virBufferAsprintf(&attrBuf, " thread_pool_max='%d'",
|
||||||
|
- iothread->thread_pool_max);
|
||||||
|
+ virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- virXMLFormatElement(&childrenBuf, "iothread", &attrBuf, NULL);
|
||||||
|
+ virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
- virXMLFormatElement(buf, "iothreadids", NULL, &childrenBuf);
|
||||||
|
-
|
||||||
|
virDomainDefaultIOThreadDefFormat(buf, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
61
libvirt-domain_conf-Format-iothread-IDs-more-often.patch
Normal file
61
libvirt-domain_conf-Format-iothread-IDs-more-often.patch
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
From 711cf329b9847c4d42994389d89a7e7b83c71596 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <711cf329b9847c4d42994389d89a7e7b83c71596@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Thu, 7 Jul 2022 16:29:33 +0200
|
||||||
|
Subject: [PATCH] domain_conf: Format iothread IDs more often
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
When formatting IOThreads (in virDomainDefIOThreadsFormat()), we
|
||||||
|
may only output the number of IOThreads, or the full list of IOThreads too:
|
||||||
|
|
||||||
|
<iothreads>4</iothreads>
|
||||||
|
<iothreadids>
|
||||||
|
<iothread id='1' thread_pool_max='10'/>
|
||||||
|
<iothread id='2' thread_pool_min='2' thread_pool_max='10'/>
|
||||||
|
<iothread id='3'/>
|
||||||
|
<iothread id='4'/>
|
||||||
|
</iothreadids>
|
||||||
|
|
||||||
|
Now, the deciding factor here is whether those individual
|
||||||
|
IOThreads were so called 'autofill-ed' or user provided. Well, we
|
||||||
|
need to take another factor in: if an IOThread has pool size
|
||||||
|
limit set, then we ought to format the full list.
|
||||||
|
|
||||||
|
But how can we get into a situation when a thread is autofilled
|
||||||
|
(i.e. not provided by user in the XML) and yet it has pool size
|
||||||
|
limit set? virDomainSetIOThreadParams() is the answer.
|
||||||
|
|
||||||
|
Sure, we could also unset the autofill flag whenever a pool size
|
||||||
|
limit is being set. But this approach allows us to not format
|
||||||
|
anything if the limits are reset (we don't lose the autofill
|
||||||
|
information).
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 5aa24958546c94a48fb8f8d6022213ca7c07c8a7)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/conf/domain_conf.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
||||||
|
index 207a45d9ae..fbc285d981 100644
|
||||||
|
--- a/src/conf/domain_conf.c
|
||||||
|
+++ b/src/conf/domain_conf.c
|
||||||
|
@@ -27728,7 +27728,9 @@ virDomainDefIothreadShouldFormat(const virDomainDef *def)
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < def->niothreadids; i++) {
|
||||||
|
- if (!def->iothreadids[i]->autofill)
|
||||||
|
+ if (!def->iothreadids[i]->autofill ||
|
||||||
|
+ def->iothreadids[i]->thread_pool_min >= 0 ||
|
||||||
|
+ def->iothreadids[i]->thread_pool_max >= 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
74
libvirt-domcaps-Introduce-TPM-backendVersion.patch
Normal file
74
libvirt-domcaps-Introduce-TPM-backendVersion.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
From 266e8c9174249b4d5a53dc8a43a3d7d9481d8b1c Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <266e8c9174249b4d5a53dc8a43a3d7d9481d8b1c@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Tue, 12 Jul 2022 15:58:12 +0200
|
||||||
|
Subject: [PATCH] domcaps: Introduce TPM backendVersion
|
||||||
|
|
||||||
|
We accept TPM version in the domain XML. However, supported
|
||||||
|
version depends on the host (swtpm_setup binary) and thus it may
|
||||||
|
be tricky for users (or mgmt applications) chose a version.
|
||||||
|
Introduce machinery for reporting supported version in domain
|
||||||
|
capabilities.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit 1277a9c884039e92765c977917420511f45e52e8)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
docs/formatdomaincaps.rst | 6 ++++++
|
||||||
|
src/conf/domain_capabilities.c | 1 +
|
||||||
|
src/conf/domain_capabilities.h | 1 +
|
||||||
|
3 files changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst
|
||||||
|
index 3c425a9a4a..70f46b972a 100644
|
||||||
|
--- a/docs/formatdomaincaps.rst
|
||||||
|
+++ b/docs/formatdomaincaps.rst
|
||||||
|
@@ -513,6 +513,10 @@ TPM device capabilities are exposed under the ``tpm`` element. For instance:
|
||||||
|
<value>passthrough</value>
|
||||||
|
<value>emulator</value>
|
||||||
|
</enum>
|
||||||
|
+ <enum name='backendVersion'>
|
||||||
|
+ <value>1.2</value>
|
||||||
|
+ <value>2.0</value>
|
||||||
|
+ </enum>
|
||||||
|
</tpm>
|
||||||
|
...
|
||||||
|
</devices>
|
||||||
|
@@ -522,6 +526,8 @@ TPM device capabilities are exposed under the ``tpm`` element. For instance:
|
||||||
|
Options for the ``model`` attribute of the ``<tpm/>`` element.
|
||||||
|
``backendModel``
|
||||||
|
Options for the ``type`` attribute of the ``<tpm><backend/>`` element.
|
||||||
|
+``backendVersion``
|
||||||
|
+ Options for the ``version`` attribute of the ``<tpm><backend/>`` element.
|
||||||
|
|
||||||
|
Features
|
||||||
|
~~~~~~~~
|
||||||
|
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
|
||||||
|
index 895e8d00e8..33570a51db 100644
|
||||||
|
--- a/src/conf/domain_capabilities.c
|
||||||
|
+++ b/src/conf/domain_capabilities.c
|
||||||
|
@@ -539,6 +539,7 @@ virDomainCapsDeviceTPMFormat(virBuffer *buf,
|
||||||
|
|
||||||
|
ENUM_PROCESS(tpm, model, virDomainTPMModelTypeToString);
|
||||||
|
ENUM_PROCESS(tpm, backendModel, virDomainTPMBackendTypeToString);
|
||||||
|
+ ENUM_PROCESS(tpm, backendVersion, virDomainTPMVersionTypeToString);
|
||||||
|
|
||||||
|
FORMAT_EPILOGUE(tpm);
|
||||||
|
}
|
||||||
|
diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
|
||||||
|
index f2eed80b15..a526969cda 100644
|
||||||
|
--- a/src/conf/domain_capabilities.h
|
||||||
|
+++ b/src/conf/domain_capabilities.h
|
||||||
|
@@ -127,6 +127,7 @@ struct _virDomainCapsDeviceTPM {
|
||||||
|
virTristateBool supported;
|
||||||
|
virDomainCapsEnum model; /* virDomainTPMModel */
|
||||||
|
virDomainCapsEnum backendModel; /* virDomainTPMBackendType */
|
||||||
|
+ virDomainCapsEnum backendVersion; /* virDomainTPMVersion */
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC_ASSERT_ENUM(VIR_DOMAIN_FS_DRIVER_TYPE_LAST);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
84
libvirt-node_device-Rework-udevKludgeStorageType.patch
Normal file
84
libvirt-node_device-Rework-udevKludgeStorageType.patch
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
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
|
||||||
|
|
39
libvirt-node_device-Treat-NVMe-disks-as-regular-disks.patch
Normal file
39
libvirt-node_device-Treat-NVMe-disks-as-regular-disks.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,183 @@
|
|||||||
|
From b020ddee84458afd8de70d9f296b91fa2b6a95fd Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <b020ddee84458afd8de70d9f296b91fa2b6a95fd@dist-git>
|
||||||
|
From: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
Date: Fri, 15 Jul 2022 14:16:54 +0200
|
||||||
|
Subject: [PATCH] qemu: Always assume support for
|
||||||
|
QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE
|
||||||
|
|
||||||
|
The 'xbzrle-cache-size' parameter was added in qemu-2.11 thus all
|
||||||
|
supported qemu versions now use the new code path.
|
||||||
|
|
||||||
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 06e0ba3da71ec6c58024efe57d0f55d3d1352d60)
|
||||||
|
|
||||||
|
This commit is not strictly needed for fixing the following BZ, but it
|
||||||
|
removes a code which will be never executed in RHEL 9 and backporting it
|
||||||
|
avoids conflicts with the actual bug fix.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 56 +++++++++-----------------------
|
||||||
|
src/qemu/qemu_migration_params.c | 18 ----------
|
||||||
|
2 files changed, 16 insertions(+), 58 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 17e4c23199..256e126ae1 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -13172,10 +13172,8 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
|
||||||
|
{
|
||||||
|
virQEMUDriver *driver = dom->conn->privateData;
|
||||||
|
virDomainObj *vm;
|
||||||
|
- qemuDomainObjPrivate *priv;
|
||||||
|
g_autoptr(qemuMigrationParams) migParams = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
- int rc;
|
||||||
|
|
||||||
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
|
@@ -13191,8 +13189,6 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
|
||||||
|
if (virDomainObjCheckActive(vm) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- priv = vm->privateData;
|
||||||
|
-
|
||||||
|
if (!qemuMigrationCapsGet(vm, QEMU_MIGRATION_CAP_XBZRLE)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
_("Compressed migration is not supported by "
|
||||||
|
@@ -13200,22 +13196,14 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE)) {
|
||||||
|
- if (qemuMigrationParamsFetch(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
- &migParams) < 0)
|
||||||
|
- goto endjob;
|
||||||
|
+ if (qemuMigrationParamsFetch(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
+ &migParams) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsGetULL(migParams,
|
||||||
|
- QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
|
||||||
|
- cacheSize) < 0)
|
||||||
|
- goto endjob;
|
||||||
|
- } else {
|
||||||
|
- qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
- rc = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
|
||||||
|
- qemuDomainObjExitMonitor(vm);
|
||||||
|
- if (rc < 0)
|
||||||
|
- goto endjob;
|
||||||
|
- }
|
||||||
|
+ if (qemuMigrationParamsGetULL(migParams,
|
||||||
|
+ QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
|
||||||
|
+ cacheSize) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
@@ -13234,10 +13222,8 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
|
||||||
|
{
|
||||||
|
virQEMUDriver *driver = dom->conn->privateData;
|
||||||
|
virDomainObj *vm;
|
||||||
|
- qemuDomainObjPrivate *priv;
|
||||||
|
g_autoptr(qemuMigrationParams) migParams = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
- int rc;
|
||||||
|
|
||||||
|
virCheckFlags(0, -1);
|
||||||
|
|
||||||
|
@@ -13253,8 +13239,6 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
|
||||||
|
if (virDomainObjCheckActive(vm) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- priv = vm->privateData;
|
||||||
|
-
|
||||||
|
if (!qemuMigrationCapsGet(vm, QEMU_MIGRATION_CAP_XBZRLE)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
_("Compressed migration is not supported by "
|
||||||
|
@@ -13263,25 +13247,17 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
|
||||||
|
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE)) {
|
||||||
|
- if (!(migParams = qemuMigrationParamsNew()))
|
||||||
|
- goto endjob;
|
||||||
|
+ if (!(migParams = qemuMigrationParamsNew()))
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsSetULL(migParams,
|
||||||
|
- QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
|
||||||
|
- cacheSize) < 0)
|
||||||
|
- goto endjob;
|
||||||
|
+ if (qemuMigrationParamsSetULL(migParams,
|
||||||
|
+ QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
|
||||||
|
+ cacheSize) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
- migParams, 0) < 0)
|
||||||
|
- goto endjob;
|
||||||
|
- } else {
|
||||||
|
- qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
- rc = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
|
||||||
|
- qemuDomainObjExitMonitor(vm);
|
||||||
|
- if (rc < 0)
|
||||||
|
- goto endjob;
|
||||||
|
- }
|
||||||
|
+ if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
+ migParams, 0) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index 6ea0bde13a..0bce358ac3 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -886,10 +886,8 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
unsigned long apiFlags)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
- bool xbzrleCacheSize_old = false;
|
||||||
|
g_autoptr(virJSONValue) params = NULL;
|
||||||
|
g_autoptr(virJSONValue) caps = NULL;
|
||||||
|
- qemuMigrationParam xbzrle = QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE;
|
||||||
|
bool postcopyResume = !!(apiFlags & VIR_MIGRATE_POSTCOPY_RESUME);
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
@@ -917,19 +915,6 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* If QEMU is too old to support xbzrle-cache-size migration parameter,
|
||||||
|
- * we need to set it via migrate-set-cache-size and tell
|
||||||
|
- * qemuMonitorSetMigrationParams to ignore this parameter.
|
||||||
|
- */
|
||||||
|
- if (migParams->params[xbzrle].set &&
|
||||||
|
- !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE)) {
|
||||||
|
- if (qemuMonitorSetMigrationCacheSize(priv->mon,
|
||||||
|
- migParams->params[xbzrle].value.ull) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
- xbzrleCacheSize_old = true;
|
||||||
|
- migParams->params[xbzrle].set = false;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (!(params = qemuMigrationParamsToJSON(migParams, postcopyResume)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
@@ -942,9 +927,6 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
cleanup:
|
||||||
|
qemuDomainObjExitMonitor(vm);
|
||||||
|
|
||||||
|
- if (xbzrleCacheSize_old)
|
||||||
|
- migParams->params[xbzrle].set = true;
|
||||||
|
-
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
195
libvirt-qemu-Make-IOThread-changing-more-robust.patch
Normal file
195
libvirt-qemu-Make-IOThread-changing-more-robust.patch
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
From 5853ac5261b2934ca300b24a7bd78cc4b377c90c Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <5853ac5261b2934ca300b24a7bd78cc4b377c90c@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Thu, 7 Jul 2022 17:37:46 +0200
|
||||||
|
Subject: [PATCH] qemu: Make IOThread changing more robust
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
There are three APIs that allow changing IOThreads:
|
||||||
|
|
||||||
|
virDomainAddIOThread()
|
||||||
|
virDomainDelIOThread()
|
||||||
|
virDomainSetIOThreadParams()
|
||||||
|
|
||||||
|
In case of QEMU driver these are handled by
|
||||||
|
qemuDomainChgIOThread() which attempts to be versatile enough to
|
||||||
|
work on both inactive and live domain definitions at the same
|
||||||
|
time. However, it's a bit clumsy - when a change to live
|
||||||
|
definition succeeds but fails in inactive definition then there's
|
||||||
|
no rollback. And somewhat rightfully so - changes to live
|
||||||
|
definition are in general harder to roll back. Therefore, do what
|
||||||
|
we do elsewhere (qemuDomainAttachDeviceLiveAndConfig(),
|
||||||
|
qemuDomainDetachDeviceAliasLiveAndConfig(), ...):
|
||||||
|
|
||||||
|
1) do the change to inactive XML first,
|
||||||
|
2) in fact, do the change to a copy of inactive XML,
|
||||||
|
3) swap inactive XML and its copy only after everything
|
||||||
|
succeeded.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 6db9c95a45d4e24cdcd5c009b7fe5da3745b5d59)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 74 ++++++++++++++++++++++++------------------
|
||||||
|
1 file changed, 43 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 3b5c3db67c..2c627396f1 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -5594,6 +5594,7 @@ qemuDomainChgIOThread(virQEMUDriver *driver,
|
||||||
|
{
|
||||||
|
g_autoptr(virQEMUDriverConfig) cfg = NULL;
|
||||||
|
qemuDomainObjPrivate *priv;
|
||||||
|
+ g_autoptr(virDomainDef) defcopy = NULL;
|
||||||
|
virDomainDef *def;
|
||||||
|
virDomainDef *persistentDef;
|
||||||
|
virDomainIOThreadIDDef *iothreaddef = NULL;
|
||||||
|
@@ -5609,34 +5610,34 @@ qemuDomainChgIOThread(virQEMUDriver *driver,
|
||||||
|
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (def) {
|
||||||
|
- if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) {
|
||||||
|
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
- _("IOThreads not supported with this binary"));
|
||||||
|
- goto endjob;
|
||||||
|
- }
|
||||||
|
+ if (persistentDef) {
|
||||||
|
+ /* Make a copy of persistent definition and do all the changes there.
|
||||||
|
+ * Swap the definitions only after changes to live definition
|
||||||
|
+ * succeeded. */
|
||||||
|
+ if (!(defcopy = virDomainObjCopyPersistentDef(vm, driver->xmlopt,
|
||||||
|
+ priv->qemuCaps)))
|
||||||
|
+ return -1;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_ADD:
|
||||||
|
- if (virDomainDriverAddIOThreadCheck(def, iothread.iothread_id) < 0)
|
||||||
|
+ if (virDomainDriverAddIOThreadCheck(defcopy, iothread.iothread_id) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (qemuDomainHotplugAddIOThread(driver, vm, iothread.iothread_id) < 0)
|
||||||
|
+ if (!virDomainIOThreadIDAdd(defcopy, iothread.iothread_id))
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_DEL:
|
||||||
|
- if (virDomainDriverDelIOThreadCheck(def, iothread.iothread_id) < 0)
|
||||||
|
+ if (virDomainDriverDelIOThreadCheck(defcopy, iothread.iothread_id) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (qemuDomainHotplugDelIOThread(driver, vm, iothread.iothread_id) < 0)
|
||||||
|
- goto endjob;
|
||||||
|
+ virDomainIOThreadIDDel(defcopy, iothread.iothread_id);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_MOD:
|
||||||
|
- iothreaddef = virDomainIOThreadIDFind(def, iothread.iothread_id);
|
||||||
|
+ iothreaddef = virDomainIOThreadIDFind(defcopy, iothread.iothread_id);
|
||||||
|
|
||||||
|
if (!iothreaddef) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
|
@@ -5645,41 +5646,47 @@ qemuDomainChgIOThread(virQEMUDriver *driver,
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (qemuDomainIOThreadValidate(iothreaddef, iothread, true) < 0)
|
||||||
|
+ if (qemuDomainIOThreadValidate(iothreaddef, iothread, false) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (qemuDomainHotplugModIOThread(driver, vm, iothread) < 0)
|
||||||
|
+ if (qemuDomainHotplugModIOThreadIDDef(iothreaddef, iothread) < 0) {
|
||||||
|
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
+ _("configuring persistent polling values is not supported"));
|
||||||
|
goto endjob;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- qemuDomainHotplugModIOThreadIDDef(iothreaddef, iothread);
|
||||||
|
break;
|
||||||
|
-
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- qemuDomainSaveStatus(vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (persistentDef) {
|
||||||
|
+ if (def) {
|
||||||
|
+ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) {
|
||||||
|
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
+ _("IOThreads not supported with this binary"));
|
||||||
|
+ goto endjob;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
switch (action) {
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_ADD:
|
||||||
|
- if (virDomainDriverAddIOThreadCheck(persistentDef, iothread.iothread_id) < 0)
|
||||||
|
+ if (virDomainDriverAddIOThreadCheck(def, iothread.iothread_id) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (!virDomainIOThreadIDAdd(persistentDef, iothread.iothread_id))
|
||||||
|
+ if (qemuDomainHotplugAddIOThread(driver, vm, iothread.iothread_id) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_DEL:
|
||||||
|
- if (virDomainDriverDelIOThreadCheck(persistentDef, iothread.iothread_id) < 0)
|
||||||
|
+ if (virDomainDriverDelIOThreadCheck(def, iothread.iothread_id) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- virDomainIOThreadIDDel(persistentDef, iothread.iothread_id);
|
||||||
|
+ if (qemuDomainHotplugDelIOThread(driver, vm, iothread.iothread_id) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_IOTHREAD_ACTION_MOD:
|
||||||
|
- iothreaddef = virDomainIOThreadIDFind(persistentDef, iothread.iothread_id);
|
||||||
|
+ iothreaddef = virDomainIOThreadIDFind(def, iothread.iothread_id);
|
||||||
|
|
||||||
|
if (!iothreaddef) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
|
@@ -5688,21 +5695,26 @@ qemuDomainChgIOThread(virQEMUDriver *driver,
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (qemuDomainIOThreadValidate(iothreaddef, iothread, false) < 0)
|
||||||
|
+ if (qemuDomainIOThreadValidate(iothreaddef, iothread, true) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (qemuDomainHotplugModIOThreadIDDef(iothreaddef, iothread) < 0) {
|
||||||
|
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
- _("configuring persistent polling values is not supported"));
|
||||||
|
+ if (qemuDomainHotplugModIOThread(driver, vm, iothread) < 0)
|
||||||
|
goto endjob;
|
||||||
|
- }
|
||||||
|
|
||||||
|
+ qemuDomainHotplugModIOThreadIDDef(iothreaddef, iothread);
|
||||||
|
break;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (virDomainDefSave(persistentDef, driver->xmlopt,
|
||||||
|
- cfg->configDir) < 0)
|
||||||
|
+ qemuDomainSaveStatus(vm);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Finally, if no error until here, we can save config. */
|
||||||
|
+ if (defcopy) {
|
||||||
|
+ if (virDomainDefSave(defcopy, driver->xmlopt, cfg->configDir) < 0)
|
||||||
|
goto endjob;
|
||||||
|
+
|
||||||
|
+ virDomainObjAssignDef(vm, &defcopy, false, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,148 @@
|
|||||||
|
From 4c906acec14efe3893491d749465ed7e285a825c Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <4c906acec14efe3893491d749465ed7e285a825c@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Wed, 29 Jun 2022 12:00:03 +0200
|
||||||
|
Subject: [PATCH] qemu: Pass migration flags to qemuMigrationParamsApply
|
||||||
|
|
||||||
|
The flags will later be used to determine which parameters should
|
||||||
|
actually be applied.
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 0eae541257cd4f01c9d90db62056ad8d03c5af23)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2111070
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 6 +++---
|
||||||
|
src/qemu/qemu_migration.c | 8 ++++----
|
||||||
|
src/qemu/qemu_migration_params.c | 11 ++++++++---
|
||||||
|
src/qemu/qemu_migration_params.h | 3 ++-
|
||||||
|
4 files changed, 17 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 847c96639d..17e4c23199 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -13091,7 +13091,7 @@ qemuDomainMigrateSetMaxDowntime(virDomainPtr dom,
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
- migParams) < 0)
|
||||||
|
+ migParams, 0) < 0)
|
||||||
|
goto endjob;
|
||||||
|
} else {
|
||||||
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
@@ -13273,7 +13273,7 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
- migParams) < 0)
|
||||||
|
+ migParams, 0) < 0)
|
||||||
|
goto endjob;
|
||||||
|
} else {
|
||||||
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
@@ -13360,7 +13360,7 @@ qemuDomainMigrateSetMaxSpeed(virDomainPtr dom,
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
- migParams) < 0)
|
||||||
|
+ migParams, 0) < 0)
|
||||||
|
goto endjob;
|
||||||
|
} else {
|
||||||
|
int rc;
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 76903d612b..8cbd73a809 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -3259,7 +3259,7 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_MIGRATION_IN,
|
||||||
|
- migParams) < 0)
|
||||||
|
+ migParams, flags) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (mig->nbd &&
|
||||||
|
@@ -4847,7 +4847,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
- migParams) < 0)
|
||||||
|
+ migParams, flags) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_ZEROCOPY) {
|
||||||
|
@@ -6941,7 +6941,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm,
|
||||||
|
QEMU_DOMAIN_MIG_BANDWIDTH_MAX * 1024 * 1024) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsApply(driver, vm, asyncJob, migParams) < 0)
|
||||||
|
+ if (qemuMigrationParamsApply(driver, vm, asyncJob, migParams, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
|
||||||
|
@@ -7037,7 +7037,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm,
|
||||||
|
QEMU_MIGRATION_PARAM_MAX_BANDWIDTH,
|
||||||
|
saveMigBandwidth * 1024 * 1024) == 0)
|
||||||
|
ignore_value(qemuMigrationParamsApply(driver, vm, asyncJob,
|
||||||
|
- migParams));
|
||||||
|
+ migParams, 0));
|
||||||
|
} else {
|
||||||
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
|
||||||
|
qemuMonitorSetMigrationSpeed(priv->mon, saveMigBandwidth);
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index cc66ed8229..398c07efd0 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -833,8 +833,10 @@ qemuMigrationCapsToJSON(virBitmap *caps,
|
||||||
|
* @vm: domain object
|
||||||
|
* @asyncJob: migration job
|
||||||
|
* @migParams: migration parameters to send to QEMU
|
||||||
|
+ * @apiFlags: migration flags, some of them may affect which parameters are applied
|
||||||
|
*
|
||||||
|
- * Send all parameters stored in @migParams to QEMU.
|
||||||
|
+ * Send parameters stored in @migParams to QEMU. If @apiFlags is non-zero, some
|
||||||
|
+ * parameters that do not make sense for the enabled flags will be ignored.
|
||||||
|
*
|
||||||
|
* Returns 0 on success, -1 on failure.
|
||||||
|
*/
|
||||||
|
@@ -842,7 +844,8 @@ int
|
||||||
|
qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
int asyncJob,
|
||||||
|
- qemuMigrationParams *migParams)
|
||||||
|
+ qemuMigrationParams *migParams,
|
||||||
|
+ unsigned long apiFlags G_GNUC_UNUSED)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
bool xbzrleCacheSize_old = false;
|
||||||
|
@@ -1245,7 +1248,9 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
|
||||||
|
if (!virDomainObjIsActive(vm) || !origParams)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams) < 0)
|
||||||
|
+ /* Do not pass apiFlags to qemuMigrationParamsApply here to make sure all
|
||||||
|
+ * parameters and capabilities are reset. */
|
||||||
|
+ if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams, 0) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
|
||||||
|
index d1184acded..9e990e09bd 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.h
|
||||||
|
+++ b/src/qemu/qemu_migration_params.h
|
||||||
|
@@ -98,7 +98,8 @@ int
|
||||||
|
qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
int asyncJob,
|
||||||
|
- qemuMigrationParams *migParams);
|
||||||
|
+ qemuMigrationParams *migParams,
|
||||||
|
+ unsigned long apiFlags);
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuMigrationParamsEnableTLS(virQEMUDriver *driver,
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,38 @@
|
|||||||
|
From b35eb8dd4800be4dba22eb0a38da4d4d1c54521f Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <b35eb8dd4800be4dba22eb0a38da4d4d1c54521f@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Wed, 27 Jul 2022 15:40:12 +0200
|
||||||
|
Subject: [PATCH] qemu: Properly release job in qemuDomainSaveInternal
|
||||||
|
|
||||||
|
The function would fail to release the job in case
|
||||||
|
qemuMigrationSrcIsAllowed failed.
|
||||||
|
|
||||||
|
Fixes v8.5.0-157-g69e0e33873
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
||||||
|
(cherry picked from commit 9c3d398df11024ef6c00a50c98fcc0f1f66c16a1)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1497907
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 256e126ae1..ebd6365f52 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -2655,7 +2655,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver,
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_SAVE, 0))
|
||||||
|
- goto cleanup;
|
||||||
|
+ goto endjob;
|
||||||
|
|
||||||
|
if (!virDomainObjIsActive(vm)) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
49
libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch
Normal file
49
libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From b3d2dae261768c00b5d92203351ff6dd7cde468e Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <b3d2dae261768c00b5d92203351ff6dd7cde468e@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Tue, 12 Jul 2022 15:58:17 +0200
|
||||||
|
Subject: [PATCH] qemu: Report supported TPM version in domcaps
|
||||||
|
|
||||||
|
Now that we have everything prepared, we can start detecting
|
||||||
|
supported TPM versions and setting corresponding values in
|
||||||
|
backendModel struct.
|
||||||
|
|
||||||
|
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/340
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit 430ab88ab17727ac9774ee5b47f09f69c57add73)
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_capabilities.c | 15 ++++++++++++---
|
||||||
|
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||||
|
index 2c3be3ecec..8586930266 100644
|
||||||
|
--- a/src/qemu/qemu_capabilities.c
|
||||||
|
+++ b/src/qemu/qemu_capabilities.c
|
||||||
|
@@ -6368,9 +6368,18 @@ virQEMUCapsFillDomainDeviceTPMCaps(virQEMUCaps *qemuCaps,
|
||||||
|
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH))
|
||||||
|
VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_PASSTHROUGH);
|
||||||
|
- if (virTPMHasSwtpm() &&
|
||||||
|
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR))
|
||||||
|
- VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_EMULATOR);
|
||||||
|
+ if (virTPMHasSwtpm()) {
|
||||||
|
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR))
|
||||||
|
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_EMULATOR);
|
||||||
|
+ if (virTPMSwtpmSetupCapsGet(VIR_TPM_SWTPM_SETUP_FEATURE_TPM_1_2)) {
|
||||||
|
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendVersion, VIR_DOMAIN_TPM_VERSION_1_2);
|
||||||
|
+ tpm->backendVersion.report = true;
|
||||||
|
+ }
|
||||||
|
+ if (virTPMSwtpmSetupCapsGet(VIR_TPM_SWTPM_SETUP_FEATURE_TPM_2_0)) {
|
||||||
|
+ VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendVersion, VIR_DOMAIN_TPM_VERSION_2_0);
|
||||||
|
+ tpm->backendVersion.report = true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need at least one frontend if it is to be usable by applications
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,85 @@
|
|||||||
|
From a1d825e5dcb8cbe0854fa852d25e5997a52d57cd Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <a1d825e5dcb8cbe0854fa852d25e5997a52d57cd@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Wed, 27 Jul 2022 14:33:23 +0200
|
||||||
|
Subject: [PATCH] qemu: Restore original memory locking limit on reconnect
|
||||||
|
|
||||||
|
Commit v8.4.0-287-gd4d3bb8130 tried to make sure the original
|
||||||
|
pre-migration memory locking limit is restored at the end of migration,
|
||||||
|
but it missed the case when libvirt daemon is restarted during
|
||||||
|
migration which needs to be aborted on reconnect.
|
||||||
|
|
||||||
|
And if this was not enough, I forgot to actually save the status XML
|
||||||
|
after setting the field in priv (in the commit mentioned above and also
|
||||||
|
in v8.4.0-291-gd375993ab3).
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107424
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit bb9badb9168ad0d40bca86b6463ef504624f096d)
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
src/qemu/qemu_migration.c
|
||||||
|
- commit v8.5.0-2-gf9dcc01a0f not backported
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 13 +++++++++----
|
||||||
|
src/qemu/qemu_process.c | 2 ++
|
||||||
|
2 files changed, 11 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 9289df81eb..61fcaf4258 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -4672,10 +4672,12 @@ qemuMigrationSrcStart(virDomainObj *vm,
|
||||||
|
switch (spec->destType) {
|
||||||
|
case MIGRATION_DEST_HOST:
|
||||||
|
if (STREQ(spec->dest.host.protocol, "rdma") &&
|
||||||
|
- vm->def->mem.hard_limit > 0 &&
|
||||||
|
- qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
|
||||||
|
- &priv->preMigrationMemlock) < 0) {
|
||||||
|
- return -1;
|
||||||
|
+ vm->def->mem.hard_limit > 0) {
|
||||||
|
+ if (qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
|
||||||
|
+ &priv->preMigrationMemlock) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+ /* Store the original memory locking limit */
|
||||||
|
+ qemuDomainSaveStatus(vm);
|
||||||
|
}
|
||||||
|
return qemuMonitorMigrateToHost(priv->mon, migrateFlags,
|
||||||
|
spec->dest.host.protocol,
|
||||||
|
@@ -4870,6 +4872,9 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
if (qemuDomainSetMaxMemLock(vm, limit << 10, &priv->preMigrationMemlock) < 0)
|
||||||
|
goto error;
|
||||||
|
+
|
||||||
|
+ /* Store the original memory locking limit */
|
||||||
|
+ qemuDomainSaveStatus(vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (storageMigration) {
|
||||||
|
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||||
|
index 771a623ef7..1c28d4b102 100644
|
||||||
|
--- a/src/qemu/qemu_process.c
|
||||||
|
+++ b/src/qemu/qemu_process.c
|
||||||
|
@@ -3677,6 +3677,7 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
|
||||||
|
{
|
||||||
|
virDomainJobStatus migStatus = VIR_DOMAIN_JOB_STATUS_NONE;
|
||||||
|
qemuDomainJobPrivate *jobPriv = job->privateData;
|
||||||
|
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
virDomainState state;
|
||||||
|
int reason;
|
||||||
|
int rc;
|
||||||
|
@@ -3726,6 +3727,7 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_NONE,
|
||||||
|
jobPriv->migParams, job->apiFlags);
|
||||||
|
+ qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,72 @@
|
|||||||
|
From fa7cff4e684ededd184976d4fdf217cc155825b8 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <fa7cff4e684ededd184976d4fdf217cc155825b8@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Mon, 31 Jan 2022 12:55:47 +0100
|
||||||
|
Subject: [PATCH] qemu: Validate domain definition even on migration
|
||||||
|
|
||||||
|
When we are about to spawn QEMU, we validate the domain
|
||||||
|
definition against qemuCaps. Except when domain is/was already
|
||||||
|
running before (i.e. on incoming migration, snapshots, resume
|
||||||
|
from a file). However, especially on incoming migration it may
|
||||||
|
happen that the destination QEMU is different to the source
|
||||||
|
QEMU, e.g. the destination QEMU may have some devices disabled.
|
||||||
|
|
||||||
|
And we have a function that validates devices/features requested
|
||||||
|
in domain XML against the desired QEMU capabilities (aka
|
||||||
|
qemuCaps) - it's virDomainDefValidate() which calls
|
||||||
|
qemuValidateDomainDef() and qemuValidateDomainDeviceDef()
|
||||||
|
subsequently.
|
||||||
|
|
||||||
|
But the problem here is that the validation function is
|
||||||
|
explicitly skipped over in specific scenarios (like incoming
|
||||||
|
migration, restore from a snapshot or previously saved file).
|
||||||
|
|
||||||
|
This in turn means that we may spawn QEMU and request
|
||||||
|
device/features it doesn't support. When that happens QEMU fails
|
||||||
|
to load migration stream:
|
||||||
|
|
||||||
|
qemu-kvm: ... 'virtio-mem-pci' is not a valid device model name
|
||||||
|
|
||||||
|
(NB, while the example shows one particular device, the problem
|
||||||
|
is paramount)
|
||||||
|
|
||||||
|
This problem is easier to run into since we are slowly moving
|
||||||
|
validation from qemu_command.c into said validation functions.
|
||||||
|
|
||||||
|
The solution is simple: do the validation in all cases. And while
|
||||||
|
it may happen that users would be unable to migrate/restore a
|
||||||
|
guest due to a bug in our validator, spawning QEMU without
|
||||||
|
validation is worse (especially when you consider that users can
|
||||||
|
supply their own XMLs for migrate/restore operations - these were
|
||||||
|
never validated).
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2048435
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit 517b8c12b98d7ac0bb4d582e0b491d50d776eb6d)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2050702
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_process.c | 6 +-----
|
||||||
|
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||||
|
index 5c9ca0fe4f..5c6657a876 100644
|
||||||
|
--- a/src/qemu/qemu_process.c
|
||||||
|
+++ b/src/qemu/qemu_process.c
|
||||||
|
@@ -5411,11 +5411,7 @@ qemuProcessStartValidate(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Checks below should not be executed when starting a qemu process for a
|
||||||
|
- * VM that was running before (migration, snapshots, save). It's more
|
||||||
|
- * important to start such VM than keep the configuration clean */
|
||||||
|
- if ((flags & VIR_QEMU_PROCESS_START_NEW) &&
|
||||||
|
- virDomainDefValidate(vm->def, 0, driver->xmlopt, qemuCaps) < 0)
|
||||||
|
+ if (virDomainDefValidate(vm->def, 0, driver->xmlopt, qemuCaps) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (qemuProcessStartValidateGraphics(vm) < 0)
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,61 @@
|
|||||||
|
From d51e6092ed7977daf662ed1def0f6cd5cc6ba33d Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <d51e6092ed7977daf662ed1def0f6cd5cc6ba33d@dist-git>
|
||||||
|
From: Laine Stump <laine@redhat.com>
|
||||||
|
Date: Wed, 27 Jul 2022 12:14:10 -0400
|
||||||
|
Subject: [PATCH] qemu: don't call qemuMigrationSrcIsAllowedHostdev() from
|
||||||
|
qemuMigrationDstPrepareFresh()
|
||||||
|
|
||||||
|
This call to qemuMigrationSrcIsAllowedHostdev() (which does a
|
||||||
|
hardcoded fail of the migration if there is any PCI or mdev hostdev
|
||||||
|
device in the domain) while doing the destination side of migration
|
||||||
|
prep was found once the call to that same function was removed from
|
||||||
|
the source side migration prep (commit 25883cd5).
|
||||||
|
|
||||||
|
According to jdenemar, for the V2 migration protocol, prep of the
|
||||||
|
destination is the first step, so this *was* the proper place to do
|
||||||
|
the check, but for V3 migration this is in a way redundant (since we
|
||||||
|
will have already done the check on the source side (updated by
|
||||||
|
25883cd5 to query QEMU rather than do a hardcoded fail)).
|
||||||
|
|
||||||
|
Of course it's possible that the source could support migration of a
|
||||||
|
particular VFIO device, but the destination doesn't. But the current
|
||||||
|
check on the destination side is worthless even in that case, since it
|
||||||
|
is just *always* failing rather than querying QEMU; and QEMU can't be
|
||||||
|
queried at the point where the destination check is happening, since
|
||||||
|
it isn't yet running.
|
||||||
|
|
||||||
|
Anyway QEMU should complain when it's started if it's going to fail,
|
||||||
|
so removing this check should just move the failure to happen a bit
|
||||||
|
later. So the best solution to this problem is to simply remove the
|
||||||
|
hardcoded check/fail from qemuMigrationDstPrepareFresh() and rely on
|
||||||
|
QEMU to fail if it needs to.
|
||||||
|
|
||||||
|
Fixes: 25883cd5f0b188f2417f294b7d219a77b219f7c2
|
||||||
|
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
(cherry picked from commit 640d185f01858b7a8db401235c929ac4798592d0)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1497907
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 3 ---
|
||||||
|
1 file changed, 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 61fcaf4258..e3ba4c3f78 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -3382,9 +3382,6 @@ qemuMigrationDstPrepareFresh(virQEMUDriver *driver,
|
||||||
|
QEMU_MIGRATION_COOKIE_CAPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowedHostdev(*def))
|
||||||
|
- goto cleanup;
|
||||||
|
-
|
||||||
|
/* Let migration hook filter domain XML */
|
||||||
|
if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
|
||||||
|
g_autofree char *xml = NULL;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,87 @@
|
|||||||
|
From 80ac99d0f947f5e2fe4ff7fe9fb63b6dc6cbc1bb Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <80ac99d0f947f5e2fe4ff7fe9fb63b6dc6cbc1bb@dist-git>
|
||||||
|
From: Laine Stump <laine@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 01:56:11 -0400
|
||||||
|
Subject: [PATCH] qemu: don't try to query QEMU about migration blockers during
|
||||||
|
offline migration
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The new code that queries QEMU about migration blockers was put at the
|
||||||
|
top of qemuMigrationSrcIsAllowed(), but that function can also be
|
||||||
|
called in the case of offline migration (ie when the domain is
|
||||||
|
inactive / QEMU isn't running). This check should have been put inside
|
||||||
|
the "if (!(flags & VIR_MIGRATE_OFFLINE))" conditional, so let's move
|
||||||
|
it there.
|
||||||
|
|
||||||
|
Fixes: 156e99f686690855be4e45d9b8b3194191a8bc31
|
||||||
|
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
(cherry picked from commit 2dd5587f1dc8e2cf4e6e0a4e4cf576b8183b33cd)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 39 +++++++++++++++++++++------------------
|
||||||
|
1 file changed, 21 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 735eb02673..96c4c0f1da 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1458,24 +1458,6 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
int nsnapshots;
|
||||||
|
int pauseReason;
|
||||||
|
size_t i;
|
||||||
|
- bool blockedReasonsCap = virQEMUCapsGet(priv->qemuCaps,
|
||||||
|
- QEMU_CAPS_MIGRATION_BLOCKED_REASONS);
|
||||||
|
-
|
||||||
|
- /* Ask qemu if it has a migration blocker */
|
||||||
|
- if (blockedReasonsCap) {
|
||||||
|
- g_auto(GStrv) blockers = NULL;
|
||||||
|
- if (qemuDomainGetMigrationBlockers(driver, vm,
|
||||||
|
- VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
- &blockers) < 0)
|
||||||
|
- return false;
|
||||||
|
-
|
||||||
|
- if (blockers && blockers[0]) {
|
||||||
|
- g_autofree char *reasons = g_strjoinv("; ", blockers);
|
||||||
|
- virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
- _("cannot migrate domain: %s"), reasons);
|
||||||
|
- return false;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
|
||||||
|
/* perform these checks only when migrating to remote hosts */
|
||||||
|
if (remote) {
|
||||||
|
@@ -1493,6 +1475,27 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
/* following checks don't make sense for offline migration */
|
||||||
|
if (!(flags & VIR_MIGRATE_OFFLINE)) {
|
||||||
|
+ bool blockedReasonsCap = virQEMUCapsGet(priv->qemuCaps,
|
||||||
|
+ QEMU_CAPS_MIGRATION_BLOCKED_REASONS);
|
||||||
|
+
|
||||||
|
+ /* Ask qemu if it has a migration blocker */
|
||||||
|
+ if (blockedReasonsCap) {
|
||||||
|
+ g_auto(GStrv) blockers = NULL;
|
||||||
|
+
|
||||||
|
+ if (qemuDomainGetMigrationBlockers(driver, vm,
|
||||||
|
+ VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
+ &blockers) < 0) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (blockers && blockers[0]) {
|
||||||
|
+ g_autofree char *reasons = g_strjoinv("; ", blockers);
|
||||||
|
+ virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
+ _("cannot migrate domain: %s"), reasons);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (remote) {
|
||||||
|
/* cancel migration if disk I/O error is emitted while migrating */
|
||||||
|
if (flags & VIR_MIGRATE_ABORT_ON_ERROR &&
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
44
libvirt-qemu-fix-inactive-snapshot-revert.patch
Normal file
44
libvirt-qemu-fix-inactive-snapshot-revert.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From 94bc9eaf3bbcaec47bd233378bbbb45f5f1523ca Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <94bc9eaf3bbcaec47bd233378bbbb45f5f1523ca@dist-git>
|
||||||
|
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||||
|
Date: Thu, 20 Jan 2022 14:53:33 +0100
|
||||||
|
Subject: [PATCH] qemu: fix inactive snapshot revert
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The commit splitting out the qemuSnapshotRevertInactive function
|
||||||
|
dropped the 'defined = true' line by accident and instead
|
||||||
|
returned -1, leaving the user with a cryptic error:
|
||||||
|
error: An error occurred, but the cause is unknown
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2039136
|
||||||
|
https://gitlab.com/libvirt/libvirt/-/issues/266
|
||||||
|
|
||||||
|
Fixes: 85e4a13c3f19078fb6af5ffb4a80022c142cbc7e
|
||||||
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 76deb656132bb8817ddae4b7f417930c4db824c9)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2043584
|
||||||
|
|
||||||
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_snapshot.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
|
||||||
|
index f92e00f9c0..ac7bab90f8 100644
|
||||||
|
--- a/src/qemu/qemu_snapshot.c
|
||||||
|
+++ b/src/qemu/qemu_snapshot.c
|
||||||
|
@@ -2193,7 +2193,7 @@ qemuSnapshotRevertInactive(virDomainObj *vm,
|
||||||
|
|
||||||
|
if (*inactiveConfig) {
|
||||||
|
virDomainObjAssignDef(vm, inactiveConfig, false, NULL);
|
||||||
|
- return -1;
|
||||||
|
+ defined = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
|
||||||
|
--
|
||||||
|
2.35.0
|
||||||
|
|
@ -0,0 +1,206 @@
|
|||||||
|
From 81f8b07ed1e4e485ded7f366739c110351120785 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <81f8b07ed1e4e485ded7f366739c110351120785@dist-git>
|
||||||
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 19:29:05 +0200
|
||||||
|
Subject: [PATCH] qemu: introduce capability
|
||||||
|
QEMU_CAPS_MIGRATION_BLOCKED_REASONS
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
since qemu 6.0, if migration is blocked for some reason, 'query-migrate'
|
||||||
|
will return an array of error strings describing the migration blockers.
|
||||||
|
This can be used to check whether there are any devices blocking
|
||||||
|
migration, etc.
|
||||||
|
|
||||||
|
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Laine Stump <laine@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 1e9d84d9f9513a73572842db30e3d1445e892291)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_capabilities.c | 2 ++
|
||||||
|
src/qemu/qemu_capabilities.h | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_7.0.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml | 1 +
|
||||||
|
13 files changed, 14 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||||
|
index 8586930266..48002f3b58 100644
|
||||||
|
--- a/src/qemu/qemu_capabilities.c
|
||||||
|
+++ b/src/qemu/qemu_capabilities.c
|
||||||
|
@@ -671,6 +671,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
|
||||||
|
"chardev.qemu-vdagent", /* QEMU_CAPS_CHARDEV_QEMU_VDAGENT */
|
||||||
|
"display-dbus", /* QEMU_CAPS_DISPLAY_DBUS */
|
||||||
|
"iothread.thread-pool-max", /* QEMU_CAPS_IOTHREAD_THREAD_POOL_MAX */
|
||||||
|
+ "migration.blocked-reasons", /* QEMU_CAPS_MIGRATION_BLOCKED_REASONS */
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1623,6 +1624,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = {
|
||||||
|
{ "chardev-add/arg-type/backend/+qemu-vdagent", QEMU_CAPS_CHARDEV_QEMU_VDAGENT },
|
||||||
|
{ "query-display-options/ret-type/+dbus", QEMU_CAPS_DISPLAY_DBUS },
|
||||||
|
{ "object-add/arg-type/+iothread/thread-pool-max", QEMU_CAPS_IOTHREAD_THREAD_POOL_MAX },
|
||||||
|
+ { "query-migrate/ret-type/blocked-reasons", QEMU_CAPS_MIGRATION_BLOCKED_REASONS },
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps;
|
||||||
|
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||||
|
index 6f35ba1485..570e43292d 100644
|
||||||
|
--- a/src/qemu/qemu_capabilities.h
|
||||||
|
+++ b/src/qemu/qemu_capabilities.h
|
||||||
|
@@ -650,6 +650,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
|
||||||
|
QEMU_CAPS_CHARDEV_QEMU_VDAGENT, /* -chardev qemu-vdagent */
|
||||||
|
QEMU_CAPS_DISPLAY_DBUS, /* -display dbus */
|
||||||
|
QEMU_CAPS_IOTHREAD_THREAD_POOL_MAX, /* -object iothread.thread-pool-max */
|
||||||
|
+ QEMU_CAPS_MIGRATION_BLOCKED_REASONS, /* query-migrate returns 'blocked-reasons */
|
||||||
|
|
||||||
|
QEMU_CAPS_LAST /* this must always be the last item */
|
||||||
|
} virQEMUCapsFlags;
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
index 4b4cc2d3aa..3e48d17811 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
@@ -189,6 +189,7 @@
|
||||||
|
<flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
index 06543071aa..790b7221d4 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
@@ -147,6 +147,7 @@
|
||||||
|
<flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>39100242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
index 8c61bf8a84..86c3732c72 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
@@ -231,6 +231,7 @@
|
||||||
|
<flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
index afd8f606eb..bd76a7a398 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
@@ -236,6 +236,7 @@
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6001000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
index 86fc46918f..6ed51ec796 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
@@ -201,6 +201,7 @@
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6001050</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700244</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
index 983b54430d..1a98fe122e 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
@@ -196,6 +196,7 @@
|
||||||
|
<flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>42900244</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
index 19605d93ae..a77efaaa37 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
@@ -238,6 +238,7 @@
|
||||||
|
<flag name='virtio-iommu-pci'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100244</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_7.0.0.aarch64.xml
|
||||||
|
index e24e2235fb..6848a075a8 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_7.0.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_7.0.0.aarch64.xml
|
||||||
|
@@ -209,6 +209,7 @@
|
||||||
|
<flag name='virtio-iommu.boot-bypass'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>6002092</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml
|
||||||
|
index 83e0f50e3a..cf4286b78b 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml
|
||||||
|
@@ -213,6 +213,7 @@
|
||||||
|
<flag name='virtio-iommu.boot-bypass'/>
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>7000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>42900243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml
|
||||||
|
index 05f844fd5b..8e2c1652f9 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml
|
||||||
|
@@ -243,6 +243,7 @@
|
||||||
|
<flag name='virtio-net.rss'/>
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
<flag name='display-dbus'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>7000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml
|
||||||
|
index 3707d9b7c9..9bdb207c4e 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_7.1.0.x86_64.xml
|
||||||
|
@@ -244,6 +244,7 @@
|
||||||
|
<flag name='chardev.qemu-vdagent'/>
|
||||||
|
<flag name='display-dbus'/>
|
||||||
|
<flag name='iothread.thread-pool-max'/>
|
||||||
|
+ <flag name='migration.blocked-reasons'/>
|
||||||
|
<version>7000050</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100244</microcodeVersion>
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,140 @@
|
|||||||
|
From 90d326f60706a990db3ed49ba338d911471578c0 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <90d326f60706a990db3ed49ba338d911471578c0@dist-git>
|
||||||
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 19:29:10 +0200
|
||||||
|
Subject: [PATCH] qemu: new function to retrieve migration blocker reasons from
|
||||||
|
QEMU
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Since QEMU 6.0, if migration is blocked for some reason,
|
||||||
|
'query-migrate' will return an array of error strings describing the
|
||||||
|
migration blockers. This can be used to check whether there are any
|
||||||
|
devices, or other conditions, that would cause migration to fail.
|
||||||
|
|
||||||
|
This patch adds a function that sends this query via a QMP command and
|
||||||
|
returns the resulting array of reasons. qemuMigrationSrcIsAllowed()
|
||||||
|
will be able to use the new function to ask QEMU for migration
|
||||||
|
blockers, instead of the hardcoded guesses that libvirt currently has.
|
||||||
|
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Laine Stump <laine@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 7e52c4839fabac2d19c6f22c99142e992e3d898e)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_monitor.c | 12 ++++++++++
|
||||||
|
src/qemu/qemu_monitor.h | 4 ++++
|
||||||
|
src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++++++++
|
||||||
|
src/qemu/qemu_monitor_json.h | 3 +++
|
||||||
|
4 files changed, 65 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
||||||
|
index fda5d2f368..865a3e69ed 100644
|
||||||
|
--- a/src/qemu/qemu_monitor.c
|
||||||
|
+++ b/src/qemu/qemu_monitor.c
|
||||||
|
@@ -4541,3 +4541,15 @@ qemuMonitorMigrateRecover(qemuMonitor *mon,
|
||||||
|
|
||||||
|
return qemuMonitorJSONMigrateRecover(mon, uri);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+qemuMonitorGetMigrationBlockers(qemuMonitor *mon,
|
||||||
|
+ char ***blockers)
|
||||||
|
+{
|
||||||
|
+ VIR_DEBUG("blockers=%p", blockers);
|
||||||
|
+
|
||||||
|
+ QEMU_CHECK_MONITOR(mon);
|
||||||
|
+
|
||||||
|
+ return qemuMonitorJSONGetMigrationBlockers(mon, blockers);
|
||||||
|
+}
|
||||||
|
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
||||||
|
index 95267ec6c7..0c3f023419 100644
|
||||||
|
--- a/src/qemu/qemu_monitor.h
|
||||||
|
+++ b/src/qemu/qemu_monitor.h
|
||||||
|
@@ -1554,3 +1554,7 @@ qemuMonitorChangeMemoryRequestedSize(qemuMonitor *mon,
|
||||||
|
int
|
||||||
|
qemuMonitorMigrateRecover(qemuMonitor *mon,
|
||||||
|
const char *uri);
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+qemuMonitorGetMigrationBlockers(qemuMonitor *mon,
|
||||||
|
+ char ***blockers);
|
||||||
|
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
||||||
|
index 3aad2ab212..84f4589c42 100644
|
||||||
|
--- a/src/qemu/qemu_monitor_json.c
|
||||||
|
+++ b/src/qemu/qemu_monitor_json.c
|
||||||
|
@@ -3434,6 +3434,52 @@ int qemuMonitorJSONMigrate(qemuMonitor *mon,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Get the exposed migration blockers.
|
||||||
|
+ *
|
||||||
|
+ * This function assume qemu has the capability of request them.
|
||||||
|
+ *
|
||||||
|
+ * It returns a NULL terminated array on blockers if there are any, or it set
|
||||||
|
+ * it to NULL otherwise.
|
||||||
|
+ */
|
||||||
|
+int
|
||||||
|
+qemuMonitorJSONGetMigrationBlockers(qemuMonitor *mon,
|
||||||
|
+ char ***blockers)
|
||||||
|
+{
|
||||||
|
+ g_autoptr(virJSONValue) cmd = NULL;
|
||||||
|
+ g_autoptr(virJSONValue) reply = NULL;
|
||||||
|
+ virJSONValue *data;
|
||||||
|
+ virJSONValue *jblockers;
|
||||||
|
+ size_t i;
|
||||||
|
+
|
||||||
|
+ *blockers = NULL;
|
||||||
|
+ if (!(cmd = qemuMonitorJSONMakeCommand("query-migrate", NULL)))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_OBJECT) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ data = virJSONValueObjectGetObject(reply, "return");
|
||||||
|
+
|
||||||
|
+ if (!(jblockers = virJSONValueObjectGetArray(data, "blocked-reasons")))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ *blockers = g_new0(char *, virJSONValueArraySize(jblockers) + 1);
|
||||||
|
+ for (i = 0; i < virJSONValueArraySize(jblockers); i++) {
|
||||||
|
+ virJSONValue *jblocker = virJSONValueArrayGet(jblockers, i);
|
||||||
|
+ const char *blocker = virJSONValueGetString(jblocker);
|
||||||
|
+
|
||||||
|
+ (*blockers)[i] = g_strdup(blocker);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
int qemuMonitorJSONMigrateCancel(qemuMonitor *mon)
|
||||||
|
{
|
||||||
|
g_autoptr(virJSONValue) cmd = qemuMonitorJSONMakeCommand("migrate_cancel", NULL);
|
||||||
|
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
|
||||||
|
index ad3853ae69..4e7d6a1a8d 100644
|
||||||
|
--- a/src/qemu/qemu_monitor_json.h
|
||||||
|
+++ b/src/qemu/qemu_monitor_json.h
|
||||||
|
@@ -199,6 +199,9 @@ qemuMonitorJSONMigrate(qemuMonitor *mon,
|
||||||
|
unsigned int flags,
|
||||||
|
const char *uri);
|
||||||
|
int
|
||||||
|
+qemuMonitorJSONGetMigrationBlockers(qemuMonitor *mon,
|
||||||
|
+ char ***blockers);
|
||||||
|
+int
|
||||||
|
qemuMonitorJSONGetSpiceMigrationStatus(qemuMonitor *mon,
|
||||||
|
bool *spice_migrated);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
From 9764a6c484d4f3586b0e0be33e8c53de63b11edd Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <9764a6c484d4f3586b0e0be33e8c53de63b11edd@dist-git>
|
||||||
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 19:29:13 +0200
|
||||||
|
Subject: [PATCH] qemu: query QEMU for migration blockers before our own
|
||||||
|
harcoded checks
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Since QEMU 6.0, if QEMU knows that a migration would fail,
|
||||||
|
'query-migrate' will return an array of error strings describing the
|
||||||
|
migration blockers. This can be used to check whether there are any
|
||||||
|
devices/conditions blocking migration.
|
||||||
|
|
||||||
|
This patch adds a call to this query at the top of
|
||||||
|
qemuMigrationSrcIsAllowed().
|
||||||
|
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Laine Stump <laine@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 156e99f686690855be4e45d9b8b3194191a8bc31)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 30 ++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 30 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 2a6b7b7819..cfb7626bb0 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1415,6 +1415,22 @@ qemuMigrationSrcIsAllowedHostdev(const virDomainDef *def)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+qemuDomainGetMigrationBlockers(virQEMUDriver *driver,
|
||||||
|
+ virDomainObj *vm,
|
||||||
|
+ char ***blockers)
|
||||||
|
+{
|
||||||
|
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
+ rc = qemuMonitorGetMigrationBlockers(priv->mon, blockers);
|
||||||
|
+ qemuDomainObjExitMonitor(vm);
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* qemuMigrationSrcIsAllowed:
|
||||||
|
* @driver: qemu driver struct
|
||||||
|
@@ -1440,6 +1456,20 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
int pauseReason;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
+ /* Ask qemu if it has a migration blocker */
|
||||||
|
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_BLOCKED_REASONS)) {
|
||||||
|
+ g_auto(GStrv) blockers = NULL;
|
||||||
|
+ if (qemuDomainGetMigrationBlockers(driver, vm, &blockers) < 0)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (blockers && blockers[0]) {
|
||||||
|
+ g_autofree char *reasons = g_strjoinv("; ", blockers);
|
||||||
|
+ virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
+ _("cannot migrate domain: %s"), reasons);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* perform these checks only when migrating to remote hosts */
|
||||||
|
if (remote) {
|
||||||
|
nsnapshots = virDomainSnapshotObjListNum(vm->snapshots, NULL, 0);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
From 0ba11af2300d0aaf80456575e03848f843ae29de Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <0ba11af2300d0aaf80456575e03848f843ae29de@dist-git>
|
||||||
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 19:29:15 +0200
|
||||||
|
Subject: [PATCH] qemu: remove hardcoded migration fail for vDPA devices if we
|
||||||
|
can ask QEMU
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
vDPA devices will be migratable soon, so we shouldn't unconditionally
|
||||||
|
block migration of any domain with a vDPA device. Instead, we should
|
||||||
|
rely on QEMU to make the decision when that info is available from the
|
||||||
|
query-migrate QMP command (QEMU versions too old to have that info in
|
||||||
|
the results of query-migrate don't support migration of vDPA devices,
|
||||||
|
so in that case we will continue to unconditionally block migration).
|
||||||
|
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Laine Stump <laine@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 2103807e330487952f423d86f541a7a28e003e95)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 8 +++++---
|
||||||
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index cfb7626bb0..2f77e45abf 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1455,9 +1455,11 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
int nsnapshots;
|
||||||
|
int pauseReason;
|
||||||
|
size_t i;
|
||||||
|
+ bool blockedReasonsCap = virQEMUCapsGet(priv->qemuCaps,
|
||||||
|
+ QEMU_CAPS_MIGRATION_BLOCKED_REASONS);
|
||||||
|
|
||||||
|
- /* Ask qemu if it has a migration blocker */
|
||||||
|
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_BLOCKED_REASONS)) {
|
||||||
|
+ /* Ask qemu if it have a migration blocker */
|
||||||
|
+ if (blockedReasonsCap) {
|
||||||
|
g_auto(GStrv) blockers = NULL;
|
||||||
|
if (qemuDomainGetMigrationBlockers(driver, vm, &blockers) < 0)
|
||||||
|
return false;
|
||||||
|
@@ -1576,7 +1578,7 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
virDomainNetDef *net = vm->def->nets[i];
|
||||||
|
qemuSlirp *slirp;
|
||||||
|
|
||||||
|
- if (net->type == VIR_DOMAIN_NET_TYPE_VDPA) {
|
||||||
|
+ if (!blockedReasonsCap && net->type == VIR_DOMAIN_NET_TYPE_VDPA) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("vDPA devices cannot be migrated"));
|
||||||
|
return false;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,62 @@
|
|||||||
|
From 8f2cd77dc208cfa90b37faa18b092ca4a76a0716 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <8f2cd77dc208cfa90b37faa18b092ca4a76a0716@dist-git>
|
||||||
|
From: Laine Stump <laine@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 02:03:49 -0400
|
||||||
|
Subject: [PATCH] qemu: skip hardcoded hostdev migration check if QEMU can do
|
||||||
|
it for us
|
||||||
|
|
||||||
|
libvirt currently will block migration for any vfio-assigned device
|
||||||
|
unless it is a network device that is associated with a virtio-net
|
||||||
|
failover device (ie. if the hostdev object has a teaming->type ==
|
||||||
|
VIR_DOMAIN_NET_TEAMING_TYPE_TRANSIENT).
|
||||||
|
|
||||||
|
In the future there will be other vfio devices that can be migrated,
|
||||||
|
so we don't want to rely on this hardcoded block. QEMU 6.0+ will
|
||||||
|
anyway inform us of any devices that will block migration (as a part
|
||||||
|
of qemuDomainGetMigrationBlockers()), so we only need to do the
|
||||||
|
hardcoded check in the case of old QEMU that can't provide that
|
||||||
|
information.
|
||||||
|
|
||||||
|
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
(cherry picked from commit 25883cd5f0b188f2417f294b7d219a77b219f7c2)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1497907
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 11 ++++++++---
|
||||||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index f571c9eb27..76903d612b 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1495,6 +1495,14 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
_("cannot migrate domain: %s"), reasons);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
+ } else {
|
||||||
|
+ /* checks here are for anything that doesn't need to be
|
||||||
|
+ * checked by libvirt if running QEMU that can be queried
|
||||||
|
+ * about migration blockers.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ if (!qemuMigrationSrcIsAllowedHostdev(vm->def))
|
||||||
|
+ return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remote) {
|
||||||
|
@@ -1521,9 +1529,6 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowedHostdev(vm->def))
|
||||||
|
- return false;
|
||||||
|
-
|
||||||
|
if (vm->def->cpu) {
|
||||||
|
/* QEMU blocks migration and save with invariant TSC enabled
|
||||||
|
* unless TSC frequency is explicitly set.
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,41 @@
|
|||||||
|
From 9b00b5666a014999a3bc9e2e8a6a844ca7a4326f Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <9b00b5666a014999a3bc9e2e8a6a844ca7a4326f@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Fri, 8 Jul 2022 09:35:39 +0200
|
||||||
|
Subject: [PATCH] qemuDomainSetIOThreadParams: Accept VIR_DOMAIN_AFFECT_CONFIG
|
||||||
|
flag
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
It was always possible to modify the inactive XML, because
|
||||||
|
VIR_DOMAIN_AFFECT_CURRENT (= 0) is accepted implicitly. But now
|
||||||
|
that the logic when changing both config and live XMLs is more
|
||||||
|
robust we can accept VIR_DOMAIN_AFFECT_CONFIG flag too.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 3096965ce78923b099fa39e4950279b2f21ab60a)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 2c627396f1..654b5d65e5 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -5818,7 +5818,8 @@ qemuDomainSetIOThreadParams(virDomainPtr dom,
|
||||||
|
qemuMonitorIOThreadInfo iothread = {0};
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
- virCheckFlags(VIR_DOMAIN_AFFECT_LIVE, -1);
|
||||||
|
+ virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
||||||
|
+ VIR_DOMAIN_AFFECT_CONFIG, -1);
|
||||||
|
|
||||||
|
if (iothread_id == 0) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
41
libvirt-qemuDomainSetupDisk-Initialize-targetPaths.patch
Normal file
41
libvirt-qemuDomainSetupDisk-Initialize-targetPaths.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
From ab4488be3282dd5d0b9582e6a5d1dafbe7b90489 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <ab4488be3282dd5d0b9582e6a5d1dafbe7b90489@dist-git>
|
||||||
|
From: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
Date: Tue, 25 Jan 2022 17:49:00 +0100
|
||||||
|
Subject: [PATCH] qemuDomainSetupDisk: Initialize 'targetPaths'
|
||||||
|
|
||||||
|
Compiler isn't able to see that 'virDevMapperGetTargets' in cases e.g.
|
||||||
|
when the devmapper isn't available may not initialize the value in the
|
||||||
|
pointer passed as the second argument.
|
||||||
|
|
||||||
|
The usage 'qemuDomainSetupDisk' lead to an accidental infinite loop as
|
||||||
|
previous calls apparently doctored the stack to a point where
|
||||||
|
'g_slist_concat' would end up in an infinite loop trying to find the end
|
||||||
|
of the list.
|
||||||
|
|
||||||
|
Fixes: 6c49c2ee9fcb88de02cdc333f666a8e95d60a3b0
|
||||||
|
Closes: https://gitlab.com/libvirt/libvirt/-/issues/268
|
||||||
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
||||||
|
(cherry picked from commit ddb2384f0c78a91c40d95afdbc7fe325e95ef2bc)
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2046172
|
||||||
|
---
|
||||||
|
src/qemu/qemu_namespace.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
|
||||||
|
index 23b1160c5e..94453033f5 100644
|
||||||
|
--- a/src/qemu/qemu_namespace.c
|
||||||
|
+++ b/src/qemu/qemu_namespace.c
|
||||||
|
@@ -251,7 +251,7 @@ qemuDomainSetupDisk(virStorageSource *src,
|
||||||
|
if (!(tmpPath = virPCIDeviceAddressGetIOMMUGroupDev(&next->nvme->pciAddr)))
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
- GSList *targetPaths;
|
||||||
|
+ GSList *targetPaths = NULL;
|
||||||
|
|
||||||
|
if (virStorageSourceIsEmpty(next) ||
|
||||||
|
!virStorageSourceIsLocalStorage(next)) {
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,314 @@
|
|||||||
|
From c387e7680c07d7dbb934dbe972e99ab78cebad28 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <c387e7680c07d7dbb934dbe972e99ab78cebad28@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Mon, 21 Mar 2022 16:55:05 +0100
|
||||||
|
Subject: [PATCH] qemu_capabilities: Detect memory-backend-*.prealloc-threads
|
||||||
|
property
|
||||||
|
|
||||||
|
The prealloc-threads is property of memory-backend class which is
|
||||||
|
parent to the other three classes memory-backend-{ram,file,memfd}.
|
||||||
|
Therefore the property is present for all, or none if QEMU is
|
||||||
|
older than v5.0.0-rc0~75^2~1^2~3 which introduced the property.
|
||||||
|
|
||||||
|
Anyway, the .reserve property is the same story, and we chose
|
||||||
|
memory-backend-file to detect it, so stick with our earlier
|
||||||
|
decision and use the same backend to detect this new property.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
(cherry picked from commit a30dac15dcdb7a6c7a3e9b6cfc5cd77bae185081)
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
src/qemu/qemu_capabilities.c: Context
|
||||||
|
src/qemu/qemu_capabilities.h
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_7.0.0.ppc64.xml
|
||||||
|
tests/qemucapabilitiesdata/caps_7.0.0.x86_64.xml
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2067126
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_capabilities.c | 2 ++
|
||||||
|
src/qemu/qemu_capabilities.h | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml | 1 +
|
||||||
|
tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml | 1 +
|
||||||
|
20 files changed, 21 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||||
|
index 8ae80ef8d7..c4f7db55c8 100644
|
||||||
|
--- a/src/qemu/qemu_capabilities.c
|
||||||
|
+++ b/src/qemu/qemu_capabilities.c
|
||||||
|
@@ -657,6 +657,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
|
||||||
|
|
||||||
|
/* 420 */
|
||||||
|
"blockdev-reopen.__com.redhat_rhel-av-8_2_0-api", /* QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API */
|
||||||
|
+ "memory-backend-file.prealloc-threads", /* QEMU_CAPS_MEMORY_BACKEND_PREALLOC_THREADS */
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1713,6 +1714,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsMemoryBackendFile[] =
|
||||||
|
* released qemu versions. */
|
||||||
|
{ "x-use-canonical-path-for-ramblock-id", QEMU_CAPS_X_USE_CANONICAL_PATH_FOR_RAMBLOCK_ID },
|
||||||
|
{ "reserve", QEMU_CAPS_MEMORY_BACKEND_RESERVE },
|
||||||
|
+ { "prealloc-threads", QEMU_CAPS_MEMORY_BACKEND_PREALLOC_THREADS },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsMemoryBackendMemfd[] = {
|
||||||
|
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||||
|
index cde6c18b4c..8e65635e0d 100644
|
||||||
|
--- a/src/qemu/qemu_capabilities.h
|
||||||
|
+++ b/src/qemu/qemu_capabilities.h
|
||||||
|
@@ -636,6 +636,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
|
||||||
|
|
||||||
|
/* 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_MEMORY_BACKEND_PREALLOC_THREADS, /* -object memory-backend-*.prealloc-threads */
|
||||||
|
|
||||||
|
QEMU_CAPS_LAST /* this must always be the last item */
|
||||||
|
} virQEMUCapsFlags;
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml
|
||||||
|
index bb6a7d5ee7..3b18f160db 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml
|
||||||
|
@@ -179,6 +179,7 @@
|
||||||
|
<flag name='input-linux'/>
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700241</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml
|
||||||
|
index f8317c1117..c90f2be296 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml
|
||||||
|
@@ -187,6 +187,7 @@
|
||||||
|
<flag name='input-linux'/>
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>42900241</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml
|
||||||
|
index 58c7eb6651..8fbe8f114f 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml
|
||||||
|
@@ -171,6 +171,7 @@
|
||||||
|
<flag name='input-linux'/>
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>0</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml
|
||||||
|
index 69f49020e7..b76c4346a4 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml
|
||||||
|
@@ -221,6 +221,7 @@
|
||||||
|
<flag name='input-linux'/>
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100241</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml b/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml
|
||||||
|
index 58af90b29f..7de7c291f5 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.1.0.sparc.xml
|
||||||
|
@@ -90,6 +90,7 @@
|
||||||
|
<flag name='rotation-rate'/>
|
||||||
|
<flag name='input-linux'/>
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5001000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>0</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml
|
||||||
|
index 578e16e8b0..9b5cb3cd7a 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml
|
||||||
|
@@ -224,6 +224,7 @@
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='virtio-mem-pci'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5001000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml
|
||||||
|
index b943eaedaf..020c04c1c4 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.2.0.aarch64.xml
|
||||||
|
@@ -184,6 +184,7 @@
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml
|
||||||
|
index ec64e1cacf..5346b1552c 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.2.0.ppc64.xml
|
||||||
|
@@ -190,6 +190,7 @@
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>42900243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml
|
||||||
|
index a11d15f91a..9f6974f85d 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.2.0.riscv64.xml
|
||||||
|
@@ -174,6 +174,7 @@
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>0</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml
|
||||||
|
index 552e1d43c9..44753b64c3 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.2.0.s390x.xml
|
||||||
|
@@ -141,6 +141,7 @@
|
||||||
|
<flag name='query-display-options'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>39100243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml
|
||||||
|
index bcc262551a..db11c99739 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml
|
||||||
|
@@ -227,6 +227,7 @@
|
||||||
|
<flag name='virtio-mem-pci'/>
|
||||||
|
<flag name='piix4.acpi-root-pci-hotplug'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>5002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
index 0fefe64537..5f9a97df43 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.aarch64.xml
|
||||||
|
@@ -192,6 +192,7 @@
|
||||||
|
<flag name='set-action'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
index 61685066b8..46bd1d3d2d 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.s390x.xml
|
||||||
|
@@ -149,6 +149,7 @@
|
||||||
|
<flag name='set-action'/>
|
||||||
|
<flag name='virtio-blk.queue-size'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>39100242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
index 0d6763e9a3..99bbb6e237 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
|
||||||
|
@@ -236,6 +236,7 @@
|
||||||
|
<flag name='piix4.acpi-root-pci-hotplug'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
<flag name='sev-inject-launch-secret'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6000000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100242</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
index 228f397c67..ff0715e605 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.1.0.x86_64.xml
|
||||||
|
@@ -240,6 +240,7 @@
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
<flag name='rbd-encryption'/>
|
||||||
|
<flag name='sev-inject-launch-secret'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6001000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100243</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
index 6bf9933bc5..dd6f0e6919 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.aarch64.xml
|
||||||
|
@@ -203,6 +203,7 @@
|
||||||
|
<flag name='memory-backend-file.reserve'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
<flag name='rbd-encryption'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6001050</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>61700244</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
index 06cd7fb396..2646cdf88f 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.ppc64.xml
|
||||||
|
@@ -199,6 +199,7 @@
|
||||||
|
<flag name='piix4.acpi-root-pci-hotplug'/>
|
||||||
|
<flag name='query-dirty-rate'/>
|
||||||
|
<flag name='rbd-encryption'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6001050</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>42900244</microcodeVersion>
|
||||||
|
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
index 75aaeed03c..f25ec1b84a 100644
|
||||||
|
--- a/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
+++ b/tests/qemucapabilitiesdata/caps_6.2.0.x86_64.xml
|
||||||
|
@@ -241,6 +241,7 @@
|
||||||
|
<flag name='rbd-encryption'/>
|
||||||
|
<flag name='sev-guest-kernel-hashes'/>
|
||||||
|
<flag name='sev-inject-launch-secret'/>
|
||||||
|
+ <flag name='memory-backend-file.prealloc-threads'/>
|
||||||
|
<version>6002000</version>
|
||||||
|
<kvmVersion>0</kvmVersion>
|
||||||
|
<microcodeVersion>43100244</microcodeVersion>
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,663 @@
|
|||||||
|
From e4e8b74f2cf090c8b29efcd3ceac4e4c4d07b929 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <e4e8b74f2cf090c8b29efcd3ceac4e4c4d07b929@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Thu, 27 Jan 2022 11:13:53 +0100
|
||||||
|
Subject: [PATCH] qemu_command: Generate memory only after controllers
|
||||||
|
|
||||||
|
Currently, memory device (def->mems) part of cmd line is
|
||||||
|
generated before any controller. In majority of cases it doesn't
|
||||||
|
matter because neither of memory devices live on a bus that's
|
||||||
|
created by an exposed controller (e.g. there's no DIMM
|
||||||
|
controller, at least not exposed). Except for virtio-mem and
|
||||||
|
virtio-pmem, which do have a PCI address. And if it so happens
|
||||||
|
that the device goes onto non-default bus (pci.0) starting such
|
||||||
|
guest fails, because the controller that creates the desired bus
|
||||||
|
wasn't processed yet. QEMU processes arguments in order.
|
||||||
|
|
||||||
|
For instance, if virtio-mem has address with bus='0x01' QEMU
|
||||||
|
refuses to start with the following message:
|
||||||
|
|
||||||
|
Bus 'pci.1' not found
|
||||||
|
|
||||||
|
Similarly for virtio-pmem. I've successfully tested migration and
|
||||||
|
changing the order does not affect migration stream.
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2047271
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
||||||
|
(cherry picked from commit af23241cfed712f69450e82135d7c7b4899736de)
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args:
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-latest.args:
|
||||||
|
These happened because downstream we don't use JSON for -device,
|
||||||
|
but upstream we do (as of 1a691fe1c84090da80a652c4c80ac00a6134a69b).
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2050697
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_command.c | 6 +++---
|
||||||
|
tests/qemuxml2argvdata/hugepages-memaccess.args | 4 ++--
|
||||||
|
tests/qemuxml2argvdata/hugepages-memaccess2.args | 4 ++--
|
||||||
|
tests/qemuxml2argvdata/hugepages-numa-default-dimm.args | 4 ++--
|
||||||
|
.../qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args | 4 ++--
|
||||||
|
.../qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args | 4 ++--
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-dimm-addr.args | 8 ++++----
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-dimm.args | 8 ++++----
|
||||||
|
.../memory-hotplug-nvdimm-access.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-align.x86_64-5.2.0.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-align.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-label.x86_64-5.2.0.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-label.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-pmem.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-ppc64-abi-update.args | 4 ++--
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm-readonly.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-nvdimm.x86_64-latest.args | 4 ++--
|
||||||
|
.../memory-hotplug-ppc64-nonuma-abi-update.args | 8 ++++----
|
||||||
|
tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma.args | 8 ++++----
|
||||||
|
.../memory-hotplug-virtio-mem.x86_64-latest.args | 8 ++++----
|
||||||
|
.../memory-hotplug-virtio-pmem.x86_64-5.2.0.args | 4 ++--
|
||||||
|
.../memory-hotplug-virtio-pmem.x86_64-latest.args | 4 ++--
|
||||||
|
tests/qemuxml2argvdata/pages-dimm-discard.args | 8 ++++----
|
||||||
|
26 files changed, 65 insertions(+), 65 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||||
|
index 6b4647a711..2acdcca2ff 100644
|
||||||
|
--- a/src/qemu/qemu_command.c
|
||||||
|
+++ b/src/qemu/qemu_command.c
|
||||||
|
@@ -10565,9 +10565,6 @@ qemuBuildCommandLine(virQEMUDriver *driver,
|
||||||
|
qemuBuildNumaCommandLine(cfg, def, cmd, priv) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (qemuBuildMemoryDeviceCommandLine(cmd, cfg, def, priv) < 0)
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
virUUIDFormat(def->uuid, uuid);
|
||||||
|
virCommandAddArgList(cmd, "-uuid", uuid, NULL);
|
||||||
|
|
||||||
|
@@ -10617,6 +10614,9 @@ qemuBuildCommandLine(virQEMUDriver *driver,
|
||||||
|
if (qemuBuildControllersCommandLine(cmd, def, qemuCaps) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
+ if (qemuBuildMemoryDeviceCommandLine(cmd, cfg, def, priv) < 0)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
if (qemuBuildHubCommandLine(cmd, def, qemuCaps) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
diff --git a/tests/qemuxml2argvdata/hugepages-memaccess.args b/tests/qemuxml2argvdata/hugepages-memaccess.args
|
||||||
|
index b89f791697..a369c7f6da 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/hugepages-memaccess.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/hugepages-memaccess.args
|
||||||
|
@@ -24,8 +24,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-numa node,nodeid=2,cpus=2,memdev=ram-node2 \
|
||||||
|
-object memory-backend-file,id=ram-node3,mem-path=/dev/hugepages1G/libvirt/qemu/-1-QEMUGuest1,share=off,prealloc=on,size=1073741824,host-nodes=3,policy=bind \
|
||||||
|
-numa node,nodeid=3,cpus=3,memdev=ram-node3 \
|
||||||
|
--object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=on,prealloc=on,size=536870912,host-nodes=0-3,policy=bind \
|
||||||
|
--device pc-dimm,node=1,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -37,6 +35,8 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=on,prealloc=on,size=536870912,host-nodes=0-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=1,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/hugepages-memaccess2.args b/tests/qemuxml2argvdata/hugepages-memaccess2.args
|
||||||
|
index 0c296797e9..434ebdaa62 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/hugepages-memaccess2.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/hugepages-memaccess2.args
|
||||||
|
@@ -24,8 +24,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-numa node,nodeid=2,cpus=2,memdev=ram-node2 \
|
||||||
|
-object memory-backend-file,id=ram-node3,mem-path=/var/lib/libvirt/qemu/ram/-1-QEMUGuest1/ram-node3,share=off,size=1073741824,host-nodes=3,policy=bind \
|
||||||
|
-numa node,nodeid=3,cpus=3,memdev=ram-node3 \
|
||||||
|
--object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=on,prealloc=on,size=536870912,host-nodes=0-3,policy=bind \
|
||||||
|
--device pc-dimm,node=1,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -37,6 +35,8 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,share=on,prealloc=on,size=536870912,host-nodes=0-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=1,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/hugepages-numa-default-dimm.args b/tests/qemuxml2argvdata/hugepages-numa-default-dimm.args
|
||||||
|
index f560cabf8e..57bb70346d 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/hugepages-numa-default-dimm.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/hugepages-numa-default-dimm.args
|
||||||
|
@@ -19,8 +19,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-mem-prealloc \
|
||||||
|
-mem-path /dev/hugepages2M/libvirt/qemu/-1-fedora \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=1024 \
|
||||||
|
--object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages1G/libvirt/qemu/-1-fedora,size=1073741824,host-nodes=1-3,policy=bind \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
-uuid 63840878-0deb-4095-97e6-fc444d9bc9fa \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -32,4 +30,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages1G/libvirt/qemu/-1-fedora,size=1073741824,host-nodes=1-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args
|
||||||
|
index 8b5665f86e..7d9dcfb4df 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/hugepages-nvdimm.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-file","id":"ram-node0","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","share":true,"prealloc":true,"size":1073741824}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"size":536870912}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"size":536870912}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-audiodev '{"id":"audio1","driver":"none"}' \
|
||||||
|
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
index 8a40e2d79c..04a320d469 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-instance-00000092/.config \
|
||||||
|
-smp 8,sockets=1,dies=1,cores=8,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-memfd","id":"ram-node0","hugetlb":true,"hugetlbsize":2097152,"share":true,"prealloc":true,"size":15032385536,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"size":536870912,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-instance-00000092/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"size":536870912,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-audiodev '{"id":"audio1","driver":"none"}' \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
|
||||||
|
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.args b/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.args
|
||||||
|
index 907072d55d..b36117f1e8 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.args
|
||||||
|
@@ -17,10 +17,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=214 \
|
||||||
|
--object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,prealloc=on,size=536870912,host-nodes=1-3,policy=bind \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
--object memory-backend-ram,id=memdimm2,size=536870912 \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm2,id=dimm2,slot=2 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -32,6 +28,10 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,prealloc=on,size=536870912,host-nodes=1-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
|
||||||
|
+-object memory-backend-ram,id=memdimm2,size=536870912 \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm2,id=dimm2,slot=2 \
|
||||||
|
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-dimm.args b/tests/qemuxml2argvdata/memory-hotplug-dimm.args
|
||||||
|
index 5d87f4a3ef..72c2803c5e 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-dimm.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-dimm.args
|
||||||
|
@@ -17,10 +17,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=214 \
|
||||||
|
--object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
--object memory-backend-file,id=memdimm1,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,prealloc=on,size=536870912,host-nodes=1-3,policy=bind \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -32,6 +28,10 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
+-object memory-backend-file,id=memdimm1,mem-path=/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1,prealloc=on,size=536870912,host-nodes=1-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args
|
||||||
|
index 3664150c51..94aeadabce 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-access.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":224395264}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-5.2.0.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-5.2.0.args
|
||||||
|
index 6c28c86004..0b29a6fded 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-5.2.0.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-5.2.0.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object memory-backend-ram,id=ram-node0,size=224395264 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912,align=2097152 \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912,align=2097152 \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args
|
||||||
|
index aa77849079..5045cc8318 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":224395264}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912,"align":2097152}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912,"align":2097152}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-5.2.0.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-5.2.0.args
|
||||||
|
index c45b401af5..7c67161b78 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-5.2.0.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-5.2.0.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object memory-backend-ram,id=ram-node0,size=224395264 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912 \
|
||||||
|
--device nvdimm,node=0,label-size=131072,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912 \
|
||||||
|
+-device nvdimm,node=0,label-size=131072,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args
|
||||||
|
index 07863ba87c..9466877699 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":224395264}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
--device nvdimm,node=0,label-size=131072,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
+-device nvdimm,node=0,label-size=131072,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args
|
||||||
|
index 3f35d4dca2..c4dae0cfd1 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object memory-backend-ram,id=ram-node0,size=224395264 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,size=536870912,pmem=on \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,size=536870912,pmem=on \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args
|
||||||
|
index 4ed86feb01..9324535ac3 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":224395264}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"size":536870912,"pmem":true}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"size":536870912,"pmem":true}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64-abi-update.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64-abi-update.args
|
||||||
|
index ebdb0429d0..55b16c9dc2 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64-abi-update.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64-abi-update.args
|
||||||
|
@@ -17,8 +17,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=1024 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,prealloc=on,size=537001984 \
|
||||||
|
--device nvdimm,node=0,label-size=131072,uuid=49545eb3-75e1-2d0a-acdd-f0294406c99e,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -28,4 +26,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-boot strict=on \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,prealloc=on,size=537001984 \
|
||||||
|
+-device nvdimm,node=0,label-size=131072,uuid=49545eb3-75e1-2d0a-acdd-f0294406c99e,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64.args
|
||||||
|
index ebdb0429d0..55b16c9dc2 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-ppc64.args
|
||||||
|
@@ -17,8 +17,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=1024 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,prealloc=on,size=537001984 \
|
||||||
|
--device nvdimm,node=0,label-size=131072,uuid=49545eb3-75e1-2d0a-acdd-f0294406c99e,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -28,4 +26,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-boot strict=on \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,prealloc=on,size=537001984 \
|
||||||
|
+-device nvdimm,node=0,label-size=131072,uuid=49545eb3-75e1-2d0a-acdd-f0294406c99e,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args
|
||||||
|
index bca2f286ba..b1873c100f 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object memory-backend-ram,id=ram-node0,size=224395264 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912 \
|
||||||
|
--device nvdimm,node=0,unarmed=on,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object memory-backend-file,id=memnvdimm0,mem-path=/tmp/nvdimm,share=off,prealloc=on,size=536870912 \
|
||||||
|
+-device nvdimm,node=0,unarmed=on,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args
|
||||||
|
index 8be7f35cec..4f11d22e00 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":224395264}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
--device nvdimm,node=0,unarmed=on,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":false,"prealloc":true,"size":536870912}' \
|
||||||
|
+-device nvdimm,node=0,unarmed=on,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args
|
||||||
|
index 307698749e..434a0f91cf 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-nvdimm.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":1073741824}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","prealloc":true,"size":536870912}' \
|
||||||
|
--device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","prealloc":true,"size":536870912}' \
|
||||||
|
+-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma-abi-update.args b/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma-abi-update.args
|
||||||
|
index 5380c9e805..e8a6451841 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma-abi-update.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma-abi-update.args
|
||||||
|
@@ -16,10 +16,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-m size=1048576k,slots=16,maxmem=4194304k \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
--object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
--device pc-dimm,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
--object memory-backend-ram,id=memdimm1,size=536870912 \
|
||||||
|
--device pc-dimm,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-uuid 49545eb3-75e1-2d0a-acdd-f0294406c99e \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -29,4 +25,8 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-boot strict=on \
|
||||||
|
+-object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
+-device pc-dimm,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
+-object memory-backend-ram,id=memdimm1,size=536870912 \
|
||||||
|
+-device pc-dimm,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma.args b/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma.args
|
||||||
|
index acff36eb78..181409cde0 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma.args
|
||||||
|
@@ -16,10 +16,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-m size=1310720k,slots=16,maxmem=4194304k \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
--object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
--device pc-dimm,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
--object memory-backend-ram,id=memdimm1,size=536870912 \
|
||||||
|
--device pc-dimm,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-uuid 49545eb3-75e1-2d0a-acdd-f0294406c99e \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -29,4 +25,8 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-boot strict=on \
|
||||||
|
+-object memory-backend-ram,id=memdimm0,size=536870912 \
|
||||||
|
+-device pc-dimm,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
+-object memory-backend-ram,id=memdimm1,size=536870912 \
|
||||||
|
+-device pc-dimm,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-msg timestamp=on
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
|
||||||
|
index 8747b249da..30b635d365 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-virtio-mem.x86_64-latest.args
|
||||||
|
@@ -18,10 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":2145386496}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-ram","id":"memvirtiomem0","reserve":false,"size":1073741824}' \
|
||||||
|
--device virtio-mem-pci,node=0,block-size=2097152,requested-size=536870912,memdev=memvirtiomem0,id=virtiomem0,bus=pci.0,addr=0x2 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memvirtiomem1","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","reserve":false,"size":2147483648,"host-nodes":[1,2,3],"policy":"bind"}' \
|
||||||
|
--device virtio-mem-pci,node=0,block-size=2097152,requested-size=1073741824,memdev=memvirtiomem1,id=virtiomem1,bus=pci.0,addr=0x3 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -33,6 +29,10 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-ram","id":"memvirtiomem0","reserve":false,"size":1073741824}' \
|
||||||
|
+-device virtio-mem-pci,node=0,block-size=2097152,requested-size=536870912,memdev=memvirtiomem0,id=virtiomem0,bus=pci.0,addr=0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memvirtiomem1","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","reserve":false,"size":2147483648,"host-nodes":[1,2,3],"policy":"bind"}' \
|
||||||
|
+-device virtio-mem-pci,node=0,block-size=2097152,requested-size=1073741824,memdev=memvirtiomem1,id=virtiomem1,bus=pci.0,addr=0x3 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-5.2.0.args b/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-5.2.0.args
|
||||||
|
index 17fd98fb88..8fa678c209 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-5.2.0.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-5.2.0.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object memory-backend-ram,id=ram-node0,size=2145386496 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object memory-backend-file,id=memvirtiopmem0,mem-path=/tmp/virtio_pmem,share=on,size=536870912 \
|
||||||
|
--device virtio-pmem-pci,memdev=memvirtiopmem0,id=virtiopmem0,bus=pci.0,addr=0x5 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object memory-backend-file,id=memvirtiopmem0,mem-path=/tmp/virtio_pmem,share=on,size=536870912 \
|
||||||
|
+-device virtio-pmem-pci,memdev=memvirtiopmem0,id=virtiopmem0,bus=pci.0,addr=0x5 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-latest.args b/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-latest.args
|
||||||
|
index e5a91b6d33..95ff490cef 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-latest.args
|
||||||
|
@@ -18,8 +18,6 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-smp 2,sockets=2,dies=1,cores=1,threads=1 \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":2145386496}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memvirtiopmem0","mem-path":"/tmp/virtio_pmem","share":true,"size":536870912}' \
|
||||||
|
--device virtio-pmem-pci,memdev=memvirtiopmem0,id=virtiopmem0,bus=pci.0,addr=0x5 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -31,6 +29,8 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memvirtiopmem0","mem-path":"/tmp/virtio_pmem","share":true,"size":536870912}' \
|
||||||
|
+-device virtio-pmem-pci,memdev=memvirtiopmem0,id=virtiopmem0,bus=pci.0,addr=0x5 \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||||
|
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
|
||||||
|
-device ide-hd,bus=ide.0,unit=0,drive=libvirt-1-format,id=ide0-0-0,bootindex=1 \
|
||||||
|
diff --git a/tests/qemuxml2argvdata/pages-dimm-discard.args b/tests/qemuxml2argvdata/pages-dimm-discard.args
|
||||||
|
index 2ebe9c1350..e63c908549 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/pages-dimm-discard.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/pages-dimm-discard.args
|
||||||
|
@@ -17,10 +17,6 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-realtime mlock=off \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,mem=1024 \
|
||||||
|
--object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages1G/libvirt/qemu/-1-fedora,prealloc=on,size=1073741824,host-nodes=1-3,policy=bind \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
--object memory-backend-file,id=memdimm1,mem-path=/var/lib/libvirt/qemu/ram/-1-fedora/dimm1,discard-data=on,share=off,size=536870912 \
|
||||||
|
--device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-uuid 63840878-0deb-4095-97e6-fc444d9bc9fa \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
@@ -32,4 +28,8 @@ QEMU_AUDIO_DRV=none \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
+-object memory-backend-file,id=memdimm0,mem-path=/dev/hugepages1G/libvirt/qemu/-1-fedora,prealloc=on,size=1073741824,host-nodes=1-3,policy=bind \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
|
||||||
|
+-object memory-backend-file,id=memdimm1,mem-path=/var/lib/libvirt/qemu/ram/-1-fedora/dimm1,discard-data=on,share=off,size=536870912 \
|
||||||
|
+-device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=1 \
|
||||||
|
-msg timestamp=on
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,66 @@
|
|||||||
|
From e52b12a986de8ac469b98135b2c1d2a8a63b9052 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <e52b12a986de8ac469b98135b2c1d2a8a63b9052@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Mon, 21 Mar 2022 17:10:15 +0100
|
||||||
|
Subject: [PATCH] qemu_command: Generate prealloc-threads property
|
||||||
|
|
||||||
|
Let's generate prealloc-threads property onto the cmd line if
|
||||||
|
domain configuration requests so.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
(cherry picked from commit b8d6ecc70c8a8e9c90bab48b6829b42d8b77c748)
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args:
|
||||||
|
Upstream has moved some cmd line arguments
|
||||||
|
(v8.0.0-260-gaf23241cfe) but that is not backported.
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2067126
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_command.c | 5 ++++-
|
||||||
|
tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args | 4 ++--
|
||||||
|
2 files changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||||
|
index 2acdcca2ff..d23af97e0c 100644
|
||||||
|
--- a/src/qemu/qemu_command.c
|
||||||
|
+++ b/src/qemu/qemu_command.c
|
||||||
|
@@ -3856,7 +3856,10 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (!priv->memPrealloc &&
|
||||||
|
- virJSONValueObjectAdd(&props, "B:prealloc", prealloc, NULL) < 0)
|
||||||
|
+ virJSONValueObjectAdd(&props,
|
||||||
|
+ "B:prealloc", prealloc,
|
||||||
|
+ "p:prealloc-threads", def->mem.allocation_threads,
|
||||||
|
+ NULL) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
index 04a320d469..9b2e6086c3 100644
|
||||||
|
--- a/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
+++ b/tests/qemuxml2argvdata/memfd-memory-numa.x86_64-latest.args
|
||||||
|
@@ -16,7 +16,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-instance-00000092/.config \
|
||||||
|
-m size=14680064k,slots=16,maxmem=1099511627776k \
|
||||||
|
-overcommit mem-lock=off \
|
||||||
|
-smp 8,sockets=1,dies=1,cores=8,threads=1 \
|
||||||
|
--object '{"qom-type":"memory-backend-memfd","id":"ram-node0","hugetlb":true,"hugetlbsize":2097152,"share":true,"prealloc":true,"size":15032385536,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
+-object '{"qom-type":"memory-backend-memfd","id":"ram-node0","hugetlb":true,"hugetlbsize":2097152,"share":true,"prealloc":true,"prealloc-threads":8,"size":15032385536,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
-numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \
|
||||||
|
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
|
||||||
|
-display none \
|
||||||
|
@@ -29,7 +29,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-instance-00000092/.config \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
|
||||||
|
--object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"size":536870912,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
+-object '{"qom-type":"memory-backend-file","id":"memnvdimm0","mem-path":"/tmp/nvdimm","share":true,"prealloc":true,"prealloc-threads":8,"size":536870912,"host-nodes":[3],"policy":"preferred"}' \
|
||||||
|
-device nvdimm,node=0,memdev=memnvdimm0,id=nvdimm0,slot=0 \
|
||||||
|
-audiodev '{"id":"audio1","driver":"none"}' \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,132 @@
|
|||||||
|
From d4c4660b097695916244307d1125a17c30c0c9ef Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <d4c4660b097695916244307d1125a17c30c0c9ef@dist-git>
|
||||||
|
From: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
Date: Fri, 22 Jul 2022 12:20:04 +0200
|
||||||
|
Subject: [PATCH] qemu_migration: Acquire correct job in
|
||||||
|
qemuMigrationSrcIsAllowed
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Commit 62627524607f added the acquiring of a job, but it is not always
|
||||||
|
VIR_ASYNC_JOB_MIGRATION_OUT, so the code fails when doing save or anything else.
|
||||||
|
Correct the async job by passing it from the caller as another parameter.
|
||||||
|
|
||||||
|
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
(cherry picked from commit 69e0e33873f1aec55df77f12fb0197d50dca3319)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_driver.c | 8 ++++----
|
||||||
|
src/qemu/qemu_migration.c | 7 ++++---
|
||||||
|
src/qemu/qemu_migration.h | 1 +
|
||||||
|
src/qemu/qemu_snapshot.c | 4 ++--
|
||||||
|
4 files changed, 11 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||||
|
index 654b5d65e5..847c96639d 100644
|
||||||
|
--- a/src/qemu/qemu_driver.c
|
||||||
|
+++ b/src/qemu/qemu_driver.c
|
||||||
|
@@ -2650,13 +2650,13 @@ qemuDomainSaveInternal(virQEMUDriver *driver,
|
||||||
|
virQEMUSaveData *data = NULL;
|
||||||
|
g_autoptr(qemuDomainSaveCookie) cookie = NULL;
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
|
||||||
|
- goto cleanup;
|
||||||
|
-
|
||||||
|
if (qemuDomainObjBeginAsyncJob(driver, vm, VIR_ASYNC_JOB_SAVE,
|
||||||
|
VIR_DOMAIN_JOB_OPERATION_SAVE, flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_SAVE, 0))
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
if (!virDomainObjIsActive(vm)) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("guest unexpectedly quit"));
|
||||||
|
@@ -3176,7 +3176,7 @@ doCoreDump(virQEMUDriver *driver,
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_DUMP, 0))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuMigrationSrcToFile(driver, vm, fd, compressor,
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 96c4c0f1da..f571c9eb27 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1452,6 +1452,7 @@ bool
|
||||||
|
qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
bool remote,
|
||||||
|
+ int asyncJob,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
@@ -1483,7 +1484,7 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
g_auto(GStrv) blockers = NULL;
|
||||||
|
|
||||||
|
if (qemuDomainGetMigrationBlockers(driver, vm,
|
||||||
|
- VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
+ asyncJob,
|
||||||
|
&blockers) < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -2632,7 +2633,7 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver,
|
||||||
|
qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_BEGIN3) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, true, flags))
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, true, priv->job.asyncJob, flags))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(flags & (VIR_MIGRATE_UNSAFE | VIR_MIGRATE_OFFLINE)) &&
|
||||||
|
@@ -6033,7 +6034,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
|
||||||
|
if (!(flags & VIR_MIGRATE_OFFLINE) && virDomainObjCheckActive(vm) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, true, flags))
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, true, VIR_ASYNC_JOB_MIGRATION_OUT, flags))
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if (!(flags & (VIR_MIGRATE_UNSAFE | VIR_MIGRATE_OFFLINE)) &&
|
||||||
|
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
|
||||||
|
index 81cc1e91c0..61d12d6eb1 100644
|
||||||
|
--- a/src/qemu/qemu_migration.h
|
||||||
|
+++ b/src/qemu/qemu_migration.h
|
||||||
|
@@ -229,6 +229,7 @@ bool
|
||||||
|
qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
bool remote,
|
||||||
|
+ int asyncJob,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
|
int
|
||||||
|
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
|
||||||
|
index 833f880252..0733d44faa 100644
|
||||||
|
--- a/src/qemu/qemu_snapshot.c
|
||||||
|
+++ b/src/qemu/qemu_snapshot.c
|
||||||
|
@@ -291,7 +291,7 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
|
||||||
|
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
||||||
|
@@ -1422,7 +1422,7 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver,
|
||||||
|
/* do the memory snapshot if necessary */
|
||||||
|
if (memory) {
|
||||||
|
/* check if migration is possible */
|
||||||
|
- if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
|
||||||
|
+ if (!qemuMigrationSrcIsAllowed(driver, vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
qemuDomainJobSetStatsType(priv->job.current,
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,229 @@
|
|||||||
|
From b8c791a3fc2767e6d899e3e0c590a93cb0ee7e03 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <b8c791a3fc2767e6d899e3e0c590a93cb0ee7e03@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 30 Jun 2022 12:52:38 +0200
|
||||||
|
Subject: [PATCH] qemu_migration: Apply max-postcopy-bandwidth on post-copy
|
||||||
|
resume
|
||||||
|
|
||||||
|
When resuming post-copy migration users may want to limit the bandwidth
|
||||||
|
used by the migration and use a value that is different from the one
|
||||||
|
specified when the migration was originally started.
|
||||||
|
|
||||||
|
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/333
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 766abdc291ba606379a7d197bff477fef25fb508)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2111070
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 12 ++++++--
|
||||||
|
src/qemu/qemu_migration_params.c | 45 ++++++++++++++++++----------
|
||||||
|
src/qemu/qemu_migration_paramspriv.h | 3 +-
|
||||||
|
tests/qemumigparamstest.c | 2 +-
|
||||||
|
tests/qemumigrationcookiexmltest.c | 2 +-
|
||||||
|
5 files changed, 42 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 285a49c5ff..8a2f5b09a1 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -5097,12 +5097,13 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuMigrationSrcResume(virDomainObj *vm,
|
||||||
|
- qemuMigrationParams *migParams G_GNUC_UNUSED,
|
||||||
|
+ qemuMigrationParams *migParams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
- qemuMigrationSpec *spec)
|
||||||
|
+ qemuMigrationSpec *spec,
|
||||||
|
+ unsigned long flags)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
virQEMUDriver *driver = priv->driver;
|
||||||
|
@@ -5119,6 +5120,10 @@ qemuMigrationSrcResume(virDomainObj *vm,
|
||||||
|
if (!mig)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ if (qemuMigrationParamsApply(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
+ migParams, flags) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
||||||
|
VIR_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
|
return -1;
|
||||||
|
@@ -5200,6 +5205,7 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
if (STREQ(uribits->scheme, "unix")) {
|
||||||
|
if ((flags & VIR_MIGRATE_TLS) &&
|
||||||
|
+ !(flags & VIR_MIGRATE_POSTCOPY_RESUME) &&
|
||||||
|
!qemuMigrationParamsTLSHostnameIsSet(migParams)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||||
|
_("Explicit destination hostname is required "
|
||||||
|
@@ -5231,7 +5237,7 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
|
||||||
|
ret = qemuMigrationSrcResume(vm, migParams, cookiein, cookieinlen,
|
||||||
|
- cookieout, cookieoutlen, &spec);
|
||||||
|
+ cookieout, cookieoutlen, &spec, flags);
|
||||||
|
} else {
|
||||||
|
ret = qemuMigrationSrcRun(driver, vm, persist_xml, cookiein, cookieinlen,
|
||||||
|
cookieout, cookieoutlen, flags, resource,
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index a68aed9aa4..6ea0bde13a 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -141,6 +141,7 @@ struct _qemuMigrationParamsTPMapItem {
|
||||||
|
typedef struct _qemuMigrationParamInfoItem qemuMigrationParamInfoItem;
|
||||||
|
struct _qemuMigrationParamInfoItem {
|
||||||
|
qemuMigrationParamType type;
|
||||||
|
+ bool applyOnPostcopyResume;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Migration capabilities which should always be enabled as long as they
|
||||||
|
@@ -265,6 +266,7 @@ static const qemuMigrationParamInfoItem qemuMigrationParamInfo[] = {
|
||||||
|
},
|
||||||
|
[QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH] = {
|
||||||
|
.type = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
+ .applyOnPostcopyResume = true,
|
||||||
|
},
|
||||||
|
[QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = {
|
||||||
|
.type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
@@ -782,7 +784,8 @@ qemuMigrationParamsFromJSON(virJSONValue *params)
|
||||||
|
|
||||||
|
|
||||||
|
virJSONValue *
|
||||||
|
-qemuMigrationParamsToJSON(qemuMigrationParams *migParams)
|
||||||
|
+qemuMigrationParamsToJSON(qemuMigrationParams *migParams,
|
||||||
|
+ bool postcopyResume)
|
||||||
|
{
|
||||||
|
g_autoptr(virJSONValue) params = virJSONValueNewObject();
|
||||||
|
size_t i;
|
||||||
|
@@ -795,6 +798,9 @@ qemuMigrationParamsToJSON(qemuMigrationParams *migParams)
|
||||||
|
if (!pv->set)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
+ if (postcopyResume && !qemuMigrationParamInfo[i].applyOnPostcopyResume)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
switch (qemuMigrationParamInfo[i].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
rc = virJSONValueObjectAppendNumberInt(params, name, pv->value.i);
|
||||||
|
@@ -868,6 +874,7 @@ qemuMigrationCapsToJSON(virBitmap *caps,
|
||||||
|
*
|
||||||
|
* Send parameters stored in @migParams to QEMU. If @apiFlags is non-zero, some
|
||||||
|
* parameters that do not make sense for the enabled flags will be ignored.
|
||||||
|
+ * VIR_MIGRATE_POSTCOPY_RESUME is the only flag checked currently.
|
||||||
|
*
|
||||||
|
* Returns 0 on success, -1 on failure.
|
||||||
|
*/
|
||||||
|
@@ -876,32 +883,38 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
int asyncJob,
|
||||||
|
qemuMigrationParams *migParams,
|
||||||
|
- unsigned long apiFlags G_GNUC_UNUSED)
|
||||||
|
+ unsigned long apiFlags)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
bool xbzrleCacheSize_old = false;
|
||||||
|
g_autoptr(virJSONValue) params = NULL;
|
||||||
|
g_autoptr(virJSONValue) caps = NULL;
|
||||||
|
qemuMigrationParam xbzrle = QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE;
|
||||||
|
+ bool postcopyResume = !!(apiFlags & VIR_MIGRATE_POSTCOPY_RESUME);
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- if (asyncJob == VIR_ASYNC_JOB_NONE) {
|
||||||
|
- if (!virBitmapIsAllClear(migParams->caps)) {
|
||||||
|
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
- _("Migration capabilities can only be set by "
|
||||||
|
- "a migration job"));
|
||||||
|
- goto cleanup;
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- if (!(caps = qemuMigrationCapsToJSON(priv->migrationCaps, migParams->caps)))
|
||||||
|
- goto cleanup;
|
||||||
|
+ /* Changing capabilities is only allowed before migration starts, we need
|
||||||
|
+ * to skip them when resuming post-copy migration.
|
||||||
|
+ */
|
||||||
|
+ if (!postcopyResume) {
|
||||||
|
+ if (asyncJob == VIR_ASYNC_JOB_NONE) {
|
||||||
|
+ if (!virBitmapIsAllClear(migParams->caps)) {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
+ _("Migration capabilities can only be set by "
|
||||||
|
+ "a migration job"));
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ if (!(caps = qemuMigrationCapsToJSON(priv->migrationCaps, migParams->caps)))
|
||||||
|
+ goto cleanup;
|
||||||
|
|
||||||
|
- if (virJSONValueArraySize(caps) > 0 &&
|
||||||
|
- qemuMonitorSetMigrationCapabilities(priv->mon, &caps) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
+ if (virJSONValueArraySize(caps) > 0 &&
|
||||||
|
+ qemuMonitorSetMigrationCapabilities(priv->mon, &caps) < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If QEMU is too old to support xbzrle-cache-size migration parameter,
|
||||||
|
@@ -917,7 +930,7 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
migParams->params[xbzrle].set = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(params = qemuMigrationParamsToJSON(migParams)))
|
||||||
|
+ if (!(params = qemuMigrationParamsToJSON(migParams, postcopyResume)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virJSONValueObjectKeysNumber(params) > 0 &&
|
||||||
|
diff --git a/src/qemu/qemu_migration_paramspriv.h b/src/qemu/qemu_migration_paramspriv.h
|
||||||
|
index f7e0f51fbd..34d51231ff 100644
|
||||||
|
--- a/src/qemu/qemu_migration_paramspriv.h
|
||||||
|
+++ b/src/qemu/qemu_migration_paramspriv.h
|
||||||
|
@@ -26,7 +26,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
virJSONValue *
|
||||||
|
-qemuMigrationParamsToJSON(qemuMigrationParams *migParams);
|
||||||
|
+qemuMigrationParamsToJSON(qemuMigrationParams *migParams,
|
||||||
|
+ bool postcopyResume);
|
||||||
|
|
||||||
|
qemuMigrationParams *
|
||||||
|
qemuMigrationParamsFromJSON(virJSONValue *params);
|
||||||
|
diff --git a/tests/qemumigparamstest.c b/tests/qemumigparamstest.c
|
||||||
|
index bcdee5f32b..5d45a9dd58 100644
|
||||||
|
--- a/tests/qemumigparamstest.c
|
||||||
|
+++ b/tests/qemumigparamstest.c
|
||||||
|
@@ -155,7 +155,7 @@ qemuMigParamsTestJSON(const void *opaque)
|
||||||
|
if (!(migParams = qemuMigrationParamsFromJSON(paramsIn)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- if (!(paramsOut = qemuMigrationParamsToJSON(migParams)) ||
|
||||||
|
+ if (!(paramsOut = qemuMigrationParamsToJSON(migParams, false)) ||
|
||||||
|
!(actualJSON = virJSONValueToString(paramsOut, true)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
diff --git a/tests/qemumigrationcookiexmltest.c b/tests/qemumigrationcookiexmltest.c
|
||||||
|
index 316bfedd15..9731348b53 100644
|
||||||
|
--- a/tests/qemumigrationcookiexmltest.c
|
||||||
|
+++ b/tests/qemumigrationcookiexmltest.c
|
||||||
|
@@ -333,7 +333,7 @@ testQemuMigrationCookieBlockDirtyBitmaps(const void *opaque)
|
||||||
|
|
||||||
|
qemuMigrationParamsSetBlockDirtyBitmapMapping(migParams, &migParamsBitmaps);
|
||||||
|
|
||||||
|
- if (!(paramsOut = qemuMigrationParamsToJSON(migParams)) ||
|
||||||
|
+ if (!(paramsOut = qemuMigrationParamsToJSON(migParams, false)) ||
|
||||||
|
!(actualJSON = virJSONValueToString(paramsOut, true)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,70 @@
|
|||||||
|
From d24586ede83472f850d1a0c520d482ac5f908696 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <d24586ede83472f850d1a0c520d482ac5f908696@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 30 Jun 2022 12:51:55 +0200
|
||||||
|
Subject: [PATCH] qemu_migration: Pass migParams to qemuMigrationSrcResume
|
||||||
|
|
||||||
|
So the we can apply selected migration parameters even when resuming
|
||||||
|
post-copy migration.
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 8c335b5530194dbcef719a4d88c89b8723b831a5)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2111070
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 8 +++++---
|
||||||
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 8cbd73a809..285a49c5ff 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -5097,6 +5097,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuMigrationSrcResume(virDomainObj *vm,
|
||||||
|
+ qemuMigrationParams *migParams G_GNUC_UNUSED,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
@@ -5229,7 +5230,7 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver,
|
||||||
|
spec.fwdType = MIGRATION_FWD_DIRECT;
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
|
||||||
|
- ret = qemuMigrationSrcResume(vm, cookiein, cookieinlen,
|
||||||
|
+ ret = qemuMigrationSrcResume(vm, migParams, cookiein, cookieinlen,
|
||||||
|
cookieout, cookieoutlen, &spec);
|
||||||
|
} else {
|
||||||
|
ret = qemuMigrationSrcRun(driver, vm, persist_xml, cookiein, cookieinlen,
|
||||||
|
@@ -6124,6 +6125,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver,
|
||||||
|
virConnectPtr conn,
|
||||||
|
virDomainObj *vm,
|
||||||
|
const char *uri,
|
||||||
|
+ qemuMigrationParams *migParams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
@@ -6148,7 +6150,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver,
|
||||||
|
ret = qemuMigrationSrcPerformNative(driver, vm, NULL, uri,
|
||||||
|
cookiein, cookieinlen,
|
||||||
|
cookieout, cookieoutlen, flags,
|
||||||
|
- 0, NULL, NULL, 0, NULL, NULL, NULL);
|
||||||
|
+ 0, NULL, NULL, 0, NULL, migParams, NULL);
|
||||||
|
|
||||||
|
if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
|
||||||
|
qemuMigrationAnyConnectionClosed) < 0)
|
||||||
|
@@ -6188,7 +6190,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
|
||||||
|
- return qemuMigrationSrcPerformResume(driver, conn, vm, uri,
|
||||||
|
+ return qemuMigrationSrcPerformResume(driver, conn, vm, uri, migParams,
|
||||||
|
cookiein, cookieinlen,
|
||||||
|
cookieout, cookieoutlen, flags);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
From c50cae68f0d083ad0c5ffcf85908cc62eeaa866d Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <c50cae68f0d083ad0c5ffcf85908cc62eeaa866d@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Tue, 19 Jul 2022 13:48:44 +0200
|
||||||
|
Subject: [PATCH] qemu_migration: Store original migration params in status XML
|
||||||
|
|
||||||
|
We keep original values of migration parameters so that we can restore
|
||||||
|
them at the end of migration to make sure later migration does not use
|
||||||
|
some random values. However, this does not really work when libvirt
|
||||||
|
daemon is restarted on the source host because we failed to explicitly
|
||||||
|
save the status XML after getting the migration parameters from QEMU.
|
||||||
|
Actually it might work if the status XML is written later for some other
|
||||||
|
reason such as domain state change, but that's not how it should work.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit c7238941357f0d2e94524cf8c5ad7d9c82dcf2f9)
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 8a2f5b09a1..9289df81eb 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -3245,6 +3245,9 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver,
|
||||||
|
migParams, mig->caps->automatic) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
+ /* Save original migration parameters */
|
||||||
|
+ qemuDomainSaveStatus(vm);
|
||||||
|
+
|
||||||
|
/* Migrations using TLS need to add the "tls-creds-x509" object and
|
||||||
|
* set the migration TLS parameters */
|
||||||
|
if (flags & VIR_MIGRATE_TLS) {
|
||||||
|
@@ -4822,6 +4825,9 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
|
||||||
|
migParams, mig->caps->automatic) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
+ /* Save original migration parameters */
|
||||||
|
+ qemuDomainSaveStatus(vm);
|
||||||
|
+
|
||||||
|
if (flags & VIR_MIGRATE_TLS) {
|
||||||
|
const char *hostname = NULL;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,64 @@
|
|||||||
|
From 25fe3cf8990b654fd568f580b8885102b3f92789 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <25fe3cf8990b654fd568f580b8885102b3f92789@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 15:00:28 +0200
|
||||||
|
Subject: [PATCH] qemu_migration: Use EnterMonitorAsync in
|
||||||
|
qemuDomainGetMigrationBlockers
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The code is run with an async job and thus needs to make sure a nested
|
||||||
|
job is acquired before entering the monitor.
|
||||||
|
|
||||||
|
While touching the code in qemuMigrationSrcIsAllowed I also fixed the
|
||||||
|
grammar which was accidentally broken by v8.5.0-140-g2103807e33.
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 62627524607f214e724a48fcac575737f49a271c)
|
||||||
|
Resolves: https://bugzilla.redhat.com/2092833
|
||||||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration.c | 11 ++++++++---
|
||||||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
||||||
|
index 2f77e45abf..735eb02673 100644
|
||||||
|
--- a/src/qemu/qemu_migration.c
|
||||||
|
+++ b/src/qemu/qemu_migration.c
|
||||||
|
@@ -1418,12 +1418,15 @@ qemuMigrationSrcIsAllowedHostdev(const virDomainDef *def)
|
||||||
|
static int
|
||||||
|
qemuDomainGetMigrationBlockers(virQEMUDriver *driver,
|
||||||
|
virDomainObj *vm,
|
||||||
|
+ int asyncJob,
|
||||||
|
char ***blockers)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
- qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
rc = qemuMonitorGetMigrationBlockers(priv->mon, blockers);
|
||||||
|
qemuDomainObjExitMonitor(vm);
|
||||||
|
|
||||||
|
@@ -1458,10 +1461,12 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
|
||||||
|
bool blockedReasonsCap = virQEMUCapsGet(priv->qemuCaps,
|
||||||
|
QEMU_CAPS_MIGRATION_BLOCKED_REASONS);
|
||||||
|
|
||||||
|
- /* Ask qemu if it have a migration blocker */
|
||||||
|
+ /* Ask qemu if it has a migration blocker */
|
||||||
|
if (blockedReasonsCap) {
|
||||||
|
g_auto(GStrv) blockers = NULL;
|
||||||
|
- if (qemuDomainGetMigrationBlockers(driver, vm, &blockers) < 0)
|
||||||
|
+ if (qemuDomainGetMigrationBlockers(driver, vm,
|
||||||
|
+ VIR_ASYNC_JOB_MIGRATION_OUT,
|
||||||
|
+ &blockers) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (blockers && blockers[0]) {
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,62 @@
|
|||||||
|
From 0022c9aef2ecf60e9091e6df57e56065b14b67c5 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <0022c9aef2ecf60e9091e6df57e56065b14b67c5@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 28 Jul 2022 15:35:45 +0200
|
||||||
|
Subject: [PATCH] qemu_migration_params: Avoid deadlock in
|
||||||
|
qemuMigrationParamsReset
|
||||||
|
|
||||||
|
In my recent comnmit v8.5.0-188-gc47f1abb81 I accidentally moved
|
||||||
|
qemuMigrationParamsResetTLS after qemuDomainObjEnterMonitorAsync not
|
||||||
|
noticing qemuMigrationParamsResetTLS will try to enter the monitor
|
||||||
|
again. The second call will time out and return with a domain object
|
||||||
|
locked. But we're still in monitor section and the object should be
|
||||||
|
unlocked which means qemuDomainObjExitMonitor will deadlock trying to
|
||||||
|
lock it again.
|
||||||
|
|
||||||
|
Fixes: c47f1abb81194461377a0c608a7ecd87f9ce9146
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 8cb19a9b9a56ab6ebefc1f913c545e0bb86d4364)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration_params.c | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index 4a824ff5e1..4766d16e64 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -1291,6 +1291,7 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
|
||||||
|
{
|
||||||
|
virErrorPtr err;
|
||||||
|
g_autoptr(virBitmap) clearCaps = NULL;
|
||||||
|
+ int rc;
|
||||||
|
|
||||||
|
virErrorPreserveLast(&err);
|
||||||
|
|
||||||
|
@@ -1305,11 +1306,16 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
|
||||||
|
|
||||||
|
clearCaps = virBitmapNew(0);
|
||||||
|
|
||||||
|
- if (qemuMigrationParamsApplyCaps(vm, clearCaps) == 0 &&
|
||||||
|
- qemuMigrationParamsApplyValues(vm, origParams, false) == 0)
|
||||||
|
- qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
|
||||||
|
+ rc = 0;
|
||||||
|
+ if (qemuMigrationParamsApplyCaps(vm, clearCaps) < 0 ||
|
||||||
|
+ qemuMigrationParamsApplyValues(vm, origParams, false) < 0)
|
||||||
|
+ rc = -1;
|
||||||
|
|
||||||
|
qemuDomainObjExitMonitor(vm);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
+ qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virErrorRestore(&err);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,107 @@
|
|||||||
|
From 852927ea725deae6d4ef8a87383a78d9b0b1cd83 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <852927ea725deae6d4ef8a87383a78d9b0b1cd83@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 15:59:51 +0200
|
||||||
|
Subject: [PATCH] qemu_migration_params: Refactor qemuMigrationParamsApply
|
||||||
|
|
||||||
|
qemuMigrationParamsApply restricts when capabilities can be set, but
|
||||||
|
this is not useful in all cases. Let's create new helpers for setting
|
||||||
|
migration capabilities and parameters which can be reused in more places
|
||||||
|
without the restriction.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit c0824fd03802085db698c10fe62c98cc95a57941)
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration_params.c | 55 +++++++++++++++++++++++---------
|
||||||
|
1 file changed, 40 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index 0bce358ac3..7b9e5453f6 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -864,6 +864,43 @@ qemuMigrationCapsToJSON(virBitmap *caps,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+qemuMigrationParamsApplyCaps(virDomainObj *vm,
|
||||||
|
+ virBitmap *states)
|
||||||
|
+{
|
||||||
|
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
+ g_autoptr(virJSONValue) json = NULL;
|
||||||
|
+
|
||||||
|
+ if (!(json = qemuMigrationCapsToJSON(priv->migrationCaps, states)))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (virJSONValueArraySize(json) > 0 &&
|
||||||
|
+ qemuMonitorSetMigrationCapabilities(priv->mon, &json) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+qemuMigrationParamsApplyValues(virDomainObj *vm,
|
||||||
|
+ qemuMigrationParams *params,
|
||||||
|
+ bool postcopyResume)
|
||||||
|
+{
|
||||||
|
+ qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
+ g_autoptr(virJSONValue) json = NULL;
|
||||||
|
+
|
||||||
|
+ if (!(json = qemuMigrationParamsToJSON(params, postcopyResume)))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (virJSONValueObjectKeysNumber(json) > 0 &&
|
||||||
|
+ qemuMonitorSetMigrationParams(priv->mon, &json) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* qemuMigrationParamsApply
|
||||||
|
* @driver: qemu driver
|
||||||
|
@@ -885,9 +922,6 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
qemuMigrationParams *migParams,
|
||||||
|
unsigned long apiFlags)
|
||||||
|
{
|
||||||
|
- qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
|
- g_autoptr(virJSONValue) params = NULL;
|
||||||
|
- g_autoptr(virJSONValue) caps = NULL;
|
||||||
|
bool postcopyResume = !!(apiFlags & VIR_MIGRATE_POSTCOPY_RESUME);
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
@@ -905,21 +939,12 @@ qemuMigrationParamsApply(virQEMUDriver *driver,
|
||||||
|
"a migration job"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
- } else {
|
||||||
|
- if (!(caps = qemuMigrationCapsToJSON(priv->migrationCaps, migParams->caps)))
|
||||||
|
- goto cleanup;
|
||||||
|
-
|
||||||
|
- if (virJSONValueArraySize(caps) > 0 &&
|
||||||
|
- qemuMonitorSetMigrationCapabilities(priv->mon, &caps) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
+ } else if (qemuMigrationParamsApplyCaps(vm, migParams->caps) < 0) {
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(params = qemuMigrationParamsToJSON(migParams, postcopyResume)))
|
||||||
|
- goto cleanup;
|
||||||
|
-
|
||||||
|
- if (virJSONValueObjectKeysNumber(params) > 0 &&
|
||||||
|
- qemuMonitorSetMigrationParams(priv->mon, ¶ms) < 0)
|
||||||
|
+ if (qemuMigrationParamsApplyValues(vm, migParams, postcopyResume) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,63 @@
|
|||||||
|
From 2a05454cd2d6ba283c128158f44d84d65832ebf7 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <2a05454cd2d6ba283c128158f44d84d65832ebf7@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Thu, 21 Jul 2022 16:49:09 +0200
|
||||||
|
Subject: [PATCH] qemu_migration_params: Refactor qemuMigrationParamsReset
|
||||||
|
|
||||||
|
Because qemuMigrationParamsReset used to call qemuMigrationParamsApply
|
||||||
|
for resetting migration capabilities and parameters, it did not work
|
||||||
|
well since commit v5.1.0-83-ga1dec315c9 which only allowed capabilities
|
||||||
|
to be set from an async job. However, when reconnecting to running
|
||||||
|
domains after daemon restart we do not have an async job. Thus the
|
||||||
|
capabilities were not properly reset in case the daemon was restarted
|
||||||
|
during an ongoing migration. We need to avoid calling
|
||||||
|
qemuMigrationParamsApply to make sure both parameters and capabilities
|
||||||
|
can be reset by a normal job.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2107892
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit c47f1abb81194461377a0c608a7ecd87f9ce9146)
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration_params.c | 14 +++++++++-----
|
||||||
|
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index 7b9e5453f6..4a824ff5e1 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -1290,6 +1290,7 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
|
||||||
|
unsigned long apiFlags)
|
||||||
|
{
|
||||||
|
virErrorPtr err;
|
||||||
|
+ g_autoptr(virBitmap) clearCaps = NULL;
|
||||||
|
|
||||||
|
virErrorPreserveLast(&err);
|
||||||
|
|
||||||
|
@@ -1299,13 +1300,16 @@ qemuMigrationParamsReset(virQEMUDriver *driver,
|
||||||
|
if (!virDomainObjIsActive(vm) || !origParams)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
- /* Do not pass apiFlags to qemuMigrationParamsApply here to make sure all
|
||||||
|
- * parameters and capabilities are reset. */
|
||||||
|
- if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams, 0) < 0)
|
||||||
|
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
- qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
|
||||||
|
- /* We don't reset 'block-bitmap-mapping' as it can't be unset */
|
||||||
|
+ clearCaps = virBitmapNew(0);
|
||||||
|
+
|
||||||
|
+ if (qemuMigrationParamsApplyCaps(vm, clearCaps) == 0 &&
|
||||||
|
+ qemuMigrationParamsApplyValues(vm, origParams, false) == 0)
|
||||||
|
+ qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
|
||||||
|
+
|
||||||
|
+ qemuDomainObjExitMonitor(vm);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virErrorRestore(&err);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,176 @@
|
|||||||
|
From aa4b6b4877d60218c24d4ae713786f5ee37ac6dc Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <aa4b6b4877d60218c24d4ae713786f5ee37ac6dc@dist-git>
|
||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Wed, 29 Jun 2022 15:12:20 +0200
|
||||||
|
Subject: [PATCH] qemu_migration_params: Replace qemuMigrationParamTypes array
|
||||||
|
|
||||||
|
We will need to annotate individual parameters a bit more than just
|
||||||
|
noting their type. Let's introduce qemuMigrationParamInfo replacing
|
||||||
|
simple qemuMigrationParamTypes with an array of structs.
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
(cherry picked from commit 184749691f27f30a39f6f6c77828ffb951af0255)
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=2111070
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_migration_params.c | 77 ++++++++++++++++++++++----------
|
||||||
|
1 file changed, 54 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
|
||||||
|
index 398c07efd0..a68aed9aa4 100644
|
||||||
|
--- a/src/qemu/qemu_migration_params.c
|
||||||
|
+++ b/src/qemu/qemu_migration_params.c
|
||||||
|
@@ -138,6 +138,11 @@ struct _qemuMigrationParamsTPMapItem {
|
||||||
|
int party; /* bit-wise OR of qemuMigrationParty */
|
||||||
|
};
|
||||||
|
|
||||||
|
+typedef struct _qemuMigrationParamInfoItem qemuMigrationParamInfoItem;
|
||||||
|
+struct _qemuMigrationParamInfoItem {
|
||||||
|
+ qemuMigrationParamType type;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
/* Migration capabilities which should always be enabled as long as they
|
||||||
|
* are supported by QEMU. If the capability is supposed to be enabled on both
|
||||||
|
* sides of migration, it won't be enabled unless both sides support it.
|
||||||
|
@@ -224,22 +229,48 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = {
|
||||||
|
.party = QEMU_MIGRATION_SOURCE},
|
||||||
|
};
|
||||||
|
|
||||||
|
-static const qemuMigrationParamType qemuMigrationParamTypes[] = {
|
||||||
|
- [QEMU_MIGRATION_PARAM_COMPRESS_LEVEL] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
- [QEMU_MIGRATION_PARAM_COMPRESS_THREADS] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
- [QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
- [QEMU_MIGRATION_PARAM_THROTTLE_INITIAL] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
- [QEMU_MIGRATION_PARAM_THROTTLE_INCREMENT] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
- [QEMU_MIGRATION_PARAM_TLS_CREDS] = QEMU_MIGRATION_PARAM_TYPE_STRING,
|
||||||
|
- [QEMU_MIGRATION_PARAM_TLS_HOSTNAME] = QEMU_MIGRATION_PARAM_TYPE_STRING,
|
||||||
|
- [QEMU_MIGRATION_PARAM_MAX_BANDWIDTH] = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
- [QEMU_MIGRATION_PARAM_DOWNTIME_LIMIT] = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
- [QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL] = QEMU_MIGRATION_PARAM_TYPE_BOOL,
|
||||||
|
- [QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE] = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
- [QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH] = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
- [QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+static const qemuMigrationParamInfoItem qemuMigrationParamInfo[] = {
|
||||||
|
+ [QEMU_MIGRATION_PARAM_COMPRESS_LEVEL] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_COMPRESS_THREADS] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_THROTTLE_INITIAL] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_THROTTLE_INCREMENT] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_TLS_CREDS] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_STRING,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_TLS_HOSTNAME] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_STRING,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_MAX_BANDWIDTH] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_DOWNTIME_LIMIT] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_BLOCK_INCREMENTAL] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_BOOL,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_ULL,
|
||||||
|
+ },
|
||||||
|
+ [QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = {
|
||||||
|
+ .type = QEMU_MIGRATION_PARAM_TYPE_INT,
|
||||||
|
+ },
|
||||||
|
};
|
||||||
|
-G_STATIC_ASSERT(G_N_ELEMENTS(qemuMigrationParamTypes) == QEMU_MIGRATION_PARAM_LAST);
|
||||||
|
+G_STATIC_ASSERT(G_N_ELEMENTS(qemuMigrationParamInfo) == QEMU_MIGRATION_PARAM_LAST);
|
||||||
|
|
||||||
|
|
||||||
|
virBitmap *
|
||||||
|
@@ -281,7 +312,7 @@ qemuMigrationParamsFree(qemuMigrationParams *migParams)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < QEMU_MIGRATION_PARAM_LAST; i++) {
|
||||||
|
- if (qemuMigrationParamTypes[i] == QEMU_MIGRATION_PARAM_TYPE_STRING)
|
||||||
|
+ if (qemuMigrationParamInfo[i].type == QEMU_MIGRATION_PARAM_TYPE_STRING)
|
||||||
|
g_free(migParams->params[i].value.s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -295,7 +326,7 @@ static int
|
||||||
|
qemuMigrationParamsCheckType(qemuMigrationParam param,
|
||||||
|
qemuMigrationParamType type)
|
||||||
|
{
|
||||||
|
- if (qemuMigrationParamTypes[param] != type) {
|
||||||
|
+ if (qemuMigrationParamInfo[param].type != type) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Type mismatch for '%s' migration parameter"),
|
||||||
|
qemuMigrationParamTypeToString(param));
|
||||||
|
@@ -595,7 +626,7 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
|
||||||
|
VIR_DEBUG("Setting migration parameter '%s' from '%s'",
|
||||||
|
qemuMigrationParamTypeToString(item->param), item->typedParam);
|
||||||
|
|
||||||
|
- switch (qemuMigrationParamTypes[item->param]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[item->param].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
if (qemuMigrationParamsGetTPInt(migParams, item->param, params,
|
||||||
|
nparams, item->typedParam,
|
||||||
|
@@ -671,7 +702,7 @@ qemuMigrationParamsDump(qemuMigrationParams *migParams,
|
||||||
|
if (!(item->party & QEMU_MIGRATION_DESTINATION))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- switch (qemuMigrationParamTypes[item->param]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[item->param].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
if (qemuMigrationParamsSetTPInt(migParams, item->param,
|
||||||
|
params, nparams, maxparams,
|
||||||
|
@@ -721,7 +752,7 @@ qemuMigrationParamsFromJSON(virJSONValue *params)
|
||||||
|
name = qemuMigrationParamTypeToString(i);
|
||||||
|
pv = &migParams->params[i];
|
||||||
|
|
||||||
|
- switch (qemuMigrationParamTypes[i]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[i].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
if (virJSONValueObjectGetNumberInt(params, name, &pv->value.i) == 0)
|
||||||
|
pv->set = true;
|
||||||
|
@@ -764,7 +795,7 @@ qemuMigrationParamsToJSON(qemuMigrationParams *migParams)
|
||||||
|
if (!pv->set)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- switch (qemuMigrationParamTypes[i]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[i].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
rc = virJSONValueObjectAppendNumberInt(params, name, pv->value.i);
|
||||||
|
break;
|
||||||
|
@@ -1280,7 +1311,7 @@ qemuMigrationParamsFormat(virBuffer *buf,
|
||||||
|
virBufferAsprintf(buf, "<param name='%s' ",
|
||||||
|
qemuMigrationParamTypeToString(i));
|
||||||
|
|
||||||
|
- switch (qemuMigrationParamTypes[i]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[i].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
virBufferAsprintf(buf, "value='%d'", pv->value.i);
|
||||||
|
break;
|
||||||
|
@@ -1357,7 +1388,7 @@ qemuMigrationParamsParse(xmlXPathContextPtr ctxt,
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
- switch (qemuMigrationParamTypes[param]) {
|
||||||
|
+ switch (qemuMigrationParamInfo[param].type) {
|
||||||
|
case QEMU_MIGRATION_PARAM_TYPE_INT:
|
||||||
|
rc = virStrToLong_i(value, NULL, 10, &pv->value.i);
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
From 088ba382d7a099ddbebe37e5486ce648e24266db Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <088ba382d7a099ddbebe37e5486ce648e24266db@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Mon, 21 Mar 2022 17:09:40 +0100
|
||||||
|
Subject: [PATCH] qemu_validate: Validate prealloc threads against qemuCpas
|
||||||
|
|
||||||
|
Only fairly new QEMUs are capable of user provided number of
|
||||||
|
preallocation threads. Validate this assumption.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
(cherry picked from commit 75a4e0165ef199809974e97b507d3953e1de01d1)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2067126
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/qemu/qemu_validate.c | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
|
||||||
|
index 3a69733f81..7bc14293d6 100644
|
||||||
|
--- a/src/qemu/qemu_validate.c
|
||||||
|
+++ b/src/qemu/qemu_validate.c
|
||||||
|
@@ -739,6 +739,13 @@ qemuValidateDomainDefMemory(const virDomainDef *def,
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (mem->allocation_threads > 0 &&
|
||||||
|
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEMORY_BACKEND_PREALLOC_THREADS)) {
|
||||||
|
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
+ _("preallocation threads are unsupported with this QEMU"));
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (mem->source == VIR_DOMAIN_MEMORY_SOURCE_ANONYMOUS) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("hugepages are not allowed with anonymous "
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From c6ea67c481a2f447951449bd9b2746cfaaf385fd Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <c6ea67c481a2f447951449bd9b2746cfaaf385fd@dist-git>
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Mon, 25 Jul 2022 14:09:39 +0100
|
||||||
|
Subject: [PATCH] rpc: Pass OPENSSL_CONF through to ssh invocations
|
||||||
|
|
||||||
|
It's no longer possible for libvirt to connect over the ssh transport
|
||||||
|
from RHEL 9 to RHEL 5. This is because SHA1 signatures have been
|
||||||
|
effectively banned in RHEL 9 at the openssl level. They are required
|
||||||
|
to check the RHEL 5 host key. Note this is a separate issue from
|
||||||
|
openssh requiring additional configuration in order to connect to
|
||||||
|
older servers.
|
||||||
|
|
||||||
|
Connecting from a RHEL 9 client to RHEL 5 server:
|
||||||
|
|
||||||
|
$ cat ~/.ssh/config
|
||||||
|
Host 192.168.0.91
|
||||||
|
KexAlgorithms +diffie-hellman-group14-sha1
|
||||||
|
MACs +hmac-sha1
|
||||||
|
HostKeyAlgorithms +ssh-rsa
|
||||||
|
PubkeyAcceptedKeyTypes +ssh-rsa
|
||||||
|
PubkeyAcceptedAlgorithms +ssh-rsa
|
||||||
|
|
||||||
|
$ virsh -c 'qemu+ssh://root@192.168.0.91/system' list
|
||||||
|
error: failed to connect to the hypervisor
|
||||||
|
error: Cannot recv data: ssh_dispatch_run_fatal: Connection to 192.168.0.91 port 22: error in libcrypto: Connection reset by peer
|
||||||
|
|
||||||
|
"error in libcrypto: Connection reset by peer" is the characteristic
|
||||||
|
error of openssl having been modified to disable SHA1 by default.
|
||||||
|
(You will not see this on non-RHEL-derived distros.)
|
||||||
|
|
||||||
|
You could enable the legacy crypto policy which downgrades security on
|
||||||
|
the entire host, but a more fine-grained way to do this is to create
|
||||||
|
an alternate openssl configuration file that enables the "forbidden"
|
||||||
|
signatures. However this requires passing the OPENSSL_CONF
|
||||||
|
environment variable through to ssh to specify the alternate
|
||||||
|
configuration. Libvirt filters out this environment variable, but
|
||||||
|
this commit allows it through. With this commit:
|
||||||
|
|
||||||
|
$ cat /var/tmp/openssl.cnf
|
||||||
|
.include /etc/ssl/openssl.cnf
|
||||||
|
[openssl_init]
|
||||||
|
alg_section = evp_properties
|
||||||
|
[evp_properties]
|
||||||
|
rh-allow-sha1-signatures = yes
|
||||||
|
|
||||||
|
$ OPENSSL_CONF=/var/tmp/openssl.cnf ./run virsh -c 'qemu+ssh://root@192.168.0.91/system' list
|
||||||
|
root@192.168.0.91's password:
|
||||||
|
Id Name State
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Essentially my argument here is that OPENSSL_CONF is sufficiently
|
||||||
|
similar in nature to KRB5CCNAME, SSH* and XAUTHORITY that we should
|
||||||
|
permit it to be passed through.
|
||||||
|
|
||||||
|
virt-v2v bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2062360
|
||||||
|
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
|
||||||
|
Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 45912ac399abd9d4eba21fa3f15cb7587351f959)
|
||||||
|
Libvirt BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2112348
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/rpc/virnetsocket.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
|
||||||
|
index 32f506d2d4..8280bda007 100644
|
||||||
|
--- a/src/rpc/virnetsocket.c
|
||||||
|
+++ b/src/rpc/virnetsocket.c
|
||||||
|
@@ -855,6 +855,7 @@ int virNetSocketNewConnectSSH(const char *nodename,
|
||||||
|
virCommandAddEnvPass(cmd, "KRB5CCNAME");
|
||||||
|
virCommandAddEnvPass(cmd, "SSH_AUTH_SOCK");
|
||||||
|
virCommandAddEnvPass(cmd, "SSH_ASKPASS");
|
||||||
|
+ virCommandAddEnvPass(cmd, "OPENSSL_CONF");
|
||||||
|
virCommandAddEnvPass(cmd, "DISPLAY");
|
||||||
|
virCommandAddEnvPass(cmd, "XAUTHORITY");
|
||||||
|
virCommandClearCaps(cmd);
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
64
libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch
Normal file
64
libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
From e13ab5c97f266eb688bc22e1124291563770370d Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <e13ab5c97f266eb688bc22e1124291563770370d@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Fri, 8 Jul 2022 14:29:32 +0200
|
||||||
|
Subject: [PATCH] vircpi: Add PCIe 5.0 and 6.0 link speeds
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The PCIe 5.0 and PCIe 6.0 standards define new link speeds:
|
||||||
|
32GT/s and 64GT/s, respectively. Update our internal enum to
|
||||||
|
include these new speeds. Otherwise we format incorrect XML:
|
||||||
|
|
||||||
|
<pci-express>
|
||||||
|
<link validity='cap' port='0' speed='(null)' width='16'/>
|
||||||
|
<link validity='sta' speed='16' width='16'/>
|
||||||
|
</pci-express>
|
||||||
|
|
||||||
|
Like all "good" specifications, these are also locked behind a
|
||||||
|
login portal. But we can look at pciutils' source code: [1] and
|
||||||
|
[2].
|
||||||
|
|
||||||
|
1: https://git.kernel.org/pub/scm/utils/pciutils/pciutils.git/commit/ls-caps.c?id=caca31a0eea41c7b051705704c1158fddc02fbd2
|
||||||
|
2: https://git.kernel.org/pub/scm/utils/pciutils/pciutils.git/commit/ls-caps.c?id=5bdf63b6b1bc35b59c4b3f47f7ca83ca1868155b
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2105231
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit d33c2a9e2f933b31f8e96e9938c237bdffe27f84)
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/util/virpci.c | 2 +-
|
||||||
|
src/util/virpci.h | 2 ++
|
||||||
|
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||||
|
index 03d1d7b074..7800966963 100644
|
||||||
|
--- a/src/util/virpci.c
|
||||||
|
+++ b/src/util/virpci.c
|
||||||
|
@@ -45,7 +45,7 @@ VIR_LOG_INIT("util.pci");
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virPCIELinkSpeed,
|
||||||
|
VIR_PCIE_LINK_SPEED_LAST,
|
||||||
|
- "", "2.5", "5", "8", "16",
|
||||||
|
+ "", "2.5", "5", "8", "16", "32", "64"
|
||||||
|
);
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virPCIStubDriver,
|
||||||
|
diff --git a/src/util/virpci.h b/src/util/virpci.h
|
||||||
|
index b9b9cd7b34..4d9193f24e 100644
|
||||||
|
--- a/src/util/virpci.h
|
||||||
|
+++ b/src/util/virpci.h
|
||||||
|
@@ -83,6 +83,8 @@ typedef enum {
|
||||||
|
VIR_PCIE_LINK_SPEED_5,
|
||||||
|
VIR_PCIE_LINK_SPEED_8,
|
||||||
|
VIR_PCIE_LINK_SPEED_16,
|
||||||
|
+ VIR_PCIE_LINK_SPEED_32,
|
||||||
|
+ VIR_PCIE_LINK_SPEED_64,
|
||||||
|
VIR_PCIE_LINK_SPEED_LAST
|
||||||
|
} virPCIELinkSpeed;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
62
libvirt-virsh-Implement-config-for-iothreadset.patch
Normal file
62
libvirt-virsh-Implement-config-for-iothreadset.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
From 02ebd15a48da7a53560bbea5e530a5b9c929daee Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <02ebd15a48da7a53560bbea5e530a5b9c929daee@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Thu, 7 Jul 2022 17:44:32 +0200
|
||||||
|
Subject: [PATCH] virsh: Implement --config for iothreadset
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Our man page already documents that iothreadset has --config
|
||||||
|
argument. Well, it doesn't really. Normally, I'd just fix the man
|
||||||
|
page, but with recent work on the API it's possible to tweak
|
||||||
|
values for inactive XML too. Therefore, implement the --config
|
||||||
|
argument for the command.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
(cherry picked from commit 3ff558c1c171f66da84b10c81937c1a6895ec6fb)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
tools/virsh-domain.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
|
||||||
|
index 43034f2f81..da63cc95ff 100644
|
||||||
|
--- a/tools/virsh-domain.c
|
||||||
|
+++ b/tools/virsh-domain.c
|
||||||
|
@@ -7831,6 +7831,7 @@ static const vshCmdOptDef opts_iothreadset[] = {
|
||||||
|
.type = VSH_OT_INT,
|
||||||
|
.help = N_("upper boundary for worker thread pool")
|
||||||
|
},
|
||||||
|
+ VIRSH_COMMON_OPT_DOMAIN_CONFIG,
|
||||||
|
VIRSH_COMMON_OPT_DOMAIN_LIVE,
|
||||||
|
VIRSH_COMMON_OPT_DOMAIN_CURRENT,
|
||||||
|
{.name = NULL}
|
||||||
|
@@ -7842,6 +7843,8 @@ cmdIOThreadSet(vshControl *ctl, const vshCmd *cmd)
|
||||||
|
g_autoptr(virshDomain) dom = NULL;
|
||||||
|
int id = 0;
|
||||||
|
bool ret = false;
|
||||||
|
+ bool current = vshCommandOptBool(cmd, "current");
|
||||||
|
+ bool config = vshCommandOptBool(cmd, "config");
|
||||||
|
bool live = vshCommandOptBool(cmd, "live");
|
||||||
|
unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
@@ -7852,8 +7855,13 @@ cmdIOThreadSet(vshControl *ctl, const vshCmd *cmd)
|
||||||
|
int thread_val;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
|
||||||
|
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
|
||||||
|
+
|
||||||
|
if (live)
|
||||||
|
flags |= VIR_DOMAIN_AFFECT_LIVE;
|
||||||
|
+ if (config)
|
||||||
|
+ flags |= VIR_DOMAIN_AFFECT_CONFIG;
|
||||||
|
|
||||||
|
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
|
||||||
|
return false;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
215
libvirt-virsh-Require-xpath-for-dumpxml.patch
Normal file
215
libvirt-virsh-Require-xpath-for-dumpxml.patch
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
From 045c3fbdc6f4a5b98013a00fcaefcd3481c1df39 Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <045c3fbdc6f4a5b98013a00fcaefcd3481c1df39@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Fri, 8 Jul 2022 12:45:42 +0200
|
||||||
|
Subject: [PATCH] virsh: Require --xpath for *dumpxml
|
||||||
|
|
||||||
|
Historically, the dumpxml command reject any unknown arguments,
|
||||||
|
for instance:
|
||||||
|
|
||||||
|
virsh dumpxml fedora xxx
|
||||||
|
|
||||||
|
However, after v8.5.0-rc1~31 the second argument ('xxx') is
|
||||||
|
treated as an XPath, but it's not that clearly visible.
|
||||||
|
Therefore, require the --xpath switch, like this:
|
||||||
|
|
||||||
|
virsh dumpxml fedora --xpath xxx
|
||||||
|
|
||||||
|
Yes, this breaks already released virsh, but I think we can argue
|
||||||
|
that the pool of users of this particular function is very small.
|
||||||
|
We also document the argument being mandatory:
|
||||||
|
|
||||||
|
dumpxml [--inactive] [--security-info] [--update-cpu] [--migratable]
|
||||||
|
[--xpath EXPRESSION] [--wrap] domain
|
||||||
|
|
||||||
|
The sooner we do this change, the better.
|
||||||
|
|
||||||
|
The same applies for other *dumpxml functions (net-dumpxml,
|
||||||
|
pool-dumpxml, vol-dumpxl to name a few).
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103524
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit e90d48ae6e22eaf1650f920abc0a6b87d2daa82b)
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
tools/virsh-backup.c | 1 +
|
||||||
|
tools/virsh-checkpoint.c | 1 +
|
||||||
|
tools/virsh-domain.c | 3 +++
|
||||||
|
tools/virsh-interface.c | 1 +
|
||||||
|
tools/virsh-network.c | 2 ++
|
||||||
|
tools/virsh-nodedev.c | 1 +
|
||||||
|
tools/virsh-nwfilter.c | 2 ++
|
||||||
|
tools/virsh-pool.c | 1 +
|
||||||
|
tools/virsh-secret.c | 1 +
|
||||||
|
tools/virsh-snapshot.c | 1 +
|
||||||
|
tools/virsh-volume.c | 1 +
|
||||||
|
11 files changed, 15 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/tools/virsh-backup.c b/tools/virsh-backup.c
|
||||||
|
index db122abc09..1bb2c63113 100644
|
||||||
|
--- a/tools/virsh-backup.c
|
||||||
|
+++ b/tools/virsh-backup.c
|
||||||
|
@@ -117,6 +117,7 @@ static const vshCmdOptDef opts_backup_dumpxml[] = {
|
||||||
|
VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE),
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-checkpoint.c b/tools/virsh-checkpoint.c
|
||||||
|
index a7ef39849d..9605c893af 100644
|
||||||
|
--- a/tools/virsh-checkpoint.c
|
||||||
|
+++ b/tools/virsh-checkpoint.c
|
||||||
|
@@ -854,6 +854,7 @@ static const vshCmdOptDef opts_checkpoint_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
|
||||||
|
index da63cc95ff..76d12d2b70 100644
|
||||||
|
--- a/tools/virsh-domain.c
|
||||||
|
+++ b/tools/virsh-domain.c
|
||||||
|
@@ -4529,6 +4529,7 @@ static const vshCmdOptDef opts_save_image_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
@@ -4961,6 +4962,7 @@ static const vshCmdOptDef opts_managed_save_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
@@ -10469,6 +10471,7 @@ static const vshCmdOptDef opts_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c
|
||||||
|
index b29ffc9bef..39ea53ec9d 100644
|
||||||
|
--- a/tools/virsh-interface.c
|
||||||
|
+++ b/tools/virsh-interface.c
|
||||||
|
@@ -472,6 +472,7 @@ static const vshCmdOptDef opts_interface_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-network.c b/tools/virsh-network.c
|
||||||
|
index 99ced6ccc6..004719dad6 100644
|
||||||
|
--- a/tools/virsh-network.c
|
||||||
|
+++ b/tools/virsh-network.c
|
||||||
|
@@ -351,6 +351,7 @@ static const vshCmdOptDef opts_network_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
@@ -1556,6 +1557,7 @@ static const vshCmdOptDef opts_network_port_dumpxml[] = {
|
||||||
|
VIRSH_COMMON_OPT_NETWORK_PORT(0),
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
|
||||||
|
index 37e361c701..2adcad9c10 100644
|
||||||
|
--- a/tools/virsh-nodedev.c
|
||||||
|
+++ b/tools/virsh-nodedev.c
|
||||||
|
@@ -567,6 +567,7 @@ static const vshCmdOptDef opts_node_device_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-nwfilter.c b/tools/virsh-nwfilter.c
|
||||||
|
index ff7f6f4026..d4112c8620 100644
|
||||||
|
--- a/tools/virsh-nwfilter.c
|
||||||
|
+++ b/tools/virsh-nwfilter.c
|
||||||
|
@@ -188,6 +188,7 @@ static const vshCmdOptDef opts_nwfilter_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
@@ -610,6 +611,7 @@ static const vshCmdOptDef opts_nwfilter_binding_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
|
||||||
|
index 820a61f889..8a98c6ae40 100644
|
||||||
|
--- a/tools/virsh-pool.c
|
||||||
|
+++ b/tools/virsh-pool.c
|
||||||
|
@@ -777,6 +777,7 @@ static const vshCmdOptDef opts_pool_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c
|
||||||
|
index 79fa3faf5a..17d2bbd88d 100644
|
||||||
|
--- a/tools/virsh-secret.c
|
||||||
|
+++ b/tools/virsh-secret.c
|
||||||
|
@@ -140,6 +140,7 @@ static const vshCmdOptDef opts_secret_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c
|
||||||
|
index 83fdfb9616..8fa64ba903 100644
|
||||||
|
--- a/tools/virsh-snapshot.c
|
||||||
|
+++ b/tools/virsh-snapshot.c
|
||||||
|
@@ -1609,6 +1609,7 @@ static const vshCmdOptDef opts_snapshot_dumpxml[] = {
|
||||||
|
},
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
|
||||||
|
index bf72d8135f..300a0aa8e5 100644
|
||||||
|
--- a/tools/virsh-volume.c
|
||||||
|
+++ b/tools/virsh-volume.c
|
||||||
|
@@ -1161,6 +1161,7 @@ static const vshCmdOptDef opts_vol_dumpxml[] = {
|
||||||
|
VIRSH_COMMON_OPT_POOL_OPTIONAL,
|
||||||
|
{.name = "xpath",
|
||||||
|
.type = VSH_OT_STRING,
|
||||||
|
+ .flags = VSH_OFLAG_REQ_OPT,
|
||||||
|
.completer = virshCompleteEmpty,
|
||||||
|
.help = N_("xpath expression to filter the XML document")
|
||||||
|
},
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
@ -0,0 +1,48 @@
|
|||||||
|
From 6d21624edd73edb9b59e5dac0d98d0812e9bf0ad Mon Sep 17 00:00:00 2001
|
||||||
|
Message-Id: <6d21624edd73edb9b59e5dac0d98d0812e9bf0ad@dist-git>
|
||||||
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Date: Tue, 12 Jul 2022 15:46:50 +0200
|
||||||
|
Subject: [PATCH] virtpm: Introduce TPM-1.2 and TPM-2.0 capabilieis
|
||||||
|
|
||||||
|
These new capabilities will be used only to track whether
|
||||||
|
swtpm_setup is capable of TPM-1.2 and/or TPM-2.0.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||||
|
(cherry picked from commit 7b37763278c44887789e80a6058ee27953c0e5e6)
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119
|
||||||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
src/util/virtpm.c | 2 ++
|
||||||
|
src/util/virtpm.h | 2 ++
|
||||||
|
2 files changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/util/virtpm.c b/src/util/virtpm.c
|
||||||
|
index b898f3a6db..3c961c11cb 100644
|
||||||
|
--- a/src/util/virtpm.c
|
||||||
|
+++ b/src/util/virtpm.c
|
||||||
|
@@ -47,6 +47,8 @@ VIR_ENUM_IMPL(virTPMSwtpmSetupFeature,
|
||||||
|
"cmdarg-create-config-files",
|
||||||
|
"tpm12-not-need-root",
|
||||||
|
"cmdarg-reconfigure-pcr-banks",
|
||||||
|
+ "tpm-1.2",
|
||||||
|
+ "tpm-2.0",
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/src/util/virtpm.h b/src/util/virtpm.h
|
||||||
|
index 0a82a03b69..bbf379a54a 100644
|
||||||
|
--- a/src/util/virtpm.h
|
||||||
|
+++ b/src/util/virtpm.h
|
||||||
|
@@ -42,6 +42,8 @@ typedef enum {
|
||||||
|
VIR_TPM_SWTPM_SETUP_FEATURE_CMDARG_CREATE_CONFIG_FILES,
|
||||||
|
VIR_TPM_SWTPM_SETUP_FEATURE_TPM12_NOT_NEED_ROOT,
|
||||||
|
VIR_TPM_SWTPM_SETUP_FEATURE_CMDARG_RECONFIGURE_PCR_BANKS,
|
||||||
|
+ VIR_TPM_SWTPM_SETUP_FEATURE_TPM_1_2,
|
||||||
|
+ VIR_TPM_SWTPM_SETUP_FEATURE_TPM_2_0,
|
||||||
|
|
||||||
|
VIR_TPM_SWTPM_SETUP_FEATURE_LAST
|
||||||
|
} virTPMSwtpmSetupFeature;
|
||||||
|
--
|
||||||
|
2.35.1
|
||||||
|
|
3062
libvirt.spec
Normal file
3062
libvirt.spec
Normal file
File diff suppressed because it is too large
Load Diff
5
rpminspect.yaml
Normal file
5
rpminspect.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
emptyrpm:
|
||||||
|
expected_empty:
|
||||||
|
- libvirt
|
||||||
|
- libvirt-daemon-driver-storage
|
||||||
|
- libvirt-daemon-kvm
|
1
sources
Normal file
1
sources
Normal file
@ -0,0 +1 @@
|
|||||||
|
SHA1 (libvirt-8.0.0.tar.xz) = e440412e9b45d7e24f0ef492d8edf5cf2cbd3f4c
|
Loading…
Reference in New Issue
Block a user