From nobody Tue Mar 24 01:17:08 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1773938608; cv=none; d=zohomail.com; s=zohoarc; b=cKSflM+k/+dly/QPgbmUPi53AgCXYC3Ma1fRHfej/jXz+fgC1dFtethywP05y2x6ZnSwL3sMejUzthHtu2u2ZdCDw/YsDa7jXHewVDhZ8+bVWCURvlPg255xrXwgOJBvKjJ06a/dfm2yTmSyzcgNX07sX/regGGb7VGF+gbQANs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773938608; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=02pdjjEf5vEy3sHZchktJDzwHtJ5KvsbVFFpwiJf0KA=; b=nnUNsEPg3MPvnn5EcPJoXsk7YaX8CUp7alrv3xn/PGZPpH7hvSbl0HG5ihDaSOq2/VWLKvNGz2quWNf7ITg+2FTkE8zw5H9imG6ngLJ1osmYGMUa2UEju/ofjhjiixrFBn7O/aTJbhYOylrSfRk44c39I8UW4KqJxpp58aWAms4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1773938608868965.0549438203107; Thu, 19 Mar 2026 09:43:28 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 3F0A341961; Thu, 19 Mar 2026 12:43:28 -0400 (EDT) Received: from [172.19.199.12] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 4D98F41CE6; Thu, 19 Mar 2026 12:39:13 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D6A9341ADD; Thu, 19 Mar 2026 12:39:08 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E53ED4181C for ; Thu, 19 Mar 2026 12:37:09 -0400 (EDT) Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-170-rePvilaGNd6VqcpAlPH31Q-1; Thu, 19 Mar 2026 12:37:08 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 458C019560A2 for ; Thu, 19 Mar 2026 16:37:07 +0000 (UTC) Received: from antique-work.redhat.com (unknown [10.44.33.53]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8EBD230001A1 for ; Thu, 19 Mar 2026 16:37:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773938229; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=02pdjjEf5vEy3sHZchktJDzwHtJ5KvsbVFFpwiJf0KA=; b=d0MDYcsQlswMzMthQVp/P738ucgNov7m3MIpbu/l/aOGOfdsE9Izgo2nCxC5XyriTj8b8d VOVnZi6iYFayGY9KeUSfIvlvAYoPdqFOXOXJ+Z+Q3Y0YKCCd74XLI/syC8o+viBCYiXYA0 M5uDgf9nvhM65h7ECN3SFL+eXPZhPjU= X-MC-Unique: rePvilaGNd6VqcpAlPH31Q-1 X-Mimecast-MFC-AGG-ID: rePvilaGNd6VqcpAlPH31Q_1773938227 To: devel@lists.libvirt.org Subject: [libvirt PATCH 07/11] conf: Introduce domain iommufd element Date: Thu, 19 Mar 2026 17:36:53 +0100 Message-ID: <1d0065abb64ee522aa155278f78e8602cd300f61.1773938045.git.phrdina@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: cwJ0NQf9MmcCUJomIHojHeX6jv_2Zw43GAs_mJJA3G8_1773938227 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: K5R4YY7UAZJO3JCZ2XNUWLNGMD26WA46 X-Message-ID-Hash: K5R4YY7UAZJO3JCZ2XNUWLNGMD26WA46 X-MailFrom: phrdina@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Pavel Hrdina via Devel Reply-To: Pavel Hrdina X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1773938611960154100 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Pavel Hrdina In addition to configuring IOMMUFD for each host device add configuration for the whole VM. This will be extended to add support for passing FD to libvirt from management applications. Signed-off-by: Pavel Hrdina Reviewed-by: Peter Krempa --- docs/formatdomain.rst | 21 ++++++++++++ src/conf/domain_conf.c | 46 ++++++++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/conf/schemas/domaincommon.rng | 12 +++++++ tests/genericxml2xmlindata/iommufd.xml | 18 ++++++++++ tests/genericxml2xmltest.c | 2 ++ 6 files changed, 101 insertions(+) create mode 100644 tests/genericxml2xmlindata/iommufd.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 9f245293e6..f6096b2b9b 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -1382,6 +1382,27 @@ Block I/O Tuning ``write_iops_sec`` Write I/O operations per second limit. :since:`Since 1.2.2` =20 +Host Device IOMMUFD +------------------- + +:: + + + ... + + ... + + +``iommufd`` + :since:`Since 12.2.0 (QEMU/KVM only)` The optional ``iommufd`` element = with + mandatory ``enabled`` attribute can be used to enable IOMMUFD backned f= or + VFIO host devices. This provides an interface to propagate DMA mappings= to + kernel for assigned devices. Libvirt will open the /dev/iommu and VFIO = device + cdev and pass associated file descriptors to QEMU. + + This controls IOMMUFD usage for all host devices, each device can chang= e this + global default by setting ``iommufd`` attribute for ``driver`` element. + Resource partitioning --------------------- =20 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 562803ea87..950c755ad9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19883,6 +19883,31 @@ virDomainDefControllersParse(virDomainDef *def, return 0; } =20 +static int +virDomainDefIommufdParse(virDomainDef *def, + xmlXPathContextPtr ctxt) +{ + int n; + g_autofree xmlNodePtr *nodes =3D NULL; + + if ((n =3D virXPathNodeSet("./iommufd", ctxt, &nodes)) < 0) + return -1; + + if (n > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("only one 'iommufd' element is supported")); + return -1; + } + + if (n =3D=3D 0) + return 0; + + if (virXMLPropTristateBool(nodes[0], "enabled", VIR_XML_PROP_REQUIRED,= &def->iommufd) < 0) + return -1; + + return 0; +} + static virDomainDef * virDomainDefParseXML(xmlXPathContextPtr ctxt, virDomainXMLOption *xmlopt, @@ -19961,6 +19986,9 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, !virDomainIOThreadIDArrayHasPin(def)) def->placement_mode =3D VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO; =20 + if (virDomainDefIommufdParse(def, ctxt) < 0) + return NULL; + if ((n =3D virXPathNodeSet("./resource", ctxt, &nodes)) < 0) return NULL; =20 @@ -28172,6 +28200,22 @@ virDomainHubDefFormat(virBuffer *buf, } =20 =20 +static void +virDomainDefIommufdFormat(virBuffer *buf, + virDomainDef *def) +{ + g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; + + if (def->iommufd =3D=3D VIR_TRISTATE_BOOL_ABSENT) + return; + + virBufferAsprintf(&attrBuf, " enabled=3D'%s'", + virTristateBoolTypeToString(def->iommufd)); + + virXMLFormatElement(buf, "iommufd", &attrBuf, NULL); +} + + static void virDomainResourceDefFormat(virBuffer *buf, virDomainResourceDef *def) @@ -29721,6 +29765,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, if (virDomainNumatuneFormatXML(buf, def->numa) < 0) return -1; =20 + virDomainDefIommufdFormat(buf, def); + virDomainResourceDefFormat(buf, def->resource); =20 for (i =3D 0; i < def->nsysinfo; i++) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3b4980394e..f7e2eb6f5e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3244,6 +3244,8 @@ struct _virDomainDef { virTristateSwitch apic_eoi; virDomainFeatureTCG *tcg_features; =20 + virTristateBool iommufd; + bool tseg_specified; unsigned long long tseg_size; =20 diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 376218118d..0436ec8edc 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -1025,6 +1025,10 @@ =20 + + + + @@ -1368,6 +1372,14 @@ =20 + + + + + + + + diff --git a/tests/genericxml2xmlindata/iommufd.xml b/tests/genericxml2xmli= ndata/iommufd.xml new file mode 100644 index 0000000000..63ea839383 --- /dev/null +++ b/tests/genericxml2xmlindata/iommufd.xml @@ -0,0 +1,18 @@ + + foo + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + + hvm + + + + destroy + restart + destroy + + + diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c index 6757fc44de..6be694cac5 100644 --- a/tests/genericxml2xmltest.c +++ b/tests/genericxml2xmltest.c @@ -263,6 +263,8 @@ mymain(void) =20 DO_TEST("iothreadids"); =20 + DO_TEST("iommufd"); + virObjectUnref(caps); virObjectUnref(xmlopt); =20 --=20 2.53.0