diff --git a/.gitignore b/.gitignore index 5ab37f0..3d4f9af 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/libvirt-8.5.0.tar.xz +SOURCES/libvirt-9.0.0.tar.xz diff --git a/.libvirt.metadata b/.libvirt.metadata index 047ffb5..2126383 100644 --- a/.libvirt.metadata +++ b/.libvirt.metadata @@ -1 +1 @@ -d5fc6173368e7c32cd87d6c8e3c9cfd9d5622860 SOURCES/libvirt-8.5.0.tar.xz +43b6ebfd7dc0ff360e75a89b25012f734c76b653 SOURCES/libvirt-9.0.0.tar.xz diff --git a/SOURCES/libvirt-conf-clarify-some-external-TPM-error-messages.patch b/SOURCES/libvirt-conf-clarify-some-external-TPM-error-messages.patch new file mode 100644 index 0000000..d6a5a99 --- /dev/null +++ b/SOURCES/libvirt-conf-clarify-some-external-TPM-error-messages.patch @@ -0,0 +1,63 @@ +From 0c35c1c0495a953268719ad83cf2f368ab53018b Mon Sep 17 00:00:00 2001 +Message-Id: <0c35c1c0495a953268719ad83cf2f368ab53018b@dist-git> +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Fri, 20 Jan 2023 12:56:48 +0100 +Subject: [PATCH] conf: clarify some external TPM error messages +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Two of the messages referred to 'backend type' when dealing +with the source type and one mentioned the 'client' attribute +from an earlier iteration of the patches, even though the attribute +was later changed to 'connect'. + +https://bugzilla.redhat.com/show_bug.cgi?id=2063723 + +Signed-off-by: Ján Tomko +Reviewed-by: Martin Kletzander +(cherry picked from commit 1c7476c8797b7f0d6e8d607f6a42c5bf43441677) +Signed-off-by: Ján Tomko +--- + src/conf/domain_conf.c | 4 ++-- + src/conf/domain_validate.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 45965fa0fa..733399e6da 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -10545,7 +10545,7 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt, + case VIR_DOMAIN_TPM_TYPE_EXTERNAL: + if (!(type = virXPathString("string(./backend/source/@type)", ctxt))) { + virReportError(VIR_ERR_XML_ERROR, "%s", +- _("missing external TPM backend type")); ++ _("missing external TPM backend source type")); + goto error; + } + +@@ -10555,7 +10555,7 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt, + def->data.external.source->type = virDomainChrTypeFromString(type); + if (def->data.external.source->type < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, +- _("unknown backend type '%s' for external TPM"), ++ _("unknown backend source type '%s' for external TPM"), + type); + goto error; + } +diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c +index 39d924d4ed..1c13929281 100644 +--- a/src/conf/domain_validate.c ++++ b/src/conf/domain_validate.c +@@ -2757,7 +2757,7 @@ virDomainTPMDevValidate(const virDomainTPMDef *tpm) + } + if (tpm->data.external.source->data.nix.listen) { + virReportError(VIR_ERR_XML_ERROR, "%s", +- _("only 'client' mode is supported for external TPM device")); ++ _("only 'connect' mode is supported for external TPM device")); + return -1; + } + if (tpm->data.external.source->data.nix.path == NULL) { +-- +2.39.1 + diff --git a/SOURCES/libvirt-docs-Document-TPM-portion-of-domcaps.patch b/SOURCES/libvirt-docs-Document-TPM-portion-of-domcaps.patch deleted file mode 100644 index e093c28..0000000 --- a/SOURCES/libvirt-docs-Document-TPM-portion-of-domcaps.patch +++ /dev/null @@ -1,62 +0,0 @@ -From b5a226f307b01bb1b58a88c95d29da34c246757f Mon Sep 17 00:00:00 2001 -Message-Id: -From: Michal Privoznik -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 -Reviewed-by: Peter Krempa -(cherry picked from commit 6a00c565c4d0f0ec970e043ea2686bd30396ed79) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119 -Signed-off-by: Michal Privoznik ---- - 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 element. - -+TPM device -+^^^^^^^^^^ -+ -+TPM device capabilities are exposed under the ``tpm`` element. For instance: -+ -+:: -+ -+ -+ ... -+ -+ -+ -+ tpm-tis -+ tpm-crb -+ -+ -+ passthrough -+ emulator -+ -+ -+ ... -+ -+ -+ -+``model`` -+ Options for the ``model`` attribute of the ```` element. -+``backendModel`` -+ Options for the ``type`` attribute of the ```` element. -+ - Features - ~~~~~~~~ - --- -2.35.1 - diff --git a/SOURCES/libvirt-docs-document-correct-cpu-shares-limits-with-both-cgroups-v1-and-v2.patch b/SOURCES/libvirt-docs-document-correct-cpu-shares-limits-with-both-cgroups-v1-and-v2.patch new file mode 100644 index 0000000..1b35f96 --- /dev/null +++ b/SOURCES/libvirt-docs-document-correct-cpu-shares-limits-with-both-cgroups-v1-and-v2.patch @@ -0,0 +1,53 @@ +From 31f2edcd7f42cda4173eabad879bfc318c202c9e Mon Sep 17 00:00:00 2001 +Message-Id: <31f2edcd7f42cda4173eabad879bfc318c202c9e@dist-git> +From: Pavel Hrdina +Date: Tue, 17 Jan 2023 10:33:22 +0100 +Subject: [PATCH] docs: document correct cpu shares limits with both cgroups v1 + and v2 + +The limits are different with cgroups v1 and v2 but our XML +documentation and virsh manpage mentioned only cgroups v1 limits without +explicitly saying it only applies to cgroups v1. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Martin Kletzander +(cherry picked from commit ead6e1b00285cbd98e0f0727efb8adcb29ebc1ba) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2037998 + +Signed-off-by: Pavel Hrdina +--- + docs/formatdomain.rst | 2 +- + docs/manpages/virsh.rst | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst +index 490a954745..8fc8aeb928 100644 +--- a/docs/formatdomain.rst ++++ b/docs/formatdomain.rst +@@ -849,7 +849,7 @@ CPU Tuning + There is no unit for the value, it's a relative measure based on the setting + of other VM, e.g. A VM configured with value 2048 will get twice as much CPU + time as a VM configured with value 1024. The value should be in range +- [2, 262144]. :since:`Since 0.9.0` ++ [2, 262144] using cgroups v1, [1, 10000] using cgroups v2. :since:`Since 0.9.0` + ``period`` + The optional ``period`` element specifies the enforcement interval (unit: + microseconds). Within ``period``, each vCPU of the domain will not be allowed +diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst +index 88b7fa1da8..d5b614dc03 100644 +--- a/docs/manpages/virsh.rst ++++ b/docs/manpages/virsh.rst +@@ -4054,7 +4054,8 @@ If *--config* is specified, affect the next start of a persistent guest. + If *--current* is specified, it is equivalent to either *--live* or + *--config*, depending on the current state of the guest. + +-``Note``: The cpu_shares parameter has a valid value range of 2-262144. ++``Note``: The cpu_shares parameter has a valid value range of 2-262144 ++with cgroups v1, 1-10000 with cgroups v2. + + ``Note``: The weight and cap parameters are defined only for the + XEN_CREDIT scheduler. +-- +2.39.1 + diff --git a/SOURCES/libvirt-domain_conf-Format-defaultiothread-more-often.patch b/SOURCES/libvirt-domain_conf-Format-defaultiothread-more-often.patch deleted file mode 100644 index 46b436d..0000000 --- a/SOURCES/libvirt-domain_conf-Format-defaultiothread-more-often.patch +++ /dev/null @@ -1,96 +0,0 @@ -From a39ce54007de67ce6909c1770a7759b09c41bfd6 Mon Sep 17 00:00:00 2001 -Message-Id: -From: Michal Privoznik -Date: Thu, 7 Jul 2022 16:29:18 +0200 -Subject: [PATCH] domain_conf: Format more often -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The 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 - defined (or only autoallocated ones are present), -then the outer formatting function exits early never calling the - formatter. - -Signed-off-by: Michal Privoznik -Reviewed-by: Ján Tomko -(cherry picked from commit 24fa7004e47ce86b92bc23c1f2ef9c3d6152c3a8) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511 -Signed-off-by: Michal Privoznik ---- - 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, "%zu\n", -+ def->niothreadids); -+ } - -- virBufferAsprintf(buf, "%zu\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 - diff --git a/SOURCES/libvirt-domain_conf-Format-iothread-IDs-more-often.patch b/SOURCES/libvirt-domain_conf-Format-iothread-IDs-more-often.patch deleted file mode 100644 index 3a3d874..0000000 --- a/SOURCES/libvirt-domain_conf-Format-iothread-IDs-more-often.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 711cf329b9847c4d42994389d89a7e7b83c71596 Mon Sep 17 00:00:00 2001 -Message-Id: <711cf329b9847c4d42994389d89a7e7b83c71596@dist-git> -From: Michal Privoznik -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: - - 4 - - - - - - - -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 -Reviewed-by: Ján Tomko -(cherry picked from commit 5aa24958546c94a48fb8f8d6022213ca7c07c8a7) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-domain_validate-drop-cpu.shares-cgroup-check.patch b/SOURCES/libvirt-domain_validate-drop-cpu.shares-cgroup-check.patch new file mode 100644 index 0000000..eaa0742 --- /dev/null +++ b/SOURCES/libvirt-domain_validate-drop-cpu.shares-cgroup-check.patch @@ -0,0 +1,50 @@ +From fbf5f9bce43e19f8827e5cdef0e456b74ccc2f7d Mon Sep 17 00:00:00 2001 +Message-Id: +From: Pavel Hrdina +Date: Tue, 17 Jan 2023 10:08:08 +0100 +Subject: [PATCH] domain_validate: drop cpu.shares cgroup check + +This check is done when VM is defined but doesn't take into account what +cgroups version is currently used on the host system so it doesn't work +correctly. + +To make proper check at this point we would have to figure out cgroups +version while defining a VM but that will still not guarantee that the +VM will start correctly in the future as the host may be rebooted with +different cgroups version. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Martin Kletzander +(cherry picked from commit 38af6497610075e5fe386734b87186731d4c17ac) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2037998 + +Signed-off-by: Pavel Hrdina +--- + src/conf/domain_validate.c | 10 ---------- + 1 file changed, 10 deletions(-) + +diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c +index 5a9bf20d3f..39d924d4ed 100644 +--- a/src/conf/domain_validate.c ++++ b/src/conf/domain_validate.c +@@ -1725,16 +1725,6 @@ virDomainDefOSValidate(const virDomainDef *def, + static int + virDomainDefCputuneValidate(const virDomainDef *def) + { +- if (def->cputune.shares > 0 && +- (def->cputune.shares < VIR_CGROUP_CPU_SHARES_MIN || +- def->cputune.shares > VIR_CGROUP_CPU_SHARES_MAX)) { +- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, +- _("Value of cputune 'shares' must be in range [%llu, %llu]"), +- VIR_CGROUP_CPU_SHARES_MIN, +- VIR_CGROUP_CPU_SHARES_MAX); +- return -1; +- } +- + CPUTUNE_VALIDATE_PERIOD(period); + CPUTUNE_VALIDATE_PERIOD(global_period); + CPUTUNE_VALIDATE_PERIOD(emulator_period); +-- +2.39.1 + diff --git a/SOURCES/libvirt-domcaps-Introduce-TPM-backendVersion.patch b/SOURCES/libvirt-domcaps-Introduce-TPM-backendVersion.patch deleted file mode 100644 index 3631a14..0000000 --- a/SOURCES/libvirt-domcaps-Introduce-TPM-backendVersion.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 266e8c9174249b4d5a53dc8a43a3d7d9481d8b1c Mon Sep 17 00:00:00 2001 -Message-Id: <266e8c9174249b4d5a53dc8a43a3d7d9481d8b1c@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Peter Krempa -(cherry picked from commit 1277a9c884039e92765c977917420511f45e52e8) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119 -Signed-off-by: Michal Privoznik ---- - 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: - passthrough - emulator - -+ -+ 1.2 -+ 2.0 -+ - - ... - -@@ -522,6 +526,8 @@ TPM device capabilities are exposed under the ``tpm`` element. For instance: - Options for the ``model`` attribute of the ```` element. - ``backendModel`` - Options for the ``type`` attribute of the ```` element. -+``backendVersion`` -+ Options for the ``version`` attribute of the ```` 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 - diff --git a/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE.patch b/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE.patch deleted file mode 100644 index 7ecdf33..0000000 --- a/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE.patch +++ /dev/null @@ -1,183 +0,0 @@ -From b020ddee84458afd8de70d9f296b91fa2b6a95fd Mon Sep 17 00:00:00 2001 -Message-Id: -From: Peter Krempa -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 -Reviewed-by: Michal Privoznik -(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 ---- - 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 - diff --git a/SOURCES/libvirt-qemu-Make-IOThread-changing-more-robust.patch b/SOURCES/libvirt-qemu-Make-IOThread-changing-more-robust.patch deleted file mode 100644 index a94f31c..0000000 --- a/SOURCES/libvirt-qemu-Make-IOThread-changing-more-robust.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 5853ac5261b2934ca300b24a7bd78cc4b377c90c Mon Sep 17 00:00:00 2001 -Message-Id: <5853ac5261b2934ca300b24a7bd78cc4b377c90c@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Ján Tomko -(cherry picked from commit 6db9c95a45d4e24cdcd5c009b7fe5da3745b5d59) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-qemu-Pass-migration-flags-to-qemuMigrationParamsApply.patch b/SOURCES/libvirt-qemu-Pass-migration-flags-to-qemuMigrationParamsApply.patch deleted file mode 100644 index a94344e..0000000 --- a/SOURCES/libvirt-qemu-Pass-migration-flags-to-qemuMigrationParamsApply.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 4c906acec14efe3893491d749465ed7e285a825c Mon Sep 17 00:00:00 2001 -Message-Id: <4c906acec14efe3893491d749465ed7e285a825c@dist-git> -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 0eae541257cd4f01c9d90db62056ad8d03c5af23) - -https://bugzilla.redhat.com/show_bug.cgi?id=2111070 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu-Properly-release-job-in-qemuDomainSaveInternal.patch b/SOURCES/libvirt-qemu-Properly-release-job-in-qemuDomainSaveInternal.patch deleted file mode 100644 index dd92c38..0000000 --- a/SOURCES/libvirt-qemu-Properly-release-job-in-qemuDomainSaveInternal.patch +++ /dev/null @@ -1,38 +0,0 @@ -From b35eb8dd4800be4dba22eb0a38da4d4d1c54521f Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Pavel Hrdina -(cherry picked from commit 9c3d398df11024ef6c00a50c98fcc0f1f66c16a1) - -https://bugzilla.redhat.com/show_bug.cgi?id=1497907 - -Signed-off-by: Jiri Denemark ---- - src/qemu/qemu_driver.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c -index 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 - diff --git a/SOURCES/libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch b/SOURCES/libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch new file mode 100644 index 0000000..63843ad --- /dev/null +++ b/SOURCES/libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch @@ -0,0 +1,105 @@ +From ec03aa23ac417797f9b53d51b6f999f5e966f9d7 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Mon, 16 Jan 2023 12:46:09 +0100 +Subject: [PATCH] qemu: Provide virDomainGetCPUStats() implementation for + session connection + +We have virDomainGetCPUStats() API which offers querying +statistics on host CPU usage by given guest. And it works in two +modes: getting overall stats (@start_cpu == -1, @ncpus == 1) or +getting per host CPU usage. + +For the QEMU driver it is implemented by looking into values +stored in corresponding cpuacct CGroup controller. Well, this +works for system instances, where libvirt has permissions to +create CGroups and place QEMU process into them. But it does not +fly for session connection, where no CGroups are set up. + +Fortunately, we can do something similar to v8.8.0-rc1~95 and use +virProcessGetStatInfo() to fill the overall stats. Unfortunately, +I haven't found any source of per host CPU usage, so we just +continue throwing an error in that case. + +Signed-off-by: Michal Privoznik +Reviewed-by: Martin Kletzander +(cherry picked from commit 8865c42771600a40eddf40663f73b458423059a4) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2148266 +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_driver.c | 52 ++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 50 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index c576c601ad..0603af6a35 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -16009,6 +16009,50 @@ qemuDomainGetMetadata(virDomainPtr dom, + return ret; + } + ++#define QEMU_CPU_STATS_PROC_TOTAL 3 ++ ++static int ++qemuDomainGetCPUStatsProc(virDomainObj *vm, ++ virTypedParameterPtr params, ++ unsigned int nparams) ++{ ++ unsigned long long cpuTime = 0; ++ unsigned long long userTime = 0; ++ unsigned long long sysTime = 0; ++ ++ if (nparams == 0) { ++ /* return supported number of params */ ++ return QEMU_CPU_STATS_PROC_TOTAL; ++ } ++ ++ if (virProcessGetStatInfo(&cpuTime, &userTime, &sysTime, ++ NULL, NULL, vm->pid, 0) < 0) { ++ virReportError(VIR_ERR_OPERATION_FAILED, "%s", ++ _("cannot read cputime for domain")); ++ return -1; ++ } ++ ++ if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_CPU_STATS_CPUTIME, ++ VIR_TYPED_PARAM_ULLONG, cpuTime) < 0) ++ return -1; ++ ++ if (nparams > 1 && ++ virTypedParameterAssign(¶ms[1], VIR_DOMAIN_CPU_STATS_USERTIME, ++ VIR_TYPED_PARAM_ULLONG, userTime) < 0) ++ return -1; ++ ++ if (nparams > 2 && ++ virTypedParameterAssign(¶ms[2], VIR_DOMAIN_CPU_STATS_SYSTEMTIME, ++ VIR_TYPED_PARAM_ULLONG, sysTime) < 0) ++ return -1; ++ ++ if (nparams > 3) ++ nparams = 3; ++ ++ return nparams; ++} ++ ++#undef QEMU_CPU_STATS_PROC_TOTAL + + static int + qemuDomainGetCPUStats(virDomainPtr domain, +@@ -16037,8 +16081,12 @@ qemuDomainGetCPUStats(virDomainPtr domain, + goto cleanup; + + if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUACCT)) { +- virReportError(VIR_ERR_OPERATION_INVALID, +- "%s", _("cgroup CPUACCT controller is not mounted")); ++ if (start_cpu == -1) { ++ ret = qemuDomainGetCPUStatsProc(vm, params, nparams); ++ } else { ++ virReportError(VIR_ERR_OPERATION_INVALID, "%s", ++ _("cgroup CPUACCT controller is not mounted")); ++ } + goto cleanup; + } + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-Remove-memAliasOrderMismatch-field-from-VM-private-data.patch b/SOURCES/libvirt-qemu-Remove-memAliasOrderMismatch-field-from-VM-private-data.patch new file mode 100644 index 0000000..63667a3 --- /dev/null +++ b/SOURCES/libvirt-qemu-Remove-memAliasOrderMismatch-field-from-VM-private-data.patch @@ -0,0 +1,77 @@ +From e0e6c7375855e09c45591d0b5ab23cddaa230ad8 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Thu, 19 Jan 2023 15:18:45 +0100 +Subject: [PATCH] qemu: Remove 'memAliasOrderMismatch' field from VM private + data + +The field is no longer used so we can remove it and the code filling it. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 5764930463eb8f450e45fa982651ef6b7a7afd7c) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2158701 +--- + src/qemu/qemu_domain.h | 3 --- + src/qemu/qemu_process.c | 24 ------------------------ + 2 files changed, 27 deletions(-) + +diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h +index 08430b67b9..eca5404cdc 100644 +--- a/src/qemu/qemu_domain.h ++++ b/src/qemu/qemu_domain.h +@@ -177,9 +177,6 @@ struct _qemuDomainObjPrivate { + uint8_t *masterKey; + size_t masterKeyLen; + +- /* note whether memory device alias does not correspond to slot number */ +- bool memAliasOrderMismatch; +- + /* for migrations using TLS with a secret (not to be saved in our */ + /* private XML). */ + qemuDomainSecretInfo *migSecinfo; +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index ee9f0784d3..29716ecb19 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -3896,28 +3896,6 @@ qemuDomainPerfRestart(virDomainObj *vm) + } + + +-static void +-qemuProcessReconnectCheckMemAliasOrderMismatch(virDomainObj *vm) +-{ +- size_t i; +- int aliasidx; +- virDomainDef *def = vm->def; +- qemuDomainObjPrivate *priv = vm->privateData; +- +- if (!virDomainDefHasMemoryHotplug(def) || def->nmems == 0) +- return; +- +- for (i = 0; i < def->nmems; i++) { +- aliasidx = qemuDomainDeviceAliasIndex(&def->mems[i]->info, "dimm"); +- +- if (def->mems[i]->info.addr.dimm.slot != aliasidx) { +- priv->memAliasOrderMismatch = true; +- break; +- } +- } +-} +- +- + static bool + qemuProcessDomainMemoryDefNeedHugepagesPath(const virDomainMemoryDef *mem, + const long system_pagesize) +@@ -9091,8 +9069,6 @@ qemuProcessReconnect(void *opaque) + if (qemuProcessRefreshFdsetIndex(obj) < 0) + goto error; + +- qemuProcessReconnectCheckMemAliasOrderMismatch(obj); +- + if (qemuConnectAgent(driver, obj) < 0) + goto error; + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch b/SOURCES/libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch deleted file mode 100644 index cb84c51..0000000 --- a/SOURCES/libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch +++ /dev/null @@ -1,49 +0,0 @@ -From b3d2dae261768c00b5d92203351ff6dd7cde468e Mon Sep 17 00:00:00 2001 -Message-Id: -From: Michal Privoznik -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 -Reviewed-by: Peter Krempa -(cherry picked from commit 430ab88ab17727ac9774ee5b47f09f69c57add73) -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-qemu-Restore-original-memory-locking-limit-on-reconnect.patch b/SOURCES/libvirt-qemu-Restore-original-memory-locking-limit-on-reconnect.patch deleted file mode 100644 index 6b22dd7..0000000 --- a/SOURCES/libvirt-qemu-Restore-original-memory-locking-limit-on-reconnect.patch +++ /dev/null @@ -1,85 +0,0 @@ -From a1d825e5dcb8cbe0854fa852d25e5997a52d57cd Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit bb9badb9168ad0d40bca86b6463ef504624f096d) - -Conflicts: - src/qemu/qemu_migration.c - - commit v8.5.0-2-gf9dcc01a0f not backported - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu-alias-Remove-oldAlias-argument-of-qemuAssignDeviceMemoryAlias.patch b/SOURCES/libvirt-qemu-alias-Remove-oldAlias-argument-of-qemuAssignDeviceMemoryAlias.patch new file mode 100644 index 0000000..2bd9312 --- /dev/null +++ b/SOURCES/libvirt-qemu-alias-Remove-oldAlias-argument-of-qemuAssignDeviceMemoryAlias.patch @@ -0,0 +1,108 @@ +From 9271efe525e9cfaf1aad931ffccf61d6d17e5273 Mon Sep 17 00:00:00 2001 +Message-Id: <9271efe525e9cfaf1aad931ffccf61d6d17e5273@dist-git> +From: Peter Krempa +Date: Thu, 19 Jan 2023 15:16:58 +0100 +Subject: [PATCH] qemu: alias: Remove 'oldAlias' argument of + qemuAssignDeviceMemoryAlias + +All callers pass 'false' so we no longer need it. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 6d3f0b11b2b056313b123510c96f2924689341f9) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2158701 +--- + src/qemu/qemu_alias.c | 13 ++++--------- + src/qemu/qemu_alias.h | 3 +-- + src/qemu/qemu_hotplug.c | 2 +- + 3 files changed, 6 insertions(+), 12 deletions(-) + +diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c +index ef8e87ab58..0f1310a0e5 100644 +--- a/src/qemu/qemu_alias.c ++++ b/src/qemu/qemu_alias.c +@@ -454,7 +454,6 @@ qemuAssignDeviceRNGAlias(virDomainDef *def, + static int + qemuDeviceMemoryGetAliasID(virDomainDef *def, + virDomainMemoryDef *mem, +- bool oldAlias, + const char *prefix) + { + size_t i; +@@ -462,8 +461,7 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def, + + /* virtio-pmem and virtio-mem go onto PCI bus and thus DIMM address is not + * valid */ +- if (!oldAlias && +- mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM && ++ if (mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM && + mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM && + mem->model != VIR_DOMAIN_MEMORY_MODEL_SGX_EPC) + return mem->info.addr.dimm.slot; +@@ -482,8 +480,6 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def, + * qemuAssignDeviceMemoryAlias: + * @def: domain definition. Necessary only if @oldAlias is true. + * @mem: memory device definition +- * @oldAlias: Generate the alias according to the order of the device in @def +- * rather than according to the slot number for legacy reasons. + * + * Generates alias for a memory device according to slot number if @oldAlias is + * false or according to order in @def->mems otherwise. +@@ -492,8 +488,7 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def, + */ + int + qemuAssignDeviceMemoryAlias(virDomainDef *def, +- virDomainMemoryDef *mem, +- bool oldAlias) ++ virDomainMemoryDef *mem) + { + const char *prefix = NULL; + int idx = 0; +@@ -525,7 +520,7 @@ qemuAssignDeviceMemoryAlias(virDomainDef *def, + break; + } + +- idx = qemuDeviceMemoryGetAliasID(def, mem, oldAlias, prefix); ++ idx = qemuDeviceMemoryGetAliasID(def, mem, prefix); + mem->info.alias = g_strdup_printf("%s%d", prefix, idx); + + return 0; +@@ -685,7 +680,7 @@ qemuAssignDeviceAliases(virDomainDef *def) + qemuAssignDeviceTPMAlias(def->tpms[i], i); + } + for (i = 0; i < def->nmems; i++) { +- if (qemuAssignDeviceMemoryAlias(def, def->mems[i], false) < 0) ++ if (qemuAssignDeviceMemoryAlias(def, def->mems[i]) < 0) + return -1; + } + if (def->vsock) { +diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h +index 6433ae4cec..af9c3f62d3 100644 +--- a/src/qemu/qemu_alias.h ++++ b/src/qemu/qemu_alias.h +@@ -55,8 +55,7 @@ void qemuAssignDeviceRNGAlias(virDomainDef *def, + virDomainRNGDef *rng); + + int qemuAssignDeviceMemoryAlias(virDomainDef *def, +- virDomainMemoryDef *mems, +- bool oldAlias); ++ virDomainMemoryDef *mems); + + void qemuAssignDeviceShmemAlias(virDomainDef *def, + virDomainShmemDef *shmem, +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 5840504d13..2df59873db 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -2275,7 +2275,7 @@ qemuDomainAttachMemory(virQEMUDriver *driver, + goto cleanup; + releaseaddr = true; + +- if (qemuAssignDeviceMemoryAlias(vm->def, mem, false) < 0) ++ if (qemuAssignDeviceMemoryAlias(vm->def, mem) < 0) + goto cleanup; + + objalias = g_strdup_printf("mem%s", mem->info.alias); +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch b/SOURCES/libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch new file mode 100644 index 0000000..8b8d08c --- /dev/null +++ b/SOURCES/libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch @@ -0,0 +1,53 @@ +From bf15c630b7c54637220af65ac84cfd007c1c798a Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 31 Jan 2023 15:35:05 +0100 +Subject: [PATCH] qemu: block: Properly handle FD-passed disk hot-(un-)plug + +The hotplug code paths need to be able to pass the FDs to the monitor to +ensure that hotplug works. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 3b8d669d557bd2ce8874f61e83b6d6074d365ec2) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_block.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index e865aa17f9..c218262691 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -1410,6 +1410,9 @@ qemuBlockStorageSourceAttachApplyStorageDeps(qemuMonitor *mon, + qemuMonitorAddObject(mon, &data->tlsProps, &data->tlsAlias) < 0) + return -1; + ++ if (qemuFDPassTransferMonitor(data->fdpass, mon) < 0) ++ return -1; ++ + return 0; + } + +@@ -1559,6 +1562,8 @@ qemuBlockStorageSourceAttachRollback(qemuMonitor *mon, + if (data->tlsKeySecretAlias) + ignore_value(qemuMonitorDelObject(mon, data->tlsKeySecretAlias, false)); + ++ qemuFDPassTransferMonitorRollback(data->fdpass, mon); ++ + virErrorRestore(&orig_err); + } + +@@ -1609,6 +1614,8 @@ qemuBlockStorageSourceDetachPrepare(virStorageSource *src) + + if (srcpriv->tlsKeySecret) + data->tlsKeySecretAlias = g_strdup(srcpriv->tlsKeySecret->alias); ++ ++ data->fdpass = srcpriv->fdpass; + } + + return g_steal_pointer(&data); +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-blockjob-Handle-pending-blockjob-state-only-when-we-need-it.patch b/SOURCES/libvirt-qemu-blockjob-Handle-pending-blockjob-state-only-when-we-need-it.patch new file mode 100644 index 0000000..42f7ce0 --- /dev/null +++ b/SOURCES/libvirt-qemu-blockjob-Handle-pending-blockjob-state-only-when-we-need-it.patch @@ -0,0 +1,117 @@ +From 11dd7c99fa96364962f81d4efae0ed220c7a7190 Mon Sep 17 00:00:00 2001 +Message-Id: <11dd7c99fa96364962f81d4efae0ed220c7a7190@dist-git> +From: Peter Krempa +Date: Fri, 10 Feb 2023 17:16:43 +0100 +Subject: [PATCH] qemu: blockjob: Handle 'pending' blockjob state only when we + need it + +The 'pending' state needs to be handled by the blockjob code only when +the snapshot code requests a block-commit without auto-finalization. + +If we always handle it we fail to properly remove the blockjob data for +the 'blockdev-create' job as that also transitions trhough 'pending' but +we'd never update it once it reaches 'concluded' as the code already +thinks that the job has finished and is no longer watching it. + +Introduce a 'processPending' property into block job data and set it +only when we know that we need to process 'pending'. + +Fixes: 90d9bc9d74a5157167548b26c00b1a016655e295 +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2168769 +Signed-off-by: Peter Krempa +Reviewed-by: Pavel Hrdina +(cherry picked from commit c433c2434c0459df98ed3355ef615e341acd9009) +--- + src/qemu/qemu_block.c | 1 + + src/qemu/qemu_blockjob.c | 19 ++++++++++--------- + src/qemu/qemu_blockjob.h | 4 ++++ + 3 files changed, 15 insertions(+), 9 deletions(-) + +diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c +index c218262691..d8ca50d618 100644 +--- a/src/qemu/qemu_block.c ++++ b/src/qemu/qemu_block.c +@@ -3374,6 +3374,7 @@ qemuBlockCommit(virDomainObj *vm, + if (!(job = qemuBlockJobDiskNewCommit(vm, disk, top_parent, topSource, + baseSource, + flags & VIR_DOMAIN_BLOCK_COMMIT_DELETE, ++ autofinalize, + flags))) + goto cleanup; + +diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c +index cb2d05d71d..a20cf1db62 100644 +--- a/src/qemu/qemu_blockjob.c ++++ b/src/qemu/qemu_blockjob.c +@@ -274,6 +274,7 @@ qemuBlockJobDiskNewCommit(virDomainObj *vm, + virStorageSource *top, + virStorageSource *base, + bool delete_imgs, ++ virTristateBool autofinalize, + unsigned int jobflags) + { + g_autoptr(qemuBlockJobData) job = NULL; +@@ -290,6 +291,7 @@ qemuBlockJobDiskNewCommit(virDomainObj *vm, + job->data.commit.top = top; + job->data.commit.base = base; + job->data.commit.deleteCommittedImages = delete_imgs; ++ job->processPending = autofinalize == VIR_TRISTATE_BOOL_NO; + job->jobflags = jobflags; + + if (qemuBlockJobRegister(job, vm, disk, true) < 0) +@@ -532,8 +534,6 @@ qemuBlockJobRefreshJobs(virDomainObj *vm) + if (job->state == QEMU_BLOCKJOB_STATE_NEW || + job->state == QEMU_BLOCKJOB_STATE_RUNNING) + job->newstate = newstate; +- } else if (newstate == QEMU_BLOCKJOB_STATE_PENDING) { +- job->newstate = newstate; + } + /* don't update the job otherwise */ + } +@@ -1568,13 +1568,14 @@ qemuBlockJobEventProcess(virQEMUDriver *driver, + + case QEMU_BLOCKJOB_STATE_PENDING: + /* Similarly as for 'ready' state we should handle it only when +- * previous state was 'new' or 'running' as there are other cases +- * when it can be emitted by QEMU. Currently we need this only when +- * deleting non-active external snapshots. */ +- if (job->state == QEMU_BLOCKJOB_STATE_NEW || +- job->state == QEMU_BLOCKJOB_STATE_RUNNING) { +- job->state = job->newstate; +- qemuDomainSaveStatus(vm); ++ * previous state was 'new' or 'running' and only if the blockjob code ++ * is handling finalization of the job explicitly. */ ++ if (job->processPending) { ++ if (job->state == QEMU_BLOCKJOB_STATE_NEW || ++ job->state == QEMU_BLOCKJOB_STATE_RUNNING) { ++ job->state = job->newstate; ++ qemuDomainSaveStatus(vm); ++ } + } + job->newstate = -1; + break; +diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h +index e9b283da20..f1ac43b4c7 100644 +--- a/src/qemu/qemu_blockjob.h ++++ b/src/qemu/qemu_blockjob.h +@@ -138,6 +138,9 @@ struct _qemuBlockJobData { + + int brokentype; /* the previous type of a broken blockjob qemuBlockJobType */ + ++ bool processPending; /* process the 'pending' state of the job, if the job ++ should not be auto-finalized */ ++ + bool invalidData; /* the job data (except name) is not valid */ + bool reconnected; /* internal field for tracking whether job is live after reconnect to qemu */ + }; +@@ -175,6 +178,7 @@ qemuBlockJobDiskNewCommit(virDomainObj *vm, + virStorageSource *top, + virStorageSource *base, + bool delete_imgs, ++ virTristateBool autofinalize, + unsigned int jobflags); + + qemuBlockJobData * +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch b/SOURCES/libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch new file mode 100644 index 0000000..d7ad2dd --- /dev/null +++ b/SOURCES/libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch @@ -0,0 +1,117 @@ +From 659a0e3cda2f5561abe45ccc10afc41014d1a331 Mon Sep 17 00:00:00 2001 +Message-Id: <659a0e3cda2f5561abe45ccc10afc41014d1a331@dist-git> +From: Peter Krempa +Date: Tue, 31 Jan 2023 14:37:40 +0100 +Subject: [PATCH] qemu: command: Handle FD passing commandline via + qemuBuildBlockStorageSourceAttachDataCommandline + +Copy the pointer to qemuFDPass into struct qemuBlockStorageSourceAttachData +so that it can be used from qemuBuildBlockStorageSourceAttachDataCommandline +rather than looping again in qemuBuildDiskSourceCommandLineFDs. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 65f14232fb031b57fad085a2e8792da87c97173f) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_block.h | 2 ++ + src/qemu/qemu_command.c | 26 +++---------------- + .../disk-source-fd.x86_64-latest.args | 6 ++--- + 3 files changed, 9 insertions(+), 25 deletions(-) + +diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h +index eac986e0f0..5a61a19da2 100644 +--- a/src/qemu/qemu_block.h ++++ b/src/qemu/qemu_block.h +@@ -99,6 +99,8 @@ struct qemuBlockStorageSourceAttachData { + char *tlsAlias; + virJSONValue *tlsKeySecretProps; + char *tlsKeySecretAlias; ++ ++ qemuFDPass *fdpass; + }; + + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index b96f2d33c1..5edad046d5 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -2119,6 +2119,8 @@ qemuBuildBlockStorageSourceAttachDataCommandline(virCommand *cmd, + return -1; + } + ++ qemuFDPassTransferCommand(data->fdpass, cmd); ++ + if (data->storageProps) { + if (!(tmp = virJSONValueToString(data->storageProps, false))) + return -1; +@@ -2147,25 +2149,6 @@ qemuBuildBlockStorageSourceAttachDataCommandline(virCommand *cmd, + } + + +-static int +-qemuBuildDiskSourceCommandLineFDs(virCommand *cmd, +- virDomainDiskDef *disk) +-{ +- virStorageSource *n; +- +- for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) { +- qemuDomainStorageSourcePrivate *srcpriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(n); +- +- if (!srcpriv || !srcpriv->fdpass) +- continue; +- +- qemuFDPassTransferCommand(srcpriv->fdpass, cmd); +- } +- +- return 0; +-} +- +- + static int + qemuBuildDiskSourceCommandLine(virCommand *cmd, + virDomainDiskDef *disk, +@@ -2183,9 +2166,6 @@ qemuBuildDiskSourceCommandLine(virCommand *cmd, + if (virStorageSourceIsEmpty(disk->src)) + return 0; + +- if (qemuBuildDiskSourceCommandLineFDs(cmd, disk) < 0) +- return -1; +- + if (!(data = qemuBuildStorageSourceChainAttachPrepareBlockdev(disk->src))) + return -1; + +@@ -10537,6 +10517,8 @@ qemuBuildStorageSourceAttachPrepareCommon(virStorageSource *src, + + tlsKeySecretAlias = srcpriv->tlsKeySecret->alias; + } ++ ++ data->fdpass = srcpriv->fdpass; + } + + if (src->haveTLS == VIR_TRISTATE_BOOL_YES && +diff --git a/tests/qemuxml2argvdata/disk-source-fd.x86_64-latest.args b/tests/qemuxml2argvdata/disk-source-fd.x86_64-latest.args +index b4a81acfc7..a7ddd65000 100644 +--- a/tests/qemuxml2argvdata/disk-source-fd.x86_64-latest.args ++++ b/tests/qemuxml2argvdata/disk-source-fd.x86_64-latest.args +@@ -33,13 +33,13 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ + -blockdev '{"driver":"file","filename":"/dev/fdset/2","node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \ + -blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"qcow2","file":"libvirt-4-storage"}' \ + -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-4-format","id":"virtio-disk4","bootindex":1}' \ +--add-fd set=0,fd=704,opaque=libvirt-1-storage0 \ +--add-fd set=1,fd=777,opaque=libvirt-2-storage0 \ +--add-fd set=1,fd=778,opaque=libvirt-2-storage1 \ + -blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071876","node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap"}' \ + -blockdev '{"node-name":"libvirt-3-format","read-only":true,"driver":"qcow2","file":"libvirt-3-storage","backing":null}' \ ++-add-fd set=1,fd=777,opaque=libvirt-2-storage0 \ ++-add-fd set=1,fd=778,opaque=libvirt-2-storage1 \ + -blockdev '{"driver":"file","filename":"/dev/fdset/1","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \ + -blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","file":"libvirt-2-storage","backing":"libvirt-3-format"}' \ ++-add-fd set=0,fd=704,opaque=libvirt-1-storage0 \ + -blockdev '{"driver":"file","filename":"/dev/fdset/0","node-name":"libvirt-1-storage","read-only":false,"discard":"unmap"}' \ + -blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2","file":"libvirt-1-storage","backing":"libvirt-2-format"}' \ + -device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x3","drive":"libvirt-1-format","id":"virtio-disk5"}' \ +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch b/SOURCES/libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch new file mode 100644 index 0000000..90408e9 --- /dev/null +++ b/SOURCES/libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch @@ -0,0 +1,103 @@ +From 0fe11b92a8278ffab202033a61340649b0296368 Mon Sep 17 00:00:00 2001 +Message-Id: <0fe11b92a8278ffab202033a61340649b0296368@dist-git> +From: Peter Krempa +Date: Tue, 31 Jan 2023 15:30:51 +0100 +Subject: [PATCH] qemu: domain: Store fdset ID for disks passed to qemu via FD + +To ensure that we can hot-unplug the disk including the associated fdset +we need to store the fdset ID in the status XML. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit f730b1e4f203cbabe363aab246d8a1679063f756) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_domain.c | 17 ++++++++++++++++- + tests/qemustatusxml2xmldata/modern-in.xml | 3 +++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 226d4d6dc1..247134672b 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -1941,6 +1941,8 @@ qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt, + g_autofree char *httpcookiealias = NULL; + g_autofree char *tlskeyalias = NULL; + g_autofree char *thresholdEventWithIndex = NULL; ++ bool fdsetPresent = false; ++ unsigned int fdSetID; + + src->nodestorage = virXPathString("string(./nodenames/nodename[@type='storage']/@name)", ctxt); + src->nodeformat = virXPathString("string(./nodenames/nodename[@type='format']/@name)", ctxt); +@@ -1957,7 +1959,9 @@ qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt, + httpcookiealias = virXPathString("string(./objects/secret[@type='httpcookie']/@alias)", ctxt); + tlskeyalias = virXPathString("string(./objects/secret[@type='tlskey']/@alias)", ctxt); + +- if (authalias || encalias || httpcookiealias || tlskeyalias) { ++ fdsetPresent = virXPathUInt("string(./fdsets/fdset[@type='storage']/@id)", ctxt, &fdSetID) == 0; ++ ++ if (authalias || encalias || httpcookiealias || tlskeyalias || fdsetPresent) { + if (!src->privateData && + !(src->privateData = qemuDomainStorageSourcePrivateNew())) + return -1; +@@ -1975,6 +1979,9 @@ qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt, + + if (qemuStorageSourcePrivateDataAssignSecinfo(&priv->tlsKeySecret, &tlskeyalias) < 0) + return -1; ++ ++ if (fdsetPresent) ++ priv->fdpass = qemuFDPassNewPassed(fdSetID); + } + + if (virStorageSourcePrivateDataParseRelPath(ctxt, src) < 0) +@@ -2008,6 +2015,7 @@ qemuStorageSourcePrivateDataFormat(virStorageSource *src, + qemuDomainStorageSourcePrivate *srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src); + g_auto(virBuffer) nodenamesChildBuf = VIR_BUFFER_INIT_CHILD(buf); + g_auto(virBuffer) objectsChildBuf = VIR_BUFFER_INIT_CHILD(buf); ++ g_auto(virBuffer) fdsetsChildBuf = VIR_BUFFER_INIT_CHILD(buf); + + virBufferEscapeString(&nodenamesChildBuf, "\n", src->nodestorage); + virBufferEscapeString(&nodenamesChildBuf, "\n", src->nodeformat); +@@ -2025,10 +2033,15 @@ qemuStorageSourcePrivateDataFormat(virStorageSource *src, + return -1; + + if (srcPriv) { ++ unsigned int fdSetID; ++ + qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->secinfo, "auth"); + qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->encinfo, "encryption"); + qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->httpcookie, "httpcookie"); + qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->tlsKeySecret, "tlskey"); ++ ++ if (qemuFDPassIsPassed(srcPriv->fdpass, &fdSetID)) ++ virBufferAsprintf(&fdsetsChildBuf, "\n", fdSetID); + } + + if (src->tlsAlias) +@@ -2036,6 +2049,8 @@ qemuStorageSourcePrivateDataFormat(virStorageSource *src, + + virXMLFormatElement(buf, "objects", NULL, &objectsChildBuf); + ++ virXMLFormatElement(buf, "fdsets", NULL, &fdsetsChildBuf); ++ + if (src->thresholdEventWithIndex) + virBufferAddLit(buf, "\n"); + +diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml +index 7759034f7a..f5beab722b 100644 +--- a/tests/qemustatusxml2xmldata/modern-in.xml ++++ b/tests/qemustatusxml2xmldata/modern-in.xml +@@ -341,6 +341,9 @@ + + + ++ ++ ++ + + + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-don-t-call-qemuMigrationSrcIsAllowedHostdev-from-qemuMigrationDstPrepareFresh.patch b/SOURCES/libvirt-qemu-don-t-call-qemuMigrationSrcIsAllowedHostdev-from-qemuMigrationDstPrepareFresh.patch deleted file mode 100644 index 537f227..0000000 --- a/SOURCES/libvirt-qemu-don-t-call-qemuMigrationSrcIsAllowedHostdev-from-qemuMigrationDstPrepareFresh.patch +++ /dev/null @@ -1,61 +0,0 @@ -From d51e6092ed7977daf662ed1def0f6cd5cc6ba33d Mon Sep 17 00:00:00 2001 -Message-Id: -From: Laine Stump -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 -Reviewed-by: Jiri Denemark -(cherry picked from commit 640d185f01858b7a8db401235c929ac4798592d0) - -https://bugzilla.redhat.com/show_bug.cgi?id=1497907 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu-don-t-try-to-query-QEMU-about-migration-blockers-during-offline-migration.patch b/SOURCES/libvirt-qemu-don-t-try-to-query-QEMU-about-migration-blockers-during-offline-migration.patch deleted file mode 100644 index 29ff19b..0000000 --- a/SOURCES/libvirt-qemu-don-t-try-to-query-QEMU-about-migration-blockers-during-offline-migration.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 80ac99d0f947f5e2fe4ff7fe9fb63b6dc6cbc1bb Mon Sep 17 00:00:00 2001 -Message-Id: <80ac99d0f947f5e2fe4ff7fe9fb63b6dc6cbc1bb@dist-git> -From: Laine Stump -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 -Reviewed-by: Jiri Denemark -(cherry picked from commit 2dd5587f1dc8e2cf4e6e0a4e4cf576b8183b33cd) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch b/SOURCES/libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch new file mode 100644 index 0000000..a2418ca --- /dev/null +++ b/SOURCES/libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch @@ -0,0 +1,97 @@ +From f7d193539a8a7194ee3506642b68e0e52619cdf9 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 31 Jan 2023 15:25:57 +0100 +Subject: [PATCH] qemu: fd: Add helpers allowing storing FD set data in status + XML + +Rollback of FD sets passed to qemu is also needed after possible restart +of libvirtd when we need to serialize the data into status XML. For this +purpose we need to access the fdset ID once it was passed to qemu and +potentially re-create a 'qemuFDPass' struct in passed state. + +Introduce 'qemuFDPassNewPassed' and 'qemuFDPassIsPassed'. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 5598c10c6464887a99928de48fb2fc3e4f1696dc) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_fd.c | 41 +++++++++++++++++++++++++++++++++++++++++ + src/qemu/qemu_fd.h | 7 +++++++ + 2 files changed, 48 insertions(+) + +diff --git a/src/qemu/qemu_fd.c b/src/qemu/qemu_fd.c +index ebeeb65505..f5eedb88ec 100644 +--- a/src/qemu/qemu_fd.c ++++ b/src/qemu/qemu_fd.c +@@ -96,6 +96,47 @@ qemuFDPassNew(const char *prefix, + } + + ++/** ++ * qemuFDPassNewPassed: ++ * @fdSetID: ID of an FDset which was allready passed to qemu ++ * ++ * Create qemuFDPass pointing to an already passed FD. Useful to usw with ++ * qemuFDPassTransferMonitorRollback, when restoring after restart. ++ */ ++qemuFDPass * ++qemuFDPassNewPassed(unsigned int fdSetID) ++{ ++ qemuFDPass *fdpass = g_new0(qemuFDPass, 1); ++ ++ fdpass->fdSetID = fdSetID; ++ fdpass->passed = true; ++ ++ return fdpass; ++} ++ ++ ++/** ++ * qemuFDPassIsPassed: ++ * @fdpass: The fd passing helper struct ++ * @id: when non-NULL filled with the fdset ID ++ * ++ * Returns true if @fdpass was passed to qemu. In such case @id is also filled ++ * with the ID of the fdset if non-NULL. ++ */ ++bool ++qemuFDPassIsPassed(qemuFDPass *fdpass, ++ unsigned *id) ++{ ++ if (!fdpass || !fdpass->passed) ++ return false; ++ ++ if (id) ++ *id = fdpass->fdSetID; ++ ++ return true; ++} ++ ++ + /** + * qemuFDPassAddFD: + * @fdpass: The fd passing helper struct +diff --git a/src/qemu/qemu_fd.h b/src/qemu/qemu_fd.h +index 032b9442ee..cd0ff2c690 100644 +--- a/src/qemu/qemu_fd.h ++++ b/src/qemu/qemu_fd.h +@@ -31,6 +31,13 @@ qemuFDPass * + qemuFDPassNew(const char *prefix, + void *dompriv); + ++qemuFDPass * ++qemuFDPassNewPassed(unsigned int fdSetID); ++ ++bool ++qemuFDPassIsPassed(qemuFDPass *fdpass, ++ unsigned *id); ++ + void + qemuFDPassAddFD(qemuFDPass *fdpass, + int *fd, +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-hotplug-Remove-legacy-quirk-for-dimm-address-generation.patch b/SOURCES/libvirt-qemu-hotplug-Remove-legacy-quirk-for-dimm-address-generation.patch new file mode 100644 index 0000000..da12b0d --- /dev/null +++ b/SOURCES/libvirt-qemu-hotplug-Remove-legacy-quirk-for-dimm-address-generation.patch @@ -0,0 +1,51 @@ +From b6eb914119af7e724cbee27951cfba0a6afb3b97 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Thu, 19 Jan 2023 15:06:11 +0100 +Subject: [PATCH] qemu: hotplug: Remove legacy quirk for 'dimm' address + generation + +Commit b7798a07f93 (in fall of 2016) changed the way we generate aliases +for 'dimm' memory devices as the alias itself is part of the migration +stream section naming and thus must be treated as ABI. + +The code added compatibility layer for VMs with memory hotplug started +with the old scheme to prevent from generating wrong aliases. The +compatibility layer broke though later when 'nvdimm' and 'pmem' devices +were introduced as it wrongly detected them as old configuration. + +Now rather than attempting to fix the legacy compat layer to treat other +devices properly we'll be better off simply removing it as it's +extremely unlikely that somebody has a VM started in 2016 running with +today's libvirt and attempts to hotplug more memory. + +This fixes a corner case when a user hot-adds a 'dimm' into a VM with a +'dimm' and a 'nvdimm' after restart of libvirtd and then attempts to +migrate the VM. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2158701 +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 50ce3463d514950350143f03e8421c8c31889c5d) +--- + src/qemu/qemu_hotplug.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index 026e1ee5ad..5840504d13 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -2275,9 +2275,7 @@ qemuDomainAttachMemory(virQEMUDriver *driver, + goto cleanup; + releaseaddr = true; + +- /* in cases where we are using a VM with aliases generated according to the +- * index of the memory device we need to keep continue using that scheme */ +- if (qemuAssignDeviceMemoryAlias(vm->def, mem, priv->memAliasOrderMismatch) < 0) ++ if (qemuAssignDeviceMemoryAlias(vm->def, mem, false) < 0) + goto cleanup; + + objalias = g_strdup_printf("mem%s", mem->info.alias); +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu-introduce-capability-QEMU_CAPS_MIGRATION_BLOCKED_REASONS.patch b/SOURCES/libvirt-qemu-introduce-capability-QEMU_CAPS_MIGRATION_BLOCKED_REASONS.patch deleted file mode 100644 index 5335271..0000000 --- a/SOURCES/libvirt-qemu-introduce-capability-QEMU_CAPS_MIGRATION_BLOCKED_REASONS.patch +++ /dev/null @@ -1,206 +0,0 @@ -From 81f8b07ed1e4e485ded7f366739c110351120785 Mon Sep 17 00:00:00 2001 -Message-Id: <81f8b07ed1e4e485ded7f366739c110351120785@dist-git> -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -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 -Signed-off-by: Eugenio Pérez -Reviewed-by: Jiri Denemark -Reviewed-by: Laine Stump - -(cherry picked from commit 1e9d84d9f9513a73572842db30e3d1445e892291) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 @@ - - - -+ - 6000000 - 0 - 61700242 -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 @@ - - - -+ - 6000000 - 0 - 39100242 -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 @@ - - - -+ - 6000000 - 0 - 43100242 -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 @@ - - - -+ - 6001000 - 0 - 43100243 -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 @@ - - - -+ - 6001050 - 0 - 61700244 -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 @@ - - - -+ - 6002000 - 0 - 42900244 -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 @@ - - - -+ - 6002000 - 0 - 43100244 -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 @@ - - - -+ - 6002092 - 0 - 61700243 -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 @@ - - - -+ - 7000000 - 0 - 42900243 -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 @@ - - - -+ - 7000000 - 0 - 43100243 -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 @@ - - - -+ - 7000050 - 0 - 43100244 --- -2.35.1 - diff --git a/SOURCES/libvirt-qemu-new-function-to-retrieve-migration-blocker-reasons-from-QEMU.patch b/SOURCES/libvirt-qemu-new-function-to-retrieve-migration-blocker-reasons-from-QEMU.patch deleted file mode 100644 index 827112d..0000000 --- a/SOURCES/libvirt-qemu-new-function-to-retrieve-migration-blocker-reasons-from-QEMU.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 90d326f60706a990db3ed49ba338d911471578c0 Mon Sep 17 00:00:00 2001 -Message-Id: <90d326f60706a990db3ed49ba338d911471578c0@dist-git> -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -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 -Reviewed-by: Jiri Denemark -Reviewed-by: Laine Stump - -(cherry picked from commit 7e52c4839fabac2d19c6f22c99142e992e3d898e) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu-query-QEMU-for-migration-blockers-before-our-own-harcoded-checks.patch b/SOURCES/libvirt-qemu-query-QEMU-for-migration-blockers-before-our-own-harcoded-checks.patch deleted file mode 100644 index 89152e4..0000000 --- a/SOURCES/libvirt-qemu-query-QEMU-for-migration-blockers-before-our-own-harcoded-checks.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 9764a6c484d4f3586b0e0be33e8c53de63b11edd Mon Sep 17 00:00:00 2001 -Message-Id: <9764a6c484d4f3586b0e0be33e8c53de63b11edd@dist-git> -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -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 -Reviewed-by: Jiri Denemark -Reviewed-by: Laine Stump - -(cherry picked from commit 156e99f686690855be4e45d9b8b3194191a8bc31) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu-remove-hardcoded-migration-fail-for-vDPA-devices-if-we-can-ask-QEMU.patch b/SOURCES/libvirt-qemu-remove-hardcoded-migration-fail-for-vDPA-devices-if-we-can-ask-QEMU.patch deleted file mode 100644 index 1db6c10..0000000 --- a/SOURCES/libvirt-qemu-remove-hardcoded-migration-fail-for-vDPA-devices-if-we-can-ask-QEMU.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 0ba11af2300d0aaf80456575e03848f843ae29de Mon Sep 17 00:00:00 2001 -Message-Id: <0ba11af2300d0aaf80456575e03848f843ae29de@dist-git> -From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= -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 -Reviewed-by: Jiri Denemark -Reviewed-by: Laine Stump - -(cherry picked from commit 2103807e330487952f423d86f541a7a28e003e95) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu-skip-hardcoded-hostdev-migration-check-if-QEMU-can-do-it-for-us.patch b/SOURCES/libvirt-qemu-skip-hardcoded-hostdev-migration-check-if-QEMU-can-do-it-for-us.patch deleted file mode 100644 index 633a169..0000000 --- a/SOURCES/libvirt-qemu-skip-hardcoded-hostdev-migration-check-if-QEMU-can-do-it-for-us.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 8f2cd77dc208cfa90b37faa18b092ca4a76a0716 Mon Sep 17 00:00:00 2001 -Message-Id: <8f2cd77dc208cfa90b37faa18b092ca4a76a0716@dist-git> -From: Laine Stump -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 -Reviewed-by: Jiri Denemark -(cherry picked from commit 25883cd5f0b188f2417f294b7d219a77b219f7c2) - -https://bugzilla.redhat.com/show_bug.cgi?id=1497907 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemuDomainSetIOThreadParams-Accept-VIR_DOMAIN_AFFECT_CONFIG-flag.patch b/SOURCES/libvirt-qemuDomainSetIOThreadParams-Accept-VIR_DOMAIN_AFFECT_CONFIG-flag.patch deleted file mode 100644 index 936f85d..0000000 --- a/SOURCES/libvirt-qemuDomainSetIOThreadParams-Accept-VIR_DOMAIN_AFFECT_CONFIG-flag.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 9b00b5666a014999a3bc9e2e8a6a844ca7a4326f Mon Sep 17 00:00:00 2001 -Message-Id: <9b00b5666a014999a3bc9e2e8a6a844ca7a4326f@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Ján Tomko -(cherry picked from commit 3096965ce78923b099fa39e4950279b2f21ab60a) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-qemuExtTPMStop-Restore-TPM-state-label-more-often.patch b/SOURCES/libvirt-qemuExtTPMStop-Restore-TPM-state-label-more-often.patch new file mode 100644 index 0000000..beeb105 --- /dev/null +++ b/SOURCES/libvirt-qemuExtTPMStop-Restore-TPM-state-label-more-often.patch @@ -0,0 +1,51 @@ +From 01d7e15c8c4a33a379e8297182dc474bb2046d2a Mon Sep 17 00:00:00 2001 +Message-Id: <01d7e15c8c4a33a379e8297182dc474bb2046d2a@dist-git> +From: Michal Privoznik +Date: Fri, 27 Jan 2023 10:46:55 +0100 +Subject: [PATCH] qemuExtTPMStop: Restore TPM state label more often +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When stopping swtpm we can restore the label either on just the +swtpm's domain specific logfile (/var/log/swtpm/libvirt/qemu/...), +or on the logfile and the state too (/var/lib/libvirt/swtpm/...). + +The deciding factor is whether the guest is stopped because of +outgoing migration OR the state is on a shared filesystem. + +But this is not correct condition, because for instance saving the +guest into a file (virsh save) is also an outgoing migration. +Alternatively, when the swtpm state is stored on a shared +filesystem, but the guest is destroyed (virsh destroy), i.e. +stopped because of different reason than migration, we want to +restore the seclabels. + +The correct condition is: skip restoring the state on outgoing +migration AND shared filesystem. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2161557 +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 794fddf866676ef4119b3acf43b5547a9e868bb9) +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_tpm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c +index b2748eb6a4..5831ffc32e 100644 +--- a/src/qemu/qemu_tpm.c ++++ b/src/qemu/qemu_tpm.c +@@ -1142,7 +1142,7 @@ qemuExtTPMStop(virQEMUDriver *driver, + return; + + qemuTPMEmulatorStop(cfg->swtpmStateDir, shortName); +- if (outgoingMigration || qemuTPMHasSharedStorage(vm->def)) ++ if (outgoingMigration && qemuTPMHasSharedStorage(vm->def)) + restoreTPMStateLabel = false; + + if (qemuSecurityRestoreTPMLabels(driver, vm, restoreTPMStateLabel) < 0) +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch b/SOURCES/libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch new file mode 100644 index 0000000..46869ed --- /dev/null +++ b/SOURCES/libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch @@ -0,0 +1,38 @@ +From d96dc2b87c220298d4de031cff72fd9a458dad74 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 31 Jan 2023 17:26:43 +0100 +Subject: [PATCH] qemuFDPassTransferCommand: Mark that FD was passed + +Until now the code didn't expect that we'd want to rollback/detach a FD +passed on the commandline, but whith disk backend FD passing this can +happen. + +Properly mark the 'qemuFDPass' object as passed to qemu even when it was +done on the commandline. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 3b7b201b95f2facc01bd9f8a42aed0fad96789fa) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_fd.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/qemu/qemu_fd.c b/src/qemu/qemu_fd.c +index 51a8133fde..ebeeb65505 100644 +--- a/src/qemu/qemu_fd.c ++++ b/src/qemu/qemu_fd.c +@@ -151,6 +151,8 @@ qemuFDPassTransferCommand(qemuFDPass *fdpass, + fdpass->fds[i].fd = -1; + virCommandAddArgList(cmd, "-add-fd", arg, NULL); + } ++ ++ fdpass->passed = true; + } + + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemuProcessLaunch-Tighten-rules-for-external-devices-wrt-incoming-migration.patch b/SOURCES/libvirt-qemuProcessLaunch-Tighten-rules-for-external-devices-wrt-incoming-migration.patch new file mode 100644 index 0000000..c9e421e --- /dev/null +++ b/SOURCES/libvirt-qemuProcessLaunch-Tighten-rules-for-external-devices-wrt-incoming-migration.patch @@ -0,0 +1,69 @@ +From dd64ec40a29739464cfe886818588bb9946b8d8d Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Fri, 27 Jan 2023 13:59:08 +0100 +Subject: [PATCH] qemuProcessLaunch: Tighten rules for external devices wrt + incoming migration +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When starting a guest, helper processes are started first. But +they need a bit of special handling. Just consider a regular cold +boot and an incoming migration. For instance, in case of swtpm +with its state on a shared volume, we want to set label on the +state for the cold boot case, but don't want to touch the label +in case of incoming migration (because the source very +specifically did not restore it either). + +Until now, these two cases were differentiated by testing +@incoming against NULL. And while that makes sense for other +aspects of domain startup, for external devices we need a bit +more, because a restore from a save file is also 'incoming +migration'. + +Now, there is a difference between regular migration and restore +from a save file. In the former case we do not want to set +seclabels in the save state. BUT, in the latter case we do need +to set them, because the code that saves the machine restored +seclabels. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2161557 +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 5c4007ddc6c29632b5cc96ab4ef81ebb7797d1bb) +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_process.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 2de87211fb..1217fb1856 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7620,6 +7620,7 @@ qemuProcessLaunch(virConnectPtr conn, + size_t nnicindexes = 0; + g_autofree int *nicindexes = NULL; + unsigned long long maxMemLock = 0; ++ bool incomingMigrationExtDevices = false; + + VIR_DEBUG("conn=%p driver=%p vm=%p name=%s id=%d asyncJob=%d " + "incoming.uri=%s " +@@ -7674,7 +7675,13 @@ qemuProcessLaunch(virConnectPtr conn, + if (qemuDomainSchedCoreStart(cfg, vm) < 0) + goto cleanup; + +- if (qemuExtDevicesStart(driver, vm, incoming != NULL) < 0) ++ /* For external devices the rules of incoming migration are a bit stricter, ++ * than plain @incoming != NULL. They need to differentiate between ++ * incoming migration and restore from a save file. */ ++ incomingMigrationExtDevices = incoming && ++ vmop == VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START; ++ ++ if (qemuExtDevicesStart(driver, vm, incomingMigrationExtDevices) < 0) + goto cleanup; + + if (!(cmd = qemuBuildCommandLine(vm, +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemuProcessRefreshDisks-Don-t-skip-filling-of-disk-information-if-tray-state-didn-t-change.patch b/SOURCES/libvirt-qemuProcessRefreshDisks-Don-t-skip-filling-of-disk-information-if-tray-state-didn-t-change.patch new file mode 100644 index 0000000..c20b6c5 --- /dev/null +++ b/SOURCES/libvirt-qemuProcessRefreshDisks-Don-t-skip-filling-of-disk-information-if-tray-state-didn-t-change.patch @@ -0,0 +1,62 @@ +From b53d7b7150f81ee6f014815fa7ee3f1106c491d5 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Thu, 9 Feb 2023 09:40:32 +0100 +Subject: [PATCH] qemuProcessRefreshDisks: Don't skip filling of disk + information if tray state didn't change + +Commit 5ef2582646eb98 added emitting of even when refreshign disk state, +where it wanted to avoid sending the event if disk state didn't change. +This was achieved by using 'continue' in the loop filling the +information. Unfortunately this skips extraction of whether the device +has a tray which is propagated into internal structures, which in turn +broke cdrom media change as the code thought there's no tray for the +device. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2166411 +Fixes: 5ef2582646eb98af208ce37355f82bdef39931fa +Signed-off-by: Peter Krempa +Reviewed-by: Kristina Hanicova +(cherry picked from commit 86cfe93ef7fdc2d665a2fc88b79af89e7978ba78) +--- + src/qemu/qemu_process.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 32083de563..7ae859d68f 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -8713,16 +8713,13 @@ qemuProcessRefreshDisks(virDomainObj *vm, + continue; + + if (info->removable) { +- virObjectEvent *event = NULL; ++ bool emitEvent = info->tray_open != disk->tray_status; + int reason; + + if (info->empty) + virDomainDiskEmptySource(disk); + + if (info->tray) { +- if (info->tray_open == disk->tray_status) +- continue; +- + if (info->tray_open) { + reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN; + disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN; +@@ -8731,8 +8728,10 @@ qemuProcessRefreshDisks(virDomainObj *vm, + disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; + } + +- event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason); +- virObjectEventStateQueue(driver->domainEventState, event); ++ if (emitEvent) { ++ virObjectEvent *event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason); ++ virObjectEventStateQueue(driver->domainEventState, event); ++ } + } + } + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemuProcessStop-Fix-detection-of-outgoing-migration-for-external-devices.patch b/SOURCES/libvirt-qemuProcessStop-Fix-detection-of-outgoing-migration-for-external-devices.patch new file mode 100644 index 0000000..d7bf0d4 --- /dev/null +++ b/SOURCES/libvirt-qemuProcessStop-Fix-detection-of-outgoing-migration-for-external-devices.patch @@ -0,0 +1,46 @@ +From 102efebe3cd2bfebace026744a7835309cf124fa Mon Sep 17 00:00:00 2001 +Message-Id: <102efebe3cd2bfebace026744a7835309cf124fa@dist-git> +From: Michal Privoznik +Date: Fri, 27 Jan 2023 10:45:50 +0100 +Subject: [PATCH] qemuProcessStop: Fix detection of outgoing migration for + external devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When cleaning up host in qemuProcessStop(), our external helper +processes (e.g. swtpm) want to know whether the domain is being +migrated out or not (so that they restore seclabels on a device +state that's on a shared storage). + +This fact is reflected in the @outgoingMigration variable which +is set to true if asyncJob is anything but +VIR_ASYNC_JOB_MIGRATION_IN. Well, we have a specific job for +outgoing migration (VIR_ASYNC_JOB_MIGRATION_OUT) and thus we +should check for that. + +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 88f0fbf63851c6ae80ad03b2a05a966d8a2f296c) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2161557 +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_process.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 29716ecb19..2de87211fb 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -8397,7 +8397,7 @@ void qemuProcessStop(virQEMUDriver *driver, + qemuDomainCleanupRun(driver, vm); + + outgoingMigration = (flags & VIR_QEMU_PROCESS_STOP_MIGRATED) && +- (asyncJob != VIR_ASYNC_JOB_MIGRATION_IN); ++ (asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT); + qemuExtDevicesStop(driver, vm, outgoingMigration); + + qemuDBusStop(driver, vm); +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch b/SOURCES/libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch new file mode 100644 index 0000000..78bede3 --- /dev/null +++ b/SOURCES/libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch @@ -0,0 +1,59 @@ +From deb6aad4f6bcfd95235d3149e9d69b95fe011294 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 31 Jan 2023 15:19:58 +0100 +Subject: [PATCH] qemuStorageSourcePrivateDataFormat: Rename 'tmp' to + 'objectsChildBuf' + +Be consistent with other children buffer variable naming scheme. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 531adf32743b6045f44964ec5e1f8bdb9c913797) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_domain.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 2eb5653254..226d4d6dc1 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -2005,9 +2005,9 @@ static int + qemuStorageSourcePrivateDataFormat(virStorageSource *src, + virBuffer *buf) + { +- g_auto(virBuffer) tmp = VIR_BUFFER_INIT_CHILD(buf); + qemuDomainStorageSourcePrivate *srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src); + g_auto(virBuffer) nodenamesChildBuf = VIR_BUFFER_INIT_CHILD(buf); ++ g_auto(virBuffer) objectsChildBuf = VIR_BUFFER_INIT_CHILD(buf); + + virBufferEscapeString(&nodenamesChildBuf, "\n", src->nodestorage); + virBufferEscapeString(&nodenamesChildBuf, "\n", src->nodeformat); +@@ -2025,16 +2025,16 @@ qemuStorageSourcePrivateDataFormat(virStorageSource *src, + return -1; + + if (srcPriv) { +- qemuStorageSourcePrivateDataFormatSecinfo(&tmp, srcPriv->secinfo, "auth"); +- qemuStorageSourcePrivateDataFormatSecinfo(&tmp, srcPriv->encinfo, "encryption"); +- qemuStorageSourcePrivateDataFormatSecinfo(&tmp, srcPriv->httpcookie, "httpcookie"); +- qemuStorageSourcePrivateDataFormatSecinfo(&tmp, srcPriv->tlsKeySecret, "tlskey"); ++ qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->secinfo, "auth"); ++ qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->encinfo, "encryption"); ++ qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->httpcookie, "httpcookie"); ++ qemuStorageSourcePrivateDataFormatSecinfo(&objectsChildBuf, srcPriv->tlsKeySecret, "tlskey"); + } + + if (src->tlsAlias) +- virBufferAsprintf(&tmp, "\n", src->tlsAlias); ++ virBufferAsprintf(&objectsChildBuf, "\n", src->tlsAlias); + +- virXMLFormatElement(buf, "objects", NULL, &tmp); ++ virXMLFormatElement(buf, "objects", NULL, &objectsChildBuf); + + if (src->thresholdEventWithIndex) + virBufferAddLit(buf, "\n"); +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_extdevice-Do-cleanup-host-only-for-VIR_DOMAIN_TPM_TYPE_EMULATOR.patch b/SOURCES/libvirt-qemu_extdevice-Do-cleanup-host-only-for-VIR_DOMAIN_TPM_TYPE_EMULATOR.patch new file mode 100644 index 0000000..f0a211a --- /dev/null +++ b/SOURCES/libvirt-qemu_extdevice-Do-cleanup-host-only-for-VIR_DOMAIN_TPM_TYPE_EMULATOR.patch @@ -0,0 +1,44 @@ +From d78fc22fb96e0050a419623bf27639c63624c998 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Fri, 10 Feb 2023 09:47:05 +0100 +Subject: [PATCH] qemu_extdevice: Do cleanup host only for + VIR_DOMAIN_TPM_TYPE_EMULATOR +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We only set up host for VIR_DOMAIN_TPM_TYPE_EMULATOR and thus +similarly, we should do cleanup for the same type. This also +fixes a crasher, in which qemuTPMEmulatorCleanupHost() accesses +tpm->data.emulator.storagepath which is NULL for +VIR_DOMAIN_TPM_TYPE_EXTERNAL. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2168762 +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 03f76e577d66f8eea6aa7cc513e75026527b4cda) +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_extdevice.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c +index f7b2e2e653..fdefe59215 100644 +--- a/src/qemu/qemu_extdevice.c ++++ b/src/qemu/qemu_extdevice.c +@@ -162,7 +162,10 @@ qemuExtDevicesCleanupHost(virQEMUDriver *driver, + return; + + for (i = 0; i < def->ntpms; i++) { +- qemuExtTPMCleanupHost(def->tpms[i], flags, outgoingMigration); ++ virDomainTPMDef *tpm = def->tpms[i]; ++ ++ if (tpm->type == VIR_DOMAIN_TPM_TYPE_EMULATOR) ++ qemuExtTPMCleanupHost(tpm, flags, outgoingMigration); + } + } + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch b/SOURCES/libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch new file mode 100644 index 0000000..a39a66f --- /dev/null +++ b/SOURCES/libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch @@ -0,0 +1,34 @@ +From bf949f570a232423c7cf01831dfbe7034a4f49d8 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Tue, 31 Jan 2023 15:23:54 +0100 +Subject: [PATCH] qemu_fd: Remove declaration for 'qemuFDPassNewDirect' + +The function doesn't exist any more. + +Signed-off-by: Peter Krempa +Reviewed-by: Martin Kletzander +(cherry picked from commit 51dc38fe31beb252cc0fa2780210cdedc698f57f) + +https://bugzilla.redhat.com/show_bug.cgi?id=2040272 +--- + src/qemu/qemu_fd.h | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/qemu/qemu_fd.h b/src/qemu/qemu_fd.h +index 6f165b6be9..032b9442ee 100644 +--- a/src/qemu/qemu_fd.h ++++ b/src/qemu/qemu_fd.h +@@ -30,9 +30,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuFDPass, qemuFDPassFree); + qemuFDPass * + qemuFDPassNew(const char *prefix, + void *dompriv); +-qemuFDPass * +-qemuFDPassNewDirect(const char *prefix, +- void *dompriv); + + void + qemuFDPassAddFD(qemuFDPass *fdpass, +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_interface-Fix-managed-no-case-when-creating-an-ethernet-interface.patch b/SOURCES/libvirt-qemu_interface-Fix-managed-no-case-when-creating-an-ethernet-interface.patch new file mode 100644 index 0000000..3814a58 --- /dev/null +++ b/SOURCES/libvirt-qemu_interface-Fix-managed-no-case-when-creating-an-ethernet-interface.patch @@ -0,0 +1,56 @@ +From 25de0ead0194159a6d9a769f34ec5b092e9b718c Mon Sep 17 00:00:00 2001 +Message-Id: <25de0ead0194159a6d9a769f34ec5b092e9b718c@dist-git> +From: Michal Privoznik +Date: Mon, 23 Jan 2023 11:42:18 +0100 +Subject: [PATCH] qemu_interface: Fix managed='no' case when creating an + ethernet interface + +In a recent commit of v9.0.0-rc1~192 I've tried to forbid case +where a TAP device already exists, but at the same time it's +managed by Libvirt ( ). NB, if @managed +attribute is missing then it's assumed to be managed by Libvirt. + +Anyway, I've mistakenly put setting of +VIR_NETDEV_TAP_CREATE_ALLOW_EXISTING flag into managed='yes' +branch instead of managed='no' branch in +qemuInterfaceEthernetConnect(). + +Move the setting of the flag into the correct branch. + +Fixes: a2ae3d299cf9c5ada8aa42ec4271748eb479dc27 +Signed-off-by: Michal Privoznik +Reviewed-by: Martin Kletzander +(cherry picked from commit d6a8b9eef70887e01fa5fd292580e14ca5eab08c) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2144738 +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_interface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c +index b6895cedde..ed2c209167 100644 +--- a/src/qemu/qemu_interface.c ++++ b/src/qemu/qemu_interface.c +@@ -443,6 +443,9 @@ qemuInterfaceEthernetConnect(virDomainDef *def, + _("target managed='no' but specified dev doesn't exist")); + goto cleanup; + } ++ ++ tap_create_flags |= VIR_NETDEV_TAP_CREATE_ALLOW_EXISTING; ++ + if (virNetDevMacVLanIsMacvtap(net->ifname)) { + auditdev = net->ifname; + if (virNetDevMacVLanTapOpen(net->ifname, tapfd, tapfdSize) < 0) +@@ -461,8 +464,6 @@ qemuInterfaceEthernetConnect(virDomainDef *def, + if (!net->ifname) + template_ifname = true; + +- tap_create_flags |= VIR_NETDEV_TAP_CREATE_ALLOW_EXISTING; +- + if (virNetDevTapCreate(&net->ifname, tunpath, tapfd, tapfdSize, + tap_create_flags) < 0) { + goto cleanup; +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_migration-Acquire-correct-job-in-qemuMigrationSrcIsAllowed.patch b/SOURCES/libvirt-qemu_migration-Acquire-correct-job-in-qemuMigrationSrcIsAllowed.patch deleted file mode 100644 index 2321536..0000000 --- a/SOURCES/libvirt-qemu_migration-Acquire-correct-job-in-qemuMigrationSrcIsAllowed.patch +++ /dev/null @@ -1,132 +0,0 @@ -From d4c4660b097695916244307d1125a17c30c0c9ef Mon Sep 17 00:00:00 2001 -Message-Id: -From: Martin Kletzander -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 -Reviewed-by: Jiri Denemark -(cherry picked from commit 69e0e33873f1aec55df77f12fb0197d50dca3319) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration-Apply-max-postcopy-bandwidth-on-post-copy-resume.patch b/SOURCES/libvirt-qemu_migration-Apply-max-postcopy-bandwidth-on-post-copy-resume.patch deleted file mode 100644 index bb7d0c6..0000000 --- a/SOURCES/libvirt-qemu_migration-Apply-max-postcopy-bandwidth-on-post-copy-resume.patch +++ /dev/null @@ -1,229 +0,0 @@ -From b8c791a3fc2767e6d899e3e0c590a93cb0ee7e03 Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 766abdc291ba606379a7d197bff477fef25fb508) - -https://bugzilla.redhat.com/show_bug.cgi?id=2111070 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration-Pass-migParams-to-qemuMigrationSrcResume.patch b/SOURCES/libvirt-qemu_migration-Pass-migParams-to-qemuMigrationSrcResume.patch deleted file mode 100644 index a61b5e9..0000000 --- a/SOURCES/libvirt-qemu_migration-Pass-migParams-to-qemuMigrationSrcResume.patch +++ /dev/null @@ -1,70 +0,0 @@ -From d24586ede83472f850d1a0c520d482ac5f908696 Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 8c335b5530194dbcef719a4d88c89b8723b831a5) - -https://bugzilla.redhat.com/show_bug.cgi?id=2111070 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration-Store-original-migration-params-in-status-XML.patch b/SOURCES/libvirt-qemu_migration-Store-original-migration-params-in-status-XML.patch deleted file mode 100644 index bd47311..0000000 --- a/SOURCES/libvirt-qemu_migration-Store-original-migration-params-in-status-XML.patch +++ /dev/null @@ -1,51 +0,0 @@ -From c50cae68f0d083ad0c5ffcf85908cc62eeaa866d Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit c7238941357f0d2e94524cf8c5ad7d9c82dcf2f9) -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration-Use-EnterMonitorAsync-in-qemuDomainGetMigrationBlockers.patch b/SOURCES/libvirt-qemu_migration-Use-EnterMonitorAsync-in-qemuDomainGetMigrationBlockers.patch deleted file mode 100644 index 70f8efe..0000000 --- a/SOURCES/libvirt-qemu_migration-Use-EnterMonitorAsync-in-qemuDomainGetMigrationBlockers.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 25fe3cf8990b654fd568f580b8885102b3f92789 Mon Sep 17 00:00:00 2001 -Message-Id: <25fe3cf8990b654fd568f580b8885102b3f92789@dist-git> -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 62627524607f214e724a48fcac575737f49a271c) -Resolves: https://bugzilla.redhat.com/2092833 -Signed-off-by: Eugenio Pérez ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration_params-Avoid-deadlock-in-qemuMigrationParamsReset.patch b/SOURCES/libvirt-qemu_migration_params-Avoid-deadlock-in-qemuMigrationParamsReset.patch deleted file mode 100644 index 53bf233..0000000 --- a/SOURCES/libvirt-qemu_migration_params-Avoid-deadlock-in-qemuMigrationParamsReset.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 0022c9aef2ecf60e9091e6df57e56065b14b67c5 Mon Sep 17 00:00:00 2001 -Message-Id: <0022c9aef2ecf60e9091e6df57e56065b14b67c5@dist-git> -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 8cb19a9b9a56ab6ebefc1f913c545e0bb86d4364) - -https://bugzilla.redhat.com/show_bug.cgi?id=2107892 - -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsApply.patch b/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsApply.patch deleted file mode 100644 index c27146a..0000000 --- a/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsApply.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 852927ea725deae6d4ef8a87383a78d9b0b1cd83 Mon Sep 17 00:00:00 2001 -Message-Id: <852927ea725deae6d4ef8a87383a78d9b0b1cd83@dist-git> -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit c0824fd03802085db698c10fe62c98cc95a57941) -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsReset.patch b/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsReset.patch deleted file mode 100644 index 638447f..0000000 --- a/SOURCES/libvirt-qemu_migration_params-Refactor-qemuMigrationParamsReset.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 2a05454cd2d6ba283c128158f44d84d65832ebf7 Mon Sep 17 00:00:00 2001 -Message-Id: <2a05454cd2d6ba283c128158f44d84d65832ebf7@dist-git> -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit c47f1abb81194461377a0c608a7ecd87f9ce9146) -Signed-off-by: Jiri Denemark ---- - 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 - diff --git a/SOURCES/libvirt-qemu_migration_params-Replace-qemuMigrationParamTypes-array.patch b/SOURCES/libvirt-qemu_migration_params-Replace-qemuMigrationParamTypes-array.patch deleted file mode 100644 index a620ace..0000000 --- a/SOURCES/libvirt-qemu_migration_params-Replace-qemuMigrationParamTypes-array.patch +++ /dev/null @@ -1,176 +0,0 @@ -From aa4b6b4877d60218c24d4ae713786f5ee37ac6dc Mon Sep 17 00:00:00 2001 -Message-Id: -From: Jiri Denemark -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 -Reviewed-by: Michal Privoznik -(cherry picked from commit 184749691f27f30a39f6f6c77828ffb951af0255) - -https://bugzilla.redhat.com/show_bug.cgi?id=2111070 - -Signed-off-by: Jiri Denemark ---- - 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, "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 - diff --git a/SOURCES/libvirt-qemu_namespace-Deal-with-nested-mounts-when-umount-ing-dev.patch b/SOURCES/libvirt-qemu_namespace-Deal-with-nested-mounts-when-umount-ing-dev.patch new file mode 100644 index 0000000..dd85c70 --- /dev/null +++ b/SOURCES/libvirt-qemu_namespace-Deal-with-nested-mounts-when-umount-ing-dev.patch @@ -0,0 +1,59 @@ +From fd06fc3affcda0d7af1721c26915b8d87e0b2614 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Tue, 7 Feb 2023 15:06:32 +0100 +Subject: [PATCH] qemu_namespace: Deal with nested mounts when umount()-ing + /dev + +In one of recent commits (v9.0.0-rc1~106) I've made our QEMU +namespace code umount the original /dev. One of the reasons was +enhanced security, because previously we just mounted a tmpfs +over the original /dev. Thus a malicious QEMU could just +umount("/dev") and it would get to the original /dev with all +nodes. + +Now, on some systems this introduced a regression: + + failed to umount devfs on /dev: Device or resource busy + +But how this could be? We've moved all file systems mounted under +/dev to a temporary location. Or have we? As it turns out, not +quite. If there are two file systems mounted on the same target, +e.g. like this: + + mount -t tmpfs tmpfs /dev/shm/ && mount -t tmpfs tmpfs /dev/shm/ + +then only the top most (i.e. the last one) is moved. See +qemuDomainUnshareNamespace() for more info. + +Now, we could enhance our code to deal with these "doubled" mount +points. Or, since it is the top most file system that is +accessible anyways (and this one is preserved), we can +umount("/dev") in a recursive fashion. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2167302 +Fixes: 379c0ce4bfed8733dfbde557c359eecc5474ce38 +Signed-off-by: Michal Privoznik +Reviewed-by: Jim Fehlig +(cherry picked from commit 5155ab4b2a704285505dfea6ffee8b980fdaa29e) +Signed-off-by: Michal Privoznik +--- + 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 5769a4dfe0..5fc043bd62 100644 +--- a/src/qemu/qemu_namespace.c ++++ b/src/qemu/qemu_namespace.c +@@ -777,7 +777,7 @@ qemuDomainUnshareNamespace(virQEMUDriverConfig *cfg, + } + + #if defined(__linux__) +- if (umount("/dev") < 0) { ++ if (umount2("/dev", MNT_DETACH) < 0) { + virReportSystemError(errno, "%s", _("failed to umount devfs on /dev")); + return -1; + } +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_process-Produce-better-debug-message-wrt-domain-namespaces.patch b/SOURCES/libvirt-qemu_process-Produce-better-debug-message-wrt-domain-namespaces.patch new file mode 100644 index 0000000..161c6d9 --- /dev/null +++ b/SOURCES/libvirt-qemu_process-Produce-better-debug-message-wrt-domain-namespaces.patch @@ -0,0 +1,64 @@ +From 99f69000a1ecacc2f064043993ece8ddba366976 Mon Sep 17 00:00:00 2001 +Message-Id: <99f69000a1ecacc2f064043993ece8ddba366976@dist-git> +From: Michal Privoznik +Date: Tue, 7 Feb 2023 10:34:40 +0100 +Subject: [PATCH] qemu_process: Produce better debug message wrt domain + namespaces + +When going through debug log of a domain startup process, one can +meet the following line: + + debug : qemuProcessLaunch:7668 : Building mount namespace + +But this is in fact wrong. Firstly, domain namespaces are just +enabled in domain's privateData. Secondly, the debug message says +nothing about actual state of namespace - whether it was enabled +or not. + +Therefore, move the debug printing into +qemuProcessEnableDomainNamespaces() and tweak it so that the +actual value is reflected. + +Signed-off-by: Michal Privoznik +Reviewed-by: Jim Fehlig +(cherry picked from commit 697c16e39ae9a9e18ce7cad0729bf2293b12a307) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2167302 +Signed-off-by: Michal Privoznik +--- + src/qemu/qemu_process.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c +index 1217fb1856..32083de563 100644 +--- a/src/qemu/qemu_process.c ++++ b/src/qemu/qemu_process.c +@@ -7377,11 +7377,17 @@ qemuProcessEnableDomainNamespaces(virQEMUDriver *driver, + virDomainObj *vm) + { + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); ++ const char *state = "disabled"; + + if (virBitmapIsBitSet(cfg->namespaces, QEMU_DOMAIN_NS_MOUNT) && + qemuDomainEnableNamespace(vm, QEMU_DOMAIN_NS_MOUNT) < 0) + return -1; + ++ if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT)) ++ state = "enabled"; ++ ++ VIR_DEBUG("Mount namespace for domain name=%s is %s", ++ vm->def->name, state); + return 0; + } + +@@ -7705,8 +7711,6 @@ qemuProcessLaunch(virConnectPtr conn, + + qemuDomainLogContextMarkPosition(logCtxt); + +- VIR_DEBUG("Building mount namespace"); +- + if (qemuProcessEnableDomainNamespaces(driver, vm) < 0) + goto cleanup; + +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_snapshot-refactor-qemuSnapshotDeleteExternalPrepare.patch b/SOURCES/libvirt-qemu_snapshot-refactor-qemuSnapshotDeleteExternalPrepare.patch new file mode 100644 index 0000000..8a632b8 --- /dev/null +++ b/SOURCES/libvirt-qemu_snapshot-refactor-qemuSnapshotDeleteExternalPrepare.patch @@ -0,0 +1,141 @@ +From 7289999ecc435bcc65881c64b49efba9746a9571 Mon Sep 17 00:00:00 2001 +Message-Id: <7289999ecc435bcc65881c64b49efba9746a9571@dist-git> +From: Pavel Hrdina +Date: Tue, 21 Feb 2023 16:52:28 +0100 +Subject: [PATCH] qemu_snapshot: refactor qemuSnapshotDeleteExternalPrepare + +When user creates external snapshot with making only memory snapshot +without any disks deleting that snapshot failed without reporting any +meaningful error. + +The issue is that the qemuSnapshotDeleteExternalPrepare function +returns NULL because the returned list is empty. This will not change +so to make it clear if the function fails or not return int instead and +have another parameter where we can pass the list. + +With the fixed memory snapshot deletion it will now correctly delete +memory only snapshot as well. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2170826 + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit e3957c22462bc52c37c94ca4d6fe3d26f8202119) +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_snapshot.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c +index 5cdcbc6290..cfa531edef 100644 +--- a/src/qemu/qemu_snapshot.c ++++ b/src/qemu/qemu_snapshot.c +@@ -2301,9 +2301,10 @@ qemuSnapshotFindParentSnapForDisk(virDomainMomentObj *snap, + } + + +-static GSList* ++static int + qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, +- virDomainMomentObj *snap) ++ virDomainMomentObj *snap, ++ GSList **externalData) + { + ssize_t i; + virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap); +@@ -2320,7 +2321,7 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, + virReportError(VIR_ERR_OPERATION_INVALID, + _("snapshot disk '%s' was target of not completed snapshot delete"), + snapDisk->name); +- return NULL; ++ return -1; + } + + data = g_new0(qemuSnapshotDeleteExternalData, 1); +@@ -2328,18 +2329,18 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, + + data->domDisk = qemuDomainDiskByName(vm->def, snapDisk->name); + if (!data->domDisk) +- return NULL; ++ return -1; + + data->diskSrc = virStorageSourceChainLookupBySource(data->domDisk->src, + data->snapDisk->src, + &data->prevDiskSrc); + if (!data->diskSrc) +- return NULL; ++ return -1; + + if (!virStorageSourceIsSameLocation(data->diskSrc, data->snapDisk->src)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("VM disk source and snapshot disk source are not the same")); +- return NULL; ++ return -1; + } + + data->parentDomDisk = virDomainDiskByTarget(snapdef->parent.dom, +@@ -2348,7 +2349,7 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, + virReportError(VIR_ERR_OPERATION_FAILED, + _("failed to find disk '%s' in snapshot VM XML"), + snapDisk->name); +- return NULL; ++ return -1; + } + + if (virDomainObjIsActive(vm)) { +@@ -2356,13 +2357,13 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, + if (!virStorageSourceIsBacking(data->parentDiskSrc)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to find parent disk source in backing chain")); +- return NULL; ++ return -1; + } + + if (!virStorageSourceIsSameLocation(data->parentDiskSrc, data->parentDomDisk->src)) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("snapshot VM disk source and parent disk source are not the same")); +- return NULL; ++ return -1; + } + } + +@@ -2371,15 +2372,16 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, + if (data->parentSnap && !virDomainSnapshotIsExternal(data->parentSnap)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("deleting external snapshot that has internal snapshot as parent not supported")); +- return NULL; ++ return -1; + } + + ret = g_slist_prepend(ret, g_steal_pointer(&data)); + } + + ret = g_slist_reverse(ret); ++ *externalData = g_steal_pointer(&ret); + +- return g_steal_pointer(&ret); ++ return 0; + } + + +@@ -3159,7 +3161,7 @@ qemuSnapshotDelete(virDomainObj *vm, + g_autoslist(qemuSnapshotDeleteExternalData) tmpData = NULL; + + /* this also serves as validation whether the snapshot can be deleted */ +- if (!(tmpData = qemuSnapshotDeleteExternalPrepare(vm, snap))) ++ if (qemuSnapshotDeleteExternalPrepare(vm, snap, &tmpData) < 0) + goto endjob; + + if (!virDomainObjIsActive(vm)) { +@@ -3174,7 +3176,7 @@ qemuSnapshotDelete(virDomainObj *vm, + + /* Call the prepare again as some data require that the VM is + * running to get everything we need. */ +- if (!(externalData = qemuSnapshotDeleteExternalPrepare(vm, snap))) ++ if (qemuSnapshotDeleteExternalPrepare(vm, snap, &externalData) < 0) + goto endjob; + } else { + qemuDomainJobPrivate *jobPriv = vm->job->privateData; +-- +2.39.1 + diff --git a/SOURCES/libvirt-qemu_snapshot-remove-memory-snapshot-when-deleting-external-snapshot.patch b/SOURCES/libvirt-qemu_snapshot-remove-memory-snapshot-when-deleting-external-snapshot.patch new file mode 100644 index 0000000..b7c8bd6 --- /dev/null +++ b/SOURCES/libvirt-qemu_snapshot-remove-memory-snapshot-when-deleting-external-snapshot.patch @@ -0,0 +1,73 @@ +From 3ef43d47b0a5a49b0896b1725476b4b6ec0629b0 Mon Sep 17 00:00:00 2001 +Message-Id: <3ef43d47b0a5a49b0896b1725476b4b6ec0629b0@dist-git> +From: Pavel Hrdina +Date: Tue, 21 Feb 2023 16:10:56 +0100 +Subject: [PATCH] qemu_snapshot: remove memory snapshot when deleting external + snapshot + +When deleting external snapshot we should remove the memory snapshot +file as well. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit 356e227208ec66fff178b91ed4b1197c7e6cf974) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2170826 + +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_snapshot.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c +index b8416808b3..5cdcbc6290 100644 +--- a/src/qemu/qemu_snapshot.c ++++ b/src/qemu/qemu_snapshot.c +@@ -2684,9 +2684,11 @@ qemuSnapshotSetInvalid(virDomainObj *vm, + + static int + qemuSnapshotDiscardExternal(virDomainObj *vm, ++ virDomainMomentObj *snap, + GSList *externalData) + { + GSList *cur = NULL; ++ virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap); + + for (cur = externalData; cur; cur = g_slist_next(cur)) { + qemuSnapshotDeleteExternalData *data = cur->data; +@@ -2756,6 +2758,14 @@ qemuSnapshotDiscardExternal(virDomainObj *vm, + goto error; + } + ++ if (snapdef->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL && ++ snapdef->memorysnapshotfile) { ++ if (unlink(snapdef->memorysnapshotfile) < 0) { ++ VIR_WARN("failed to remove memory snapshot '%s'", ++ snapdef->memorysnapshotfile); ++ } ++ } ++ + return 0; + + error: +@@ -2886,7 +2896,7 @@ qemuSnapshotDiscardImpl(virQEMUDriver *driver, + } + + if (virDomainSnapshotIsExternal(snap)) { +- if (qemuSnapshotDiscardExternal(vm, externalData) < 0) ++ if (qemuSnapshotDiscardExternal(vm, snap, externalData) < 0) + return -1; + } else { + if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-d", true) < 0) +@@ -2894,7 +2904,7 @@ qemuSnapshotDiscardImpl(virQEMUDriver *driver, + } + } else { + if (virDomainSnapshotIsExternal(snap)) { +- if (qemuSnapshotDiscardExternal(vm, externalData) < 0) ++ if (qemuSnapshotDiscardExternal(vm, snap, externalData) < 0) + return -1; + } else { + /* Similarly as internal snapshot creation we would use a regular job +-- +2.39.1 + diff --git a/SOURCES/libvirt-rpc-Don-t-warn-about-max_client_requests-in-single-threaded-daemons.patch b/SOURCES/libvirt-rpc-Don-t-warn-about-max_client_requests-in-single-threaded-daemons.patch new file mode 100644 index 0000000..0fe7473 --- /dev/null +++ b/SOURCES/libvirt-rpc-Don-t-warn-about-max_client_requests-in-single-threaded-daemons.patch @@ -0,0 +1,55 @@ +From 64dbfdfe3ed2fc8f252ce138f6213b529edb2407 Mon Sep 17 00:00:00 2001 +Message-Id: <64dbfdfe3ed2fc8f252ce138f6213b529edb2407@dist-git> +From: Peter Krempa +Date: Wed, 15 Feb 2023 10:48:31 +0100 +Subject: [PATCH] rpc: Don't warn about "max_client_requests" in + single-threaded daemons +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The warning about max_client_requests is hit inside virtlogd every time +a VM starts which spams the logs. + +Emit the warning only when the client request limit is not 1 and add a +warning into the daemon config to not configure it too low instead. + +Fixes: 031878c2364 +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2145188 +Signed-off-by: Peter Krempa +Reviewed-by: Daniel P. Berrangé +(cherry picked from commit b3f8e072fe08a6beaf3ec3d27e02efee4358b2ca) +--- + src/remote/libvirtd.conf.in | 1 + + src/rpc/virnetserverclient.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/remote/libvirtd.conf.in b/src/remote/libvirtd.conf.in +index 80a98b1529..32a680317a 100644 +--- a/src/remote/libvirtd.conf.in ++++ b/src/remote/libvirtd.conf.in +@@ -374,6 +374,7 @@ + # connection. To avoid one client monopolizing the server + # this should be a small fraction of the global max_workers + # parameter. ++# Setting this too low may cause keepalive timeouts. + #max_client_requests = 5 + + # Same processing controls, but this time for the admin interface. +diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c +index b5c764b1b0..bdb3552c5d 100644 +--- a/src/rpc/virnetserverclient.c ++++ b/src/rpc/virnetserverclient.c +@@ -1261,7 +1261,8 @@ static virNetMessage *virNetServerClientDispatchRead(virNetServerClient *client) + client->rx->bufferLength = VIR_NET_MESSAGE_LEN_MAX; + client->rx->buffer = g_new0(char, client->rx->bufferLength); + client->nrequests++; +- } else if (!client->nrequests_warning) { ++ } else if (!client->nrequests_warning && ++ client->nrequests_max > 1) { + client->nrequests_warning = true; + VIR_WARN("Client hit max requests limit %zd. This may result " + "in keep-alive timeouts. Consider tuning the " +-- +2.39.1 + diff --git a/SOURCES/libvirt-rpc-Fix-error-message-in-virNetServerSetClientLimits.patch b/SOURCES/libvirt-rpc-Fix-error-message-in-virNetServerSetClientLimits.patch new file mode 100644 index 0000000..b146789 --- /dev/null +++ b/SOURCES/libvirt-rpc-Fix-error-message-in-virNetServerSetClientLimits.patch @@ -0,0 +1,43 @@ +From f26e30ecb3d0e25d5cf648755e2b4e1db0476b52 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Martin Kletzander +Date: Tue, 24 Jan 2023 13:45:09 +0100 +Subject: [PATCH] rpc: Fix error message in virNetServerSetClientLimits +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit f007940cb25a tried to change the error message so that it is unified +later in 35afa1d2d6c1, but various rewrites missed this particular error message +which does not make sense. Fix it so that it is the same as the other two +messages checking the same thing in this file. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2033879 + +Signed-off-by: Martin Kletzander +Reviewed-by: Ján Tomko +(cherry picked from commit 1e2605c934b80c3e9c30e929834d38fee86f184e) +Signed-off-by: Martin Kletzander +--- + src/rpc/virnetserver.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c +index bf0fda04ee..e97dfe8136 100644 +--- a/src/rpc/virnetserver.c ++++ b/src/rpc/virnetserver.c +@@ -1127,9 +1127,8 @@ virNetServerSetClientLimits(virNetServer *srv, + + if (max < max_unauth) { + virReportError(VIR_ERR_INVALID_ARG, "%s", +- _("The overall maximum number of clients waiting " +- "for authentication must not be less than the overall " +- "maximum number of clients")); ++ _("The overall maximum number of clients must not be less " ++ "than the number of clients waiting for authentication")); + return -1; + } + +-- +2.39.1 + diff --git a/SOURCES/libvirt-rpc-Pass-OPENSSL_CONF-through-to-ssh-invocations.patch b/SOURCES/libvirt-rpc-Pass-OPENSSL_CONF-through-to-ssh-invocations.patch deleted file mode 100644 index f70a508..0000000 --- a/SOURCES/libvirt-rpc-Pass-OPENSSL_CONF-through-to-ssh-invocations.patch +++ /dev/null @@ -1,82 +0,0 @@ -From c6ea67c481a2f447951449bd9b2746cfaaf385fd Mon Sep 17 00:00:00 2001 -Message-Id: -From: "Richard W.M. Jones" -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 -Acked-by: Laszlo Ersek -Reviewed-by: Michal Privoznik - -(cherry picked from commit 45912ac399abd9d4eba21fa3f15cb7587351f959) -Libvirt BZ: https://bugzilla.redhat.com/show_bug.cgi?id=2112348 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-rpc-client-Don-t-check-return-value-of-virNetMessageNew.patch b/SOURCES/libvirt-rpc-client-Don-t-check-return-value-of-virNetMessageNew.patch new file mode 100644 index 0000000..9b62d1e --- /dev/null +++ b/SOURCES/libvirt-rpc-client-Don-t-check-return-value-of-virNetMessageNew.patch @@ -0,0 +1,45 @@ +From c07df2b480134357e6ecb53f61eb1d8295b2b406 Mon Sep 17 00:00:00 2001 +Message-Id: +From: Peter Krempa +Date: Wed, 15 Feb 2023 10:43:53 +0100 +Subject: [PATCH] rpc: client: Don't check return value of virNetMessageNew +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +virNetServerClientDispatchRead checked the return value but it's not +necessary any more as it can't return NULL nowadays. + +Signed-off-by: Peter Krempa +Reviewed-by: Daniel P. Berrangé +(cherry picked from commit 761cb8a0876d32445951791030c77afa147c0de1) +https://bugzilla.redhat.com/show_bug.cgi?id=2145188 +--- + src/rpc/virnetserverclient.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c +index c9a4eb521e..b5c764b1b0 100644 +--- a/src/rpc/virnetserverclient.c ++++ b/src/rpc/virnetserverclient.c +@@ -1257,13 +1257,10 @@ static virNetMessage *virNetServerClientDispatchRead(virNetServerClient *client) + + /* Possibly need to create another receive buffer */ + if (client->nrequests < client->nrequests_max) { +- if (!(client->rx = virNetMessageNew(true))) { +- client->wantClose = true; +- } else { +- client->rx->bufferLength = VIR_NET_MESSAGE_LEN_MAX; +- client->rx->buffer = g_new0(char, client->rx->bufferLength); +- client->nrequests++; +- } ++ client->rx = virNetMessageNew(true); ++ client->rx->bufferLength = VIR_NET_MESSAGE_LEN_MAX; ++ client->rx->buffer = g_new0(char, client->rx->bufferLength); ++ client->nrequests++; + } else if (!client->nrequests_warning) { + client->nrequests_warning = true; + VIR_WARN("Client hit max requests limit %zd. This may result " +-- +2.39.1 + diff --git a/SOURCES/libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch b/SOURCES/libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch new file mode 100644 index 0000000..e585288 --- /dev/null +++ b/SOURCES/libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch @@ -0,0 +1,61 @@ +From a967747fcdf7d78425d218625ddb42606451c2ab Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Wed, 18 Jan 2023 09:03:29 +0100 +Subject: [PATCH] src: Don't use virReportSystemError() on + virProcessGetStatInfo() failure + +Firstly, the virProcessGetStatInfo() does not fail really. But +even if it did, it sets correct errno only sometimes (and even +that is done in a helper it's calling - virProcessGetStat() and +even there it's the case only in very few error paths). + +Therefore, using virReportSystemError() to report errors is very +misleading. Use plain virReportError() instead. Luckily, there +are only two places where the former was used: +chDomainHelperGetVcpus() and qemuDomainHelperGetVcpus() (not a +big surprise since CH driver is heavily inspired by QEMU driver). + +Signed-off-by: Michal Privoznik +Reviewed-by: Martin Kletzander +(cherry picked from commit 818c9717c53446ca7abbaa7b3fd7925e1c5ab663) +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2148266 +Signed-off-by: Michal Privoznik +--- + src/ch/ch_driver.c | 4 ++-- + src/qemu/qemu_driver.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c +index db2a66d131..12fbe31c24 100644 +--- a/src/ch/ch_driver.c ++++ b/src/ch/ch_driver.c +@@ -1079,8 +1079,8 @@ chDomainHelperGetVcpus(virDomainObj *vm, + NULL, NULL, + &vcpuinfo->cpu, NULL, + vm->pid, vcpupid) < 0) { +- virReportSystemError(errno, "%s", +- _("cannot get vCPU placement & pCPU time")); ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", ++ _("cannot get vCPU placement & pCPU time")); + return -1; + } + } +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index d6879175fe..c576c601ad 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -1355,8 +1355,8 @@ qemuDomainHelperGetVcpus(virDomainObj *vm, + NULL, NULL, + &vcpuinfo->cpu, NULL, + vm->pid, vcpupid) < 0) { +- virReportSystemError(errno, "%s", +- _("cannot get vCPU placement & pCPU time")); ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", ++ _("cannot get vCPU placement & pCPU time")); + return -1; + } + } +-- +2.39.1 + diff --git a/SOURCES/libvirt-vircgroupv2-fix-cpu.weight-limits-check.patch b/SOURCES/libvirt-vircgroupv2-fix-cpu.weight-limits-check.patch new file mode 100644 index 0000000..8e1a60c --- /dev/null +++ b/SOURCES/libvirt-vircgroupv2-fix-cpu.weight-limits-check.patch @@ -0,0 +1,59 @@ +From 28bd414db666463dca0a26bbb969fd6bc784ec8e Mon Sep 17 00:00:00 2001 +Message-Id: <28bd414db666463dca0a26bbb969fd6bc784ec8e@dist-git> +From: Pavel Hrdina +Date: Tue, 17 Jan 2023 10:02:07 +0100 +Subject: [PATCH] vircgroupv2: fix cpu.weight limits check + +The cgroup v2 cpu.weight limits are different than cgroup v1 cpu.shares +limits. + +Signed-off-by: Pavel Hrdina +Reviewed-by: Martin Kletzander +(cherry picked from commit cf3414a85b8383d71d6ae2a53daf63c331cc2230) + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2037998 + +Signed-off-by: Pavel Hrdina +--- + src/util/vircgroup.h | 2 ++ + src/util/vircgroupv2.c | 8 ++++---- + 2 files changed, 6 insertions(+), 4 deletions(-) + +diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h +index 690f09465c..adf3850b22 100644 +--- a/src/util/vircgroup.h ++++ b/src/util/vircgroup.h +@@ -235,6 +235,8 @@ int virCgroupGetCpuShares(virCgroup *group, unsigned long long *shares); + /* Based on kernel code ((1ULL << MAX_BW_BITS) - 1) where MAX_BW_BITS is + * (64 - BW_SHIFT) and BW_SHIFT is 20 */ + #define VIR_CGROUP_CPU_QUOTA_MAX 17592186044415LL ++#define VIR_CGROUPV2_WEIGHT_MIN 1LL ++#define VIR_CGROUPV2_WEIGHT_MAX 10000LL + + int virCgroupSetCpuCfsPeriod(virCgroup *group, unsigned long long cfs_period); + int virCgroupGetCpuCfsPeriod(virCgroup *group, unsigned long long *cfs_period); +diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c +index b1f562aa52..219b9c7f21 100644 +--- a/src/util/vircgroupv2.c ++++ b/src/util/vircgroupv2.c +@@ -1499,13 +1499,13 @@ static int + virCgroupV2SetCpuShares(virCgroup *group, + unsigned long long shares) + { +- if (shares < VIR_CGROUP_CPU_SHARES_MIN || +- shares > VIR_CGROUP_CPU_SHARES_MAX) { ++ if (shares < VIR_CGROUPV2_WEIGHT_MIN || ++ shares > VIR_CGROUPV2_WEIGHT_MAX) { + virReportError(VIR_ERR_INVALID_ARG, + _("shares '%llu' must be in range [%llu, %llu]"), + shares, +- VIR_CGROUP_CPU_SHARES_MIN, +- VIR_CGROUP_CPU_SHARES_MAX); ++ VIR_CGROUPV2_WEIGHT_MIN, ++ VIR_CGROUPV2_WEIGHT_MAX); + return -1; + } + +-- +2.39.1 + diff --git a/SOURCES/libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch b/SOURCES/libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch deleted file mode 100644 index 84802e4..0000000 --- a/SOURCES/libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch +++ /dev/null @@ -1,64 +0,0 @@ -From e13ab5c97f266eb688bc22e1124291563770370d Mon Sep 17 00:00:00 2001 -Message-Id: -From: Michal Privoznik -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: - - - - - - -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 -Reviewed-by: Ján Tomko -(cherry picked from commit d33c2a9e2f933b31f8e96e9938c237bdffe27f84) -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-virsh-Implement-config-for-iothreadset.patch b/SOURCES/libvirt-virsh-Implement-config-for-iothreadset.patch deleted file mode 100644 index 0ef1196..0000000 --- a/SOURCES/libvirt-virsh-Implement-config-for-iothreadset.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 02ebd15a48da7a53560bbea5e530a5b9c929daee Mon Sep 17 00:00:00 2001 -Message-Id: <02ebd15a48da7a53560bbea5e530a5b9c929daee@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Ján Tomko -(cherry picked from commit 3ff558c1c171f66da84b10c81937c1a6895ec6fb) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2059511 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-virsh-Make-domif-setlink-work-more-than-once.patch b/SOURCES/libvirt-virsh-Make-domif-setlink-work-more-than-once.patch new file mode 100644 index 0000000..7d4726a --- /dev/null +++ b/SOURCES/libvirt-virsh-Make-domif-setlink-work-more-than-once.patch @@ -0,0 +1,47 @@ +From f895d23743a65141a2db7f816e56d18c9c4de6df Mon Sep 17 00:00:00 2001 +Message-Id: +From: Michal Privoznik +Date: Mon, 30 Jan 2023 10:55:22 +0100 +Subject: [PATCH] virsh: Make domif-setlink work more than once +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In virsh, we have this convenient domif-setlink command, which is +just a wrapper over virDomainUpdateDeviceFlags() and which allows +setting link state of given guest NIC. It does so by fetching +corresponding XML snippet and either putting into it, OR if the element already exists setting the +attribute to desired value. The XML is then fed into the update +API. + +There's, however, a small bug in detecting the pre-existence of +the element and its attribute. The code looks at "link" +attribute, while in fact, the attribute is called "state". + +Resolves: https://gitlab.com/libvirt/libvirt/-/issues/426 +Fixes: e575bf082ed4889280be07c986375f1ca15bb7ee +Signed-off-by: Michal Privoznik +Reviewed-by: Ján Tomko +(cherry picked from commit 6f3f6c0f763b9ffd8ef93eb124c88dd0b79138fc) +https://bugzilla.redhat.com/show_bug.cgi?id=2165466 +--- + tools/virsh-domain.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c +index 6b431bd1e5..59b2b3ce60 100644 +--- a/tools/virsh-domain.c ++++ b/tools/virsh-domain.c +@@ -3209,7 +3209,7 @@ cmdDomIfSetLink(vshControl *ctl, const vshCmd *cmd) + } + } + +- if (xmlHasProp(linkNode, BAD_CAST "link")) ++ if (xmlHasProp(linkNode, BAD_CAST "state")) + stateAttr = xmlSetProp(linkNode, BAD_CAST "state", BAD_CAST state); + else + stateAttr = xmlNewProp(linkNode, BAD_CAST "state", BAD_CAST state); +-- +2.39.1 + diff --git a/SOURCES/libvirt-virsh-Require-xpath-for-dumpxml.patch b/SOURCES/libvirt-virsh-Require-xpath-for-dumpxml.patch deleted file mode 100644 index 1400494..0000000 --- a/SOURCES/libvirt-virsh-Require-xpath-for-dumpxml.patch +++ /dev/null @@ -1,215 +0,0 @@ -From 045c3fbdc6f4a5b98013a00fcaefcd3481c1df39 Mon Sep 17 00:00:00 2001 -Message-Id: <045c3fbdc6f4a5b98013a00fcaefcd3481c1df39@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Peter Krempa -(cherry picked from commit e90d48ae6e22eaf1650f920abc0a6b87d2daa82b) -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/libvirt-virtpm-Introduce-TPM-1.2-and-TPM-2.0-capabilieis.patch b/SOURCES/libvirt-virtpm-Introduce-TPM-1.2-and-TPM-2.0-capabilieis.patch deleted file mode 100644 index 6891c08..0000000 --- a/SOURCES/libvirt-virtpm-Introduce-TPM-1.2-and-TPM-2.0-capabilieis.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 6d21624edd73edb9b59e5dac0d98d0812e9bf0ad Mon Sep 17 00:00:00 2001 -Message-Id: <6d21624edd73edb9b59e5dac0d98d0812e9bf0ad@dist-git> -From: Michal Privoznik -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 -Reviewed-by: Peter Krempa -(cherry picked from commit 7b37763278c44887789e80a6058ee27953c0e5e6) -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103119 -Signed-off-by: Michal Privoznik ---- - 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 - diff --git a/SOURCES/symlinks b/SOURCES/symlinks index 430872a..df232a6 100644 --- a/SOURCES/symlinks +++ b/SOURCES/symlinks @@ -89,9 +89,7 @@ tests/qemuxml2argvdata/aarch64-gic-none-v3.xml aarch64-gic-none-v2.xml tests/qemuxml2argvdata/aarch64-gic-none.args aarch64-gic-v2.args tests/qemuxml2argvdata/cpu-check-full.args cpu-check-none.args tests/qemuxml2argvdata/cpu-check-partial.args cpu-check-none.args -tests/qemuxml2argvdata/cpu-numa-memshared-1.xml cpu-numa-memshared.xml tests/qemuxml2argvdata/disk-backing-chains-index.x86_64-latest.args disk-backing-chains-noindex.x86_64-latest.args -tests/qemuxml2argvdata/disk-backing-chains-noindex.x86_64-4.1.0.args disk-backing-chains-index.x86_64-4.1.0.args tests/qemuxml2argvdata/mach-virt-console-native.args mach-virt-serial-native.args tests/qemuxml2argvdata/mach-virt-serial+console-native.args mach-virt-serial-native.args tests/qemuxml2argvdata/mach-virt-serial-compat.args mach-virt-serial-native.args @@ -100,21 +98,12 @@ tests/qemuxml2argvdata/memory-hotplug-ppc64-nonuma-abi-update.xml memory-hotplug tests/qemuxml2argvdata/pci-rom-disabled-invalid.args pci-rom-disabled.args tests/qemuxml2argvdata/ppc64-usb-controller-legacy.xml ppc64-usb-controller.xml tests/qemuxml2argvdata/ppc64-usb-controller-qemu-xhci.xml ppc64-usb-controller.xml -tests/qemuxml2argvdata/pseries-console-native.args pseries-serial-native.args -tests/qemuxml2argvdata/pseries-features-ccf.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-cfpc.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-hpt-pagesize.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-htm.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-ibs.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-nested-hv.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-features-sbbc.xml pseries-features.xml -tests/qemuxml2argvdata/pseries-serial+console-native.args pseries-serial-native.args -tests/qemuxml2argvdata/pseries-serial-compat.args pseries-serial-native.args -tests/qemuxml2argvdata/q35-virtio-pci.xml q35-pcie.xml +tests/qemuxml2argvdata/pseries-console-native.ppc64-latest.args pseries-serial-native.ppc64-latest.args +tests/qemuxml2argvdata/pseries-serial+console-native.ppc64-latest.args pseries-serial-native.ppc64-latest.args +tests/qemuxml2argvdata/pseries-serial-compat.ppc64-latest.args pseries-serial-native.ppc64-latest.args tests/qemuxml2argvdata/usb-controller-default-unavailable-q35.xml usb-controller-default-q35.xml tests/qemuxml2argvdata/usb-controller-explicit-unavailable-q35.xml usb-controller-explicit-q35.xml tests/qemuxml2argvdata/usb-controller-qemu-xhci-unavailable.xml usb-controller-qemu-xhci.xml -tests/qemuxml2argvdata/user-aliases2.args boot-floppy-q35.args tests/qemuxml2xmloutdata/aarch64-gic-default-both.xml ../qemuxml2argvdata/aarch64-gic-v3.xml tests/qemuxml2xmloutdata/aarch64-gic-default-v2.xml ../qemuxml2argvdata/aarch64-gic-v2.xml tests/qemuxml2xmloutdata/aarch64-gic-default-v3.xml ../qemuxml2argvdata/aarch64-gic-v3.xml @@ -159,11 +148,11 @@ tests/qemuxml2xmloutdata/boot-floppy-q35.xml ../qemuxml2argvdata/boot-floppy-q35 tests/qemuxml2xmloutdata/clock-realtime.xml ../qemuxml2argvdata/clock-realtime.xml tests/qemuxml2xmloutdata/clock-timer-armvtimer.aarch64-latest.xml ../qemuxml2argvdata/clock-timer-armvtimer.xml tests/qemuxml2xmloutdata/disk-detect-zeroes.x86_64-latest.xml ../qemuxml2argvdata/disk-detect-zeroes.xml -tests/qemuxml2xmloutdata/disk-nvme.xml ../qemuxml2argvdata/disk-nvme.xml +tests/qemuxml2xmloutdata/disk-nvme.x86_64-latest.xml ../qemuxml2argvdata/disk-nvme.xml tests/qemuxml2xmloutdata/disk-virtio-queues.x86_64-latest.xml ../qemuxml2argvdata/disk-virtio-queues.xml tests/qemuxml2xmloutdata/disk-virtio-scsi-reservations.xml ../qemuxml2argvdata/disk-virtio-scsi-reservations.xml tests/qemuxml2xmloutdata/downscript.xml ../qemuxml2argvdata/downscript.xml -tests/qemuxml2xmloutdata/encrypted-disk-usage.xml ../qemuxml2argvdata/encrypted-disk-usage.xml +tests/qemuxml2xmloutdata/encrypted-disk-usage.x86_64-latest.xml ../qemuxml2argvdata/encrypted-disk-usage.xml tests/qemuxml2xmloutdata/fd-memory-no-numa-topology.xml ../qemuxml2argvdata/fd-memory-no-numa-topology.xml tests/qemuxml2xmloutdata/fd-memory-numa-topology.xml ../qemuxml2argvdata/fd-memory-numa-topology.xml tests/qemuxml2xmloutdata/fd-memory-numa-topology2.xml ../qemuxml2argvdata/fd-memory-numa-topology2.xml @@ -174,12 +163,19 @@ tests/qemuxml2xmloutdata/graphics-dbus-audio.xml ../qemuxml2argvdata/graphics-db tests/qemuxml2xmloutdata/graphics-dbus-chardev.xml ../qemuxml2argvdata/graphics-dbus-chardev.xml tests/qemuxml2xmloutdata/graphics-dbus-p2p.xml ../qemuxml2argvdata/graphics-dbus-p2p.xml tests/qemuxml2xmloutdata/graphics-dbus.xml ../qemuxml2argvdata/graphics-dbus.xml -tests/qemuxml2xmloutdata/hugepages-default-2M.xml ../qemuxml2argvdata/hugepages-default-2M.xml -tests/qemuxml2xmloutdata/hugepages-default-system-size.xml ../qemuxml2argvdata/hugepages-default-system-size.xml -tests/qemuxml2xmloutdata/hugepages-memaccess.xml ../qemuxml2argvdata/hugepages-memaccess.xml -tests/qemuxml2xmloutdata/hugepages-memaccess2.xml ../qemuxml2argvdata/hugepages-memaccess2.xml -tests/qemuxml2xmloutdata/hugepages-numa-default-dimm.xml ../qemuxml2argvdata/hugepages-numa-default-dimm.xml -tests/qemuxml2xmloutdata/hugepages-nvdimm.xml ../qemuxml2argvdata/hugepages-nvdimm.xml +tests/qemuxml2xmloutdata/hugepages-default-2M.x86_64-latest.xml ../qemuxml2argvdata/hugepages-default-2M.xml +tests/qemuxml2xmloutdata/hugepages-default-system-size.x86_64-latest.xml ../qemuxml2argvdata/hugepages-default-system-size.xml +tests/qemuxml2xmloutdata/hugepages-default.x86_64-latest.xml ../qemuxml2argvdata/hugepages-default.xml +tests/qemuxml2xmloutdata/hugepages-memaccess.x86_64-latest.xml ../qemuxml2argvdata/hugepages-memaccess.xml +tests/qemuxml2xmloutdata/hugepages-memaccess2.x86_64-latest.xml ../qemuxml2argvdata/hugepages-memaccess2.xml +tests/qemuxml2xmloutdata/hugepages-memaccess3.x86_64-latest.xml ../qemuxml2argvdata/hugepages-memaccess3.xml +tests/qemuxml2xmloutdata/hugepages-nodeset.x86_64-latest.xml ../qemuxml2argvdata/hugepages-nodeset.xml +tests/qemuxml2xmloutdata/hugepages-numa-default-2M.x86_64-latest.xml ../qemuxml2argvdata/hugepages-numa-default-2M.xml +tests/qemuxml2xmloutdata/hugepages-numa-default-dimm.x86_64-latest.xml ../qemuxml2argvdata/hugepages-numa-default-dimm.xml +tests/qemuxml2xmloutdata/hugepages-numa-nodeset-part.x86_64-latest.xml ../qemuxml2argvdata/hugepages-numa-nodeset-part.xml +tests/qemuxml2xmloutdata/hugepages-numa-nodeset.x86_64-latest.xml ../qemuxml2argvdata/hugepages-numa-nodeset.xml +tests/qemuxml2xmloutdata/hugepages-nvdimm.x86_64-latest.xml ../qemuxml2argvdata/hugepages-nvdimm.xml +tests/qemuxml2xmloutdata/hugepages-shared.x86_64-latest.xml ../qemuxml2argvdata/hugepages-shared.xml tests/qemuxml2xmloutdata/input-linux.x86_64-latest.xml ../qemuxml2argvdata/input-linux.xml tests/qemuxml2xmloutdata/intel-iommu-aw-bits.x86_64-latest.xml ../qemuxml2argvdata/intel-iommu-aw-bits.xml tests/qemuxml2xmloutdata/intel-iommu-caching-mode.x86_64-latest.xml ../qemuxml2argvdata/intel-iommu-caching-mode.xml @@ -205,14 +201,14 @@ tests/qemuxml2xmloutdata/memory-hotplug-ppc64-nonuma.xml ../qemuxml2argvdata/mem tests/qemuxml2xmloutdata/memory-hotplug-virtio-mem.x86_64-latest.xml ../qemuxml2argvdata/memory-hotplug-virtio-mem.xml tests/qemuxml2xmloutdata/memory-hotplug-virtio-pmem.x86_64-latest.xml ../qemuxml2argvdata/memory-hotplug-virtio-pmem.xml tests/qemuxml2xmloutdata/net-user-addr.xml ../qemuxml2argvdata/net-user-addr.xml +tests/qemuxml2xmloutdata/net-user-passt.xml ../qemuxml2argvdata/net-user-passt.xml tests/qemuxml2xmloutdata/net-virtio-rss.x86_64-latest.xml ../qemuxml2argvdata/net-virtio-rss.xml tests/qemuxml2xmloutdata/net-virtio-teaming-hostdev.xml ../qemuxml2argvdata/net-virtio-teaming-hostdev.xml tests/qemuxml2xmloutdata/numatune-hmat.xml ../qemuxml2argvdata/numatune-hmat.xml tests/qemuxml2xmloutdata/numatune-memnode-restrictive-mode.x86_64-latest.xml ../qemuxml2argvdata/numatune-memnode-restrictive-mode.xml tests/qemuxml2xmloutdata/numatune-no-vcpu.xml ../qemuxml2argvdata/numatune-no-vcpu.xml -tests/qemuxml2xmloutdata/os-firmware-efi-no-enrolled-keys.x86_64-latest.xml ../qemuxml2argvdata/os-firmware-efi-no-enrolled-keys.xml -tests/qemuxml2xmloutdata/pages-dimm-discard.xml ../qemuxml2argvdata/pages-dimm-discard.xml -tests/qemuxml2xmloutdata/pages-discard-hugepages.xml ../qemuxml2argvdata/pages-discard-hugepages.xml +tests/qemuxml2xmloutdata/pages-dimm-discard.x86_64-latest.xml ../qemuxml2argvdata/pages-dimm-discard.xml +tests/qemuxml2xmloutdata/pages-discard-hugepages.x86_64-latest.xml ../qemuxml2argvdata/pages-discard-hugepages.xml tests/qemuxml2xmloutdata/pages-discard.xml ../qemuxml2argvdata/pages-discard.xml tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-disable.x86_64-latest.xml ../qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-disable.xml tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-enable.x86_64-latest.xml ../qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-enable.xml @@ -220,15 +216,17 @@ tests/qemuxml2xmloutdata/pseries-console-native.ppc64-latest.xml pseries-serial- tests/qemuxml2xmloutdata/pseries-serial+console-native.ppc64-latest.xml pseries-serial-native.ppc64-latest.xml tests/qemuxml2xmloutdata/pseries-serial-compat.ppc64-latest.xml pseries-serial-native.ppc64-latest.xml tests/qemuxml2xmloutdata/serial-tcp-tlsx509-chardev-notls.xml ../qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.xml +tests/qemuxml2xmloutdata/sgx-epc.x86_64-7.0.0.xml ../qemuxml2argvdata/sgx-epc.xml tests/qemuxml2xmloutdata/smbios-type-fwcfg.xml ../qemuxml2argvdata/smbios-type-fwcfg.xml tests/qemuxml2xmloutdata/tpm-emulator-spapr.ppc64-latest.xml ../qemuxml2argvdata/tpm-emulator-spapr.xml tests/qemuxml2xmloutdata/tpm-emulator-tpm2-enc.x86_64-latest.xml ../qemuxml2argvdata/tpm-emulator-tpm2-enc.xml tests/qemuxml2xmloutdata/tpm-emulator-tpm2-pstate.x86_64-latest.xml ../qemuxml2argvdata/tpm-emulator-tpm2-pstate.xml tests/qemuxml2xmloutdata/tpm-emulator-tpm2.x86_64-latest.xml ../qemuxml2argvdata/tpm-emulator-tpm2.xml tests/qemuxml2xmloutdata/tpm-emulator.x86_64-latest.xml ../qemuxml2argvdata/tpm-emulator.xml +tests/qemuxml2xmloutdata/tpm-external.x86_64-latest.xml ../qemuxml2argvdata/tpm-external.xml tests/qemuxml2xmloutdata/tpm-passthrough-crb.x86_64-latest.xml ../qemuxml2argvdata/tpm-passthrough-crb.xml tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml ../qemuxml2argvdata/tpm-passthrough.xml -tests/qemuxml2xmloutdata/user-aliases.xml ../qemuxml2argvdata/user-aliases.xml +tests/qemuxml2xmloutdata/user-aliases.x86_64-latest.xml ../qemuxml2argvdata/user-aliases.xml tests/qemuxml2xmloutdata/vcpu-placement-static.xml ../qemuxml2argvdata/vcpu-placement-static.xml tests/qemuxml2xmloutdata/vhost-user-fs-fd-memory.x86_64-latest.xml ../qemuxml2argvdata/vhost-user-fs-fd-memory.xml tests/qemuxml2xmloutdata/vhost-user-fs-hugepages.x86_64-latest.xml ../qemuxml2argvdata/vhost-user-fs-hugepages.xml diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec index 898e949..d80f56a 100644 --- a/SPECS/libvirt.spec +++ b/SPECS/libvirt.spec @@ -61,11 +61,6 @@ # Then the secondary host drivers, which run inside libvirtd %define with_storage_rbd 0%{!?_without_storage_rbd:1} -%if 0%{?fedora} - %define with_storage_sheepdog 0%{!?_without_storage_sheepdog:1} -%else - %define with_storage_sheepdog 0 -%endif %define with_storage_gluster 0%{!?_without_storage_gluster:1} %if 0%{?rhel} @@ -143,7 +138,6 @@ %define with_netcf 0%{!?_without_netcf:1} %endif - # fuse is used to provide virtualized /proc for LXC %if %{with_lxc} %define with_fuse 0%{!?_without_fuse:1} @@ -197,6 +191,10 @@ %define qemu_moddir %{_libdir}/qemu %define qemu_datadir %{_datadir}/qemu +%define with_mingw 0 +%if 0%{?fedora} + %define with_mingw 0%{!?_without_mingw:1} +%endif # RHEL releases provide stable tool chains and so it is safe to turn # compiler warning into errors without being worried about frequent @@ -230,8 +228,8 @@ Summary: Library providing a simple virtualization API Name: libvirt -Version: 8.5.0 -Release: 5%{?dist}%{?extra_release} +Version: 9.0.0 +Release: 7%{?dist}%{?extra_release} License: LGPLv2+ URL: https://libvirt.org/ @@ -240,38 +238,37 @@ URL: https://libvirt.org/ %endif Source: https://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.xz Source1: symlinks -Patch1: libvirt-domain_conf-Format-defaultiothread-more-often.patch -Patch2: libvirt-domain_conf-Format-iothread-IDs-more-often.patch -Patch3: libvirt-qemu-Make-IOThread-changing-more-robust.patch -Patch4: libvirt-qemuDomainSetIOThreadParams-Accept-VIR_DOMAIN_AFFECT_CONFIG-flag.patch -Patch5: libvirt-virsh-Implement-config-for-iothreadset.patch -Patch6: libvirt-docs-Document-TPM-portion-of-domcaps.patch -Patch7: libvirt-virtpm-Introduce-TPM-1.2-and-TPM-2.0-capabilieis.patch -Patch8: libvirt-domcaps-Introduce-TPM-backendVersion.patch -Patch9: libvirt-qemu-Report-supported-TPM-version-in-domcaps.patch -Patch10: libvirt-vircpi-Add-PCIe-5.0-and-6.0-link-speeds.patch -Patch11: libvirt-qemu-introduce-capability-QEMU_CAPS_MIGRATION_BLOCKED_REASONS.patch -Patch12: libvirt-qemu-new-function-to-retrieve-migration-blocker-reasons-from-QEMU.patch -Patch13: libvirt-qemu-query-QEMU-for-migration-blockers-before-our-own-harcoded-checks.patch -Patch14: libvirt-qemu-remove-hardcoded-migration-fail-for-vDPA-devices-if-we-can-ask-QEMU.patch -Patch15: libvirt-qemu_migration-Use-EnterMonitorAsync-in-qemuDomainGetMigrationBlockers.patch -Patch16: libvirt-qemu-don-t-try-to-query-QEMU-about-migration-blockers-during-offline-migration.patch -Patch17: libvirt-qemu_migration-Acquire-correct-job-in-qemuMigrationSrcIsAllowed.patch -Patch18: libvirt-virsh-Require-xpath-for-dumpxml.patch -Patch19: libvirt-qemu-skip-hardcoded-hostdev-migration-check-if-QEMU-can-do-it-for-us.patch -Patch20: libvirt-qemu-Pass-migration-flags-to-qemuMigrationParamsApply.patch -Patch21: libvirt-qemu_migration_params-Replace-qemuMigrationParamTypes-array.patch -Patch22: libvirt-qemu_migration-Pass-migParams-to-qemuMigrationSrcResume.patch -Patch23: libvirt-qemu_migration-Apply-max-postcopy-bandwidth-on-post-copy-resume.patch -Patch24: libvirt-qemu-Always-assume-support-for-QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE.patch -Patch25: libvirt-qemu_migration-Store-original-migration-params-in-status-XML.patch -Patch26: libvirt-qemu_migration_params-Refactor-qemuMigrationParamsApply.patch -Patch27: libvirt-qemu_migration_params-Refactor-qemuMigrationParamsReset.patch -Patch28: libvirt-qemu_migration_params-Avoid-deadlock-in-qemuMigrationParamsReset.patch -Patch29: libvirt-qemu-Restore-original-memory-locking-limit-on-reconnect.patch -Patch30: libvirt-qemu-Properly-release-job-in-qemuDomainSaveInternal.patch -Patch31: libvirt-qemu-don-t-call-qemuMigrationSrcIsAllowedHostdev-from-qemuMigrationDstPrepareFresh.patch -Patch32: libvirt-rpc-Pass-OPENSSL_CONF-through-to-ssh-invocations.patch +Patch1: libvirt-vircgroupv2-fix-cpu.weight-limits-check.patch +Patch2: libvirt-domain_validate-drop-cpu.shares-cgroup-check.patch +Patch3: libvirt-docs-document-correct-cpu-shares-limits-with-both-cgroups-v1-and-v2.patch +Patch4: libvirt-qemu_interface-Fix-managed-no-case-when-creating-an-ethernet-interface.patch +Patch5: libvirt-conf-clarify-some-external-TPM-error-messages.patch +Patch6: libvirt-qemu-hotplug-Remove-legacy-quirk-for-dimm-address-generation.patch +Patch7: libvirt-qemu-alias-Remove-oldAlias-argument-of-qemuAssignDeviceMemoryAlias.patch +Patch8: libvirt-qemu-Remove-memAliasOrderMismatch-field-from-VM-private-data.patch +Patch9: libvirt-rpc-Fix-error-message-in-virNetServerSetClientLimits.patch +Patch10: libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch +Patch11: libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch +Patch12: libvirt-virsh-Make-domif-setlink-work-more-than-once.patch +Patch13: libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch +Patch14: libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch +Patch15: libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch +Patch16: libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch +Patch17: libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch +Patch18: libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch +Patch19: libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch +Patch20: libvirt-qemuProcessStop-Fix-detection-of-outgoing-migration-for-external-devices.patch +Patch21: libvirt-qemuExtTPMStop-Restore-TPM-state-label-more-often.patch +Patch22: libvirt-qemuProcessLaunch-Tighten-rules-for-external-devices-wrt-incoming-migration.patch +Patch23: libvirt-qemu_process-Produce-better-debug-message-wrt-domain-namespaces.patch +Patch24: libvirt-qemu_namespace-Deal-with-nested-mounts-when-umount-ing-dev.patch +Patch25: libvirt-qemuProcessRefreshDisks-Don-t-skip-filling-of-disk-information-if-tray-state-didn-t-change.patch +Patch26: libvirt-qemu_extdevice-Do-cleanup-host-only-for-VIR_DOMAIN_TPM_TYPE_EMULATOR.patch +Patch27: libvirt-qemu-blockjob-Handle-pending-blockjob-state-only-when-we-need-it.patch +Patch28: libvirt-rpc-client-Don-t-check-return-value-of-virNetMessageNew.patch +Patch29: libvirt-rpc-Don-t-warn-about-max_client_requests-in-single-threaded-daemons.patch +Patch30: libvirt-qemu_snapshot-remove-memory-snapshot-when-deleting-external-snapshot.patch +Patch31: libvirt-qemu_snapshot-refactor-qemuSnapshotDeleteExternalPrepare.patch Requires: libvirt-daemon = %{version}-%{release} @@ -293,7 +290,6 @@ Obsoletes: libvirt-daemon-uml <= 5.0.0 Requires: libvirt-daemon-driver-vbox = %{version}-%{release} %endif Requires: libvirt-daemon-driver-nwfilter = %{version}-%{release} - Requires: libvirt-daemon-driver-interface = %{version}-%{release} Requires: libvirt-daemon-driver-secret = %{version}-%{release} Requires: libvirt-daemon-driver-storage = %{version}-%{release} @@ -306,7 +302,7 @@ Requires: libvirt-libs = %{version}-%{release} # listed against each sub-RPM BuildRequires: python3-docutils BuildRequires: gcc -BuildRequires: meson >= 0.54.0 +BuildRequires: meson >= 0.56.0 BuildRequires: ninja-build BuildRequires: git BuildRequires: perl-interpreter @@ -328,6 +324,7 @@ BuildRequires: libblkid-devel >= 2.17 # for augparse, optionally used in testing BuildRequires: augeas BuildRequires: systemd-devel >= 185 +BuildRequires: systemd-rpm-macros BuildRequires: libpciaccess-devel >= 0.10.9 BuildRequires: yajl-devel %if %{with_sanlock} @@ -369,9 +366,6 @@ BuildRequires: librbd-devel BuildRequires: glusterfs-api-devel >= 3.4.1 BuildRequires: glusterfs-devel >= 3.4.1 %endif -%if %{with_storage_sheepdog} -BuildRequires: sheepdog -%endif %if %{with_numactl} # For QEMU/LXC numa info BuildRequires: numactl-devel @@ -386,6 +380,9 @@ BuildRequires: libssh2-devel >= 1.3.0 %if %{with_netcf} BuildRequires: netcf-devel >= 0.2.2 %endif +%if (0%{?fedora} >= 36) || (0%{?rhel} >= 9) +BuildRequires: passt +%endif %if %{with_esx} BuildRequires: libcurl-devel %endif @@ -395,38 +392,59 @@ BuildRequires: libwsman-devel >= 2.6.3 BuildRequires: audit-libs-devel # we need /usr/sbin/dtrace BuildRequires: systemtap-sdt-devel - # For mount/umount in FS driver BuildRequires: util-linux # For showmount in FS driver (netfs discovery) BuildRequires: nfs-utils - # Fedora build root suckage BuildRequires: gawk - # For storage wiping with different algorithms BuildRequires: scrub - %if %{with_numad} BuildRequires: numad %endif - %if %{with_wireshark} BuildRequires: wireshark-devel %endif - %if %{with_libssh} -BuildRequires: libssh-devel >= 0.7.0 +BuildRequires: libssh-devel >= 0.8.1 %endif - BuildRequires: rpcgen BuildRequires: libtirpc-devel - # Needed for the firewalld_reload macro %if %{with_firewalld_zone} BuildRequires: firewalld-filesystem %endif +%if %{with_mingw} +BuildRequires: mingw32-filesystem +BuildRequires: mingw32-gcc +BuildRequires: mingw32-binutils +BuildRequires: mingw32-glib2 >= 2.48 +BuildRequires: mingw32-libgpg-error +BuildRequires: mingw32-libgcrypt +BuildRequires: mingw32-gnutls +BuildRequires: mingw32-gettext +BuildRequires: mingw32-libxml2 +BuildRequires: mingw32-portablexdr +BuildRequires: mingw32-dlfcn +BuildRequires: mingw32-libssh2 +BuildRequires: mingw32-curl +BuildRequires: mingw64-filesystem +BuildRequires: mingw64-gcc +BuildRequires: mingw64-binutils +BuildRequires: mingw64-glib2 >= 2.48 +BuildRequires: mingw64-libgpg-error +BuildRequires: mingw64-libgcrypt +BuildRequires: mingw64-gnutls +BuildRequires: mingw64-gettext +BuildRequires: mingw64-libxml2 +BuildRequires: mingw64-portablexdr +BuildRequires: mingw64-dlfcn +BuildRequires: mingw64-libssh2 +BuildRequires: mingw64-curl +%endif + %description Libvirt is a C toolkit to interact with the virtualization capabilities of recent versions of Linux (and other OSes). The main package includes @@ -446,23 +464,24 @@ Summary: Server side daemon and supporting files for libvirt library # for subpackages are listed later in those subpackages) # The client side, i.e. shared libs are in a subpackage -Requires: %{name}-libs = %{version}-%{release} - +Requires: libvirt-libs = %{version}-%{release} +# The libvirt-guests.sh script requires virsh from libvirt-client subpackage, +# but not every deployment wants to use libvirt-guests service. Using +# Recommends here will install libvirt-client by default (if available), but +# RPM won't complain if the package is unavailable, masked, or removed later. +Recommends: libvirt-client = %{version}-%{release} # netcat is needed on the server side so that clients that have # libvirt < 6.9.0 can connect, but newer versions will prefer # virt-ssh-helper. Making this a Recommends means that it gets # installed by default, but can still be removed if compatibility # with old clients is not required Recommends: /usr/bin/nc - # for modprobe of pci devices Requires: module-init-tools - # for /sbin/ip Requires: iproute # for /sbin/tc Requires: iproute-tc - Requires: polkit >= 0.112 %if %{with_dmidecode} # For virConnectGetSysinfo @@ -478,7 +497,11 @@ Requires: dbus # For uid creation during pre Requires(pre): shadow-utils # Needed by /usr/libexec/libvirt-guests.sh script. +%if 0%{?fedora} >= 37 +Requires: gettext-runtime +%else Requires: gettext +%endif # Ensure smooth upgrades Obsoletes: libvirt-admin < 7.3.0 @@ -520,7 +543,6 @@ The network driver plugin for the libvirtd daemon, providing an implementation of the virtual network APIs using the Linux bridge capabilities. - %package daemon-driver-nwfilter Summary: Nwfilter driver plugin for the libvirtd daemon Requires: libvirt-daemon = %{version}-%{release} @@ -533,7 +555,6 @@ The nwfilter driver plugin for the libvirtd daemon, providing an implementation of the firewall APIs using the ebtables, iptables and ip6tables capabilities - %package daemon-driver-nodedev Summary: Nodedev driver plugin for the libvirtd daemon Requires: libvirt-daemon = %{version}-%{release} @@ -548,7 +569,6 @@ The nodedev driver plugin for the libvirtd daemon, providing an implementation of the node device APIs using the udev capabilities. - %package daemon-driver-interface Summary: Interface driver plugin for the libvirtd daemon Requires: libvirt-daemon = %{version}-%{release} @@ -582,8 +602,9 @@ Requires: util-linux Requires: /usr/bin/qemu-img %endif %if !%{with_storage_rbd} -Obsoletes: libvirt-daemon-driver-storage-rbd < %{version}-%{release} +Obsoletes: libvirt-daemon-driver-storage-rbd < 5.2.0 %endif +Obsoletes: libvirt-daemon-driver-storage-sheepdog < 8.8.0 %description daemon-driver-storage-core The storage driver plugin for the libvirtd daemon, providing @@ -600,7 +621,6 @@ Requires: lvm2 The storage driver backend adding implementation of the storage APIs for block volumes using lvm. - %package daemon-driver-storage-disk Summary: Storage driver plugin for disk Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} @@ -612,7 +632,6 @@ Requires: device-mapper The storage driver backend adding implementation of the storage APIs for block volumes using the host disks. - %package daemon-driver-storage-scsi Summary: Storage driver plugin for local scsi devices Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} @@ -622,7 +641,6 @@ Requires: libvirt-libs = %{version}-%{release} The storage driver backend adding implementation of the storage APIs for scsi host devices. - %package daemon-driver-storage-iscsi Summary: Storage driver plugin for iscsi Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} @@ -633,7 +651,6 @@ Requires: iscsi-initiator-utils The storage driver backend adding implementation of the storage APIs for iscsi volumes using the host iscsi stack. - %if %{with_storage_iscsi_direct} %package daemon-driver-storage-iscsi-direct Summary: Storage driver plugin for iscsi-direct @@ -645,7 +662,6 @@ The storage driver backend adding implementation of the storage APIs for iscsi volumes using libiscsi direct connection. %endif - %package daemon-driver-storage-mpath Summary: Storage driver plugin for multipath volumes Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} @@ -656,7 +672,6 @@ Requires: device-mapper The storage driver backend adding implementation of the storage APIs for multipath storage using device mapper. - %if %{with_storage_gluster} %package daemon-driver-storage-gluster Summary: Storage driver plugin for gluster @@ -674,7 +689,6 @@ The storage driver backend adding implementation of the storage APIs for gluster volumes using libgfapi. %endif - %if %{with_storage_rbd} %package daemon-driver-storage-rbd Summary: Storage driver plugin for rbd @@ -686,20 +700,6 @@ The storage driver backend adding implementation of the storage APIs for rbd volumes using the ceph protocol. %endif - -%if %{with_storage_sheepdog} -%package daemon-driver-storage-sheepdog -Summary: Storage driver plugin for sheepdog -Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} -Requires: libvirt-libs = %{version}-%{release} -Requires: sheepdog - -%description daemon-driver-storage-sheepdog -The storage driver backend adding implementation of the storage APIs for -sheepdog volumes using. -%endif - - %if %{with_storage_zfs} %package daemon-driver-storage-zfs Summary: Storage driver plugin for ZFS @@ -714,7 +714,6 @@ The storage driver backend adding implementation of the storage APIs for ZFS volumes. %endif - %package daemon-driver-storage Summary: Storage driver plugin including all backends for the libvirtd daemon Requires: libvirt-daemon-driver-storage-core = %{version}-%{release} @@ -732,9 +731,6 @@ Requires: libvirt-daemon-driver-storage-gluster = %{version}-%{release} %if %{with_storage_rbd} Requires: libvirt-daemon-driver-storage-rbd = %{version}-%{release} %endif -%if %{with_storage_sheepdog} -Requires: libvirt-daemon-driver-storage-sheepdog = %{version}-%{release} -%endif %if %{with_storage_zfs} Requires: libvirt-daemon-driver-storage-zfs = %{version}-%{release} %endif @@ -744,7 +740,6 @@ The storage driver plugin for the libvirtd daemon, providing an implementation of the storage APIs using LVM, iSCSI, parted and more. - %if %{with_qemu} %package daemon-driver-qemu Summary: QEMU driver plugin for the libvirtd daemon @@ -758,6 +753,9 @@ Requires: lzop Requires: xz Requires: systemd-container Requires: swtpm-tools + %if (0%{?fedora} >= 36) || (0%{?rhel} >= 9) +Recommends: passt + %endif %description daemon-driver-qemu The qemu driver plugin for the libvirtd daemon, providing @@ -765,7 +763,6 @@ an implementation of the hypervisor driver APIs using QEMU %endif - %if %{with_lxc} %package daemon-driver-lxc Summary: LXC driver plugin for the libvirtd daemon @@ -781,7 +778,6 @@ an implementation of the hypervisor driver APIs using the Linux kernel %endif - %if %{with_vbox} %package daemon-driver-vbox Summary: VirtualBox driver plugin for the libvirtd daemon @@ -794,7 +790,6 @@ an implementation of the hypervisor driver APIs using VirtualBox %endif - %if %{with_libxl} %package daemon-driver-libxl Summary: Libxl driver plugin for the libvirtd daemon @@ -808,8 +803,6 @@ an implementation of the hypervisor driver APIs using Libxl %endif - - %if %{with_qemu_tcg} %package daemon-qemu Summary: Server side daemon & driver required to run QEMU guests @@ -829,7 +822,6 @@ Server side daemon and driver required to manage the virtualization capabilities of the QEMU TCG emulators %endif - %if %{with_qemu_kvm} %package daemon-kvm Summary: Server side daemon & driver required to run KVM guests @@ -849,7 +841,6 @@ Server side daemon and driver required to manage the virtualization capabilities of the KVM hypervisor %endif - %if %{with_lxc} %package daemon-lxc Summary: Server side daemon & driver required to run LXC guests @@ -868,15 +859,12 @@ Server side daemon and driver required to manage the virtualization capabilities of LXC %endif - %if %{with_libxl} %package daemon-xen Summary: Server side daemon & driver required to run XEN guests Requires: libvirt-daemon = %{version}-%{release} - %if %{with_libxl} Requires: libvirt-daemon-driver-libxl = %{version}-%{release} - %endif Requires: libvirt-daemon-driver-interface = %{version}-%{release} Requires: libvirt-daemon-driver-network = %{version}-%{release} Requires: libvirt-daemon-driver-nodedev = %{version}-%{release} @@ -910,7 +898,7 @@ capabilities of VirtualBox %package client Summary: Client side utilities of the libvirt library -Requires: %{name}-libs = %{version}-%{release} +Requires: libvirt-libs = %{version}-%{release} # Needed by virt-pki-validate script. Requires: gnutls-utils @@ -921,6 +909,15 @@ Obsoletes: libvirt-bash-completion < 7.3.0 The client binaries needed to access the virtualization capabilities of recent versions of Linux (and other OSes). +%package client-qemu +Summary: Additional client side utilities for QEMU +Requires: libvirt-libs = %{version}-%{release} +Requires: python3-libvirt >= 3.7.0 + +%description client-qemu +The additional client binaries are used to interact +with some QEMU specific features of libvirt. + %package libs Summary: Client side libraries # So remote clients can access libvirt over SSH tunnel @@ -936,7 +933,7 @@ Shared libraries for accessing the libvirt daemon. %package wireshark Summary: Wireshark dissector plugin for libvirt RPC transactions Requires: wireshark -Requires: %{name}-libs = %{version}-%{release} +Requires: libvirt-libs = %{version}-%{release} %description wireshark Wireshark dissector plugin for better analysis of libvirt RPC traffic. @@ -945,7 +942,7 @@ Wireshark dissector plugin for better analysis of libvirt RPC traffic. %if %{with_lxc} %package login-shell Summary: Login shell for connecting users to an LXC container -Requires: %{name}-libs = %{version}-%{release} +Requires: libvirt-libs = %{version}-%{release} %description login-shell Provides the set-uid virt-login-shell binary that is used to @@ -955,7 +952,7 @@ namespaces. %package devel Summary: Libraries, includes, etc. to compile with the libvirt library -Requires: %{name}-libs = %{version}-%{release} +Requires: libvirt-libs = %{version}-%{release} Requires: pkgconfig %description devel @@ -967,8 +964,8 @@ Summary: Sanlock lock manager plugin for QEMU driver Requires: sanlock >= 2.4 #for virt-sanlock-cleanup require augeas Requires: augeas -Requires: %{name}-daemon = %{version}-%{release} -Requires: %{name}-libs = %{version}-%{release} +Requires: libvirt-daemon = %{version}-%{release} +Requires: libvirt-libs = %{version}-%{release} %description lock-sanlock Includes the Sanlock lock manager plugin for the QEMU @@ -982,9 +979,27 @@ Requires: libvirt-daemon-driver-network = %{version}-%{release} %description nss Libvirt plugin for NSS for translating domain names into IP addresses. +%if %{with_mingw} +%package -n mingw32-libvirt +Summary: %{summary} +Obsoletes: mingw32-libvirt-static < 7.0.0 +BuildArch: noarch -%prep +%description -n mingw32-libvirt +MinGW Windows libvirt virtualization library. + +%package -n mingw64-libvirt +Summary: %{summary} +Obsoletes: mingw64-libvirt-static < 7.0.0 +BuildArch: noarch + +%description -n mingw64-libvirt +MinGW Windows libvirt virtualization library. +%{?mingw_debug_package} +%endif + +%prep %autosetup -S git_am -N # "make dist" replaces all symlinks with a copy of the linked files; @@ -1072,12 +1087,6 @@ exit 1 %define arg_storage_rbd -Dstorage_rbd=disabled %endif -%if %{with_storage_sheepdog} - %define arg_storage_sheepdog -Dstorage_sheepdog=enabled -%else - %define arg_storage_sheepdog -Dstorage_sheepdog=disabled -%endif - %if %{with_storage_gluster} %define arg_storage_gluster -Dstorage_gluster=enabled -Dglusterfs=enabled %else @@ -1161,12 +1170,11 @@ exit 1 %define who %{?packager}%{!?packager:Unknown} %define arg_packager -Dpackager="%{who}, %{when}, %{where}" %define arg_packager_version -Dpackager_version="%{release}" - %define arg_selinux_mount -Dselinux_mount="/sys/fs/selinux" # place macros above and build commands below this comment -export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec) +export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/libvirt.spec) %meson \ -Drunstatedir=%{_rundir} \ @@ -1197,7 +1205,6 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec) -Dstorage_disk=enabled \ -Dstorage_mpath=enabled \ %{?arg_storage_rbd} \ - %{?arg_storage_sheepdog} \ %{?arg_storage_gluster} \ %{?arg_storage_zfs} \ -Dstorage_vstorage=disabled \ @@ -1242,10 +1249,87 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec) %meson_build +%if %{with_mingw} +%mingw_meson \ + --auto-features=enabled \ + -Ddriver_remote=enabled \ + -Ddriver_test=enabled \ + -Ddriver_esx=enabled \ + -Dcurl=enabled \ + -Ddocs=enabled \ + -Dapparmor=disabled \ + -Dapparmor_profiles=disabled \ + -Dattr=disabled \ + -Daudit=disabled \ + -Dbash_completion=disabled \ + -Dblkid=disabled \ + -Dcapng=disabled \ + -Ddriver_bhyve=disabled \ + -Ddriver_hyperv=disabled \ + -Ddriver_interface=disabled \ + -Ddriver_libvirtd=disabled \ + -Ddriver_libxl=disabled \ + -Ddriver_lxc=disabled \ + -Ddriver_network=disabled \ + -Ddriver_openvz=disabled \ + -Ddriver_qemu=disabled \ + -Ddriver_secrets=disabled \ + -Ddriver_vbox=disabled \ + -Ddriver_vmware=disabled \ + -Ddriver_vz=disabled \ + -Ddtrace=disabled \ + -Dexpensive_tests=enabled \ + -Dfirewalld=disabled \ + -Dfirewalld_zone=disabled \ + -Dfuse=disabled \ + -Dglusterfs=disabled \ + -Dhost_validate=disabled \ + -Dlibiscsi=disabled \ + -Dlibnl=disabled \ + -Dlibpcap=disabled \ + -Dlibssh2=disabled \ + -Dlibssh=disabled \ + -Dlogin_shell=disabled \ + -Dnetcf=disabled \ + -Dnls=disabled \ + -Dnss=disabled \ + -Dnumactl=disabled \ + -Dnumad=disabled \ + -Dopenwsman=disabled \ + -Dpciaccess=disabled \ + -Dpm_utils=disabled \ + -Dpolkit=disabled \ + -Dreadline=disabled \ + -Drpath=disabled \ + -Dsanlock=disabled \ + -Dsasl=disabled \ + -Dsecdriver_apparmor=disabled \ + -Dsecdriver_selinux=disabled \ + -Dselinux=disabled \ + -Dstorage_dir=disabled \ + -Dstorage_disk=disabled \ + -Dstorage_fs=disabled \ + -Dstorage_gluster=disabled \ + -Dstorage_iscsi_direct=disabled \ + -Dstorage_iscsi=disabled \ + -Dstorage_lvm=disabled \ + -Dstorage_mpath=disabled \ + -Dstorage_rbd=disabled \ + -Dstorage_scsi=disabled \ + -Dstorage_vstorage=disabled \ + -Dstorage_zfs=disabled \ + -Dsysctl_config=disabled \ + -Dtests=disabled \ + -Dudev=disabled \ + -Dwireshark_dissector=disabled \ + -Dyajl=disabled +%mingw_ninja +%endif + %install rm -fr %{buildroot} -export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec) +export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/libvirt.spec) %meson_install @@ -1310,6 +1394,27 @@ mv $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset/libvirt_qemu_probes.stp \ %endif %endif +%if %{with_mingw} +%mingw_ninja_install + +rm -rf $RPM_BUILD_ROOT%{mingw32_sysconfdir}/libvirt/nwfilter +rm -rf $RPM_BUILD_ROOT%{mingw64_sysconfdir}/libvirt/nwfilter +rm -rf $RPM_BUILD_ROOT%{mingw32_datadir}/doc/* +rm -rf $RPM_BUILD_ROOT%{mingw64_datadir}/doc/* +rm -rf $RPM_BUILD_ROOT%{mingw32_datadir}/gtk-doc/* +rm -rf $RPM_BUILD_ROOT%{mingw64_datadir}/gtk-doc/* + +rm -rf $RPM_BUILD_ROOT%{mingw32_libexecdir}/libvirt_iohelper.exe +rm -rf $RPM_BUILD_ROOT%{mingw64_libexecdir}/libvirt_iohelper.exe +rm -rf $RPM_BUILD_ROOT%{mingw32_libexecdir}/libvirt-guests.sh +rm -rf $RPM_BUILD_ROOT%{mingw64_libexecdir}/libvirt-guests.sh + +%mingw_debug_install_post + +%mingw_find_lang %{name} + +%endif + %check # Building on slow archs, like emulated s390x in Fedora copr, requires # raising the test timeout @@ -1348,7 +1453,6 @@ fi \ # libvirtd. The uid number is irrelevant, so we use dynamic allocation # described at the above link. getent group libvirt >/dev/null || groupadd -r libvirt - exit 0 %post daemon @@ -1359,14 +1463,11 @@ exit 0 %else %libvirt_daemon_systemd_post_inet libvirtd %endif - %systemd_post libvirt-guests.service - %libvirt_daemon_schedule_restart libvirtd %preun daemon %systemd_preun libvirt-guests.service - %libvirt_daemon_systemd_preun_inet libvirtd %libvirt_daemon_systemd_preun_inet virtproxyd %libvirt_daemon_systemd_preun_priv virtlogd @@ -1379,18 +1480,6 @@ if [ $1 -ge 1 ] ; then fi %systemd_postun libvirt-guests.service -# In upgrade scenario we must explicitly enable virtlockd/virtlogd -# sockets, if libvirtd is already enabled and start them if -# libvirtd is running, otherwise you'll get failures to start -# guests -%triggerpostun daemon -- libvirt-daemon < 1.3.0 -if [ $1 -ge 1 ] ; then - /bin/systemctl is-enabled libvirtd.service 1>/dev/null 2>&1 && - /bin/systemctl enable virtlogd.socket virtlogd-admin.socket || : - /bin/systemctl is-active libvirtd.service 1>/dev/null 2>&1 && - /bin/systemctl start virtlogd.socket virtlogd-admin.socket || : -fi - %posttrans daemon %libvirt_sysconfig_posttrans libvirtd virtproxyd virtlogd virtlockd libvirt-guests if test %libvirt_daemon_needs_restart libvirtd @@ -1410,27 +1499,21 @@ then libvirtd-admin.socket \ libvirtd-tls.socket \ libvirtd-tcp.socket >/dev/null 2>&1 || : + /bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || : else # Old libvirtd owns the sockets and will delete them on # shutdown. Can't use a try-restart as libvirtd will simply # own the sockets again when it comes back up. Thus we must # do this particular ordering, so that we get libvirtd # running with socket activation in use - /bin/systemctl is-active libvirtd.service 1>/dev/null 2>&1 - if test $? = 0 - then - /bin/systemctl stop libvirtd.service >/dev/null 2>&1 || : - - /bin/systemctl try-restart \ - libvirtd.socket \ - libvirtd-ro.socket \ - libvirtd-admin.socket >/dev/null 2>&1 || : - - /bin/systemctl start libvirtd.service >/dev/null 2>&1 || : - fi + /bin/systemctl stop libvirtd.service >/dev/null 2>&1 || : + /bin/systemctl try-restart \ + libvirtd.socket \ + libvirtd-ro.socket \ + libvirtd-admin.socket >/dev/null 2>&1 || : + /bin/systemctl start libvirtd.service >/dev/null 2>&1 || : fi fi - %libvirt_daemon_finish_restart libvirtd %pre daemon-driver-network @@ -1522,7 +1605,6 @@ fi %libvirt_sysconfig_posttrans virtsecretd %libvirt_daemon_perform_restart virtsecretd - %pre daemon-driver-storage-core %libvirt_sysconfig_pre virtstoraged @@ -1539,7 +1621,6 @@ fi %libvirt_sysconfig_posttrans virtstoraged %libvirt_daemon_perform_restart virtstoraged - %if %{with_qemu} %pre daemon-driver-qemu %libvirt_sysconfig_pre virtqemud @@ -1571,7 +1652,6 @@ exit 0 %libvirt_daemon_perform_restart virtqemud %endif - %if %{with_lxc} %pre daemon-driver-lxc %libvirt_sysconfig_pre virtlxcd @@ -1590,7 +1670,6 @@ exit 0 %libvirt_daemon_perform_restart virtlxcd %endif - %if %{with_vbox} %post daemon-driver-vbox %if %{with_modular_daemons} @@ -1609,7 +1688,6 @@ exit 0 %libvirt_daemon_perform_restart virtvboxd %endif - %if %{with_libxl} %post daemon-driver-libxl %if %{with_modular_daemons} @@ -1628,7 +1706,6 @@ exit 0 %libvirt_daemon_perform_restart virtxend %endif - %post daemon-config-network if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; then # see if the network used by default network creates a conflict, @@ -1704,7 +1781,6 @@ exit 0 %doc libvirt-docs/* %files daemon - %{_unitdir}/libvirtd.service %{_unitdir}/libvirtd.socket %{_unitdir}/libvirtd-ro.socket @@ -1731,25 +1807,21 @@ exit 0 %config(noreplace) %{_sysconfdir}/libvirt/virtlockd.conf %config(noreplace) %{_sysconfdir}/sasl2/libvirt.conf %config(noreplace) %{_prefix}/lib/sysctl.d/60-libvirtd.conf - %config(noreplace) %{_sysconfdir}/logrotate.d/libvirtd %dir %{_datadir}/libvirt/ - %ghost %dir %{_rundir}/libvirt/ %ghost %dir %{_rundir}/libvirt/common/ - %dir %attr(0755, root, root) %{_localstatedir}/lib/libvirt/ %dir %attr(0711, root, root) %{_localstatedir}/lib/libvirt/images/ %dir %attr(0711, root, root) %{_localstatedir}/lib/libvirt/filesystems/ %dir %attr(0711, root, root) %{_localstatedir}/lib/libvirt/boot/ %dir %attr(0711, root, root) %{_localstatedir}/cache/libvirt/ - - %dir %attr(0755, root, root) %{_libdir}/libvirt/ %dir %attr(0755, root, root) %{_libdir}/libvirt/connection-driver/ -%dir %attr(0755, root, root) %{_libdir}/libvirt/lock-driver +%dir %attr(0755, root, root) %{_libdir}/libvirt/lock-driver/ +%dir %attr(0755, root, root) %{_libdir}/libvirt/storage-backend/ +%dir %attr(0755, root, root) %{_libdir}/libvirt/storage-file/ %attr(0755, root, root) %{_libdir}/libvirt/lock-driver/lockd.so - %{_datadir}/augeas/lenses/libvirtd.aug %{_datadir}/augeas/lenses/tests/test_libvirtd.aug %{_datadir}/augeas/lenses/virtlogd.aug @@ -1762,23 +1834,17 @@ exit 0 %if %{with_qemu} %{_datadir}/augeas/lenses/tests/test_libvirt_lockd.aug %endif - %{_datadir}/polkit-1/actions/org.libvirt.unix.policy %{_datadir}/polkit-1/actions/org.libvirt.api.policy %{_datadir}/polkit-1/rules.d/50-libvirt.rules - %dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/ - %attr(0755, root, root) %{_libexecdir}/libvirt_iohelper - %attr(0755, root, root) %{_bindir}/virt-ssh-helper - %attr(0755, root, root) %{_sbindir}/libvirtd %attr(0755, root, root) %{_sbindir}/virtproxyd %attr(0755, root, root) %{_sbindir}/virtlogd %attr(0755, root, root) %{_sbindir}/virtlockd %attr(0755, root, root) %{_libexecdir}/libvirt-guests.sh - %{_mandir}/man1/virt-admin.1* %{_mandir}/man1/virt-host-validate.1* %{_mandir}/man8/virt-ssh-helper.8* @@ -1787,7 +1853,6 @@ exit 0 %{_mandir}/man8/virtlogd.8* %{_mandir}/man8/virtlockd.8* %{_mandir}/man8/virtproxyd.8* - %{_bindir}/virt-host-validate %{_bindir}/virt-admin %{_datadir}/bash-completion/completions/virt-admin @@ -1813,7 +1878,7 @@ exit 0 %{_unitdir}/virtinterfaced-admin.socket %attr(0755, root, root) %{_sbindir}/virtinterfaced %ghost %dir %{_rundir}/libvirt/interface/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_interface.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_interface.so %{_mandir}/man8/virtinterfaced.8* %files daemon-driver-network @@ -1832,11 +1897,14 @@ exit 0 %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/network/ %dir %attr(0755, root, root) %{_localstatedir}/lib/libvirt/dnsmasq/ %attr(0755, root, root) %{_libexecdir}/libvirt_leaseshelper -%{_libdir}/%{name}/connection-driver/libvirt_driver_network.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_network.so %{_mandir}/man8/virtnetworkd.8* - %if %{with_firewalld_zone} %{_prefix}/lib/firewalld/zones/libvirt.xml +%{_prefix}/lib/firewalld/zones/libvirt-routed.xml +%{_prefix}/lib/firewalld/policies/libvirt-routed-in.xml +%{_prefix}/lib/firewalld/policies/libvirt-routed-out.xml +%{_prefix}/lib/firewalld/policies/libvirt-to-host.xml %endif %files daemon-driver-nodedev @@ -1849,7 +1917,7 @@ exit 0 %{_unitdir}/virtnodedevd-admin.socket %attr(0755, root, root) %{_sbindir}/virtnodedevd %ghost %dir %{_rundir}/libvirt/nodedev/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_nodedev.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_nodedev.so %{_mandir}/man8/virtnodedevd.8* %files daemon-driver-nwfilter @@ -1865,7 +1933,7 @@ exit 0 %ghost %dir %{_rundir}/libvirt/network/ %ghost %dir %{_rundir}/libvirt/nwfilter-binding/ %ghost %dir %{_rundir}/libvirt/nwfilter/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_nwfilter.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_nwfilter.so %{_mandir}/man8/virtnwfilterd.8* %files daemon-driver-secret @@ -1879,7 +1947,7 @@ exit 0 %attr(0755, root, root) %{_sbindir}/virtsecretd %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/secrets/ %ghost %dir %{_rundir}/libvirt/secrets/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_secret.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_secret.so %{_mandir}/man8/virtsecretd.8* %files daemon-driver-storage @@ -1897,50 +1965,45 @@ exit 0 %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/storage/ %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/storage/autostart/ %ghost %dir %{_rundir}/libvirt/storage/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_storage.so -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_fs.so -%{_libdir}/%{name}/storage-file/libvirt_storage_file_fs.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_storage.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_fs.so +%{_libdir}/libvirt/storage-file/libvirt_storage_file_fs.so %{_mandir}/man8/virtstoraged.8* %files daemon-driver-storage-disk -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_disk.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_disk.so %files daemon-driver-storage-logical -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_logical.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_logical.so %files daemon-driver-storage-scsi -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_scsi.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_scsi.so %files daemon-driver-storage-iscsi -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_iscsi.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_iscsi.so %if %{with_storage_iscsi_direct} %files daemon-driver-storage-iscsi-direct -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_iscsi-direct.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_iscsi-direct.so %endif %files daemon-driver-storage-mpath -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_mpath.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_mpath.so %if %{with_storage_gluster} %files daemon-driver-storage-gluster -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_gluster.so -%{_libdir}/%{name}/storage-file/libvirt_storage_file_gluster.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_gluster.so +%{_libdir}/libvirt/storage-file/libvirt_storage_file_gluster.so %endif %if %{with_storage_rbd} %files daemon-driver-storage-rbd -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_rbd.so -%endif - -%if %{with_storage_sheepdog} -%files daemon-driver-storage-sheepdog -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_sheepdog.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_rbd.so %endif %if %{with_storage_zfs} %files daemon-driver-storage-zfs -%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_zfs.so +%{_libdir}/libvirt/storage-backend/libvirt_storage_backend_zfs.so %endif %if %{with_qemu} @@ -1962,6 +2025,7 @@ exit 0 %config(noreplace) %{_sysconfdir}/logrotate.d/libvirtd.qemu %ghost %dir %{_rundir}/libvirt/qemu/ %ghost %dir %{_rundir}/libvirt/qemu/dbus/ +%ghost %dir %{_rundir}/libvirt/qemu/passt/ %ghost %dir %{_rundir}/libvirt/qemu/slirp/ %ghost %dir %{_rundir}/libvirt/qemu/swtpm/ %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/ @@ -1976,7 +2040,7 @@ exit 0 %dir %attr(0750, root, root) %{_localstatedir}/cache/libvirt/qemu/ %{_datadir}/augeas/lenses/libvirtd_qemu.aug %{_datadir}/augeas/lenses/tests/test_libvirtd_qemu.aug -%{_libdir}/%{name}/connection-driver/libvirt_driver_qemu.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_qemu.so %dir %attr(0711, root, root) %{_localstatedir}/lib/libvirt/swtpm/ %dir %attr(0730, tss, tss) %{_localstatedir}/log/swtpm/libvirt/qemu/ %{_bindir}/virt-qemu-run @@ -2004,7 +2068,7 @@ exit 0 %{_datadir}/augeas/lenses/libvirtd_lxc.aug %{_datadir}/augeas/lenses/tests/test_libvirtd_lxc.aug %attr(0755, root, root) %{_libexecdir}/libvirt_lxc -%{_libdir}/%{name}/connection-driver/libvirt_driver_lxc.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_lxc.so %{_mandir}/man8/virtlxcd.8* %endif @@ -2032,7 +2096,7 @@ exit 0 %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/libxl/channel/target/ %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/libxl/dump/ %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/libxl/save/ -%{_libdir}/%{name}/connection-driver/libvirt_driver_libxl.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_libxl.so %{_mandir}/man8/virtxend.8* %endif @@ -2046,7 +2110,7 @@ exit 0 %{_unitdir}/virtvboxd-ro.socket %{_unitdir}/virtvboxd-admin.socket %attr(0755, root, root) %{_sbindir}/virtvboxd -%{_libdir}/%{name}/connection-driver/libvirt_driver_vbox.so +%{_libdir}/libvirt/connection-driver/libvirt_driver_vbox.so %{_mandir}/man8/virtvboxd.8* %endif @@ -2097,9 +2161,16 @@ exit 0 %{_bindir}/virt-xml-validate %{_bindir}/virt-pki-query-dn %{_bindir}/virt-pki-validate - %{_datadir}/bash-completion/completions/virsh +%if %{with_qemu} +%files client-qemu +%{_mandir}/man1/virt-qemu-qmp-proxy.1* +%{_mandir}/man1/virt-qemu-sev-validate.1* +%{_bindir}/virt-qemu-qmp-proxy +%{_bindir}/virt-qemu-sev-validate +%endif + %files libs -f %{name}.lang %license COPYING COPYING.LESSER %dir %attr(0700, root, root) %{_sysconfdir}/libvirt/ @@ -2111,17 +2182,13 @@ exit 0 %{_libdir}/libvirt-admin.so.* %dir %{_datadir}/libvirt/ %dir %{_datadir}/libvirt/schemas/ - %{_datadir}/systemtap/tapset/libvirt_probes*.stp %{_datadir}/systemtap/tapset/libvirt_functions.stp %if %{with_qemu} %{_datadir}/systemtap/tapset/libvirt_qemu_probes*.stp %endif - %{_datadir}/libvirt/schemas/*.rng - %{_datadir}/libvirt/cpu_map/*.xml - %{_datadir}/libvirt/test-screenshot.png %if %{with_wireshark} @@ -2169,15 +2236,214 @@ exit 0 %{_libdir}/pkgconfig/libvirt-admin.pc %{_libdir}/pkgconfig/libvirt-qemu.pc %{_libdir}/pkgconfig/libvirt-lxc.pc - %dir %{_datadir}/libvirt/api/ %{_datadir}/libvirt/api/libvirt-api.xml %{_datadir}/libvirt/api/libvirt-admin-api.xml %{_datadir}/libvirt/api/libvirt-qemu-api.xml %{_datadir}/libvirt/api/libvirt-lxc-api.xml +%if %{with_mingw} +%files -n mingw32-libvirt -f mingw32-libvirt.lang +%dir %{mingw32_sysconfdir}/libvirt/ +%config(noreplace) %{mingw32_sysconfdir}/libvirt/libvirt.conf +%config(noreplace) %{mingw32_sysconfdir}/libvirt/libvirt-admin.conf +%{mingw32_bindir}/libvirt-0.dll +%{mingw32_bindir}/virsh.exe +%{mingw32_bindir}/virt-admin.exe +%{mingw32_bindir}/virt-xml-validate +%{mingw32_bindir}/virt-pki-query-dn.exe +%{mingw32_bindir}/virt-pki-validate +%{mingw32_bindir}/libvirt-lxc-0.dll +%{mingw32_bindir}/libvirt-qemu-0.dll +%{mingw32_bindir}/libvirt-admin-0.dll +%{mingw32_libdir}/libvirt.dll.a +%{mingw32_libdir}/pkgconfig/libvirt.pc +%{mingw32_libdir}/pkgconfig/libvirt-qemu.pc +%{mingw32_libdir}/pkgconfig/libvirt-lxc.pc +%{mingw32_libdir}/pkgconfig/libvirt-admin.pc +%{mingw32_libdir}/libvirt-lxc.dll.a +%{mingw32_libdir}/libvirt-qemu.dll.a +%{mingw32_libdir}/libvirt-admin.dll.a +%dir %{mingw32_datadir}/libvirt/ +%dir %{mingw32_datadir}/libvirt/schemas/ +%{mingw32_datadir}/libvirt/schemas/*.rng +%dir %{mingw32_datadir}/libvirt/api/ +%{mingw32_datadir}/libvirt/api/libvirt-api.xml +%{mingw32_datadir}/libvirt/api/libvirt-lxc-api.xml +%{mingw32_datadir}/libvirt/api/libvirt-qemu-api.xml +%{mingw32_datadir}/libvirt/api/libvirt-admin-api.xml +%{mingw32_datadir}/libvirt/cpu_map/*.xml +%{mingw32_datadir}/libvirt/test-screenshot.png +%dir %{mingw32_includedir}/libvirt +%{mingw32_includedir}/libvirt/libvirt.h +%{mingw32_includedir}/libvirt/libvirt-common.h +%{mingw32_includedir}/libvirt/libvirt-domain.h +%{mingw32_includedir}/libvirt/libvirt-domain-checkpoint.h +%{mingw32_includedir}/libvirt/libvirt-domain-snapshot.h +%{mingw32_includedir}/libvirt/libvirt-event.h +%{mingw32_includedir}/libvirt/libvirt-host.h +%{mingw32_includedir}/libvirt/libvirt-interface.h +%{mingw32_includedir}/libvirt/libvirt-network.h +%{mingw32_includedir}/libvirt/libvirt-nodedev.h +%{mingw32_includedir}/libvirt/libvirt-nwfilter.h +%{mingw32_includedir}/libvirt/libvirt-secret.h +%{mingw32_includedir}/libvirt/libvirt-storage.h +%{mingw32_includedir}/libvirt/libvirt-stream.h +%{mingw32_includedir}/libvirt/virterror.h +%{mingw32_includedir}/libvirt/libvirt-lxc.h +%{mingw32_includedir}/libvirt/libvirt-qemu.h +%{mingw32_includedir}/libvirt/libvirt-admin.h +%{mingw32_mandir}/man1/virsh.1* +%{mingw32_mandir}/man1/virt-admin.1* +%{mingw32_mandir}/man1/virt-xml-validate.1* +%{mingw32_mandir}/man1/virt-pki-query-dn.1* +%{mingw32_mandir}/man1/virt-pki-validate.1* +%{mingw32_mandir}/man7/virkey*.7* + +%files -n mingw64-libvirt -f mingw64-libvirt.lang +%dir %{mingw64_sysconfdir}/libvirt/ +%config(noreplace) %{mingw64_sysconfdir}/libvirt/libvirt.conf +%config(noreplace) %{mingw64_sysconfdir}/libvirt/libvirt-admin.conf +%{mingw64_bindir}/libvirt-0.dll +%{mingw64_bindir}/virsh.exe +%{mingw64_bindir}/virt-admin.exe +%{mingw64_bindir}/virt-xml-validate +%{mingw64_bindir}/virt-pki-query-dn.exe +%{mingw64_bindir}/virt-pki-validate +%{mingw64_bindir}/libvirt-lxc-0.dll +%{mingw64_bindir}/libvirt-qemu-0.dll +%{mingw64_bindir}/libvirt-admin-0.dll +%{mingw64_libdir}/libvirt.dll.a +%{mingw64_libdir}/pkgconfig/libvirt.pc +%{mingw64_libdir}/pkgconfig/libvirt-qemu.pc +%{mingw64_libdir}/pkgconfig/libvirt-lxc.pc +%{mingw64_libdir}/pkgconfig/libvirt-admin.pc +%{mingw64_libdir}/libvirt-lxc.dll.a +%{mingw64_libdir}/libvirt-qemu.dll.a +%{mingw64_libdir}/libvirt-admin.dll.a +%dir %{mingw64_datadir}/libvirt/ +%dir %{mingw64_datadir}/libvirt/schemas/ +%{mingw64_datadir}/libvirt/schemas/*.rng +%dir %{mingw64_datadir}/libvirt/api/ +%{mingw64_datadir}/libvirt/api/libvirt-api.xml +%{mingw64_datadir}/libvirt/api/libvirt-lxc-api.xml +%{mingw64_datadir}/libvirt/api/libvirt-qemu-api.xml +%{mingw64_datadir}/libvirt/api/libvirt-admin-api.xml +%{mingw64_datadir}/libvirt/cpu_map/*.xml +%{mingw64_datadir}/libvirt/test-screenshot.png +%dir %{mingw64_includedir}/libvirt +%{mingw64_includedir}/libvirt/libvirt.h +%{mingw64_includedir}/libvirt/libvirt-common.h +%{mingw64_includedir}/libvirt/libvirt-domain.h +%{mingw64_includedir}/libvirt/libvirt-domain-checkpoint.h +%{mingw64_includedir}/libvirt/libvirt-domain-snapshot.h +%{mingw64_includedir}/libvirt/libvirt-event.h +%{mingw64_includedir}/libvirt/libvirt-host.h +%{mingw64_includedir}/libvirt/libvirt-interface.h +%{mingw64_includedir}/libvirt/libvirt-network.h +%{mingw64_includedir}/libvirt/libvirt-nodedev.h +%{mingw64_includedir}/libvirt/libvirt-nwfilter.h +%{mingw64_includedir}/libvirt/libvirt-secret.h +%{mingw64_includedir}/libvirt/libvirt-storage.h +%{mingw64_includedir}/libvirt/libvirt-stream.h +%{mingw64_includedir}/libvirt/virterror.h +%{mingw64_includedir}/libvirt/libvirt-lxc.h +%{mingw64_includedir}/libvirt/libvirt-qemu.h +%{mingw64_includedir}/libvirt/libvirt-admin.h +%{mingw64_mandir}/man1/virsh.1* +%{mingw64_mandir}/man1/virt-admin.1* +%{mingw64_mandir}/man1/virt-xml-validate.1* +%{mingw64_mandir}/man1/virt-pki-query-dn.1* +%{mingw64_mandir}/man1/virt-pki-validate.1* +%{mingw64_mandir}/man7/virkey*.7* +%endif %changelog +* Wed Feb 22 2023 Jiri Denemark - 9.0.0-7 +- qemu_snapshot: remove memory snapshot when deleting external snapshot (rhbz#2170826) +- qemu_snapshot: refactor qemuSnapshotDeleteExternalPrepare (rhbz#2170826) + +* Fri Feb 17 2023 Jiri Denemark - 9.0.0-6 +- rpc: client: Don't check return value of virNetMessageNew (rhbz#2145188) +- rpc: Don't warn about "max_client_requests" in single-threaded daemons (rhbz#2145188) + +* Mon Feb 13 2023 Jiri Denemark - 9.0.0-5 +- qemu_extdevice: Do cleanup host only for VIR_DOMAIN_TPM_TYPE_EMULATOR (rhbz#2168762) +- qemu: blockjob: Handle 'pending' blockjob state only when we need it (rhbz#2168769) + +* Thu Feb 9 2023 Jiri Denemark - 9.0.0-4 +- qemuProcessStop: Fix detection of outgoing migration for external devices (rhbz#2161557) +- qemuExtTPMStop: Restore TPM state label more often (rhbz#2161557) +- qemuProcessLaunch: Tighten rules for external devices wrt incoming migration (rhbz#2161557) +- qemu_process: Produce better debug message wrt domain namespaces (rhbz#2167302) +- qemu_namespace: Deal with nested mounts when umount()-ing /dev (rhbz#2167302) +- qemuProcessRefreshDisks: Don't skip filling of disk information if tray state didn't change (rhbz#2166411) + +* Wed Feb 1 2023 Jiri Denemark - 9.0.0-3 +- src: Don't use virReportSystemError() on virProcessGetStatInfo() failure (rhbz#2148266) +- qemu: Provide virDomainGetCPUStats() implementation for session connection (rhbz#2148266) +- virsh: Make domif-setlink work more than once (rhbz#2165466) +- qemu_fd: Remove declaration for 'qemuFDPassNewDirect' (rhbz#2040272) +- qemuStorageSourcePrivateDataFormat: Rename 'tmp' to 'objectsChildBuf' (rhbz#2040272) +- qemu: command: Handle FD passing commandline via qemuBuildBlockStorageSourceAttachDataCommandline (rhbz#2040272) +- qemuFDPassTransferCommand: Mark that FD was passed (rhbz#2040272) +- qemu: fd: Add helpers allowing storing FD set data in status XML (rhbz#2040272) +- qemu: domain: Store fdset ID for disks passed to qemu via FD (rhbz#2040272) +- qemu: block: Properly handle FD-passed disk hot-(un-)plug (rhbz#2040272) + +* Wed Jan 25 2023 Jiri Denemark - 9.0.0-2 +- vircgroupv2: fix cpu.weight limits check (rhbz#2037998) +- domain_validate: drop cpu.shares cgroup check (rhbz#2037998) +- docs: document correct cpu shares limits with both cgroups v1 and v2 (rhbz#2037998) +- qemu_interface: Fix managed='no' case when creating an ethernet interface (rhbz#2144738) +- conf: clarify some external TPM error messages (rhbz#2063723) +- qemu: hotplug: Remove legacy quirk for 'dimm' address generation (rhbz#2158701) +- qemu: alias: Remove 'oldAlias' argument of qemuAssignDeviceMemoryAlias (rhbz#2158701) +- qemu: Remove 'memAliasOrderMismatch' field from VM private data (rhbz#2158701) +- rpc: Fix error message in virNetServerSetClientLimits (rhbz#2033879) + +* Mon Jan 16 2023 Jiri Denemark - 9.0.0-1 +- Rebased to libvirt-9.0.0 (rhbz#2124466) +- The rebase also fixes the following bugs: + rhbz#2151064, rhbz#1874163, rhbz#2130192, rhbz#2111948, rhbz#1824722 + rhbz#2150455, rhbz#2063723, rhbz#1717611, rhbz#2160448, rhbz#2151869 + rhbz#2040272, rhbz#2144738, rhbz#2159851, rhbz#2156289, rhbz#2033879 + rhbz#1820437, rhbz#2151202 + +* Tue Dec 6 2022 Jiri Denemark - 8.10.0-2 +- qemu_process: Document qemuProcessPrepare{Domain,Host}() order (rhbz#2150760) +- qemu_extdevice: Init paths in qemuExtDevicesPrepareDomain() (rhbz#2150760) +- qemu_extdevice: Expose qemuExtDevicesInitPaths() (rhbz#2150760) +- qemu: Init ext devices paths on reconnect (rhbz#2150760) + +* Thu Dec 1 2022 Jiri Denemark - 8.10.0-1 +- Rebased to libvirt-8.10.0 (rhbz#2124466) +- The rebase also fixes the following bugs: + rhbz#2128993, rhbz#2143235, rhbz#2143840, rhbz#1874163, rhbz#2000075 + rhbz#2143838, rhbz#2104919, rhbz#2072204, rhbz#2137298 + +* Wed Nov 2 2022 Jiri Denemark - 8.9.0-2 +- RHEL: rpminspect: Disable abidiff inspection (rhbz#2124466) +- spec: Fix python3-libvirt requirement in client-qemu package (rhbz#2124466) + +* Tue Nov 1 2022 Jiri Denemark - 8.9.0-1 +- Rebased to libvirt-8.9.0 (rhbz#2124466) +- The rebase also fixes the following bugs: + rhbz#2074559, rhbz#2134009, rhbz#1777212, rhbz#2013523, rhbz#2114866 + rhbz#1964855 + +* Mon Oct 3 2022 Jiri Denemark - 8.8.0-1 +- Rebased to libvirt-8.8.0 (rhbz#2124466) +- The rebase also fixes the following bugs: + rhbz#2122534, rhbz#2121262, rhbz#2130089, rhbz#2121276, rhbz#2121627 + rhbz#2125111, rhbz#2129239, rhbz#1964855, rhbz#2114866 + +* Tue Sep 6 2022 Jiri Denemark - 8.7.0-1 +- Rebased to libvirt-8.7.0 (rhbz#2124466) +- The rebase also fixes the following bugs: + rhbz#2084046, rhbz#2108483, rhbz#2123371, rhbz#2101633, rhbz#1988211 + rhbz#2086677, rhbz#2103132, rhbz#2078805, rhbz#2111301, rhbz#2094641 + * Thu Aug 4 2022 Jiri Denemark - 8.5.0-5 - rpc: Pass OPENSSL_CONF through to ssh invocations (rhbz#2112348)