From nobody Fri Dec 12 14:06:21 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 (Bad Signature); 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 1763778770438276.95253134108805; Fri, 21 Nov 2025 18:32:50 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id CDBAD443DE; Fri, 21 Nov 2025 21:32:49 -0500 (EST) Received: from [172.19.199.56] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 8DEDA41842; Fri, 21 Nov 2025 21:27:38 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 98E9641905; Fri, 21 Nov 2025 21:22:47 -0500 (EST) Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011012.outbound.protection.outlook.com [40.93.194.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id BB37E43FC3 for ; Fri, 21 Nov 2025 21:21:03 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by CY1PR12MB9559.namprd12.prod.outlook.com (2603:10b6:930:fd::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.11; Sat, 22 Nov 2025 02:21:01 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9343.011; Sat, 22 Nov 2025 02:21:01 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,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 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RqdlXZDA3Ii3WUHyyFESj+CJsfbB5tXB+v4WvQPd8SlG9dwDb/itsaZ4z6yMgiccsHXl/iHvo0cBqpuuKVdd7/FoiCh1kdKNaRGo4OU3LXFZJSJhtwW2um9GanMfuJCyX2y2iYWaOPFgtRMuwMB9tT5s41CeehdZN7F1qWDqxtJe9ZKAvB21LJ+bXW4o9pSpC86ETr54XY2OaQXI4tuSPD8G8YC6FbcxVYZb9lLAdFAAqkj82flnEKYjnURZNPr/ZBpXRp6QaG1JmunxzXAMQTkbDcRbeCw5m9sRzdQhcRBEFDrtXbrWMrWWl1gDTEf3HTUMoTZp3rSf1i6rdglOmQ== 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=ctSzIFbEIRjoYM9rE1+OQTT5Ms1F2IocHFf2Y/mfjKg=; b=SNnfFCegaJdKfbKWAHmTMqojU8b6Y6hBOZJa/gTxI3S8LpeV62QXlX1NcSySnZTD6WraB4Ps/0v5dECurBfZmaAN90LbUamdyPOAB21BbiTRu9T/jTJV4nYYxfl86yePKbcssUiIP4hfPXR1byjZyM5+EjdsgcWEkUai82QQVNFhmwtA1Y//yZ/+y+EqKPToG7yyv2Tjgbz7qq4c93TT/rFOJ/JOdVtrE7LzZj5IStqTaPnUiwtLbupm50hXM9b7UYj1cHEGstmLQUuWRblMq49E7GjgDKcSv/65ptrvQ4YOQ4qAudL4ASE/nyptOepclig0J2RwSx8PPYBOcvfWDw== 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=ctSzIFbEIRjoYM9rE1+OQTT5Ms1F2IocHFf2Y/mfjKg=; b=BUyxxokMfh/JXK8CsQKrkvZ7aJbb3UvxfR6e8MS7dsR0SOfePZn50IU6IMaVzMkjhM60hDly3yDerPpIAg0ruehuRQzLekx3kBdM76hLtgU/xvKTfJMbfKPiAs//yKSo9dTpSwRZicETkEs2+609YcV26+tH/aNm8UNZayQci7pbkqtxCGsTj1UO0gUEWndxnAGKQskBeyCLcXh9DJROWP/QKw0dhZrO4guD7Gt8kMijtNqLsD/Nt6MWFqlgAxUcFU69tS+y5kOooIc1Y/ja4XUvwKso40p4KqdbFGMdBSLFlT4jcgW6nXBjRRr7EDfnUQ0YYFc9MtLks1MQssshGQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v2 3/5] qemu: open iommufd FD from libvirt backend Date: Fri, 21 Nov 2025 18:20:55 -0800 Message-ID: <20251122022057.3440459-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251122022057.3440459-1-nathanc@nvidia.com> References: <20251122022057.3440459-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BYAPR11CA0067.namprd11.prod.outlook.com (2603:10b6:a03:80::44) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|CY1PR12MB9559:EE_ X-MS-Office365-Filtering-Correlation-Id: c6268c4b-d49f-4d8f-c7d7-08de296dc7e3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?xYTuORcWSUBUjugM+ssU8G8+Tt0MZCdvQchF4FqzYuiACFEsrPVuaOlQ+joR?= =?us-ascii?Q?GTbAGWQF2F4kLdfG4GchIfCk6O6LgjR1cCRf/rLNS3RT6b5ai9YEd7kisMHJ?= =?us-ascii?Q?NxpTIuCDAurOJmXuIG0tDA5K9CATsBD8xgLc4fHdi9pmSOE1/xv6UdcHPqDk?= =?us-ascii?Q?kRVtEfCbuQhFh6Lk6nEcyOgOF4Ph/eOs8Eyw+kBvLAeE/hpA9SZLZsjZiqaW?= =?us-ascii?Q?HnxaV2SsNJ+G+KBoPo2ZmT2R+YXy1z3Tzk8ZyzKFZmTnAhSiTQV/TuTDfz9n?= =?us-ascii?Q?BIBFY+tyGSz7OIU1e5WJ9Lu0px+JV+60xL67VopNQipnaVT3eRBF8g9An4DZ?= =?us-ascii?Q?xEG2ycNDuadYcWk3Q52xMMkV2dkPmIzxmhziGxYoDjO+S6QKhGCDpgifewMN?= =?us-ascii?Q?uJxyX6RSXredSrzAbRIptrejiw4s8BTO8qXL+835Oy8g/VULkmxgZYTZPOmr?= =?us-ascii?Q?kOhOOrOw6nKhcB8pIFDjD1YQwn45YdHj05+EjnpbYBoA24FNQnGx9tPoxWdd?= =?us-ascii?Q?ZcK5dhtMi+LaDIFakH3HXIr9evBMO8laXl3nfBzVxyu5YUsejkD4gXvzdpO6?= =?us-ascii?Q?btHvm5Z4RZw47MRAo1DCUxvTtzlnVKA0/QPzYr7dZsm96NBS64OeuL9nOOpW?= =?us-ascii?Q?8mPnpq4gnJKcSAZIzz95CsdXMVr1WYp19q9mz7jrk5iSNpySBZxLPaC0819L?= =?us-ascii?Q?YWw1z9ubv0ouJg/OPnXi2TMWNwt83u4CRxYPyfwQqsj3Nl/9t8iTlA7qYaB5?= =?us-ascii?Q?zTWgkhDhD1UpY6hn9MaHD0fk3/qmpjbLUEQLd8mMwy9cLANQhBdmW7IcjZPT?= =?us-ascii?Q?9rDYICa1dfIhCITinoyizjyhna2YJGSidpI4WabSMuUbbpqa14I1roaO1lyn?= =?us-ascii?Q?JXe3Zl8pr5I0tMNp6r+pGn6bTQL6OudUY26CzUZdewMtdtKkjRrDzcq7xCYq?= =?us-ascii?Q?p0SzhceuzpPDR3Cwu1X6ptMDuljDH+qEMY/y2p3L8/kkqV3yAno++S1Do6Dd?= =?us-ascii?Q?0hy85raj46U+wVn+yPenFFuqUECQn7P42//8V3hmUpLvR60+s3tUgIlKOEXN?= =?us-ascii?Q?0I29dpWNbenLqloUndlxCOS0dIWbHGD2+xoq6FnB10U7H30m722fRJe7sIuR?= =?us-ascii?Q?80PpP5SM6/aAwY4VtwQZ8Ua+iAoCqY0GXLp5yHhOapr9fhDJaM45c8Z1dAiV?= =?us-ascii?Q?IhrPUVeKwm0rj7DQCAxhnprvfJsUrGJZj2oEfZEDfHcYUrJa2KgTigP6Vp58?= =?us-ascii?Q?AWvGp7MqTEssb/UfPgG6WTKlYoVnEKhUp0KYuIRg/Xug2JZhSA1EWD6wq1mW?= =?us-ascii?Q?hcdJUOhjEWe50bF/BddXfCBljnwluZ06wykY0tkOtSvqh/4DIRXitjx+nLG9?= =?us-ascii?Q?n1ZMRrWKbNZFiP+BLsrFd/0oeiFs5tj9gyFWnntauhQfJhUjo66MdNrlV+Dz?= =?us-ascii?Q?rblzoqfdl+tmiveX+Ut/Zok0J2L232lV?= 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)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?sue3yvxKN9A0Vy7tKzLMaY8/TVZeM4OdKoqKMhUZX649uKn+vgBHnkD2ygSL?= =?us-ascii?Q?y4YeH3m/2PnVp4TJpDaxzbLVsbKs0nJ9HtH0cH2MTKiiqZIDUlcmucE4Ghc1?= =?us-ascii?Q?Beb6VT004Gu7h79YFvKxcb/9sI5o6WSEimMeptPcr/DNIfEwjsO9Drk3rRcK?= =?us-ascii?Q?cekZFJG2em6UQEkfk1KfBrJOKu7QKRRLMJp2kL9YcgtKqa0KkYflusjboCqX?= =?us-ascii?Q?Cqo8zkj1AcfmPArTU7S2P9S0yFDFz+CHl135lHAMTYPclM7mXc/bhoLBOSFq?= =?us-ascii?Q?jJZKwEESaHS9+vY2jGf1KmaDJq15o3OQJgng179Qf6aEZMvUPHO7YYpYoK9B?= =?us-ascii?Q?275srh3eXaaXhIHwR7yEoGdnOLtUd+R2LtFjFBeHpvH1hPCcsbf7RYSoRa6c?= =?us-ascii?Q?MlBOIpNKV+zrAPTSkgCeMKF7uBG/8T7SwZkJIQcNmykwNBnftWjPVT3RT5k7?= =?us-ascii?Q?59Zzd+bsY1pcTYHaY78tzj3q2T3uViu60z6AH+AI8Of55rNjYjujfIBa7nIh?= =?us-ascii?Q?eYj2p3fvX+6Qwt/T17I2airhqtzweSJHpvIzrEwJaTNpRQyRK/7mxtRENxWk?= =?us-ascii?Q?XL07/ELmu+jn6GWWr7molhp6lvk5l0bRjEkXVEr/r5MwIY9ed6tT1Nglgiyz?= =?us-ascii?Q?eSfRGO7WncURDNSSS1hQE6RG7wORZ10gyHgBCdxYSvsOjmov47iqeP1b2WqP?= =?us-ascii?Q?NejS35mJl0IjD5CFUmkSLvlcU5rvAZG0jXejk0v1HTGSCFSxk9/32rx1xRzd?= =?us-ascii?Q?cDg1Qnh3/PS5EnZsouxyUuUd1PCXqP5/ArQPwD814ClEbGbaDaiDp0FlZuYS?= =?us-ascii?Q?/bTgsmfjJxMM5LMdFY7SEcZ8oziwBPC/IUXcRYkalxMYBPtxiXfCpPDEjkfC?= =?us-ascii?Q?GANkYCN7m8B4cVTRnidAklpblZnanQJWiIrUx8sbmWQEa1KYfsE1j/AD3RUL?= =?us-ascii?Q?M//RYNesNq9AJWP3PBez8k61FSrh2s6Fqmt/iax4wiSrofLwYbE72tlDJcDv?= =?us-ascii?Q?Pvd5RTY5fbm4yrKghlskML0Iih3V/JrpUeWy8DndJpmzJnAJ+M0BkJfkAEDF?= =?us-ascii?Q?VOb+HmpZIbUk0ebFXbK10wCoECIinqwP8ADNpzYvOJskWb6438w/SOstyodv?= =?us-ascii?Q?YJBvwBBMhx08KUA5Iva9Gai63lQ565CSGiwE0dSDV8P/y8aN+YsBL3f2kPi6?= =?us-ascii?Q?GJqTRvI7+mLVQ2ZGaMm3i3Fb9zKSCuC+y3KbfhU3zPRQzrqP0/bm4hgDbMOi?= =?us-ascii?Q?Qo5zlJ52v2JlXDbtak7erUefw2bR+zmXzwhQsPb6kyVxjEHJkpoRjFarwgTZ?= =?us-ascii?Q?X/JxoLpIGzYrthFrKZusCDACQ7P3Se3rGjEQd3Mdccd6iOOR9tc6tdNigu/s?= =?us-ascii?Q?3VHoMQFQ1WUOj5YEkkTSq4A2F4QUFyEFzKIMuRW9v8/qyC9crfaMLWq/lBA2?= =?us-ascii?Q?HDuyN+CT/K8AcMptSfW5K9HQjW4GSp1KMPvpUGTq2VPy0s0+sIWxsZh8hKRC?= =?us-ascii?Q?kFDPllKKeqKFvO9cH2t95R28Byf8JRV+LDF61i2XbLW4C/061PT4lKpBPNQL?= =?us-ascii?Q?On8l6nHifaQ1Yu9K93u8QcwVsbgG8Hi3njsqpiZt?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6268c4b-d49f-4d8f-c7d7-08de296dc7e3 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2025 02:21:01.5926 (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: Xt+bov6x6Hs63/Nm6eFX7XY/hOptzZe9ZBXCg/q1SJFDpNtWr2VhDlcVw4I9UX/b3/41GLjZY7kqgOp5GlRwLg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB9559 Message-ID-Hash: P7Z3T3QKZH2I5MWIQESHDROTMHQJGVSE X-Message-ID-Hash: P7Z3T3QKZH2I5MWIQESHDROTMHQJGVSE X-MailFrom: nathanc@nvidia.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 CC: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com 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: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1763778771169018900 Content-Type: text/plain; charset="utf-8" Open iommufd FD from libvirt backend without exposing these FDs to XML users, i.e. one per domain for /dev/iommu, and pass the FD to qemu command line. Signed-off-by: Nathan Chen --- src/qemu/qemu_command.c | 8 ++++-- src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_process.c | 56 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9b08f66175..99c310cf31 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5229,12 +5229,14 @@ qemuBuildAcpiNodesetProps(virCommand *cmd, static int qemuBuildHostdevCommandLine(virCommand *cmd, const virDomainDef *def, - virQEMUCaps *qemuCaps) + virQEMUCaps *qemuCaps, + virDomainObj *vm) { size_t i; g_autoptr(virJSONValue) props =3D NULL; int iommufd =3D 0; const char * iommufdId =3D "iommufd0"; + qemuDomainObjPrivate *priv =3D vm->privateData; =20 for (i =3D 0; i < def->nhostdevs; i++) { virDomainHostdevDef *hostdev =3D def->hostdevs[i]; @@ -5265,8 +5267,10 @@ qemuBuildHostdevCommandLine(virCommand *cmd, =20 if (subsys->u.pci.driver.iommufd =3D=3D VIR_TRISTATE_BOOL_YES = && iommufd =3D=3D 0) { iommufd =3D 1; + virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_C= LOSE_PARENT); if (qemuMonitorCreateObjectProps(&props, "iommufd", iommufdId, + "S:fd", g_strdup_printf("= %d", priv->iommufd), NULL) < 0) return -1; =20 @@ -10967,7 +10971,7 @@ qemuBuildCommandLine(virDomainObj *vm, if (qemuBuildRedirdevCommandLine(cmd, def, qemuCaps) < 0) return NULL; =20 - if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps) < 0) + if (qemuBuildHostdevCommandLine(cmd, def, qemuCaps, vm) < 0) return NULL; =20 if (migrateURI) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7601bdbb2b..d569dd5ad9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2042,6 +2042,7 @@ qemuDomainObjPrivateAlloc(void *opaque) priv->blockjobs =3D virHashNew(virObjectUnref); priv->fds =3D virHashNew(g_object_unref); =20 + priv->iommufd =3D -1; priv->pidMonitored =3D -1; =20 /* agent commands block by default, user can choose different behavior= */ diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 4736f1ede5..e55ba1c968 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -264,6 +264,8 @@ struct _qemuDomainObjPrivate { /* named file descriptor groups associated with the VM */ GHashTable *fds; =20 + int iommufd; + char *memoryBackingDir; }; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bf245ee8af..83b8a586a1 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -10272,6 +10272,38 @@ qemuProcessHandleNbdkitExit(qemuNbdkitProcess *nbd= kit, virObjectUnlock(vm); } =20 +/** + * qemuProcessOpenIommuFd: + * @vm: domain object + * @iommuFd: returned file descriptor + * + * Opens /dev/iommu file descriptor for the VM. + * + * Returns: 0 on success, -1 on failure + */ +static int +qemuProcessOpenIommuFd(virDomainObj *vm, int *iommuFd) +{ + int fd =3D -1; + + VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name); + + if ((fd =3D open("/dev/iommu", O_RDWR | O_CLOEXEC)) < 0) { + if (errno =3D=3D ENOENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMU FD support requires /dev/iommu device"= )); + } else { + virReportSystemError(errno, "%s", + _("cannot open /dev/iommu")); + } + return -1; + } + + *iommuFd =3D fd; + VIR_DEBUG("Opened IOMMU FD %d for domain %s", fd, vm->def->name); + return 0; +} + /** * qemuProcessOpenVfioDeviceFd: * @hostdev: host device definition @@ -10329,6 +10361,8 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *ho= stdev, int qemuProcessOpenVfioFds(virDomainObj *vm) { + qemuDomainObjPrivate *priv =3D vm->privateData; + bool needsIommuFd =3D false; size_t i; =20 /* Check if we have any hostdevs that need VFIO FDs */ @@ -10342,6 +10376,8 @@ qemuProcessOpenVfioFds(virDomainObj *vm) if (hostdev->source.subsys.u.pci.driver.name =3D=3D VIR_DEVICE= _HOSTDEV_PCI_DRIVER_NAME_VFIO && hostdev->source.subsys.u.pci.driver.iommufd =3D=3D VIR_TRI= STATE_BOOL_YES) { =20 + needsIommuFd =3D true; + if (!hostdev->privateData) { if (!(hostdev->privateData =3D qemuDomainHostdevPrivat= eNew())) goto error; @@ -10363,6 +10399,18 @@ qemuProcessOpenVfioFds(virDomainObj *vm) } } =20 + /* Open IOMMU FD if needed */ + if (needsIommuFd) { + int iommuFd =3D -1; + + if (qemuProcessOpenIommuFd(vm, &iommuFd) < 0) + goto error; + + priv->iommufd =3D iommuFd; + + VIR_DEBUG("Stored IOMMU FD %d", priv->iommufd); + } + return 0; =20 error: @@ -10379,6 +10427,7 @@ qemuProcessOpenVfioFds(virDomainObj *vm) void qemuProcessCloseVfioFds(virDomainObj *vm) { + qemuDomainObjPrivate *priv =3D vm->privateData; size_t i; =20 /* Close all VFIO device FDs */ @@ -10396,4 +10445,11 @@ qemuProcessCloseVfioFds(virDomainObj *vm) VIR_FORCE_CLOSE(hostdevPriv->vfioDeviceFd); } } + + /* Close IOMMU FD */ + if (priv->iommufd >=3D 0) { + VIR_DEBUG("Closing IOMMU FD %d", priv->iommufd); + VIR_FORCE_CLOSE(priv->iommufd); + priv->iommufd =3D -1; + } } --=20 2.43.0