From e16fe9c7fa885a36df0be1967d248808a5bc1fb5 Mon Sep 17 00:00:00 2001 Message-ID: From: Pavel Hrdina Date: Fri, 13 Mar 2026 15:28:17 +0100 Subject: [PATCH] conf: Add iommufd fdgroup support This will allow management applications running libvirt without necessary permissions to pass FD for /dev/iommu with per-process locked memory accounting enabled. Kernel uses per-user locked memory accounting by default which may cause error while starting multiple VMs with host devices using IOMMUFD. Signed-off-by: Pavel Hrdina Reviewed-by: Peter Krempa (cherry picked from commit 58875a6df679c5272f61028d33bf1380c51b0d5b) Resolves: https://redhat.atlassian.net/browse/RHEL-159175 Signed-off-by: Pavel Hrdina --- docs/formatdomain.rst | 8 +++++++- src/conf/domain_conf.c | 6 ++++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 16 ++++++++++++++++ src/conf/schemas/domaincommon.rng | 3 +++ tests/genericxml2xmlindata/iommufd.xml | 2 +- 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 20ea10bd35..cdcf164253 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -1389,7 +1389,7 @@ Host Device IOMMUFD ... - + ... @@ -1403,6 +1403,12 @@ Host Device IOMMUFD This controls IOMMUFD usage for all host devices, each device can change this global default by setting ``iommufd`` attribute for ``driver`` element. + Optional ``fdgroup`` attribute can be used together with + `virDomainFDAssociate `__ + to pass /dev/iommu FD instead of letting libvirt to open it. Caller is + responsible for setting per-process locked memory accounting otherwise + starting multiple VMs with host devices using IOMMUFD may fail. + Resource partitioning --------------------- diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 59908d9da6..452985c9ba 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4214,6 +4214,8 @@ void virDomainDefFree(virDomainDef *def) g_free(def->kvm_features); g_free(def->tcg_features); + g_free(def->iommufd_fdgroup); + virBlkioDeviceArrayClear(def->blkio.devices, def->blkio.ndevices); g_free(def->blkio.devices); @@ -19795,6 +19797,8 @@ virDomainDefIommufdParse(virDomainDef *def, if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED, &def->iommufd) < 0) return -1; + def->iommufd_fdgroup = virXMLPropString(nodes[0], "fdgroup"); + return 0; } @@ -28028,6 +28032,8 @@ virDomainDefIommufdFormat(virBuffer *buf, virBufferAsprintf(&attrBuf, " enabled='%s'", virTristateBoolTypeToString(def->iommufd)); + virBufferEscapeString(&attrBuf, " fdgroup='%s'", def->iommufd_fdgroup); + virXMLFormatElement(buf, "iommufd", &attrBuf, NULL); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 145084e4fd..ba22fc347d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3241,6 +3241,7 @@ struct _virDomainDef { virDomainFeatureTCG *tcg_features; virTristateBool iommufd; + char *iommufd_fdgroup; bool tseg_specified; unsigned long long tseg_size; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 163095d55c..e400f80da3 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2003,6 +2003,19 @@ virDomainDefValidateThrottleGroups(const virDomainDef *def) } +static int +virDomainDefValidateIommufd(const virDomainDef *def) +{ + if (def->iommufd == VIR_TRISTATE_BOOL_NO && def->iommufd_fdgroup) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Setting 'fdgroup' when 'iommufd' is disabled is not supported.")); + return -1; + } + + return 0; +} + + static int virDomainDefValidateInternal(const virDomainDef *def, virDomainXMLOption *xmlopt) @@ -2064,6 +2077,9 @@ virDomainDefValidateInternal(const virDomainDef *def, if (virDomainDefValidateThrottleGroups(def) < 0) return -1; + if (virDomainDefValidateIommufd(def) < 0) + return -1; + return 0; } diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index de505e6c49..3c3013baec 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -1377,6 +1377,9 @@ + + + diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmlindata/iommufd.xml index 63ea839383..10d59ca548 100644 --- a/tests/genericxml2xmlindata/iommufd.xml +++ b/tests/genericxml2xmlindata/iommufd.xml @@ -4,7 +4,7 @@ 219136 219136 1 - + hvm -- 2.53.0