From nobody Sun Feb 8 03:12:26 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; 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 1767754645340478.8104796311512; Tue, 6 Jan 2026 18:57:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 64DF141BCF; Tue, 6 Jan 2026 21:57:24 -0500 (EST) Received: from [172.19.199.83] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 3941A43F15; Tue, 6 Jan 2026 21:50:34 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id EF54D41BA4; Tue, 6 Jan 2026 21:49:51 -0500 (EST) Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012042.outbound.protection.outlook.com [40.93.195.42]) (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 8EE3041B9E for ; Tue, 6 Jan 2026 21:49:45 -0500 (EST) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SN7PR12MB7977.namprd12.prod.outlook.com (2603:10b6:806:340::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9478.4; Wed, 7 Jan 2026 02:49:43 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc%7]) with mapi id 15.20.9499.002; Wed, 7 Jan 2026 02:49:43 +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=EHtgrCj0Y072gVcA+GLoxxEBoSN6DEYDjHjgBd/mTWRmSQ0KgZckRhu9GFofBVUxhmm1wpLpyTNFxPvCKSO/I8CYjK2WqzZqHURaTiu2ZIMnCMuj5eQwk3HjIJf8G9lUZHohkNKC/BsRiKBhhLBgVOyKJP5Z+youMRv1s2k4ZUqoJumv6wkBkJrfvjwaAsZHNEgD4w9wOjLM1uqKlmIJGTyKI/zYGER80HVkMV7ks8pU6jyA17dERaawqcnBZ4yyAD2awey06FyVvUYSc0euOmCshYUxSjtGtOLz5ArCMjm0FK3APIdNA1U2hbcEcD3D6sm3s48dcNTqE1oLsg2HJQ== 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=sKvBp80mQ/WAL9SKUsKhYAmrRJq6TYxSmDVvD+nx/X0=; b=r8htGaERSSFrHlYAIATYhDbfTZDaGRsm0OPWqrrihDcWxHFMVT7o2Ppf9FaiieCxvL7eRO8dIMMFJ95FgqSaG6PxZKZvGIsz/ravFp1xTz9Z9D/72+e3aPDqoycN2ravtVtuDmBX9Smutsnp/dDoCfaFykokVs4K7Syegt4Yft9Jl7GG4uB4r1DSfskUUncvCNtgwhAoZ6HdSgEnycdnbdF2gJk7hfAGqsPjF9mol6t+UwP04/4Y/PU99lp97nHNQPAJtfk5I1LGLi0GD30USpWi0DOlD3xev3vaw0PkN6MOh9WPo97GtyGtyo8CcswqmeiwFgFPNbo+4sGkxds3vg== 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=sKvBp80mQ/WAL9SKUsKhYAmrRJq6TYxSmDVvD+nx/X0=; b=Od/+8Ce/mt4Yeudi4w+XStfmpgvDNLRi/wCPvQeKzM/oM6OsRDSG4XRrpgNI7ijqUBOcW9nvR3FRxY/amaVFu2VSjjfAxEAKHYKFcJkhVNX9lkjD1b6D34PK62x7+oe3A9dPA0OiK4LY2eSeSCK7AYEVkDaFA0uUnsIo4DlAiPZTquuPwDoHLB7giZKRWRIzfv9m35o/bnRu81Z7C9EbLgzTeZyVDb5LeWDOmeB/fCVgWULGKXujueXOpgMnUKMNU2G8P/ajjvD0qT9Zqo89DtywFoktCnQltpATLMEwMYYipP9lDcU5/WheSMaTZB1ntR66x2TrW1lQ1nRgfKweuQ== 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 v4 4/7] qemu: open VFIO FDs from libvirt backend Date: Tue, 6 Jan 2026 18:49:35 -0800 Message-ID: <20260107024938.461794-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107024938.461794-1-nathanc@nvidia.com> References: <20260107024938.461794-1-nathanc@nvidia.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR03CA0020.namprd03.prod.outlook.com (2603:10b6:a03:39a::25) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SN7PR12MB7977:EE_ X-MS-Office365-Filtering-Correlation-Id: adab5f8d-1e88-423d-0f64-08de4d976914 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: =?utf-8?B?T0RKS05Xa3MybWlzcHVnY3dyNWpGb0VTbElGMDJsY0dpcCtzY3A1N29xaEI4?= =?utf-8?B?QzFKNk5hZmtBbzd0YkxLWGd1bzFqN05BKy8wMnpwaVlRSEZuc3pMVlpsd3Vh?= =?utf-8?B?cnBGUnFCMVQ4TS8yY1Z6WnVlcWkyWnArM2hwMmViY1p0RHBOYk1UL2oyMUVq?= =?utf-8?B?UGdNSHRGMGpPVStXMW92aWNiWklvOVJxQlhHbUZrZ1I0dDBsa0FVS2ZCQjVw?= =?utf-8?B?aFdnZTdiNHpJME5GVzYyK1d6MU81OExkaXZEYnJTT1NndkhBbnZvUzFCd29F?= =?utf-8?B?NWVBOUgvcXp2YTg2bVBjSldkY1lIdzArU3Q1U3lyZWlKclA1dW9oZW52aDlZ?= =?utf-8?B?MEx2SWRHUGg1V1E4OEM2Z0ZkRnFhOTRPVStzcE9ib05JaFRCMUxoN2dPL0or?= =?utf-8?B?ZEEzZTBUYnVwUkV5YTFkOFFVZUIwbmhWQzdJZytYNVYrWnh2Smx5VVRYc2M3?= =?utf-8?B?NGpLOTNDcmdBQTNVZGx3NlFGNFNhY05nbENIVjhjVW9WUENFNnZEWTBjMElQ?= =?utf-8?B?YktxTjJESjY2VlhNSmE3T1BNUzhiRzU5YXV2WHFJVDBlWlZBL3NHRVdYenNH?= =?utf-8?B?UU5wd0hXSFVsRUdZOGdXUWJ2Vkx3cUF4S0RobG9zNXFMYmJGaXZPWjNOWUJT?= =?utf-8?B?Y3NDRzlKcFpaL3VzQUdSL3JiMnJqT2NueGVWbmdjQ3pjdzI2UUdzYlBzZ2xh?= =?utf-8?B?NkJmR1BkdHBHd2xzZEFrKzU2RnZJY0lUNEFpRDFnMWQ2UDVORVlRQTZ3dEhD?= =?utf-8?B?RGJIdzgxTzA4MXZNaWFXTWNMWmVnTUZ5NVNhZEN1RmtoTHVNRy90UTRFNjZj?= =?utf-8?B?Tk12bncwalpTMXRqTkt3OHQ5WWJDWWs0c3Q1amdYTjQ2RTJBUjN0QW1PTHFD?= =?utf-8?B?TW16d3N0cCswRlNXY1QxR2UwaXNaZ1B1eWZkSEl3ai9yL05Ya3BtNjQ0QUIv?= =?utf-8?B?dVV3TlAydExDRzNZVXlja2JZLzZlbnRZR09MSzZSTnkyOHoxTlF3clo5aitP?= =?utf-8?B?aTlLUml3aksxUVhQc3kxWTFvS1orQzVFOWtxLzh2SDg1MWQ3UHNqSWFzaUh3?= =?utf-8?B?L3JBanIyZzVhWDU0d2hwSCtuZW5peFdqZmwrZXZGR3FvRHMxcldodk9yM1FP?= =?utf-8?B?Q2h6WDN0QUJxQUN0ZGhxc1VjbTFuaVNrczg2ZWErRk5RdGF2TzY2b2xMT3Nl?= =?utf-8?B?eERVd1BPVkR0bEhNZDRxTXZvQWdXSUo5TVduK0U2clluRzJiN3VZMnE4bGFt?= =?utf-8?B?OGtMNnV5QmJXa1ZjYnFLTitCQ0ZzZUpsTzJpSGtYcVplUk1BbzdqTXUyMmZy?= =?utf-8?B?ZVlIUnNEMk5xa2VoNElaVG94bE5hNXMyaHdMV2pvREVzRjgzaU13eXBFQnhQ?= =?utf-8?B?WWxDL1BFQ0ZnNmVndWVWckR6YWJuL1dDZGl0NWZkaUNEc1c2eDZuM3NZWUNL?= =?utf-8?B?dForMWg4MldiNERCZ0VxTG1udmd5RGhVQmlCNmo5em9UM2pBZkszVVRSbFVQ?= =?utf-8?B?a1lGUWtZL0FLeEF2ZHRBK3REL0lLcHZ4M0dLUDFHZ0gzblNFRE5vNnZoeHVY?= =?utf-8?B?WnFuVFNNWFl3Ymk4UjJjWFBRNEVuL3JQaE5VNVVnOGE1VWtoUk83VGFsK1dj?= =?utf-8?B?TWEzWWx4M3ZHMVNaY0RQb2xkMkRiRUQxZDA2R09NNGc2TkVxcjdnQjZTZjJx?= =?utf-8?B?M1k4NEdsbWVkVlc1bExuT1RGVGkzMlBQVWdaWjRUb1JIeCtZSHRWK204cElM?= =?utf-8?B?blRSMXJzdFZRWW1La1pVc0VWRFpLcE9FTVJPRXdHMHhhUGhKYnlGamZGYkF3?= =?utf-8?B?OHIzVTdTeTRWRFhrbFZnVFZpVXlHaHAwT2thRTdiWXZCWmRTa1JEREJkZjda?= =?utf-8?B?SzFkZzhrdUgxb0t6RnNDb0JUcTFtSGkyRldaZnZLdzkwVHZ3U3dnd3prVnoz?= =?utf-8?Q?l0FXIaascC0q0Us1eK2NER+mx2pqoqE+?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB6838.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: =?utf-8?B?bnZiTHN5Mi9rVHJaelMzekExaHdPT3E2cTVRbnV3UG95OGNJK0ExT3hlbEtQ?= =?utf-8?B?eUhKdlRmUUNId0FrdWJzYjdaRjJaWFZlY0YyWHVqU2RXaXltZCs3N3dVbWkr?= =?utf-8?B?RTgyREc1TWptVWlNV011K200UDZENVdnYjlOQnRPQ252ak54UCtLR0dvRCtT?= =?utf-8?B?Q29rSlc1MnBoVkJtdTk5TUVSaDFERDV5a2N2UFFkZTQ3MTF1a29LckFyZFF6?= =?utf-8?B?dGdCN0VRWDRGNDVwMEtPdStERTVoUG9aelhHLzlML3F2aWgzZ1p5M2Z5YmNq?= =?utf-8?B?dVV5SVVFT3hyZW82c3RHSkpwbUt2SDVFUUJzM0VualNMZU1LbStrRlBsY2tG?= =?utf-8?B?Y2pHQitmNktKK0oyUkM3UGl3aE1hT2pDa1ZTZ0ZFQjJCWXJiN2lwMmVpZ0ZX?= =?utf-8?B?aDhqNzZ5ZURFVVRZR05zR1JUQ1NhTjdHQndMM3lWeXY0WEVEZk4xVjRVNGxR?= =?utf-8?B?UjZzaEMxVWx5czhxTDczRGNZb2Q1Qm1IUHpRRDZuMWJFNVZpOUcxbGRKcDFr?= =?utf-8?B?YkxadW1wZTJXKzEydnEvWDlhVG9seGpUL3FMdlRCWUtXVVhKdk9RUEQxMFhl?= =?utf-8?B?R0Zrc1BjRkFTNnlpL204NlVDYlI1MjBWYlI4a1hUdjAwQmdDN2FRbmtNOENW?= =?utf-8?B?ZEN5a1VoOVRsQ21iQkFuMHFIWk5KdkRuNnpqVlZ0SGZUaTlIVE8zRGpCdVpa?= =?utf-8?B?aTNFNmpVTEdOREpsYWkyZG5DVkZnd1FsWkowZ1lvNFdycXdHaUpBYWZyYTQx?= =?utf-8?B?NW91dFJ6NjBOYnZaR1hhL0dhTW9JUFhZSDQza1ZkWnlJWXoya092cmduUW9Z?= =?utf-8?B?YmhXeGJwOUVzZkhadXRCSWFJVTM2Zi93RkdGdE1IWThuMEVudXFldGg2VXU4?= =?utf-8?B?b0U2WkVxWmIyazF4cURZYnljbnpnL3J3eml1UE5PVWI5aERGWno1Z2lKZWY5?= =?utf-8?B?NVpHOTV1ZXUzMHdDekc0UDhqVENHZjU2Qlc2WWZhZ0JoRVBIOXh0SGJDUWZx?= =?utf-8?B?Wm5BZVErWmV1bDZtYTJVb05nUk9VdlprV2VtaTR6Y1hRRC9kaENGWEYwWHNC?= =?utf-8?B?YTJkQmVlMWNtenlBaG5IRWdiZXBzWThqTGxxSkpiYVZrTC83T1VySkpoRG5y?= =?utf-8?B?VkhqZVJwOVh1SGQ1TnpCUk9TME1xemN0c3NOQTZ2ejVxRXdodUUrVGUvUlNB?= =?utf-8?B?QmJqY090Z0tUTE8vQjRnY2hJQ2IrNGRyUFNQZGNzcFZMcnByY1RwdFdKT3hn?= =?utf-8?B?QStFTXNaME9qdG9ZcHA5MVpjZitsMWlrNEl2NG5WNXIxcEtOZTBuaUJUQnA0?= =?utf-8?B?MGN4cFBRTUhKN2VjeWducGxGaEg3MURsVWV5UFlYT0lPQUNwNWlKQWdlamRB?= =?utf-8?B?MkpPU01tTGlHOVVxRUFVVi9pV2FlRitvTzhRN3FCT0U3YlUvQytpVW9qVXNL?= =?utf-8?B?S2lwazJoOHpsYnNid05FWGs4ZDM5cmxLSGtqV2VDd0lHT0NRS2Q0U1RZbkRa?= =?utf-8?B?T25Wd0w1OG9wbUFHNm00UmJ2NjZnNjNLSGoveFVOM3F3b2NWMjVQbW8zb2dC?= =?utf-8?B?R213dVNOYXYvSXRJNkVxVVdoTTM2Mi9HckdQNHdvdFlabEoyTVl3cHphZVlO?= =?utf-8?B?WEk2Z0NHSmVwVVZleXJRRHZMRFV1NTBXMHNIOCs3MngvMzlyYkJqWkxDNmJU?= =?utf-8?B?SEdBM2dsMkxiQnh0LzQxRjJjYm1IK2swVU4vWXFtT1JzZkpyN2lLRWpzN2sz?= =?utf-8?B?QzFnOGFXMEpGS3VEZXJZdjAzYkNIeDlPTDhJQmZUMW1TbkVyR1NrK2ZMTWt2?= =?utf-8?B?VmlEWk1wbCszQ0RUaFNORTUrUjRJY0oyUVhhZHJvTUdXeTZNRFFCTDJXZmpk?= =?utf-8?B?RnVHVXhFMDFPRVJ5MlQ3T0JzL011dzRlY3AzSXVQTk5rRjNYcVpuQUF5MEFx?= =?utf-8?B?R3RnSzFxYzJGVVhqbTJLWmVBeGpSeGltWWRTdGJkN1RVcFZ6blF6MDAvOWdx?= =?utf-8?B?aWhNRlJia25LVmtlcmtDNzBUMkpTZnAzUmhvZEVFRWlzb20vb3MzcjBvVzZT?= =?utf-8?B?V3VnMVhML3pCZERxR05ndmFIeFFkL21uV0FpWm9Hd1g0aEV3aTU5bkJyVWRx?= =?utf-8?B?MW9OaU03d1dKZGpUS3V6RTlab0VXdGlOMEVNTHBJT1Zubzl0ektHcUdHTEpC?= =?utf-8?B?VkxlUzltc05uVUxkQ2lpang3RFBzRXlKaU1jM1Z5Yngwd0pPcG5XWUhleEE5?= =?utf-8?B?SEg3eUJyZVRMTHdhd3BCYjhlOElPaFp2dW42V3dXSWRqaTNQZzM5alo2SFMz?= =?utf-8?B?dHpuREJLRSsydTBkUlVTYXd2S01tYjZ5UkNBcVhHZU4rTmtwUmk4Zz09?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: adab5f8d-1e88-423d-0f64-08de4d976914 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 02:49:43.2324 (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: zzUvVdDfM61fYFcBO+zpi7p1Xqr1S1t3kPZCNEGmH6ThessrvjfpMftzNbyoTmMggZAdjT63XcsWBRVt5kFf4A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7977 Message-ID-Hash: ZHV5EBSGN2K57ZLU4UVWZ65647BSJROV X-Message-ID-Hash: ZHV5EBSGN2K57ZLU4UVWZ65647BSJROV 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: 1767754648504158500 From: Nathan Chen Open VFIO FDs from libvirt backend without exposing these FDs to XML users, i.e. one per iommufd hostdev for /dev/vfio/devices/vfioX, and pass the FD to qemu command line. Suggested-by: J=C3=A1n Tomko Signed-off-by: Nathan Chen --- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 21 +++++++++++ src/qemu/qemu_process.c | 79 ++++++++++++++++++++++++++++++++++++++++ src/util/virpci.c | 42 +++++++++++++++++++++ src/util/virpci.h | 2 + 5 files changed, 145 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a8eadbfb8a..0904265459 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3163,6 +3163,7 @@ virPCIDeviceGetStubDriverName; virPCIDeviceGetStubDriverType; virPCIDeviceGetUnbindFromStub; virPCIDeviceGetUsedBy; +virPCIDeviceGetVfioPath; virPCIDeviceGetVPD; virPCIDeviceHasPCIExpressLink; virPCIDeviceIsAssignable; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 98e4469c25..2a16f9df63 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4809,6 +4809,18 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, NULL) < 0) return NULL; =20 + if (pcisrc->driver.name =3D=3D VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO= && + pcisrc->driver.iommufd =3D=3D VIR_TRISTATE_BOOL_YES) { + qemuDomainHostdevPrivate *hostdevPriv =3D QEMU_DOMAIN_HOSTDEV_PRIV= ATE(dev); + + if (hostdevPriv->vfioDeviceFd !=3D -1) { + g_autofree char *fdstr =3D g_strdup_printf("%d", hostdevPriv->= vfioDeviceFd); + if (virJSONValueObjectAdd(&props, "S:fd", fdstr, NULL) < 0) + return NULL; + hostdevPriv->vfioDeviceFd =3D -1; + } + } + if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0) return NULL; =20 @@ -5253,6 +5265,15 @@ qemuBuildHostdevCommandLine(virCommand *cmd, if (qemuCommandAddExtDevice(cmd, hostdev->info, def, qemuCaps)= < 0) return -1; =20 + if (subsys->u.pci.driver.iommufd =3D=3D VIR_TRISTATE_BOOL_YES)= { + qemuDomainHostdevPrivate *hostdevPriv =3D QEMU_DOMAIN_HOST= DEV_PRIVATE(hostdev); + + if (hostdevPriv->vfioDeviceFd !=3D -1) { + virCommandPassFD(cmd, hostdevPriv->vfioDeviceFd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT); + } + } + if (!(devprops =3D qemuBuildPCIHostdevDevProps(def, hostdev))) return -1; =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0e50cd1ccc..ab88a6bf62 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -103,6 +103,7 @@ #include "storage_source.h" #include "backup_conf.h" #include "storage_file_probe.h" +#include "virpci.h" =20 #include "logging/log_manager.h" #include "logging/log_protocol.h" @@ -8181,6 +8182,9 @@ qemuProcessLaunch(virConnectPtr conn, if (qemuExtDevicesStart(driver, vm, incomingMigrationExtDevices) < 0) goto cleanup; =20 + if (qemuProcessOpenVfioFds(vm) < 0) + goto cleanup; + if (!(cmd =3D qemuBuildCommandLine(vm, incoming ? "defer" : NULL, vmop, @@ -10360,3 +10364,78 @@ qemuProcessHandleNbdkitExit(qemuNbdkitProcess *nbd= kit, qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_NBDKIT_EXITED, 0, 0, nbd= kit); virObjectUnlock(vm); } + +/** + * qemuProcessOpenVfioDeviceFd: + * @hostdev: host device definition + * @vfioFd: returned file descriptor + * + * Opens the VFIO device file descriptor for a hostdev. + * + * Returns: FD on success, -1 on failure + */ +static int +qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev) +{ + g_autofree char *vfioPath =3D NULL; + int fd =3D -1; + + if (hostdev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || + hostdev->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PC= I) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("VFIO FD only supported for PCI hostdevs")); + return -1; + } + + if (virPCIDeviceGetVfioPath(&hostdev->source.subsys.u.pci.addr, &vfioP= ath) < 0) + return -1; + + VIR_DEBUG("Opening VFIO device %s", vfioPath); + + if ((fd =3D open(vfioPath, O_RDWR | O_CLOEXEC)) < 0) { + if (errno =3D=3D ENOENT) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("VFIO device %1$s not found - ensure device i= s bound to vfio-pci driver"), + vfioPath); + } else { + virReportSystemError(errno, + _("cannot open VFIO device %1$s"), vfioPa= th); + } + return -1; + } + + VIR_DEBUG("Opened VFIO device FD %d for %s", fd, vfioPath); + return fd; +} + +/** + * qemuProcessOpenVfioFds: + * @vm: domain object + * + * Opens all necessary VFIO file descriptors for the domain. + * + * Returns: 0 on success, -1 on failure + */ +int +qemuProcessOpenVfioFds(virDomainObj *vm) +{ + size_t i; + + /* Check if we have any hostdevs that need VFIO FDs */ + for (i =3D 0; i < vm->def->nhostdevs; i++) { + virDomainHostdevDef *hostdev =3D vm->def->hostdevs[i]; + qemuDomainHostdevPrivate *hostdevPriv =3D QEMU_DOMAIN_HOSTDEV_PRIV= ATE(hostdev); + + if (hostdev->mode =3D=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + hostdev->source.subsys.type =3D=3D VIR_DOMAIN_HOSTDEV_SUBSYS_T= YPE_PCI && + hostdev->source.subsys.u.pci.driver.name =3D=3D VIR_DEVICE_HOS= TDEV_PCI_DRIVER_NAME_VFIO && + hostdev->source.subsys.u.pci.driver.iommufd =3D=3D VIR_TRISTAT= E_BOOL_YES) { + /* Open VFIO device FD */ + hostdevPriv->vfioDeviceFd =3D qemuProcessOpenVfioDeviceFd(host= dev); + if (hostdevPriv->vfioDeviceFd =3D=3D -1) + return -1; + } + } + + return 0; +} diff --git a/src/util/virpci.c b/src/util/virpci.c index 90617e69c6..886e2c55e6 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -3320,3 +3320,45 @@ virPCIDeviceAddressFree(virPCIDeviceAddress *address) { g_free(address); } + +/** + * virPCIDeviceGetVfioPath: + * @addr: host device PCI address + * @vfioPath: returned VFIO device path + * + * Constructs the VFIO device path for a PCI hostdev. + * + * Returns: 0 on success, -1 on failure + */ +int +virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, + char **vfioPath) +{ + g_autofree char *addrStr =3D NULL; + + *vfioPath =3D NULL; + addrStr =3D virPCIDeviceAddressAsString(addr); + + /* First try: Direct lookup in device's vfio-dev subdirectory */ + { + g_autofree char *sysfsPath =3D NULL; + g_autoptr(DIR) dir =3D NULL; + struct dirent *entry =3D NULL; + + sysfsPath =3D g_strdup_printf("/sys/bus/pci/devices/%s/vfio-dev/",= addrStr); + + if (virDirOpen(&dir, sysfsPath) =3D=3D 1) { + while (virDirRead(dir, &entry, sysfsPath) > 0) { + if (STRPREFIX(entry->d_name, "vfio")) { + *vfioPath =3D g_strdup_printf("/dev/vfio/devices/%s", = entry->d_name); + return 0; + } + } + } + } + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot find VFIO device for PCI device %1$s"), + addrStr); + return -1; +} diff --git a/src/util/virpci.h b/src/util/virpci.h index fc538566e1..24ede10755 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -296,6 +296,8 @@ void virPCIEDeviceInfoFree(virPCIEDeviceInfo *dev); =20 void virPCIDeviceAddressFree(virPCIDeviceAddress *address); =20 +int virPCIDeviceGetVfioPath(virPCIDeviceAddress *addr, char **vfioPath); + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIDevice, virPCIDeviceFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIDeviceAddress, virPCIDeviceAddressFree= ); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virPCIEDeviceInfo, virPCIEDeviceInfoFree); --=20 2.43.0