From ff5db98bff1379f839f0f68700127534f11d3018 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Wed, 1 Feb 2023 13:33:57 +0100 Subject: [PATCH] libvirt-9.0.0-3.el9 - 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) Resolves: rhbz#2040272, rhbz#2148266, rhbz#2165466 --- ...mplementation-for-session-connection.patch | 105 ++++++++++++++++ ...ly-handle-FD-passed-disk-hot-un-plug.patch | 53 ++++++++ ...ckStorageSourceAttachDataCommandline.patch | 117 ++++++++++++++++++ ...t-ID-for-disks-passed-to-qemu-via-FD.patch | 103 +++++++++++++++ ...ng-storing-FD-set-data-in-status-XML.patch | 97 +++++++++++++++ ...nsferCommand-Mark-that-FD-was-passed.patch | 38 ++++++ ...Format-Rename-tmp-to-objectsChildBuf.patch | 59 +++++++++ ...-declaration-for-qemuFDPassNewDirect.patch | 34 +++++ ...ror-on-virProcessGetStatInfo-failure.patch | 61 +++++++++ ...ke-domif-setlink-work-more-than-once.patch | 47 +++++++ libvirt.spec | 24 +++- 11 files changed, 737 insertions(+), 1 deletion(-) create mode 100644 libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch create mode 100644 libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch create mode 100644 libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch create mode 100644 libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch create mode 100644 libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch create mode 100644 libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch create mode 100644 libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch create mode 100644 libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch create mode 100644 libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch create mode 100644 libvirt-virsh-Make-domif-setlink-work-more-than-once.patch diff --git a/libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch b/libvirt-qemu-Provide-virDomainGetCPUStats-implementation-for-session-connection.patch new file mode 100644 index 0000000..63843ad --- /dev/null +++ b/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/libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch b/libvirt-qemu-block-Properly-handle-FD-passed-disk-hot-un-plug.patch new file mode 100644 index 0000000..8b8d08c --- /dev/null +++ b/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/libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch b/libvirt-qemu-command-Handle-FD-passing-commandline-via-qemuBuildBlockStorageSourceAttachDataCommandline.patch new file mode 100644 index 0000000..d7ad2dd --- /dev/null +++ b/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/libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch b/libvirt-qemu-domain-Store-fdset-ID-for-disks-passed-to-qemu-via-FD.patch new file mode 100644 index 0000000..90408e9 --- /dev/null +++ b/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/libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch b/libvirt-qemu-fd-Add-helpers-allowing-storing-FD-set-data-in-status-XML.patch new file mode 100644 index 0000000..a2418ca --- /dev/null +++ b/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/libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch b/libvirt-qemuFDPassTransferCommand-Mark-that-FD-was-passed.patch new file mode 100644 index 0000000..46869ed --- /dev/null +++ b/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/libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch b/libvirt-qemuStorageSourcePrivateDataFormat-Rename-tmp-to-objectsChildBuf.patch new file mode 100644 index 0000000..78bede3 --- /dev/null +++ b/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/libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch b/libvirt-qemu_fd-Remove-declaration-for-qemuFDPassNewDirect.patch new file mode 100644 index 0000000..a39a66f --- /dev/null +++ b/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/libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch b/libvirt-src-Don-t-use-virReportSystemError-on-virProcessGetStatInfo-failure.patch new file mode 100644 index 0000000..e585288 --- /dev/null +++ b/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/libvirt-virsh-Make-domif-setlink-work-more-than-once.patch b/libvirt-virsh-Make-domif-setlink-work-more-than-once.patch new file mode 100644 index 0000000..7d4726a --- /dev/null +++ b/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/libvirt.spec b/libvirt.spec index d710581..614a373 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -229,7 +229,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 9.0.0 -Release: 2%{?dist}%{?extra_release} +Release: 3%{?dist}%{?extra_release} License: LGPLv2+ URL: https://libvirt.org/ @@ -247,6 +247,16 @@ Patch6: libvirt-qemu-hotplug-Remove-legacy-quirk-for-dimm-address-generation.pat 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 Requires: libvirt-daemon = %{version}-%{release} @@ -2337,6 +2347,18 @@ exit 0 %endif %changelog +* 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)