From nobody Mon Feb 2 07:29: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; 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 1768614310273982.3723481642204; Fri, 16 Jan 2026 17:45:10 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 62ED143DE8; Fri, 16 Jan 2026 20:45:09 -0500 (EST) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id E59A743F80; Fri, 16 Jan 2026 20:40:03 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id D561B41B54; Fri, 16 Jan 2026 20:39:49 -0500 (EST) Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010023.outbound.protection.outlook.com [52.101.193.23]) (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 02F6341B92 for ; Fri, 16 Jan 2026 20:39:46 -0500 (EST) Received: from DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) by LV2PR12MB999097.namprd12.prod.outlook.com (2603:10b6:408:353::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.6; Sat, 17 Jan 2026 01:39:44 +0000 Received: from DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5]) by DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5%3]) with mapi id 15.20.9520.005; Sat, 17 Jan 2026 01:39:44 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, 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=I/WRQzCz9vCzZwaGzwj7itC9VY8H2CaDstoAtH2yJEbgM3Z0oNaYrcigFkN8CXnQIP/1s6MLr6hxOYXS9kKpcNAYgo+ouVShCb7+P+iGJBzaFrlZ+hkiR1F/lUEhG2CCzDyRusX9Mhe4vjQHYHLoBA8QYwNyZELa8/30l+KaenhUKrPS+gA38Hb6X+Sfr5LAichidDqUcdXRqsLq9ggqW+b7TaxczUsPDnj4igdznZwxrwzUBVGmdkslBhu9Q4EViUppI+cbV06jCYYy97vyKczabGLkRIOyz9GeDCS+XpwWBOEXf6pmHzCyGQ+zjFd37EYv0Q97j9euSNpOXsu9mw== 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=BZUe6gbwUh+wW43aJKqMA+B4I0R8z/WT1vh+GaO0YfA=; b=aVhbL9Fzs4czAIUEVW815frrXpcl+E2F1rCVMOqV0VwtimJoTSaeA/tlVdGpEOn7vjCayFkDICnV1Y3bU3RJv7W2mNIMxGFtKA1xq324LAlGIf6JJH/kV9A5yg7TvV+5PDL4c91Y7buYy2DbNe3qsiyXG33n+V4pdx3Heq4aXN6FBo5WNgwNI53gSoNv3UfQiKUbRqZTuZmLpxHc2XSd2tZjOD6owWZPRhvCQOeRbFo2DkizntJ9vA7Sr7tW8ouRXlRzL2g4PCFSsWSJxLcgkO3u3skQ89hOsA6+8jKTTdl1SgaF7wmmLoXcUCrfkS7vfTLfWShAH9JBFKHyv0OZnw== 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=BZUe6gbwUh+wW43aJKqMA+B4I0R8z/WT1vh+GaO0YfA=; b=fN4ObuxS6z6SBp/9YitL12zWVkUWpDWW/0KwQGKoIAjOgCAvoQ3Abwme+g70j2jKKTu3TQ0M9v31FcPsU2hiB7juvOP5a9RqvetmnqYwQsqlMJljtH0ZQcUR74s8Xx1YVbJ2w27TPQCYM+Fwhz+Be+eKBg/svRLK0ydFdTO0T6cnHIwcqsVSmEogifTJtskjNqvInUCZY1CDzHdSoEGyCK3lAk2qI7ZP/f0VQslN2aFn+D64nE2DGTLayYTHilmx0NtZeAl+/7XOD+CHUQdlQvb73SM25wBNGXwNwn/JsHtVU8NjC/Cnzj0EK78kG56baiT3JMc6Y240otXAQhGelw== 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 v5 4/7] qemu: open VFIO FDs from libvirt backend Date: Fri, 16 Jan 2026 17:39:34 -0800 Message-ID: <20260117013937.3803457-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260117013937.3803457-1-nathanc@nvidia.com> References: <20260117013937.3803457-1-nathanc@nvidia.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR13CA0134.namprd13.prod.outlook.com (2603:10b6:a03:2c6::19) To DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PR12MB9567:EE_|LV2PR12MB999097:EE_ X-MS-Office365-Filtering-Correlation-Id: fd4aaf64-945c-41c7-0567-08de55694a68 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?SzhJVU44NXFETC9NNkRPcVpscmNIVkRVNGtYU0I3aFdDSzhmZlpVd0ZjRGVT?= =?utf-8?B?Ly9HTTZOeWdJS2JQYkNoZ0I4ZVpwQWRQRzAzVktJeXFCRGFoS1dUdzhjSHpP?= =?utf-8?B?UDRNaWJZYm1ucVpkeHBNWFBHTTlDM1dtVGlOU2FlUElWTmRVdDBEMkZOV1lC?= =?utf-8?B?M3NQaXFXUjI2azcxdy9vb2NkOXFuWmNaS1NBd0F1RGRVb3BPY1NZNDBpMElU?= =?utf-8?B?WHdWVGcxTE5pb0Q5c3hxK3Exd2dTUHJHcHRLN0lSMHF1a1p5dXlOLytRQVBj?= =?utf-8?B?VDhYVW1LbTQrRHNIR2RBS245eEhHTTRBaHh6Yk5xWWkzT2V2VEtzNzUzcVdO?= =?utf-8?B?NGwzWkdvMGdUbXRIYW1BUTRkQlorWmVkQlRWUW1GM0hOWThmU0taSlg4bHJB?= =?utf-8?B?Ny9sVmpPUW91ZUVRVWtwUXRDOFRwZWdhMjc3V2YzaFNEOFBVR0FPZWg2TFZp?= =?utf-8?B?bU1lci9Kd1BwS0pGY2RNZkhCN3Y4cXp6QkhOVjk5RDBLRnNFc1NLbGE2M2Nn?= =?utf-8?B?QjJiSG5IWm1WUkZ5RkUyNVU2c05HeExWT1dhazRIdGloTTF5VXFEMnRZMzdB?= =?utf-8?B?QTNDb0ZheVhmeWdveDJLeU9zSnhHeUpndVpjek1VNUtQanNISXhYa0VBZk1F?= =?utf-8?B?N0lvNmVZdElxMXRNemIwSVRXZEpFdEpxT0d3U2VsN1NQb0luNDJETXN0SmdK?= =?utf-8?B?OUYveDBHeUZBaEhHUVlUa2dMb0JDb1VVa3NjOWpZR1VZbVpsSDdWWFpEVmtV?= =?utf-8?B?SW4wbEJxS1cwelphNXAxWFFOZ05wTnE2aUVRQll2WXdiTUxnUGVIdUdUSGFo?= =?utf-8?B?YUxjRkh3eGZ2MmdrL0JVdHlLUHRZVjhhbHhjblJIeDc1YkcraWtGSjdLT0xE?= =?utf-8?B?d013SnNLNG5PUC9KZ25qSkxObU1Kbis0LzVtbXl4dUVldWlZTnh3S3NnUUNo?= =?utf-8?B?ejFOQVF2N1kzclF0azNBYzhPNm5VeTA5eWF0bTdUU1AvalAyQTAyWGpkOTF5?= =?utf-8?B?OEkvdTZGSWNFWXBSaGgvSWJVSzY1NU9RTWRZcEJhQWxZSUtPcE9hZjgwMDcy?= =?utf-8?B?MnNGd05KV0RGVDR1ekx6VFcvUXhIWlRoSXVkU3Y2NlZsYXNyYlVQd3NacE1t?= =?utf-8?B?REFKSnBZTXNpZzQrUzhPWUNla2F6bUl0d1RyenhTZ1R5Z1lIeGkzdDhHR3hi?= =?utf-8?B?ZUNkdFU5ZDdDVVlEb0pXZFVwWWlRTTRibXlKRVc5cWVCbWZPSGVxeFgvZERm?= =?utf-8?B?L2xqSUt1dVVrRTRDaEUySWtCcS9QU2dMR1prR0d4UnFxVmtFOG5Nc2sycThW?= =?utf-8?B?eE1YU2pVQmlneFpHVytRS1JwVGplWStOenFNSWVnS3FCMUF5YXpJZXZxaDZ0?= =?utf-8?B?TXZtc3VPbzBUY2FLUzg3bmR2VTBMV3ZubXV0aGNLT2puTVhTOTBOajNnUTZL?= =?utf-8?B?eHhZNC9uaDdRR1BsUENZUG1tSU9aNDRNTElqbmRyc1NDZWhUamZYeVcwSFA1?= =?utf-8?B?VXFYOHFlc0N1ZDF1Y1B3aWlCWTRwM3ptdjEwT1EzSzRYczJ6ZENSbXRNZUcy?= =?utf-8?B?Vzd3dVBqYlRPYmQ3aWlBVml5VW0wMmFRZjE3YXBlZGhqalFQVHNRTzRIZSto?= =?utf-8?B?aEQxK1d6aVhpYVVyZk1wU3FrbFlpSzg1RWV5eERCNWI0ZFpuaFN4YVk3cEV5?= =?utf-8?B?bk92bHBQUUR0RWtwTFVxazRidUhWNkxIOHNnL0NaS0h6bjBUREJPTnRHc08y?= =?utf-8?B?Q01jKzgyRXErZ2JqbWhyNm5VSmRyNzhyZCs4V0k2K1hzd1FadkRISFJzT213?= =?utf-8?B?OHJ0WjU0M2dPTVdDbXNQSjdKWDJPWjgzQUZDR3lFOGFHck54V2s4aEd0ZDJ6?= =?utf-8?B?Y3VFVDZ6ek5UQmlENWY2R01oVHlhY1FmNTkybVBvdnRsdlU4SkRZSlRPRmx2?= =?utf-8?B?MStaRjlTVVlMYkpvcHBxWktOQ1VWS3hIQWhnekZSZWZzamhZbCtpWGhkdXJz?= =?utf-8?B?TVUxa3VqL0hmcFlFR3Q0UGxJbldCNVgzaXN6TjRwcG5tTm0xZUx0bWdoZ3pV?= =?utf-8?B?V25zQUh1RWg2VFFwbTdVUmFBMktJZEc3b29KajlEd21HajVHVmtmY3dFYTBo?= =?utf-8?Q?fcS0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS2PR12MB9567.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?VnRoK2pTa1lGcThqZ2NKaDFRUUEyNFFrVHdrcVV2dHZWODVFZjIrbVdXMFdO?= =?utf-8?B?R2t6VGJieEpxWVRPSGhUOGFiVWZ4d0I1cXNHSVUydW91emZFZjlJblNxY29p?= =?utf-8?B?Mlg1dWVoNmExN1ZzcEFMZWNHME1XMmF5TE5sSEhnREV5aXY5UzNEdjVOQ1dv?= =?utf-8?B?aDRVWHh3dVZJc0pCQjZRZGZubC9PbzFub244U0Yvd1BMVm0vYXZtL0xFcUNm?= =?utf-8?B?NGpOU0lzTGhobzMyUi9SbWo3UFJVTTRVcGpmMm9LS1BHVTEyWGQ1bGw5ck11?= =?utf-8?B?ZVRmZzhPQXFlS0ZxZWZJaXV1U1dOZnZrQy9ReXZsSS9tTVExaDJuS01zbDUr?= =?utf-8?B?ODRiNFNnenNDK0N3UEY4eGJhQ1JqRGh2c0xYU1pyejI2ME45UUR2aVlDeExi?= =?utf-8?B?by9ObjNRWnIxYjJzVXdOeS9jKzFoejJGQ1Vsa2pob2ZXVGlwcU1TV3B6Q1I5?= =?utf-8?B?VjNVYS9WQ210MytWY3ZjNENFaXhvb3BoanRDMWNKWDVGdDNuRXRoWFNFSTA4?= =?utf-8?B?bmZnUE1HTEQrWjNIc1k1VXM5ZUV4Y0Z4OGtVMkdaNThPTVUwb1V2R2JSQW8y?= =?utf-8?B?WVREUHRkZ3RoNjBQQ1dJQ05aVXdVWU1BQjh5T2RKTFZsejFiUDFuQWRSaFVa?= =?utf-8?B?dDJRZTdpS2pvazF4ZXltQ3AzTm9JL0RWUkhCZGRkWmhaNExYcVIwc2hRT0xQ?= =?utf-8?B?UHNnNXVEMHllWWpDenNVR0hrOVhxcEpueDVSM2w2NkFOd1NnT0dQUkpPQThs?= =?utf-8?B?UzZBU2t3ZG41R0tvSjkwTzRwbllBQzJtWk5rampEVVVEOURYbUNZbVV6U0ZU?= =?utf-8?B?UXo2bmRueTNTdzdoWUtlSUw3dWxQUkJWUUhzWnFuaGVxajZBQ2pjZVhQdnVp?= =?utf-8?B?dDRaRjNCcXdvYjdoUTlRM2cvbDRYeWs2d1RYRTViamVwMXZEUVl4K3RhVWd4?= =?utf-8?B?dWVyLzBxWjd0L0REYkRrbnAzaUNkMTlKRlI3RFU2RElIcU5qbFpyeG05YVcv?= =?utf-8?B?MjVhUTlaQTBNaUJ6RHBKbTkyblhuanZ6ZXRpcG8rMkdoNjFOQ0Y0MElwNWg0?= =?utf-8?B?MVF2ZmEzWGNkaXR6TWRWYmd0TWRFWFBwM3ovUElFc1RhNkV2aXhJWjFHcGdj?= =?utf-8?B?Ump3S3ltckp6MzhXbEF3L1JDNUV0SFcxeWhwbkQ4d2orNUNyNDlNclN1b3VV?= =?utf-8?B?cExtaXBoazF1TzU3SzA4MGNsc281ZEkvSHBhL3pXRVVqWUkxL2I2Q3dTWm95?= =?utf-8?B?akFwWnpNWHFqb2NpcElqOWw2eFpSL2VyV0JqTFIrdXU3ak9WYkZsb0Z0S0Y4?= =?utf-8?B?cEdoSXQybUErc0l2WjVBZC9LNWlPTURSc09qV1c2VjZ0bElmcFNZcFBnMU8z?= =?utf-8?B?Yk5nSlpubUhrOVNVc25sQU1iWFhNbXZ4aGZJdXMzRjBielp4c1hCL2JmV0lJ?= =?utf-8?B?aTdjQjRhYlFPb3JCNGJwSWhLd21ETUhrRFVLcjFGb2Y3enBERyt2Z0pLZVhq?= =?utf-8?B?NnQ4SGN4RGwyVFo3N20rWDAyckJEclFYdktwcHZmMWZqdzFMUUp1TmtsU1Ns?= =?utf-8?B?SS9wSncwZ0ZmYVM3b3UybVRraXU4VDVMLzEyT3BGS0U4ZW9hN0EySEdDL2JS?= =?utf-8?B?Yzd2SFNtZGR0eFdKSjFwYU1OeDJYZENvelMxSUFtMlJKMFJGV2g5cUxkTEhL?= =?utf-8?B?Y1BaVWxNNmxFb2RucGhBOHVYV2hjcUhyR3hNUWhjODJqTDJXcU9hTjI4aytL?= =?utf-8?B?ZjVSWUVrb1ROaW5hWENUUklTZDVPVzA4bGNvRTVoQUx1eDJDMlhJRFN6UjY1?= =?utf-8?B?REVlenB3N3VMUVFrVnBPbDJkbU9XRGMzTUR5TVcxOXJtZHMxb2VWamNwaXFR?= =?utf-8?B?OW1wRXZTeXY1cXVIV3ZNRE1SbmFsTUNnQ29SYWYrZkF5b0xFT2c0TnBmcUd2?= =?utf-8?B?dTRqa0pHZjdmZDdRWmZBMEhJUko0V1U5NEdGcDQ3ZzJHUmF0RWluZURQNkJh?= =?utf-8?B?Tlk4cHJVODdTdHd3SnVmbDRLd2t6SGkweHFXb3plWmhZdHZMS0lhYm5iZHpI?= =?utf-8?B?c280YnR4dzhzOTVDNkR2ZUQzSncyVFVIWjhWV1l1bXNFbEwxd3VlR1o3djVp?= =?utf-8?B?WG85TDRiWU9QUlNIeS9UOFlNaXpmaU5xeEFuaVFMUmhvTkRGUi9hSjBEQWJz?= =?utf-8?B?N1pydXlwN3lvZlQvK2tOcFJuZEN6YUhpYUJJMDJiOWcwSXZsZUVlendsMzJD?= =?utf-8?B?cXg4TXpJcXk3L1VPOWk4MzVOTVJUOHNveW8xOHJLam9zL3AvMWtqd3M5T2Zx?= =?utf-8?B?dVpHZ3ZORkJuUjFHbmg2dFR3R3FLMUp0WUszYzNLRnVNSU9ZZjhqZz09?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: fd4aaf64-945c-41c7-0567-08de55694a68 X-MS-Exchange-CrossTenant-AuthSource: DS2PR12MB9567.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2026 01:39:44.2687 (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: DbRgdOceXoVJBJXolae6sclytc4Xc3SEJlHrCA5czNoa+OU0WaElLI+G9kOVn1EYk7qh5/X+P//5diivILotTw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB999097 Message-ID-Hash: HSC2F72IEJBEVSUA6THYWMBV5ODS6ZFL X-Message-ID-Hash: HSC2F72IEJBEVSUA6THYWMBV5ODS6ZFL 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: 1768614311490158500 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 | 78 ++++++++++++++++++++++++++++++++++++++++ src/util/virpci.c | 39 ++++++++++++++++++++ src/util/virpci.h | 2 ++ 5 files changed, 141 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7fa76a1ec3..d81b30f0b6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3156,6 +3156,7 @@ virPCIDeviceGetStubDriverName; virPCIDeviceGetStubDriverType; virPCIDeviceGetUnbindFromStub; virPCIDeviceGetUsedBy; +virPCIDeviceGetVfioPath; virPCIDeviceGetVPD; virPCIDeviceHasPCIExpressLink; virPCIDeviceIsAssignable; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5274b33d17..406f14831c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4810,6 +4810,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 @@ -5254,6 +5266,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 a53bb40783..2841856454 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" @@ -7670,6 +7671,81 @@ qemuProcessPrepareHostBackendChardevHotplug(virDomai= nObj *vm, return 0; } =20 +/** + * 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 + */ +static 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; +} + /** * qemuProcessPrepareHost: * @driver: qemu driver @@ -7725,6 +7801,8 @@ qemuProcessPrepareHost(virQEMUDriver *driver, hostdev_flags |=3D VIR_HOSTDEV_COLD_BOOT; if (qemuHostdevPrepareDomainDevices(driver, vm->def, hostdev_flags) < = 0) return -1; + if (qemuProcessOpenVfioFds(vm) < 0) + return -1; =20 VIR_DEBUG("Preparing chr device backends"); if (qemuProcessPrepareHostBackendChardev(vm) < 0) diff --git a/src/util/virpci.c b/src/util/virpci.c index 90617e69c6..2348a98003 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -3320,3 +3320,42 @@ 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; + g_autofree char *sysfsPath =3D NULL; + g_autoptr(DIR) dir =3D NULL; + struct dirent *entry =3D NULL; + + *vfioPath =3D NULL; + addrStr =3D virPCIDeviceAddressAsString(addr); + + /* Look in device's vfio-dev subdirectory */ + sysfsPath =3D g_strdup_printf("/sys/bus/pci/devices/%s/vfio-dev/", add= rStr); + + 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", entr= y->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