From nobody Mon Feb 2 07:28:47 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; 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 1769799896966344.35803901493955; Fri, 30 Jan 2026 11:04:56 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 25D8841A32; Fri, 30 Jan 2026 14:04:56 -0500 (EST) Received: from [172.19.199.6] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 69BAF43E24; Fri, 30 Jan 2026 13:59:43 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id C9C8B3F878; Fri, 30 Jan 2026 13:59:29 -0500 (EST) Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012032.outbound.protection.outlook.com [52.101.48.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E593D3F8B4 for ; Fri, 30 Jan 2026 13:59:28 -0500 (EST) Received: from DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) by SN7PR12MB7106.namprd12.prod.outlook.com (2603:10b6:806:2a1::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 18:59:25 +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.9564.008; Fri, 30 Jan 2026 18:59:25 +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=ICG3nr23DZOU1Bmppv1zYy71KsxCkut1QCnLIIf04TfyR1Ah/bq0RGRLT9LEfMT2QLCsCyhNXgeRubedUg7lUg8l2yAzzxxZyCMKoBHxVaJgjfkoLC8Mj1YQXKukqcMtSth/b598QWKxg/N+vU61UfjR2ZC0hhTTrep3TfRnTXijTopnYf7v1dJNgTehFcFiWSxO02pp8Op30uwIdT05gM69Go/8O44vHVSkV7lZKCx6Lv2xbirIPboFQz6zygqRFcTpRqNJ8VZqXjFaQ7SX0L3AFN07Ewx3Se7yN3xBXUX6/NiRnannz5MLUqzp/bRQuRINhzHmz8yF34sfsfZtLQ== 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=LyCUGK0HV+DWDXtGaa/rXqr2QW+GTh8GlJ38oDOiyEc=; b=ufwdffhZY0ujaWyNgUYJyEnO4O99cHgkNw0bIww4kxAs1hA9ipFBVSdyTmBz8HLY2k/RoJAmCmungUOfq4LiVlH/a49yYPZNe75YwQv5y5EljvV6tIeDyLwBqJbRTMPeUPA6j4EY1holZpErgfNZq0VOlkOT4rpLcdONMTxhJ1OgDjMD4EALb5toga5lN83TwrXwzDEAmUyti/t4p0Sry8LvOty0cEk6wQ2HxCJHi89Al32ARlojckB/jhC0MWctaJSWR99e57xoYQYFRA1dr3tXzTw2T/IkwVHWxqieB6ip/avAqW+QXFEV4bxOvLWuFdSClnW24Wz9ST7jgDDCkA== 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=LyCUGK0HV+DWDXtGaa/rXqr2QW+GTh8GlJ38oDOiyEc=; b=Zc/+mvt3OJ3JLGTQ8ZUFBWmcjD5sz06SfgEUwlee45fiAxh9cJtOqsNeLKgbXvHzc/cw7LLCiOuXH0+Ua1HAdiRoit9gZ+mrEadlQdkkXg3UDRnqL2KMRWXCEl5Yfjn93WgiGLW9hMORA5Sz1Sn4nkKfqdx2Sz3qlL0fZKs46pWUgQwN6+w2if9a1n3lSgeU4YSoLZ92KSPxBvbXYAVY6CBNN5X2NZyI697UCAucbC3NQgeppI3yYC5f4bTHPlfNHrU2PNgGXZfYP0SeCmD1hkWlCccUPNrgbH6IY/Zg3uFl3/hMolYfZsswt5CPVzJ3ghmxD3kLfrjxDHjwSPLFWw== 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 v6 4/7] qemu: open VFIO FDs from libvirt backend Date: Fri, 30 Jan 2026 10:59:15 -0800 Message-ID: <20260130185918.4154310-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130185918.4154310-1-nathanc@nvidia.com> References: <20260130185918.4154310-1-nathanc@nvidia.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0198.namprd03.prod.outlook.com (2603:10b6:a03:2ef::23) To DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PR12MB9567:EE_|SN7PR12MB7106:EE_ X-MS-Office365-Filtering-Correlation-Id: 534dc79f-9afa-422a-8154-08de6031af95 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Nlo4TjFtc05RdTVpdXE2WmJNY2pPQ3c5N2JjVkEzZ3JqRFlrNVVtSHZUMGZW?= =?utf-8?B?aTBjMHFhY1pqQkVIQlRaZ2x1MTl0TlAxd1JGVVdHK1FmWWRtbFdWSGsyQjlP?= =?utf-8?B?SGM4OXdBZmpCdkxMdVFrQzhkYm1rQTFibi8vdUdiQ3lwenhmM1REM0lMRGtq?= =?utf-8?B?UzRMa0k0UCtjb2gyOTIwWEx2SHhxeVdGSHY1UnBDcTltVXJ2L2YwUzI2YlAz?= =?utf-8?B?MHpHM0d2YlU4aElNOWpwNkppSXRDTFNWV1BTV3BMREVJZWVLTlA3cWFOVko4?= =?utf-8?B?QnFnUlQvcVFLajljQzdNRWpLcXpjMitJTTlnMEg3dVVXKzMvSzAxaGt1MUlW?= =?utf-8?B?Z09uUTdwT0R3aVM5ZTJKUk9XL0NoR1RoS081bUNKelRqUjJjUVpaYWFGN1Jr?= =?utf-8?B?cHd1T1p6aXp1NHkxTzdtMXNxQmRoN3E2MmlJS2pUU2xiZW5YN0VKMXZNaUxO?= =?utf-8?B?bTRMZXRVS0lBRnp3SGJ2SWc4UGtCdnRaUndSdXVvRzVpajIwUWFXMm1RUEUy?= =?utf-8?B?UWJoK1poMCs1OHRwR29wVXcrRlJ4eVBERUFSUmpZbWNNeUpyTCtsY0pyMzVh?= =?utf-8?B?M2QzaXBmcXBSK1BiU2puOWRKdnlMTHhCQUR0S3U0bEFSU1pxRGl6TDRIN2Fw?= =?utf-8?B?TkpuNThITllyQzRrclU1MHMyblhDQnZlSm85Q0JWRTJCOG8wUUlhVGJxWWhk?= =?utf-8?B?Z0liN3hGbDlYRXdlSHhNMU1uV2k1L2ZiaEwyTmVIWHhselFOTGRJVHp5cTMz?= =?utf-8?B?eTE3NlpncEpQbXRwbUM3Wnc1RG1nU1VSd2Y0TzJhbTBQdzVncmI3a0tRR28y?= =?utf-8?B?N3dJU0FscU9xTFBlOGlMa3NjUEVQbzI1UHo2ZVFPQlFQU2pUZnBBMzFCZnBW?= =?utf-8?B?N1F0S2lDUnIycU9FcEEzQ05DaGRqNjAxTklhQms0U0gyL0ZqM3VhSXhYTXNn?= =?utf-8?B?TzFvaitHZjUycFVpM3NRK1RCQXpUb3JFaXRFVVd0OVFlUUVEZmtaWkxDd1Fs?= =?utf-8?B?SExzNU9Rejlwc1BFN1NwZ3BYbGVjUklKWmc3Kzc2bmQ3MGVrWFZESTBXSnF0?= =?utf-8?B?WGVSZU9uaGxuME5obS9JRVRNRUU4YkZ2bW0yUFU4d3VVNzRpRVB5WkFBUWc1?= =?utf-8?B?cjBKWm1PVkdtUS95SVUvaUlHcjR1ZDIzODFyaEFaZUhsVWdIbXN5c3ZaQlB5?= =?utf-8?B?MElDbHlHK0dac1F6VFQ2cnhJK09EYXR5QTQvNk0wUVFybWVXVUxQUUczdU1K?= =?utf-8?B?YXh6c0YwMDRCSU5jSjhUODloc3I1NmtRNmZSOFFZVkJKbGl1ejZEbmxiVWNy?= =?utf-8?B?SWlaS3c1TnhJVXhpRzJCSERHc0dIUThKcExDZXdMV0ZzL3JueGYvYVJZcXR0?= =?utf-8?B?aE01RkZGOGpIVUMyaUx0bTJ5c0xQVkVkTzJBcjgvakhLMnVFMDJpZVY2enVq?= =?utf-8?B?RDN0L3BhMjQ4QzNuTGhWbGx2ZlZTNzRTWlE4b3l4OVBETHVYVE9NWlZSNTVB?= =?utf-8?B?eG41a2xZeDVGQ0paaXV0NFFEemFpZmUyK29zb1VGUjdReWlUbW5aY3MwdGdD?= =?utf-8?B?UVIwVStONmxuSGsvVjkxUnV4K3h5YUJ4MEJQb01uRS9WTHNRNDlJcEtjK2RF?= =?utf-8?B?alZMNU4zRDdTdXBnSDlBNXc2U2ZYbDUyOENUY0ZoUnl6MG5yYU5jQUh5dkpX?= =?utf-8?B?d0VvRVMxczZtTjNEM0plb3NMZjBjYVMvM3Bpc000a3c0R2o4R2F3aXQxeGxv?= =?utf-8?B?U085RUM1WnpSRndTcWpPQ29LY0psYm51WUF3WmpCeVlEN0laUTRtTDdoM2Iv?= =?utf-8?B?QmJRdG5LMnFKVHdHdnIrVDRtWjJBMkhxSHJTb0o1S2RGelpHeC9kUXU2cG1w?= =?utf-8?B?Sit1UXlXelgrcUVML1JHdVVFZCtWeTFTSGdFYkVHckdNbTlCU3RWdlZBUjhR?= =?utf-8?B?dWkzRmlMeTVaeEFrYjFiNTVKcndDbzJZajk4dXhlT210OE8veCtNQ0lWczZ1?= =?utf-8?B?K2k0RVNhOHFMVnAwSVRDdDhOOFVyWmFnQ1U4NXZDVnFBTDRhS3BSbEFnTEFm?= =?utf-8?B?U1p4UjNVM1pvN0NMS00vYXBvQXZOVkg3VFBmcnRLN2xadkZ1OG0wczZ6d3la?= =?utf-8?Q?X0x4=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)(366016)(1800799024)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cC96cVpVK1RvRWIyZWhscWtTRWJ3WXF1bW1DdnhZUGlkS3BCQ1hibm41V3d3?= =?utf-8?B?RHBWa2QyK1BPUTVVNHJSbnRWOVJ5KzZqWDNyU2sxSkdHbHNJZEhuYy9hT0hN?= =?utf-8?B?YnBodGxZWGtGRUVpNGJzbDlRdjFRa3ozb2hJNUd3YnppdW9tM0JGYVVIMVVn?= =?utf-8?B?M2lXcW0wU2kxeFRDVWhURnpnQVNydldNbk5YS0wvWHZyODZMQld0SVA5WXVL?= =?utf-8?B?alViZFhOcDJjaFpLUElVNGFkYTkxWFVsZEVpVk9RR2FGd3Z5SmxIL1FEMmV4?= =?utf-8?B?NDV1VjlJcTVHSkxZUnRJb0pOVzJ5MCtJNGkyWlpKNHI1NG5OVnJ0TnpySHFi?= =?utf-8?B?ZCtxaTBEeWVoOTIzeXFMWWljaDN5R013ajJmV2o3MzVyYXFYYklDWE1yMFo4?= =?utf-8?B?dXVJZjl0dk9tWXhkVStvM1cvamtRMHdHdnZjbnRJdGVNbmNPeTFlcmZUM0Zw?= =?utf-8?B?UXYyV3o3NkpianVFSnVFSGVGamdkZFZzS3F3M0xDUGxkSjE2dmMwazIwSjRm?= =?utf-8?B?WUU4bTY3MzBoQ1RuV1lTWWdBMzYxUXV0cXBoRWVMNU5lTkkzR0VreWxXRE5Z?= =?utf-8?B?RkZRbStoZ2JKSklHdVJRMWFhaWNHbmNzcHBqQURnTHpPaHp6TTFnOXZ3WkZu?= =?utf-8?B?YTg2NGVqNjN3bTVqYWlvOTlGY2V0Y0pXL3JmZER4aTZwdGRhY3RrSnFNV3ky?= =?utf-8?B?RDN1alFhMG5oM2ZRV3VOL1ZkVHVkbHZvM0tzRDFpMGtnZTNvdk5xcFlDNVd1?= =?utf-8?B?Z3BXbkVmR1h0UEVHR3VLbldOVGduVzRTd1ZEQVlGallJbnZtOHcxU05wSFQz?= =?utf-8?B?N3lObGxwR3I5aThjaDR5VVVYMDBDSXRpVWpLK3N5WHhhOU1UR0ZXaWpqRUFS?= =?utf-8?B?eDRXczVxUGRkUVNNWTVPaWVyamxadlVHTHZNWmJVdFVvUk9GT0JWdWVGc3Q0?= =?utf-8?B?TUtMWnhVdVN5QUlXbURmN3FxZS9mWitFTzZ1NExtem9haUJMVDFwUkdZY1Bk?= =?utf-8?B?eDNoeGU4aDF3MHRGMjlac0RLSkdwRnBPajFreUY3b1U4NVREdjc1ZTZ5RW53?= =?utf-8?B?ODdEUk1RWTlEbHA5em5YeWp3QmlyRWZxUllRR29DR3R2V3ZaaDE5TEhmL0NM?= =?utf-8?B?a3NLd2dTYjh6WExBakxHVGhtVm5YYjViTnRhUlAwNWVUZm1hQUFBS3U0a2V2?= =?utf-8?B?aXAyVWp2bHdLRU04eCtTMjBvQ1pkMWd3ZUdhN0tpMy9sQnBaZm9LaDNkcmZ3?= =?utf-8?B?bGFTUFA2TkJTWXhLMWR6SU1CeGZIZmR1UjFrL1RtNEJwZTlIUCs4TDRxUzVm?= =?utf-8?B?S2cvTTdWcGFPb0g2NlJxMUJNeTJJY1QxaGFUeDY3anJnaWFSejJTTmJLdUJH?= =?utf-8?B?SE5DdFpjVCs5L2MxblZDYVgra2VCQ2VpdTVvV1daem84MmpId0VsVlZCZkpJ?= =?utf-8?B?Ykorbk5GRS9IVFpyMGUxQUVlY3krbHk3SGV3QlRhbHdmd1hKNDB6ODJudEFS?= =?utf-8?B?Qm9NRUIyTnVUYUdGd3VUTjdRRGE1N2RHRE05eUZKdzVOOWQxMjB1UE8zRVpz?= =?utf-8?B?djVrZEgvbG9oVUJBSzVLSmVTdGxkR0prVkVUUUZMV1dOaVovTjFlWHRKOFVI?= =?utf-8?B?WklhVkxQcGxPK2x2aGFIYW9OSHhMMEVwbUUxdG9nM2RmR2FTK1VrL1lpeFRy?= =?utf-8?B?MXpacmF6VFM1R1Zwc1R5MktoNmd6Sm4xQWVTeEQrMDM1aURoaE9qSkJCemlF?= =?utf-8?B?eGtHMEh5T3dZR3hURnFMZEJPVjBXZVdkdVpCL1NUd010SXpIQUM2cDkwR2RD?= =?utf-8?B?aU5DQmlFNFFaUmlMNUNoMkg1RGxMS1VGQm9BYUlXKzdBQmdvMURIRUNZYUho?= =?utf-8?B?dm10UmV3YmdOZ2Z1S2QwbzRvM3ZTZlFQc0pNb29qVHkxS1J2bUVnaTd1Lzcw?= =?utf-8?B?a0ZDR0I4WFB2TTN6U2ZmSkNsS0RjWmV0eHRYRWJXQVhrbDNsVTFiYkc1OThJ?= =?utf-8?B?T2pWNHRlNEtObTgxQUFlTnV3bVlaUGxWQ1BJYm9STW1uMmN3S2pxYUZzaVhO?= =?utf-8?B?eHVjTmlRNWZ3emJkaG54QmRkRXQ1WEh0YkVJdWs4cjN5T1RiaTZXSzB4TWRN?= =?utf-8?B?alhYY0RacWsvVHRaVTJXTS90QUxwKzZ0eFEwOHJDZGFpb0t0RWxDQ25MeHYz?= =?utf-8?B?bzZDVURQek1FdzFTR2dJa0NzWWVuSWtxeWd4V2ZQdVlzZHNIVThQRkNDMzhp?= =?utf-8?B?U1hFVnJXcmtyaVZvUTNMU3g3bUpSVXg3azFtalBJdTNUZm5UeGd1ZkxTVENP?= =?utf-8?B?M241TldTUmtSQXBFQ0F3QU5FbkhHRFpOY2tFSndiTXNicG9kWHUxUT09?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 534dc79f-9afa-422a-8154-08de6031af95 X-MS-Exchange-CrossTenant-AuthSource: DS2PR12MB9567.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 18:59:24.9760 (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: +CZxoCwywgJl5zxZWRTnqO8b54kIrIjD5m/ihEDhdqD0nDWvxA3qJAuwoZgfoudPmHX4sj5w8SKvEo2BZp51nQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7106 Message-ID-Hash: SY5HZM7UH4Y7VQ2BZEGHEVWMY6W6WKWB X-Message-ID-Hash: SY5HZM7UH4Y7VQ2BZEGHEVWMY6W6WKWB 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: 1769799898725158500 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 fb09c678f3..db5712721e 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