From nobody Mon Sep 8 02:21:10 2025 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; arc=fail (BodyHash is different from the expected one); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 175522668676266.88223955078865; Thu, 14 Aug 2025 19:58:06 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 212CFB34; Thu, 14 Aug 2025 22:58:06 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 10586B9F; Thu, 14 Aug 2025 22:54:57 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 98124984; Thu, 14 Aug 2025 22:54:52 -0400 (EDT) Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2051.outbound.protection.outlook.com [40.107.220.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7CD35984 for ; Thu, 14 Aug 2025 22:54:41 -0400 (EDT) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by PH7PR12MB5685.namprd12.prod.outlook.com (2603:10b6:510:13c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9031.15; Fri, 15 Aug 2025 02:54:37 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%4]) with mapi id 15.20.9009.017; Fri, 15 Aug 2025 02:54:37 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, FORGED_SPF_HELO,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fyI9/RufgFWTGUXw/Y0XlsPE0pAIQ2VK9F58TaigNMZkFMElS0b8FP+yTT7/3bi+7pRQZqjqF8vYUdIeZVruiUNqQknJot7Xxbu0l+h8bFPoXeE4OvG2Da3SM3tKq7ZvA4ykWDfT7Bl3jHGc87zqt9k40Hr6iHRY+UgnRBnn34LEzwuQScB8DIskIACbA0x0CNMDtIYJKYnSGT9AIQr2j2MXIPM/ynWMihn8sjUB+wX8P9SuRMcYzdo6h32K8Ha+HouAq8RSl34FtGsZGMxcpZfHjpSo6jXfiS1bn7INRoVpMre0GYO1/glOrrtVD5UQMLSBIXXPIlmOsccMSnNGog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Zrd4xH9f0340gfroFPXTka19pqdjCccyzTYTh7CTetM=; b=sRnAbcA8cER0jwptZvte4swwwKhSGMOMHgzEuRMEBkfRhskK61LCAAqXmSrbeZMrgHLnv38qtfOyHDiXWhUi4/GLFWNp7cf1MF1S9TvSjjrrqqG7GLbygPsuOOImuVgfhFZ+PLpuVBSCUzovuUbnsC8dmDKSAJY5VV/GxYAkWhI+wgW+5ram92gvMNJ81P8aFT917Ai0trhacjOi6g1pGPe4XX26Gl5QY3XJ3GCD6a721CwQzbX34m761jaQJlWQKiMByfXYFk4OwjxdqlE2gi0Z4s4VAwHmD1ITM180HHm7WJtEo7FvcvJEYxv7bwz86/Tl8YwiCYP9v5vUOx3qrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Zrd4xH9f0340gfroFPXTka19pqdjCccyzTYTh7CTetM=; b=uZl+wKKK7i4Tl1Gi7iq1g7qgNnWLYqOFSo5h/Nduf5FalOlBB+OgSADsoSNCyfmrsJ34StoOhyvqZTyCE5f3fND/0sVpEsXx/VDeaeWePQiuTrppOM+KcVslQgMlO8rwHynug+295Dj6mSOsm25pnaWUJSm2TBPkecuUzPs6RdBDxxeupsjnhkhznp1lXY+lw3QWhR1AsqLlnmjOK7GT66Sfjb9wwjVsSJZMv1SueQ+yktZi7Yl/SxP8Ozsx65/bQWnlYRs3TlsTcy1KyWpniVpQ76aEfzH5d9VKlFXOJinxA1vcbeEHD8ZHOOxi9SKaEdHGsR9/rlJhOsikbQQPcg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [RFC PATCH 3/5] qemu: Implement support for associating iommufd to hostdev Date: Thu, 14 Aug 2025 19:54:12 -0700 Message-ID: <20250815025415.2805374-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250815025415.2805374-1-nathanc@nvidia.com> References: <20250815025415.2805374-1-nathanc@nvidia.com> X-ClientProxiedBy: BYAPR05CA0082.namprd05.prod.outlook.com (2603:10b6:a03:e0::23) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|PH7PR12MB5685:EE_ X-MS-Office365-Filtering-Correlation-Id: 7f3b227d-ca54-44d6-5ae6-08dddba7126e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PlotTl7JJRmBraJ5IkRo1nbx8O4IEpEZ95oW/tx76B6yTl+252SRwnysZS3w?= =?us-ascii?Q?ix+PWfc96gy5FiBzvV71u3zCpqnFwmzemoXEdimn4EsqJRmBmawqYwKFE2aX?= =?us-ascii?Q?pGUE7wsXLabwrHHcTgUFWR9FU1Bsfo7tiaHBz0WgScON3EKz9Wr8zjDBf8hD?= =?us-ascii?Q?rGfJvwQr3DXWUJez81ez0YFbWr4dcICUlCY9v/j8pbT8uF8GPdWeHiH+VPj4?= =?us-ascii?Q?3/feOtq5inQaTgBnRd3uJTCPu4RXta9Fk84CV/VCUEzq4/faBL7UDnPpLBPF?= =?us-ascii?Q?Uz6AgsiCcBXEzicC1Fcda1R0X3gr5/oTYB31xcSzie8Mzth/63PNJ6MmH+Pj?= =?us-ascii?Q?JWAmfSAicHURwdPe2l7fS/qwhcCeZWxO7lcpL/AmFCM1p+RIfkyZGcu6EiZL?= =?us-ascii?Q?oYRdNNDUW40hcCqe9FbjXLpspc1BQvmG8OHKsdIuEzCbYLbeguuus8B2eDTI?= =?us-ascii?Q?jtokl811e+u9LcBf9BOZFgSfUDkbSd0iJU9pJ3ozubTGkU/So1juIpp0waP+?= =?us-ascii?Q?6Nhrs8SVKuZJqnkXXRE3stUFJuKjkvxkD/HKshXKvUjjxjmCeM+Z/yI7f6Jy?= =?us-ascii?Q?Om7l5f2HUx9pvcjYAAFZyzvmtzmgS+JNc7H5bmpMgcGUaKwAkfccbl0ZX9oo?= =?us-ascii?Q?pvcO5F+phGsr7nQfvOLVC9cydFI7bwqkAw+wbgvz09nC9OHu8FdoGAMkSbxq?= =?us-ascii?Q?eONVyUryc6ZfWo6DRak7q2fmz0oGxEUz/aGVJVQKFliVXpzHJxwJ/4gCRxxj?= =?us-ascii?Q?+yLacLprlk1hhMGIUILIsoCzQ8TaGqjSta9BUFwyL8v/z3DkKN3BSRxjyW+8?= =?us-ascii?Q?WqL9faPMBnXgHE7kpYI0WzdMwkRqmAb91MJCvIkIK795VP4wIzswS3oH2ltT?= =?us-ascii?Q?OuuBL+Xtk1M8WCBPasbm33IPgHbXiFsB+vLwB0RAe1n/7sEfh9eCXeJ/thJl?= =?us-ascii?Q?bhHURPXOKjSf6dFHgeS1UzrDtHJq3YZh/5gnGg1pJb5ZW4zGtGRW0SsBqBHS?= =?us-ascii?Q?pJk6UDFpwpBNPTQfqAYoFEyNU944UKRNOoKvT1kPyUlsHkmIyZDHEuLihfG9?= =?us-ascii?Q?OX/JLzEgT11Hn99YMvWhsBb2IkArTXEA/x8c2H+exyn6tVSScEsvcrrPx22D?= =?us-ascii?Q?mGhVlRm1uJKfph02E+FFeU9NtzlWL5npPXW3+ob6AelH8i8Gh0LnzvbvOnqH?= =?us-ascii?Q?GmeozcMnzHnFnR+2cafSiHH00VPBJJigvvXPsgI1RhwoGIw18uCrV59RvKxB?= =?us-ascii?Q?b3ykSmYrW+Fi6y4SDqzgPXhx5CzTj5cbkaCGAXaHfRKBdIFPzWEPZi2Rft8P?= =?us-ascii?Q?f5724ovbmQSBZjgvXyXucBy/KxBZ6p8Q3FW0VG2iX9jcw3wdOnOzwaYvXiv1?= =?us-ascii?Q?dTaKzXLqLdAE44nuhZ2xEs/o5rzYZWoXO+7srt8Vany5nnyZZQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?qcPFVIUaUg59dn0W48goZKDkWlKEyp4urWg+Fua5OyzjehsKJAeoFBqzYk0s?= =?us-ascii?Q?rMuzeyDRNC0+YhoBvpBg5yqZ7Wycg/cpy5ITbwCfbGRT4Omcc3VRLZh51Glo?= =?us-ascii?Q?F6dpJK3nYfU0zHKVQYey+9U0lEVXEt2ZTrWgpSlYRkSWqMK2WkODalUxJZUN?= =?us-ascii?Q?/LXBU7u/hTXZorLUeNlVJQj64HRrL7Wuotp2EXuPlJcrYDS4hGkL8iOIuxGB?= =?us-ascii?Q?8GLzTLM2m9Nt7JEkCoLvqsuZ6YnxNffQx3V8+oV4BA1L/I7KhwLe5SKPU0DB?= =?us-ascii?Q?zphVVxJNN1QpyY8cAMScUJtQEtHD3Zty4KxRZkdFd+aKpe9HrtpivncRTpb4?= =?us-ascii?Q?YDpCcBp3C+pdli1z25aBkm6srHBmlVBLidsCMzMmvXftFC5shG9kOMZvbRsq?= =?us-ascii?Q?JUuK8xBDYtFzr5obOGxL83VvKSRweITU3BwvPpbhDe5MXAJfqwvlGghzfGBz?= =?us-ascii?Q?y2kX16d9YuVoXU/AjZgg6MbiVL4wn6fCJ4d2HXys3jFoyFFwKJzjpfVbTjCf?= =?us-ascii?Q?TdbHUC00cVYj0yfksjXWXn/fskhNZu8DPLjy4aFd5Rl+Gg/AS638tOpIDZKG?= =?us-ascii?Q?DMQt9QQ3vhqcCF4eY9F5pd5YJLkk/U9YYJbH8Ls6DJLEkvgXt5LDNll8C0zA?= =?us-ascii?Q?6sw0KWlnwkQuUeiTi0lL0SibFCFYlwz9u5gQUjJ/nkTu4nVRYZnHiZyaJwxf?= =?us-ascii?Q?1ewY5DobvPNfmSCfRrd4OKugBiO+BgCa1fsT/xLdGVt7gav8+YBPjdlGllAm?= =?us-ascii?Q?sjF+84Ok5cOuyKhUISxz6mgAoDNMZPzOJirMGmI6AW1PWEbW3XkvHyOtVhW6?= =?us-ascii?Q?uIE2apj6mkZ3qyGtrJeKRo1YIX3EXt0WqToRiJY0PJlhxw2d3MKGmguJrySV?= =?us-ascii?Q?QQWVL4OhXxrJvJVwpl0hSZp1Lb7utioflhAppL7AQ6ONUF2mJRS5jAw7yLWk?= =?us-ascii?Q?a7zupw5UrpZTwKZIiP/4T4kruU5k7qB1Ynbs98sJ7+kieC4O9aCvaGCqt/Un?= =?us-ascii?Q?djcC0VOnLyy4BPg8L8CbVdRuq1J0ev0VQ788zjnmFIYt8RuxzsgMcMqsx+6t?= =?us-ascii?Q?V9Fs8tmoeBxPGlMTGlBOnFsPBQaa1rvhq4+oWRSR+2AEkA558eQlZ7pCzIwv?= =?us-ascii?Q?amqnm58jjEjwaaFZhBjMEKDDweA3JDV1FqO9k+KnDBIfIklHeBxewhTteox7?= =?us-ascii?Q?tB9d6ZhVXNnnNDJkw2kSnb1vt4Lab6OCoqVlxGwg8wSouJyepJzKKE9RGh70?= =?us-ascii?Q?I4IGA0STWizGBYqHw87tQx1KyFm/YOHrdM5cYXEUtDgLZEaqNYwN15p0K3sL?= =?us-ascii?Q?ufloBWJYJElW5876jmmiefHdtXx0aG3GEqoqOMwFOJlNdSk1/cyWDeQKI8Ox?= =?us-ascii?Q?Rj7ypkN3+tdiWM6L67fAyA4Hnb/CUyZhV+dvmb68r4nndREMPc4CKB/iAAqz?= =?us-ascii?Q?tZ3YpPomp3a6JEyKWQQjXw5qYGl4zv7UpGQhM9ARFYMSpkxQ20uJsFNsFZLY?= =?us-ascii?Q?66IC02UVEWws8emejwtvZGZxz/bVt1GDVI+c7WR1ctSnwKeAZsO+KUO7Ez8H?= =?us-ascii?Q?pqrxfaKsDYf+CoOHbklu7HrDl4tujvMJEm2pAd46?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7f3b227d-ca54-44d6-5ae6-08dddba7126e X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Aug 2025 02:54:37.2883 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /g3vKtwZnYSmJYOY2nGMjxI96lHMEVf/GxIHPew8doGQrhniQjfnvkaM/1ScPYYAMoK972Jom2C+orbFehs7Vg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5685 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZHJJSSLNIZBYZ42Z75354BDF62QVYFGE X-Message-ID-Hash: ZHJJSSLNIZBYZ42Z75354BDF62QVYFGE X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: shameerali.kolothum.thodi@huawei.com, nicolinc@nvidia.com, nathanc@nvidia.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1755226689135124100 Content-Type: text/plain; charset="utf-8" Implement iommufdId attribute for hostdev devices that can be used to specify associated iommufd object when launching a qemu VM. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 9 +++++++++ src/conf/domain_conf.c | 20 ++++++++++++++++++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 9 +++++++++ src/qemu/qemu_command.c | 14 ++++++++++++++ 5 files changed, 53 insertions(+) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 2558df18ef..e2b9be16c9 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -4581,6 +4581,7 @@ or: + iommufd0 ... @@ -4829,6 +4830,14 @@ or: device; if PCI ROM loading is disabled through this attribute, attempts= to tweak the loading process further using the ``bar`` or ``file`` attribu= tes will be rejected. :since:`Since 4.3.0 (QEMU and KVM only)`. +``iommufdId`` + The ``iommufdId`` element is used to specify using the iommufd interfac= e to + propagate DMA mappings to the kernel, instead of legacy VFIO. When the + element is present, an iommufd object with its ID specified by ``iommuf= dId`` + will be created by the resulting qemu command. Libvirt will open the + /dev/iommu and VFIO device cdev, passing the associated file descriptor + numbers to the qemu command. + ``address`` The ``address`` element for USB devices has a ``bus`` and ``device`` attribute to specify the USB bus and device number the device appears a= t on diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5ea4d6424b..38d8f2998a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13581,6 +13581,15 @@ virDomainVideoDefParseXML(virDomainXMLOption *xmlo= pt, return g_steal_pointer(&def); } =20 +static void +virDomainHostdevDefIommufdParseXML(xmlXPathContextPtr ctxt, + char** iommufdId) +{ + g_autofree char *iommufdIdtmp =3D virXPathString("string(./iommufdId)"= , ctxt); + if (iommufdIdtmp) + *iommufdId =3D g_steal_pointer(&iommufdIdtmp); +} + static virDomainHostdevDef * virDomainHostdevDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr node, @@ -13655,6 +13664,8 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xml= opt, if (virDomainNetTeamingInfoParseXML(ctxt, &def->teaming) < 0) goto error; =20 + virDomainHostdevDefIommufdParseXML(ctxt, &def->iommufdId); + return def; =20 error: @@ -21195,6 +21206,11 @@ virDomainHostdevDefCheckABIStability(virDomainHost= devDef *src, } } =20 + if (src->iommufdId && dst->iommufdId) { + if (STRNEQ(src->iommufdId, dst->iommufdId)) + return false; + } + if (!virDomainDeviceInfoCheckABIStability(src->info, dst->info)) return false; =20 @@ -27554,6 +27570,10 @@ virDomainHostdevDefFormat(virBuffer *buf, if (def->shareable) virBufferAddLit(buf, "\n"); =20 + if (def->iommufdId) { + virBufferAsprintf(buf, "%s\n", def->iommufd= Id); + } + virDomainDeviceInfoFormat(buf, def->info, flags | VIR_DOMAIN_DEF_FORMA= T_ALLOW_BOOT | VIR_DOMAIN_DEF_FORMA= T_ALLOW_ROM); =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index edb18632f3..367e7686f1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -375,6 +375,7 @@ struct _virDomainHostdevDef { virDomainHostdevCaps caps; } source; virDomainNetTeamingInfo *teaming; + char *iommufdId; virDomainDeviceInfo *info; /* Guest address */ }; =20 diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index fd19f115f7..662f12c4f1 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6507,6 +6507,9 @@ + + + @@ -7761,6 +7764,12 @@ =20 + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cecd0661ca..6b3e2ffd0d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4846,6 +4846,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, "S:failover_pair_id", failover_pair_id, "S:display", qemuOnOffAuto(pcisrc->display), "B:ramfb", ramfb, + "S:iommufd", dev->iommufdId, NULL) < 0) return NULL; =20 @@ -5225,6 +5226,8 @@ qemuBuildHostdevCommandLine(virCommand *cmd, virQEMUCaps *qemuCaps) { size_t i; + g_autoptr(virJSONValue) props =3D NULL; + int iommufd =3D 0; =20 for (i =3D 0; i < def->nhostdevs; i++) { virDomainHostdevDef *hostdev =3D def->hostdevs[i]; @@ -5234,6 +5237,17 @@ qemuBuildHostdevCommandLine(virCommand *cmd, g_autofree char *vhostfdName =3D NULL; int vhostfd =3D -1; =20 + if (hostdev->iommufdId && iommufd =3D=3D 0) { + iommufd =3D 1; + if (qemuMonitorCreateObjectProps(&props, "iommufd", + hostdev->iommufdId, + NULL) < 0) + return -1; + + if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) + return -1; + } + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; =20 --=20 2.43.0