From c3a2f6f18b529bbfc11be2e17fa0ce9c51733717 Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Tue, 3 Mar 2026 14:34:15 +0100 Subject: [PATCH] libvirt-11.10.0-10.2.el10nv - domain_conf: initialize network hostdev private data (VOYAGER-227) - qemu_hotplug: enter monitor in order to rollback passed FD (VOYAGER-227) Resolves: VOYAGER-227 --- ...tialize-network-hostdev-private-data.patch | 96 +++++++++++++++++++ ...nitor-in-order-to-rollback-passed-FD.patch | 48 ++++++++++ libvirt.spec | 8 +- 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 libvirt-domain_conf-initialize-network-hostdev-private-data.patch create mode 100644 libvirt-qemu_hotplug-enter-monitor-in-order-to-rollback-passed-FD.patch diff --git a/libvirt-domain_conf-initialize-network-hostdev-private-data.patch b/libvirt-domain_conf-initialize-network-hostdev-private-data.patch new file mode 100644 index 0000000..4bf8bec --- /dev/null +++ b/libvirt-domain_conf-initialize-network-hostdev-private-data.patch @@ -0,0 +1,96 @@ +From dad5203ccef4ef9321034a4234ea82af6d945af3 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Thu, 26 Feb 2026 10:18:23 +0100 +Subject: [PATCH] domain_conf: initialize network hostdev private data + +From: Pavel Hrdina + +Currently virDomainNetDef and virDomainActualNetDef use +virDomainHostdevDef directly as structure and the code doesn't call +virDomainHostdevDefNew() that would initialize private data. + +This is hackish quick fix to solve a crash that happens in two +scenarios: + +1. attaching any interface with hostdev backend + +0x0000fffbfc0e2a90 in qemuDomainAttachHostPCIDevice (driver=0xfffbb4006750, vm=0xfffbf001f790, hostdev=0xfffbf400b150) at ../src/qemu/qemu_hotplug.c:1652 +1652 if ((ret = qemuFDPassDirectTransferMonitor(hostdevPriv->vfioDeviceFd, priv->mon)) < 0) + +2. starting VM with interface with hostdev backend using iommufd + +0x00007f6638d5b9ca in qemuProcessOpenVfioDeviceFd (hostdev=hostdev@entry=0x7f6634425ee0) at ../src/qemu/qemu_process.c:7719 +7719 hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd); + +Proper fix for this issue is to refactor network code to use pointer and to +use virDomainHostdevDefNew(). + +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +(cherry picked from commit fe782ed334ea0d4373e6dad093f5815fc925a56b) + +https://issues.redhat.com/browse/VOYAGER-227 + +Signed-off-by: Pavel Hrdina +--- + src/conf/domain_conf.c | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index b8c180e72d..4e12ebf712 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -3489,6 +3489,20 @@ void virDomainVideoDefFree(virDomainVideoDef *def) + } + + ++static int ++virDomainHostdevDefPrivateDataNew(virDomainHostdevDef *def, ++ virDomainXMLOption *xmlopt) ++{ ++ if (!xmlopt || !xmlopt->privateData.hostdevNew) ++ return 0; ++ ++ if (!(def->privateData = xmlopt->privateData.hostdevNew())) ++ return -1; ++ ++ return 0; ++} ++ ++ + virDomainHostdevDef * + virDomainHostdevDefNew(virDomainXMLOption *xmlopt) + { +@@ -3498,8 +3512,7 @@ virDomainHostdevDefNew(virDomainXMLOption *xmlopt) + + def->info = g_new0(virDomainDeviceInfo, 1); + +- if (xmlopt && xmlopt->privateData.hostdevNew && +- !(def->privateData = xmlopt->privateData.hostdevNew())) { ++ if (virDomainHostdevDefPrivateDataNew(def, xmlopt) < 0) { + VIR_FREE(def->info); + VIR_FREE(def); + return NULL; +@@ -9653,6 +9666,9 @@ virDomainActualNetDefParseXML(xmlNodePtr node, + virDomainHostdevDef *hostdev = &actual->data.hostdev.def; + int type; + ++ if (virDomainHostdevDefPrivateDataNew(hostdev, xmlopt) < 0) ++ goto error; ++ + hostdev->parentnet = parent; + hostdev->info = &parent->info; + /* The helper function expects type to already be found and +@@ -10346,6 +10362,9 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt, + g_autofree char *addrtype = virXPathString("string(./source/address/@type)", ctxt); + int type; + ++ if (virDomainHostdevDefPrivateDataNew(&def->data.hostdev.def, xmlopt) < 0) ++ return NULL; ++ + def->data.hostdev.def.parentnet = def; + def->data.hostdev.def.info = &def->info; + def->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; +-- +2.53.0 diff --git a/libvirt-qemu_hotplug-enter-monitor-in-order-to-rollback-passed-FD.patch b/libvirt-qemu_hotplug-enter-monitor-in-order-to-rollback-passed-FD.patch new file mode 100644 index 0000000..01bcb5e --- /dev/null +++ b/libvirt-qemu_hotplug-enter-monitor-in-order-to-rollback-passed-FD.patch @@ -0,0 +1,48 @@ +From af8b75eaad8a84b712338a2975091d8bbe144015 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Pavel Hrdina +Date: Thu, 26 Feb 2026 10:54:18 +0100 +Subject: [PATCH] qemu_hotplug: enter monitor in order to rollback passed FD + +From: Pavel Hrdina + +Reported-by: Peter Krempa +Signed-off-by: Pavel Hrdina +Reviewed-by: Peter Krempa +Reviewed-by: Jiri Denemark +(cherry picked from commit 4374dbbbf0d87f0052dd96be96baad6c20963713) + +https://issues.redhat.com/browse/VOYAGER-227 + +Signed-off-by: Pavel Hrdina +--- + src/qemu/qemu_hotplug.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index a455c2cd53..bb88815e27 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -1682,15 +1682,16 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver, + if (teardownmemlock && qemuDomainAdjustMaxMemLock(vm) < 0) + VIR_WARN("Unable to reset maximum locked memory on hotplug fail"); + +- if (removeiommufd) { +- qemuDomainObjEnterMonitor(vm); ++ qemuDomainObjEnterMonitor(vm); ++ ++ if (removeiommufd) + ignore_value(qemuMonitorDelObject(priv->mon, "iommufd0", false)); +- qemuDomainObjExitMonitor(vm); +- } + + qemuFDPassDirectTransferMonitorRollback(hostdevPriv->vfioDeviceFd, priv->mon); + qemuFDPassDirectTransferMonitorRollback(priv->iommufd, priv->mon); + ++ qemuDomainObjExitMonitor(vm); ++ + if (releaseaddr) + qemuDomainReleaseDeviceAddress(vm, info); + +-- +2.53.0 diff --git a/libvirt.spec b/libvirt.spec index d22804f..b80feb2 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -294,7 +294,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 11.10.0 -Release: 10.1%{?dist}%{?extra_release} +Release: 10.2%{?dist}%{?extra_release} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -385,6 +385,8 @@ Patch80: libvirt-qemu-Add-support-for-HW-accelerated-nested-SMMUv3.patch Patch81: libvirt-tests-qemuxmlconfdata-provide-HW-accel-smmuv3-sample-XML-and-CLI-args.patch Patch82: libvirt-qemu-add-IOMMU-attribute-cmdqv-for-smmuv3.patch Patch83: libvirt-tests-qemuxmlconfdata-provide-cmdqv-sample-XML-and-CLI-args.patch +Patch84: libvirt-domain_conf-initialize-network-hostdev-private-data.patch +Patch85: libvirt-qemu_hotplug-enter-monitor-in-order-to-rollback-passed-FD.patch Requires: libvirt-daemon = %{version}-%{release} @@ -2776,6 +2778,10 @@ exit 0 %endif %changelog +* Wed Mar 4 2026 Pavel Hrdina - 11.10.0-10.2.el10nv +- domain_conf: initialize network hostdev private data (VOYAGER-227) +- qemu_hotplug: enter monitor in order to rollback passed FD (VOYAGER-227) + * Thu Feb 19 2026 Pavel Hrdina - 11.10.0-10.1.el10nv - qemu: Add support for HW-accelerated nested SMMUv3 (VOYAGER-4) - tests: qemuxmlconfdata: provide HW-accel smmuv3 sample XML and CLI args (VOYAGER-4)