From nobody Sun Dec 14 02:02:12 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 17473416114241010.2163777692994; Thu, 15 May 2025 13:40:11 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 561B014F1; Thu, 15 May 2025 16:40:10 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 2EB5114FB; Thu, 15 May 2025 16:37:34 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id CA34C141A; Thu, 15 May 2025 16:37:22 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2066.outbound.protection.outlook.com [40.107.236.66]) (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 96166148B for ; Thu, 15 May 2025 16:37:06 -0400 (EDT) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SJ2PR12MB8135.namprd12.prod.outlook.com (2603:10b6:a03:4f3::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.32; Thu, 15 May 2025 20:36:59 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400%3]) with mapi id 15.20.8722.027; Thu, 15 May 2025 20:36:59 +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=XpWtY3FFk2WQOncgkArTU5oHP0F6+sQ/XfaxbX9x3WY/OVc7K0/HkeHufn/+v0gcb9tK+XIRwEJVU+00+ImRFwL8Wwu/vc2Hrdu/TMMAR9g5tS1QP+18Nlw9PkW78xerRhBWIklmmmPZAc9aFqsPywbXW987Mju6WCk/xW10bvwjfJNJSMtkvdPjWKLzBCGQzWVjv292Kn03pemwn8txw7O1gFjyjbkXpRTiBpGxrSTs+8cDXzp8fysxZBEV7BTSmJvtlXholLP/fuqdjQBzVMYI5AqEnZhoDtgF/gPVUS0BP+gINb6kNJgj9i2HpCLb8mnkH8ailsxYQob9yj8l+w== 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=+iX9IITHN4B+BrPmBMhfrrp4FBxUI7VB6oAl0+L+2qk=; b=Ij9A297FdBgu+5Usn1TPMl2auKx4mQfMpjT0erbpxzPpnSGRhVsUWZwPxD78rGgonuIm6l5plGocLWiaJtlTAAYNpRuxzMYubmmK0afOuUpwtMBI9/t9VHCtWRRnkKBrfHvK+08hUsK2sr/dGX6sodQxTacfGezIzhdlsn2vuWHq0yV5tYk1aIO0tB0iHKj+oCBwr7mUPXyUuJzk5Eh2OjUgOUZRwcekyRcrwlygza9Ldsq68zpKlk08v0e3cmdIqFjYp94DJA8jrEu3zcberi2Qmh2b+Ma1LQjAYfmVzzGYurNQF3c+KrNXjhY9nsALAZuN8qnwk0X2QMKt7f5TwA== 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=+iX9IITHN4B+BrPmBMhfrrp4FBxUI7VB6oAl0+L+2qk=; b=FXF8QfwDlEouqitexf5LE2ZCNcdpb+F7txuCDzvzqvhiGIT0fELH7nbw4lp7JETjVsHdxXgbRQz664Uy2Hmy9FgBiE2lwP6jv4mQq4Ww15WxH5G9cpijGys+Jsw88V3f5enJgAlkYK78/QJBC7rNL5y9Ovio2HN4lWC3sJm9BWYeMF1HEHWwLljGKvrqpwiwMH4iuDeihlfvyM5DiuwUuSpNiJHIT/iPun9MEY0uSsOASrX0gCmzzpgv7hTeO6297HUWQuasMkx33WEx6Es1Potq34lo7YfMU8OLgsHfYptBzegix2X9yYg1RqdOgUoWkE2AisUi+9lIasWV1mCC/A== 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 1/5] conf: Support multiple smmuv3Dev IOMMU devices Date: Thu, 15 May 2025 13:36:39 -0700 Message-ID: <20250515203643.21109-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250515203643.21109-1-nathanc@nvidia.com> References: <20250515203643.21109-1-nathanc@nvidia.com> X-ClientProxiedBy: SJ0P220CA0028.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::11) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SJ2PR12MB8135:EE_ X-MS-Office365-Filtering-Correlation-Id: e853a566-099a-4d97-8cbc-08dd93f03d97 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?SbTTgfS3K9SRzLOc8TdCSVjsa5fQtf3cONOZny1ys7Fpr3o/BPXknvFPK7Sc?= =?us-ascii?Q?6cNsvvIJbi1oRSZtvCKAOvInQGlof5u+ueLDgiD5VqXuAQifbrfeXJYH3biw?= =?us-ascii?Q?xEArH1DZBWo0IrRLjL7mlYt4SfKvBXiewMk4+9F69n/11bvlJEynqOvRhSuv?= =?us-ascii?Q?J5EGfCfeR/maY92/cvGTDCkx2KzAnnjmM9CwDgLQcoarF82EL/+84lEZ14+X?= =?us-ascii?Q?MA0TsfHq2JLhrr8SGdae7b2oawF3bE+uEo/ceamGyzUSeLmv1idwDYPKTafE?= =?us-ascii?Q?afv22DGRuwQ8QSEsR9cwjSQG7tt+1p7ZD47AoTVRRPfsikgfvMYg91ti0zFX?= =?us-ascii?Q?M+iPwePHKl5sF/pWCPComFI7qIzcKS5AAIbOf+wK7GokxwWR0VI7Z30XEFR+?= =?us-ascii?Q?Zk+q7GmMw5b6aU4453pLCr0vnswxlcspLl1hvC69Q0DysrnfrJSHceqzhO8N?= =?us-ascii?Q?ajoVOehc6vqK9bkSPgg56JRHpklap7YQhWi74+Zzj/4xn1PNphl9vg0/7q7V?= =?us-ascii?Q?oxTkMcdmYabeAMZyJLRc/0EXZse6iSijSNASazmknYYIBIkYmD6ghrnBUwX7?= =?us-ascii?Q?s1vX/X9/qRo81Gk0XJqydk7NrEdwiEfo3tI9UlqSid6G0jztHLDkdS/yRFVv?= =?us-ascii?Q?+eFWu2zIAaYgBljval0xNDslrkKdvQRuiiBGYpHWNYYDLD7OfSRxjjZ30E/i?= =?us-ascii?Q?y2FRfQ8xsl8angOcs5M3ThjshEYbA4s0FqkSOoGr+FchCmeP0nCMOXVQC4Nr?= =?us-ascii?Q?VJj/8xNjLmKlc872ABqjB7FoucYZUYfaMFY9D98GRkB20rIi8fnT3iLV7sqQ?= =?us-ascii?Q?cK01edsb3ZtccwQ+UiAMrFu92xNRLKE80YJiR117jdXe9Q20coZfZHbDUbAK?= =?us-ascii?Q?gAW4aoh4riLfirHt/TdolUHnjLwDgUwko4+Wj2hNP7pTZkVsIdi1vgNMXOis?= =?us-ascii?Q?6i+sQsE6sdNnEv7EJglPkzOtupMrwHgI5oMEOVi8Ps/hH8KPPNjV7pJI4qAi?= =?us-ascii?Q?PX58TxemyU6SmHbG73Swu9CIZDyjbeYNZdNKe0/Vq2msGy+2gGm1WdsXHOi4?= =?us-ascii?Q?XcUxgm1sJhOcZhODTFnJNd16xjVgRoa/dpRFuLjr4Xh8WHAK5sDcG87ePnJG?= =?us-ascii?Q?f7HPH4zZa1y1THs3JF6kCyK9+cRZ+KiA8/NSrB0thsszz1Y4FacOYSXrqQvE?= =?us-ascii?Q?BPaTCziITDx0+lNbXhpS/3qoOTM1V9zJVPVPulI84uoBDhE3plxjmMX6SLXQ?= =?us-ascii?Q?TsROZgKtPRG3LUkHTM+NnEYd1ANJzhcyKkR9Magd36zNQoCfSKxdACpUBQsi?= =?us-ascii?Q?NnSqsSeGA9WIx6Rh+30ki6+jQ6i+0kY+1kdGQNS9fTE09/nfpZuH3RhzXd3n?= =?us-ascii?Q?cNJCaCBchE8e/jfkknaLKeOfMPGRlh+ddM/tfQKj6hEDLoUJD7343w+hSBra?= =?us-ascii?Q?c928NusdzZs=3D?= 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: =?us-ascii?Q?l4NQQwt8n0ar4n/qWHgUPb3q3zAs8Gf0xELt1pQDYFVzV5bqDbHYQZ6fmdIk?= =?us-ascii?Q?t09jhoI17DiWHFzOr5+OnfLc/g6REDC3xYe9LGiBBhBGx7pcfDKi1u0smN+m?= =?us-ascii?Q?cg7R76O7Oz/ju/yaZha+mPGVLzliBuxofe9n5wnx9d43sUoC3vBLgHRJwPyt?= =?us-ascii?Q?2nWptj/YCr4AquglgMZjXPD6v6017E/WSL24pw8vq1+g/f/QpTqpMlBGJF6N?= =?us-ascii?Q?c4ZAJtQ2UAl7jxJUGFceiQd2ohLyjc4vSyNBmgd+hO2oVMThq0Lc1dT1USLR?= =?us-ascii?Q?/Si/wv2VXRQv9Q4K5eGOiU2XeFW1XQY3HMXmLUpOggzKTAP0h0vKmtaoJF+o?= =?us-ascii?Q?wVd6tqen1hOmhKbKEJ8c/+cQdAeaaRtF2xRIFe10qqZ/6yLGBXQXLGIlwsoQ?= =?us-ascii?Q?wnNw9O8bDFHeRZJAFaJS1YdytHmOMqA4cb/EeScy+uKm4mkdwf8v5gxtOU0t?= =?us-ascii?Q?zvp1tqAzNNMvNtDRGAQt9yIpYtOnCVBnoUoaJXpZObuKgJq3zNa6mqCkh7pH?= =?us-ascii?Q?yTKNxIo26ZB5Bvj9idhgfS7VEu+WjiLhd944AVzTft+b/JaHyKFt3+wiXLPg?= =?us-ascii?Q?RXuaLV7CblHBoiLYp9ENxx97ckGYokobJnkLHLEoDG+9sV+t/Tr5ioBE+e1E?= =?us-ascii?Q?dGWMDFvEyQqFKyh9YY5x3HEerWR4VGzSqSmyE7Y9Fa0xpMQO1U8Lb3s/kcdI?= =?us-ascii?Q?R0j3JNsOKc7WjQdm7EMjJqt5YRbpwSzKjQAFpJOto+uVeKL8jRQSonqRapyi?= =?us-ascii?Q?JNxBtB3gkUiUPZOgunqUKp9Pmz5e94G+4jahsgjoG5m/SlTnpeLIjpY9oMV8?= =?us-ascii?Q?xtGIIXbPA0rtjj1VpJELyhlWAEuka89kPSICpOfv+K8wiY+jBUMlwySDdrz5?= =?us-ascii?Q?OCxXIsFx8AeMwE/W0WMyMvQ67z9dxbreZzlfjuaDVWCnxt7ec6JkqtVEYjT9?= =?us-ascii?Q?yiOdjd+rYx/kJK9dEcVlDXnmI/uwA58hv/QO8RNlurLDUjjEDU4sD1IjbvQO?= =?us-ascii?Q?yRGxTRcrMvbsy681Zh6/BOcA2bX7yfg4cNbNhVIqZwhGRPlhVATNFk4EIQ34?= =?us-ascii?Q?WU/CuOwFs0gTPHelGhsg63/V3CR4yT5I/XkRdpWG/69vTWBtwG6ssGjamPRg?= =?us-ascii?Q?qW4YmB0Z8TFyFBvEHx07ai5EVz9Ld96NUD+hnU6MzWVXv+vagKV54teVz+4m?= =?us-ascii?Q?DfDH6kSfjrYWfwJhx2sh6flJQJu77QxiWthoVfSSBCnbxSVQt1KB/qvfUf0J?= =?us-ascii?Q?MnBHQG61H6G6EZNGpnz3swA28qNc7nLEY4++dSljaRF3FYAhwLp5eCFVXcs/?= =?us-ascii?Q?5eZdYEALxfb0R8hN26WfuUu0DSnYvN3FEx8dlufw5gNZe/DPwkUcs8Wfwtxb?= =?us-ascii?Q?zxeXN/Q0DnINUM6el5MLonlvrOxTOVzbqHsJZKmNMET2d1+abPGQpmec9cbE?= =?us-ascii?Q?7z9bWQupGJxRmuB0KlX3l0NXgZI2q29ba2uYd+b2DeMn3RJh5H7R9MbOmWPH?= =?us-ascii?Q?aCUspVO1h27aHPOw/0NGcpHwQxbO86zKyrDP1sxYWzQ68DVylDBJGl2ApTwM?= =?us-ascii?Q?NpLNCkKlufbD8cM6sZDpaxAMD4sH28FNnim6RTry?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e853a566-099a-4d97-8cbc-08dd93f03d97 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2025 20:36:59.3113 (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: +AJNDc0VyOxXJ7TC4oHT9a7fShSjRmu1pdeyovx9+Lj236c6CZhbeqz4Ei8mmrLB7R1d80TZ5t+ek3hMLZPFIA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8135 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 5G27YDK3SUZJ4V3ONDILLUL75APA34S5 X-Message-ID-Hash: 5G27YDK3SUZJ4V3ONDILLUL75APA34S5 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, Nathan Chen 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: 1747341612217116600 Content-Type: text/plain; charset="utf-8" Add support for "smmuv3Dev" IOMMU model, and add support for parsing multiple IOMMU devices from the VM definition when "smmuv3Dev" is the IOMMU model. Enable plugging smmuv3Dev into pcie-root and pcie-expander-bus. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 5 +- src/conf/domain_addr.c | 12 ++- src/conf/domain_addr.h | 4 +- src/conf/domain_conf.c | 153 ++++++++++++++++++++++++++---- src/conf/domain_conf.h | 11 ++- src/conf/domain_validate.c | 38 +++++--- src/conf/schemas/domaincommon.rng | 8 +- src/libvirt_private.syms | 2 + src/qemu/qemu_alias.c | 15 ++- src/qemu/qemu_command.c | 135 +++++++++++++++++--------- src/qemu/qemu_domain_address.c | 33 ++++--- src/qemu/qemu_driver.c | 8 +- src/qemu/qemu_postparse.c | 11 ++- src/qemu/qemu_validate.c | 22 ++++- 14 files changed, 342 insertions(+), 115 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index c7c75ae219..f9b835da7d 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9043,8 +9043,9 @@ Example: ... =20 ``model`` - Supported values are ``intel`` (for Q35 guests) ``smmuv3`` - (:since:`since 5.5.0`, for ARM virt guests), and ``virtio`` + Supported values are ``intel`` (for Q35 guests), ``smmuv3`` + (:since:`since 5.5.0`, for ARM virt guests), ``smmuv3Dev`` + (for ARM virt guests), and ``virtio`` (:since:`since 8.3.0`, for Q35 and ARM virt guests). =20 ``driver`` diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 8dfa8feca0..6a75a7aee1 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -386,6 +386,8 @@ virDomainPCIAddressFlagsCompatible(virPCIDeviceAddress = *addr, connectStr =3D "pcie-expander-bus"; } else if (devFlags & VIR_PCI_CONNECT_TYPE_PCI_BRIDGE) { connectStr =3D "pci-bridge"; + } else if (devFlags & VIR_PCI_CONNECT_TYPE_SMMUV3_DEV) { + connectStr =3D "arm-smmuv3-dev"; } else { /* this should never happen. If it does, there is a * bug in the code that sets the flag bits for devices. @@ -517,7 +519,8 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBus *= bus, bus->flags =3D (VIR_PCI_CONNECT_TYPE_PCIE_DEVICE | VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT | VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE | - VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS); + VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS | + VIR_PCI_CONNECT_TYPE_SMMUV3_DEV); bus->minSlot =3D 1; bus->maxSlot =3D VIR_PCI_ADDRESS_SLOT_LAST; break; @@ -561,11 +564,12 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBus= *bus, bus->maxSlot =3D VIR_PCI_ADDRESS_SLOT_LAST; break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - /* 32 slots, no hotplug, only accepts pcie-root-port or - * dmi-to-pci-bridge + /* 32 slots, no hotplug, only accepts pcie-root-port, + * dmi-to-pci-bridge, or arm-smmuv3-dev */ bus->flags =3D (VIR_PCI_CONNECT_TYPE_PCIE_ROOT_PORT | - VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE); + VIR_PCI_CONNECT_TYPE_DMI_TO_PCI_BRIDGE | + VIR_PCI_CONNECT_TYPE_SMMUV3_DEV); bus->minSlot =3D 0; bus->maxSlot =3D VIR_PCI_ADDRESS_SLOT_LAST; break; diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index e72fb48847..906ba9a52d 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -57,6 +57,7 @@ typedef enum { VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS =3D 1 << 11, VIR_PCI_CONNECT_TYPE_PCI_BRIDGE =3D 1 << 12, VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE =3D 1 << 13, + VIR_PCI_CONNECT_TYPE_SMMUV3_DEV =3D 1 << 14, } virDomainPCIConnectFlags; =20 /* a combination of all bits that describe the type of connections @@ -71,7 +72,8 @@ typedef enum { VIR_PCI_CONNECT_TYPE_PCI_EXPANDER_BUS | \ VIR_PCI_CONNECT_TYPE_PCIE_EXPANDER_BUS | \ VIR_PCI_CONNECT_TYPE_PCI_BRIDGE | \ - VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE) + VIR_PCI_CONNECT_TYPE_PCIE_TO_PCI_BRIDGE | \ + VIR_PCI_CONNECT_TYPE_SMMUV3_DEV) =20 /* combination of all bits that could be used to connect a normal * endpoint device (i.e. excluding the connection possible between an diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b3b0bd7329..c8d481eb5c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1350,6 +1350,7 @@ VIR_ENUM_IMPL(virDomainIOMMUModel, "intel", "smmuv3", "virtio", + "smmuv3Dev", ); =20 VIR_ENUM_IMPL(virDomainVsockModel, @@ -4113,7 +4114,8 @@ void virDomainDefFree(virDomainDef *def) virDomainCryptoDefFree(def->cryptos[i]); g_free(def->cryptos); =20 - virDomainIOMMUDefFree(def->iommu); + for (i =3D 0; i < def->niommus; i++) + virDomainIOMMUDefFree(def->iommu[i]); =20 virDomainPstoreDefFree(def->pstore); =20 @@ -4985,9 +4987,9 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, } =20 device.type =3D VIR_DOMAIN_DEVICE_IOMMU; - if (def->iommu) { - device.data.iommu =3D def->iommu; - if ((rc =3D cb(def, &device, &def->iommu->info, opaque)) !=3D 0) + for (i =3D 0; i < def->niommus; i++) { + device.data.iommu =3D def->iommu[i]; + if ((rc =3D cb(def, &device, &def->iommu[i]->info, opaque)) !=3D 0) return rc; } =20 @@ -16369,6 +16371,110 @@ virDomainInputDefFind(const virDomainDef *def, } =20 =20 +bool +virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, + const virDomainIOMMUDef *b) +{ + if (a->model !=3D b->model || + a->intremap !=3D b->intremap || + a->caching_mode !=3D b->caching_mode || + a->eim !=3D b->eim || + a->iotlb !=3D b->iotlb || + a->aw_bits !=3D b->aw_bits || + a->dma_translation !=3D b->dma_translation) + return false; + + switch (a->info.type) { + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: + if (a->info.addr.pci.domain !=3D b->info.addr.pci.domain || + a->info.addr.pci.bus !=3D b->info.addr.pci.bus || + a->info.addr.pci.slot !=3D b->info.addr.pci.slot || + a->info.addr.pci.function !=3D b->info.addr.pci.function) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE: + if (a->info.addr.drive.controller !=3D b->info.addr.drive.controll= er || + a->info.addr.drive.bus !=3D b->info.addr.drive.bus || + a->info.addr.drive.unit !=3D b->info.addr.drive.unit) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL: + if (a->info.addr.vioserial.controller !=3D b->info.addr.vioserial.= controller || + a->info.addr.vioserial.bus !=3D b->info.addr.vioserial.bus || + a->info.addr.vioserial.port !=3D b->info.addr.vioserial.port) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID: + if (a->info.addr.ccid.controller !=3D b->info.addr.ccid.controller= || + a->info.addr.ccid.slot !=3D b->info.addr.ccid.slot) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA: + if (a->info.addr.isa.iobase !=3D b->info.addr.isa.iobase || + a->info.addr.isa.irq !=3D b->info.addr.isa.irq) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM: + if (a->info.addr.dimm.slot !=3D b->info.addr.dimm.slot) { + return false; + } + + if (a->info.addr.dimm.base !=3D b->info.addr.dimm.base) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: + if (a->info.addr.ccw.cssid !=3D b->info.addr.ccw.cssid || + a->info.addr.ccw.ssid !=3D b->info.addr.ccw.ssid || + a->info.addr.ccw.devno !=3D b->info.addr.ccw.devno) { + return false; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + break; + } + + if (a->info.acpiIndex !=3D b->info.acpiIndex) { + return false; + } + + return true; +} + + +ssize_t +virDomainIOMMUDefFind(const virDomainDef *def, + const virDomainIOMMUDef *iommu) +{ + size_t i; + + for (i =3D 0; i < def->niommus; i++) { + if (virDomainIOMMUDefEquals(iommu, def->iommu[i])) + return i; + } + + return -1; +} + + bool virDomainVsockDefEquals(const virDomainVsockDef *a, const virDomainVsockDef *b) @@ -19375,6 +19481,7 @@ virDomainDefControllersParse(virDomainDef *def, return 0; } =20 + static virDomainDef * virDomainDefParseXML(xmlXPathContextPtr ctxt, virDomainXMLOption *xmlopt, @@ -20021,19 +20128,28 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); =20 + /* analysis of iommu devices */ if ((n =3D virXPathNodeSet("./devices/iommu", ctxt, &nodes)) < 0) return NULL; =20 - if (n > 1) { + if (n > 1 && !virXPathBoolean("./devices/iommu/@model =3D 'smmuv3Dev'"= , ctxt)) { virReportError(VIR_ERR_XML_ERROR, "%s", - _("only a single IOMMU device is supported")); + _("multiple IOMMU devices are only supported with m= odel smmuv3Dev")); return NULL; } =20 - if (n > 0) { - if (!(def->iommu =3D virDomainIOMMUDefParseXML(xmlopt, nodes[0], - ctxt, flags))) + if (n > 0) + def->iommu =3D g_new0(virDomainIOMMUDef *, n); + + for (i =3D 0; i < n; i++) { + virDomainIOMMUDef *iommu; + + iommu =3D virDomainIOMMUDefParseXML(xmlopt, nodes[i], ctxt, flags); + + if (!iommu) return NULL; + + def->iommu[def->niommus++] =3D iommu; } VIR_FREE(nodes); =20 @@ -22455,15 +22571,17 @@ virDomainDefCheckABIStabilityFlags(virDomainDef *= src, goto error; } =20 - if (!!src->iommu !=3D !!dst->iommu) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Target domain IOMMU device count does not match = source")); + if (src->niommus !=3D dst->niommus) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device count %1$zu does not = match source %2$zu"), + dst->niommus, src->niommus); goto error; } =20 - if (src->iommu && - !virDomainIOMMUDefCheckABIStability(src->iommu, dst->iommu)) - goto error; + for (i =3D 0; i < src->niommus; i++) { + if (!virDomainIOMMUDefCheckABIStability(src->iommu[i], dst->iommu[= i])) + goto error; + } =20 if (!!src->vsock !=3D !!dst->vsock) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -29222,8 +29340,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, for (n =3D 0; n < def->ncryptos; n++) { virDomainCryptoDefFormat(buf, def->cryptos[n], flags); } - if (def->iommu) - virDomainIOMMUDefFormat(buf, def->iommu); + + for (n =3D 0; n < def->niommus; n++) + virDomainIOMMUDefFormat(buf, def->iommu[n]); =20 if (def->vsock) virDomainVsockDefFormat(buf, def->vsock); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 58b97a2b54..75568ff50a 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3005,6 +3005,7 @@ typedef enum { VIR_DOMAIN_IOMMU_MODEL_INTEL, VIR_DOMAIN_IOMMU_MODEL_SMMUV3, VIR_DOMAIN_IOMMU_MODEL_VIRTIO, + VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV, =20 VIR_DOMAIN_IOMMU_MODEL_LAST } virDomainIOMMUModel; @@ -3258,6 +3259,9 @@ struct _virDomainDef { size_t nwatchdogs; virDomainWatchdogDef **watchdogs; =20 + size_t niommus; + virDomainIOMMUDef **iommu; + /* At maximum 2 TPMs on the domain if a TPM Proxy is present. */ size_t ntpms; virDomainTPMDef **tpms; @@ -3267,7 +3271,6 @@ struct _virDomainDef { virDomainNVRAMDef *nvram; virCPUDef *cpu; virDomainRedirFilterDef *redirfilter; - virDomainIOMMUDef *iommu; virDomainVsockDef *vsock; virDomainPstoreDef *pstore; =20 @@ -4269,6 +4272,12 @@ virDomainShmemDef *virDomainShmemDefRemove(virDomain= Def *def, size_t idx) ssize_t virDomainInputDefFind(const virDomainDef *def, const virDomainInputDef *input) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; + +bool virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, + const virDomainIOMMUDef *b); +ssize_t virDomainIOMMUDefFind(const virDomainDef *def, + const virDomainIOMMUDef *iommu) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; bool virDomainVsockDefEquals(const virDomainVsockDef *a, const virDomainVsockDef *b) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index d0d4bc0bf4..4861b1c002 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1838,21 +1838,32 @@ virDomainDefCputuneValidate(const virDomainDef *def) static int virDomainDefIOMMUValidate(const virDomainDef *def) { + size_t i; + if (!def->iommu) - return 0; + return 0; =20 - if (def->iommu->intremap =3D=3D VIR_TRISTATE_SWITCH_ON && - def->features[VIR_DOMAIN_FEATURE_IOAPIC] !=3D VIR_DOMAIN_IOAPIC_QE= MU) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("IOMMU interrupt remapping requires split I/O API= C (ioapic driver=3D'qemu')")); - return -1; - } + for (i =3D 0; i < def->niommus; i++) { + virDomainIOMMUDef *iommu =3D def->iommu[i]; =20 - if (def->iommu->eim =3D=3D VIR_TRISTATE_SWITCH_ON && - def->iommu->intremap !=3D VIR_TRISTATE_SWITCH_ON) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("IOMMU eim requires interrupt remapping to be ena= bled")); - return -1; + if (def->niommus > 1 && iommu->model !=3D VIR_DOMAIN_IOMMU_MODEL_S= MMUV3_DEV) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("IOMMU model smmuv3Dev must be specified for = multiple IOMMU definitions")); + } + + if (iommu->intremap =3D=3D VIR_TRISTATE_SWITCH_ON && + def->features[VIR_DOMAIN_FEATURE_IOAPIC] !=3D VIR_DOMAIN_IOAPI= C_QEMU) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMU interrupt remapping requires split I/O= APIC (ioapic driver=3D'qemu')")); + return -1; + } + + if (iommu->eim =3D=3D VIR_TRISTATE_SWITCH_ON && + iommu->intremap !=3D VIR_TRISTATE_SWITCH_ON) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("IOMMU eim requires interrupt remapping to be= enabled")); + return -1; + } } =20 return 0; @@ -3066,6 +3077,7 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) { switch (iommu->model) { case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || @@ -3095,6 +3107,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) return -1; } break; + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + break; =20 case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: case VIR_DOMAIN_IOMMU_MODEL_LAST: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 5597d5a66b..8d1768b24f 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6190,6 +6190,7 @@ intel smmuv3 virtio + smmuv3Dev @@ -6233,9 +6234,6 @@ - - - @@ -6867,9 +6865,9 @@ - + - + diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a8ebf9efd8..143d3af8f3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -491,6 +491,8 @@ virDomainInputSourceGrabToggleTypeToString; virDomainInputSourceGrabTypeFromString; virDomainInputSourceGrabTypeToString; virDomainInputTypeToString; +virDomainIOMMUDefEquals; +virDomainIOMMUDefFind; virDomainIOMMUDefFree; virDomainIOMMUDefNew; virDomainIOMMUModelTypeFromString; diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 3e6bced4a8..d635eb0178 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -631,10 +631,14 @@ qemuAssignDeviceVsockAlias(virDomainVsockDef *vsock) =20 =20 static void -qemuAssignDeviceIOMMUAlias(virDomainIOMMUDef *iommu) +qemuAssignDeviceIOMMUAlias(virDomainDef *def, + virDomainIOMMUDef **iommu) { - if (!iommu->info.alias) - iommu->info.alias =3D g_strdup("iommu0"); + size_t i; + for (i =3D 0; i < def->niommus; i++) { + if (!iommu[i]->info.alias) + iommu[i]->info.alias =3D g_strdup_printf("iommu%zu", i); + } } =20 =20 @@ -750,8 +754,9 @@ qemuAssignDeviceAliases(virDomainDef *def) if (def->vsock) { qemuAssignDeviceVsockAlias(def->vsock); } - if (def->iommu) - qemuAssignDeviceIOMMUAlias(def->iommu); + if (def->iommu && def->niommus > 0) { + qemuAssignDeviceIOMMUAlias(def, def->iommu); + } for (i =3D 0; i < def->ncryptos; i++) { qemuAssignDeviceCryptoAlias(def, def->cryptos[i]); } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index bf03561fde..9deafefaad 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6128,60 +6128,106 @@ qemuBuildBootCommandLine(virCommand *cmd, } =20 =20 +static virJSONValue * +qemuBuildPCISmmuv3DevDevProps(const virDomainDef *def, + virDomainIOMMUDef *iommu) +{ + g_autoptr(virJSONValue) props =3D NULL; + g_autofree char *pciaddr =3D NULL; + g_autofree char *bus =3D qemuBuildDeviceAddressPCIGetBus(def, &iommu->= info); + + if (!bus) + return NULL; + + if (iommu->info.addr.pci.function !=3D 0) { + pciaddr =3D g_strdup_printf("0x%x.0x%x", iommu->info.addr.pci.slot, + iommu->info.addr.pci.function); + } else { + pciaddr =3D g_strdup_printf("0x%x", iommu->info.addr.pci.slot); + } + if (virJSONValueObjectAdd(&props, + "s:driver", "arm-smmuv3-accel", + "s:bus", bus, + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +} + + static int qemuBuildIOMMUCommandLine(virCommand *cmd, const virDomainDef *def, virQEMUCaps *qemuCaps) { + size_t i; g_autoptr(virJSONValue) props =3D NULL; - const virDomainIOMMUDef *iommu =3D def->iommu; =20 - if (!iommu) + if (!def->iommu || def->niommus <=3D 0) return 0; =20 - switch (iommu->model) { - case VIR_DOMAIN_IOMMU_MODEL_INTEL: - if (virJSONValueObjectAdd(&props, - "s:driver", "intel-iommu", - "s:id", iommu->info.alias, - "S:intremap", qemuOnOffAuto(iommu->intre= map), - "T:caching-mode", iommu->caching_mode, - "S:eim", qemuOnOffAuto(iommu->eim), - "T:device-iotlb", iommu->iotlb, - "z:aw-bits", iommu->aw_bits, - "T:dma-translation", iommu->dma_translat= ion, - NULL) < 0) - return -1; + for (i =3D 0; i < def->niommus; i++) { + virDomainIOMMUDef *iommu =3D def->iommu[i]; + switch (iommu->model) { + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + /* Ignore unassigned devices */ + if (iommu->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNA= SSIGNED) + continue; =20 - if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 0) - return -1; + if (qemuCommandAddExtDevice(cmd, &iommu->info, def, qemuCaps) = < 0) + return -1; =20 - return 0; + if (!(props =3D qemuBuildPCISmmuv3DevDevProps(def, iommu))) + return -1; =20 - case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: - if (virJSONValueObjectAdd(&props, - "s:driver", "virtio-iommu", - "s:id", iommu->info.alias, - NULL) < 0) { - return -1; - } + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; =20 - if (qemuBuildDeviceAddressProps(props, def, &iommu->info) < 0) - return -1; + break; =20 - if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 0) - return -1; + case VIR_DOMAIN_IOMMU_MODEL_INTEL: + if (virJSONValueObjectAdd(&props, + "s:driver", "intel-iommu", + "s:id", iommu->info.alias, + "S:intremap", qemuOnOffAuto(iommu->i= ntremap), + "T:caching-mode", iommu->caching_mod= e, + "S:eim", qemuOnOffAuto(iommu->eim), + "T:device-iotlb", iommu->iotlb, + "z:aw-bits", iommu->aw_bits, + "T:dma-translation", iommu->dma_tran= slation, + NULL) < 0) + return -1; =20 - return 0; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; =20 - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - /* There is no -device for SMMUv3, so nothing to be done here */ - return 0; + return 0; =20 - case VIR_DOMAIN_IOMMU_MODEL_LAST: - default: - virReportEnumRangeError(virDomainIOMMUModel, iommu->model); - return -1; + case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: + if (virJSONValueObjectAdd(&props, + "s:driver", "virtio-iommu", + "s:id", iommu->info.alias, + NULL) < 0) { + return -1; + } + + if (qemuBuildDeviceAddressProps(props, def, &iommu->info) < 0) + return -1; + + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; + + return 0; + + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + /* There is no -device for SMMUv3, so nothing to be done here = */ + return 0; + + case VIR_DOMAIN_IOMMU_MODEL_LAST: + default: + virReportEnumRangeError(virDomainIOMMUModel, iommu->model); + return -1; + } } =20 return 0; @@ -7001,8 +7047,8 @@ qemuBuildMachineCommandLine(virCommand *cmd, if (qemuAppendDomainFeaturesMachineParam(&buf, def, qemuCaps) < 0) return -1; =20 - if (def->iommu) { - switch (def->iommu->model) { + if (def->iommu && def->niommus =3D=3D 1) { + switch (def->iommu[0]->model) { case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: virBufferAddLit(&buf, ",iommu=3Dsmmuv3"); break; @@ -7011,10 +7057,11 @@ qemuBuildMachineCommandLine(virCommand *cmd, case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: /* These IOMMUs are formatted in qemuBuildIOMMUCommandLine */ break; - + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + break; case VIR_DOMAIN_IOMMU_MODEL_LAST: default: - virReportEnumRangeError(virDomainIOMMUModel, def->iommu->model= ); + virReportEnumRangeError(virDomainIOMMUModel, def->iommu[0]->mo= del); return -1; } } @@ -10598,15 +10645,15 @@ qemuBuildCommandLine(virDomainObj *vm, if (qemuBuildBootCommandLine(cmd, def) < 0) return NULL; =20 - if (qemuBuildIOMMUCommandLine(cmd, def, qemuCaps) < 0) - return NULL; - if (qemuBuildGlobalControllerCommandLine(cmd, def) < 0) return NULL; =20 if (qemuBuildControllersCommandLine(cmd, def, qemuCaps) < 0) return NULL; =20 + if (qemuBuildIOMMUCommandLine(cmd, def, qemuCaps) < 0) + return NULL; + if (qemuBuildMemoryDeviceCommandLine(cmd, cfg, def, priv) < 0) return NULL; =20 diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e89cdee487..aeacdbc9db 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -943,6 +943,8 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, =20 case VIR_DOMAIN_IOMMU_MODEL_INTEL: case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + return VIR_PCI_CONNECT_TYPE_SMMUV3_DEV; case VIR_DOMAIN_IOMMU_MODEL_LAST: /* These are not PCI devices */ return 0; @@ -2354,22 +2356,25 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, /* Nada - none are PCI based (yet) */ } =20 - if (def->iommu) { - virDomainIOMMUDef *iommu =3D def->iommu; + if (def->iommu && def->niommus > 0) { + for (i =3D 0; i < def->niommus; i++) { + virDomainIOMMUDef *iommu =3D def->iommu[i]; =20 - switch (iommu->model) { - case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: - if (virDeviceInfoPCIAddressIsWanted(&iommu->info) && - qemuDomainPCIAddressReserveNextAddr(addrs, &iommu->info) <= 0) { - return -1; - } - break; + switch (iommu->model) { + case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: + if (virDeviceInfoPCIAddressIsWanted(&iommu->info) && + qemuDomainPCIAddressReserveNextAddr(addrs, &iommu->inf= o) < 0) { + return -1; + } + break; =20 - case VIR_DOMAIN_IOMMU_MODEL_INTEL: - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - case VIR_DOMAIN_IOMMU_MODEL_LAST: - /* These are not PCI devices */ - break; + case VIR_DOMAIN_IOMMU_MODEL_INTEL: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + case VIR_DOMAIN_IOMMU_MODEL_LAST: + /* These are not PCI devices */ + break; + } } } =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a34d6f1437..8599761137 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6894,12 +6894,12 @@ qemuDomainAttachDeviceConfig(virDomainDef *vmdef, break; =20 case VIR_DOMAIN_DEVICE_IOMMU: - if (vmdef->iommu) { + if (vmdef->iommu && vmdef->niommus > 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain already has an iommu device")); return -1; } - vmdef->iommu =3D g_steal_pointer(&dev->data.iommu); + VIR_APPEND_ELEMENT(vmdef->iommu, vmdef->niommus, dev->data.iommu); break; =20 case VIR_DOMAIN_DEVICE_VIDEO: @@ -7113,12 +7113,12 @@ qemuDomainDetachDeviceConfig(virDomainDef *vmdef, break; =20 case VIR_DOMAIN_DEVICE_IOMMU: - if (!vmdef->iommu) { + if ((idx =3D virDomainIOMMUDefFind(vmdef, dev->data.iommu)) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("matching iommu device not found")); return -1; } - g_clear_pointer(&vmdef->iommu, virDomainIOMMUDefFree); + VIR_DELETE_ELEMENT(vmdef->iommu, idx, vmdef->niommus); break; =20 case VIR_DOMAIN_DEVICE_VIDEO: diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index ed4af9ca8e..f2df3cba73 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -1450,7 +1450,7 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, } } =20 - if (addIOMMU && !def->iommu && + if (addIOMMU && !def->iommu && def->niommus =3D=3D 0 && virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_INTREMAP) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_INTEL_IOMMU_EIM)) { @@ -1462,7 +1462,8 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, iommu->intremap =3D VIR_TRISTATE_SWITCH_ON; iommu->eim =3D VIR_TRISTATE_SWITCH_ON; =20 - def->iommu =3D g_steal_pointer(&iommu); + def->iommu =3D g_new0(virDomainIOMMUDef *, 1); + def->iommu[def->niommus++] =3D g_steal_pointer(&iommu); } =20 if (qemuDomainDefAddDefaultAudioBackend(driver, def) < 0) @@ -1538,9 +1539,9 @@ qemuDomainDefEnableDefaultFeatures(virDomainDef *def, * domain already has IOMMU without inremap. This will be fixed in * qemuDomainIOMMUDefPostParse() but there domain definition can't be * modified so change it now. */ - if (def->iommu && - (def->iommu->intremap =3D=3D VIR_TRISTATE_SWITCH_ON || - qemuDomainNeedsIOMMUWithEIM(def)) && + if (def->iommu && def->niommus =3D=3D 1 && + (def->iommu[0]->intremap =3D=3D VIR_TRISTATE_SWITCH_ON || + qemuDomainNeedsIOMMUWithEIM(def)) && def->features[VIR_DOMAIN_FEATURE_IOAPIC] =3D=3D VIR_DOMAIN_IOAPIC_= NONE) { def->features[VIR_DOMAIN_FEATURE_IOAPIC] =3D VIR_DOMAIN_IOAPIC_QEM= U; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index b2c3c9e2f6..f4431f1b2a 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -851,7 +851,12 @@ qemuValidateDomainVCpuTopology(const virDomainDef *def= , virQEMUCaps *qemuCaps) QEMU_MAX_VCPUS_WITHOUT_EIM); return -1; } - if (!def->iommu || def->iommu->eim !=3D VIR_TRISTATE_SWITCH_ON) { + if (!def->iommu || def->niommus =3D=3D 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("iommu device not found. more than %1$d vCPUs= require extended interrupt mode enabled on the iommu device"), + QEMU_MAX_VCPUS_WITHOUT_EIM); + return -1; + } else if (def->iommu[0]->eim !=3D VIR_TRISTATE_SWITCH_ON) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("more than %1$d vCPUs require extended interr= upt mode enabled on the iommu device"), QEMU_MAX_VCPUS_WITHOUT_EIM); @@ -5225,6 +5230,21 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMM= UDef *iommu, } break; =20 + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3_DEV: + if (!qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%1$s' is only supported with = ARM Virt machines"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: '%1$s' is not supported with t= his QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); --=20 2.43.0 From nobody Sun Dec 14 02:02:12 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 174734150213444.76132334822955; Thu, 15 May 2025 13:38:22 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 1C4C4142F; Thu, 15 May 2025 16:38:21 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B381313CE; Thu, 15 May 2025 16:37:26 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id BF47112ED; Thu, 15 May 2025 16:37:21 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2066.outbound.protection.outlook.com [40.107.236.66]) (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 550B21489 for ; Thu, 15 May 2025 16:37:06 -0400 (EDT) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SJ2PR12MB8135.namprd12.prod.outlook.com (2603:10b6:a03:4f3::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.32; Thu, 15 May 2025 20:37:01 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400%3]) with mapi id 15.20.8722.027; Thu, 15 May 2025 20:37:01 +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=Kkuqcqd3zrn3Y8OCg7i7nh/jVjuFiSlHIodCngybI+egnYPmyEsDAx9IRcMMuuBb5rro9jybnuSO6+dS07E4p8n8/W6djq2aEiDsesU0jYgwKuB9uFeI1ZC4FtBhqjjwprxsFMUf/RAxWJYhf+CPZGjsmsmZS/dlaoP/fYYIodjBTnOXHHNdKBhv/uvIvoAzQwrVcR78T3d2PdwYNgclV+8r7r2UW5Gdc3+QLa0+oQb14yy7Ph2mppsytPxzv2Kfk9upG0OW0m2gNdYFLKvUBa81/OKo9Rx66db8nOnVDSJ0Qi6QxiwzsnASyriPHXaWAPhf6hAcZlmswNzOLR/XGA== 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=pFnlBaevaT35+Pc5EN7v4vLyqgiU6RvmU0xYQNypsx0=; b=QX+bS8KJRcVplI5olAA5ByUw4Ji2laP37Uztu9DsScQFNhT6nKi4V64PhtNeZqclChm+oK33xZJnrFOFsDTZiTAxxIEVNTHdK8V+kuG/FfSGIIpY4yiNqkhMGuHIBH7wODgm4RZ5b2FWyEyxP2ePtoDk5uspN/AJgGAZl2AVgh773PLX66BVHtA41+/BGiJWtr/c+LK2RJhbGn97DhPkHflQbG3nCQ1vC7yfWnMAO7pEtXz155F82AyVc1MGDqxrz7iXPGfbIdQZyoyqqGX6w+hlTdK8ncWMSuV2+VRJm0JLVz1FWd4VjVcRekrQxCVgi9M02wg4al17TwwDknOfJA== 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=pFnlBaevaT35+Pc5EN7v4vLyqgiU6RvmU0xYQNypsx0=; b=UiizYWjHjZlxP9RWvUbklNMO40CZC5n0GV5KiU9E3eqYRoSfEjTAGeeaKhXpq3Hq3tTd0qxVawGaLF4igC3gG3FTuyJOFRK9x9cOGXqBTcZAKEOYT4xs43uWwGqtrIiv3qRjF2v2kLfwV0fkyb6+GFH5R7f+mZfuR8MgmQh/xlgnp47+nnz/s1gLMB3Eh959nh3orasEGGtFej6lZ+q2uaCsIIgKFVrHuRG/NAiGv3TRrQpp3fZnvIYtgUFRhsBmaPiLNLkPVJX5ajmxPy/Uj7GsMw93lu9mTUCcyqdgr3O+BdSXmBnyroEoNiCgln7r2DMw9qHj4+lGX+iFdlZ6Gg== 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 2/5] conf: Add an iommufd member struct to virDomainIOMMUDef Date: Thu, 15 May 2025 13:36:40 -0700 Message-ID: <20250515203643.21109-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250515203643.21109-1-nathanc@nvidia.com> References: <20250515203643.21109-1-nathanc@nvidia.com> X-ClientProxiedBy: SJ0P220CA0025.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::16) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SJ2PR12MB8135:EE_ X-MS-Office365-Filtering-Correlation-Id: 7000a825-5c15-462b-b94f-08dd93f03f0d 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?QhjCfMf/eU7CeF0I07AbnN2vaHq3mX3NlwsFwjBikG4R8lpXIrwcRF9xR6c8?= =?us-ascii?Q?UnnJzzaeF2eKinXGhkDeGllRgonuVLQyjReWt1GthNUws80HF6r3THRQZMb1?= =?us-ascii?Q?6SUKmFM/hMNCUcufR+XOMRoSukyI54kGk6WC9PfT4k0pr3YPyktCS68keK7P?= =?us-ascii?Q?N/toimbSV2wpRTx+RKeyMruZkcRaHYaGqNF+ZHrU6Aeu8kxr4zDKLcXBWjXE?= =?us-ascii?Q?m0J0SEfvQ2cdc4aO4acHeYwn1NJMyPkLc5IB2c00Om7BppR6UdUT7fmZuaU8?= =?us-ascii?Q?kZIRwh+w3lkQyOpR1pVG86AyahRiu7OjSrF3ta5kBVETywYftOj4bHwzP97L?= =?us-ascii?Q?YjZ763PQxjSlx632eIj9nJ9gGXWgxbxwXVKmJku+dWvDuxcJBWkGcdUb2XGE?= =?us-ascii?Q?dkeXj/tPZeelIBooQuEO+RXi+eGagkk57AWyPOTgndFQSUdXFxV+JG6d948/?= =?us-ascii?Q?Kp7zL1SsT+epuWJaE2owG+I78WPkHY7wEppsJyeY6RpiGnrF6vpp/JoDx9RN?= =?us-ascii?Q?m/qEscmEg7Dh+4fluzT93tuU8mwm8NaafctFwrFW4HU0/SBqRGjxG0mHDNlf?= =?us-ascii?Q?juou5wGntRANXoUtt60FvTtumqmNAG96xm1CTMmFwVrGyvhraJvUSKTtGxL5?= =?us-ascii?Q?oZwjWChZVP/kd6BSqNXGbynEw/Lk9MW36mAwHSOKGrm25NVPaMaHqjGiO3JZ?= =?us-ascii?Q?CfGQzswEhMurK2oN42jXjZlfBkw2+Hj8FTdpzCmS9XIfxo8HObmnsHBXou5C?= =?us-ascii?Q?zjLiPezht+kTfB/hGCESn1X2SlNhnbww7oIkzYo1V0zHMWl+ucUURW3OHe/u?= =?us-ascii?Q?mqdxcia17HRtmX/xxdOBWnOJoun4xNpnvAjiQ1qHehNRCU2B8Cp9S2BbX3KG?= =?us-ascii?Q?zuAK+FcFSlYt85bpxGlHziQs5v9Q9+P4sHYEJjSMA9sAydnFDeix20G+pE9M?= =?us-ascii?Q?EXaAzqXJLBf/V6qVQNYWJT2zEMNXJaTeeM71izQDFLR9Jz+3PaQnub4mxuZ5?= =?us-ascii?Q?F+6j/JOeI9UULqKHpS7bKFgAmvrPE935mSjylF73gXt+C07JV0AQ4Jc/rXJI?= =?us-ascii?Q?ZH/4HJ1n+wiSVuAV4T3Ti5Ui2wik8FP4b+Oj4s+ZN6IHpya1YlMuk6+9EqBo?= =?us-ascii?Q?GGAa8f6RsiSNZ3oxGCV4UKHXCNmWpeHPGqJ6iqOPuttaxKxFYUmgmZBCd+jv?= =?us-ascii?Q?qMdUN5r+wGcjsyoeyvNmS1PqN6MG/GCpbhhs5msppuCT58Uuo2+0s/6OW6iy?= =?us-ascii?Q?RlwsXq2UhqcgsEVVFpzLEgBCzOl4o99d+3KyoRQQvAnCtOXfX7IrbQAMo/QT?= =?us-ascii?Q?XE414qp74wY9rOTb1wzLdRcEifhWHPaGkghdowYTqDsCa0114aOO3E4fXVqq?= =?us-ascii?Q?JAmLFgxB0Oj8MzHwBfNArtihKCgR97i20oWXPZ6LQYtyeBVX7EJF60Ck1Irr?= =?us-ascii?Q?SxKnDlH2Mz8=3D?= 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: =?us-ascii?Q?Epmuo/yUlf6sMlt82CuF4wUXHBntMVyvdxwycgekdg7nQ2LdaCXxF0x9Iumb?= =?us-ascii?Q?OzLUVPQRYdrurKqpxW8P41IokfgjgcGHKuCMGP9RKx4TkNhAByDJlCEd4LNV?= =?us-ascii?Q?EZPqJwtuURBFABPNdFqp57LJEOiiNBrc2a2YABhJcVBuNxSQAdW+S6HqCbo9?= =?us-ascii?Q?kzPID9C6wcG2KE7hp55F9hjXDAf14H5iAXdfHg7bLUmBGnjHYUfL3P6pV9Cj?= =?us-ascii?Q?3vIHnYltylmb+u3C9iATPMmztf8+WfSZZTaNwLCVIT/iZpxmoqsR8Vu6tuA/?= =?us-ascii?Q?isi+qXDc4RxILoJM2IV8z+fMK438N2nFOKmjbnfGFQJEpMwSRk1mj6+Dvg9/?= =?us-ascii?Q?0LkybWAxVtC/MxkGad/iowLHOi2vmnAeL5wcg67zQQAh9l3aZOvc+BPDltjH?= =?us-ascii?Q?Fy/ic7uwNzTfQ343gBHACJ2XDLG7y0EwIq/xIpc4bvyO68d+svkftGnL7kV9?= =?us-ascii?Q?8Ue9POMH7L6++qPMI7oEAUKTFCk6PK0yn4TzuQy9afd2sInTkGIYdpoQ3Yck?= =?us-ascii?Q?tQ+CwNOn+cNo3Rkpeq3bopYQCyoFzGvK7NeBKpc7dftQMW/KuXvWzIzdQivw?= =?us-ascii?Q?KPG2Zvb5qYWPNglddPcMEpcucH0bBSAb213WI88shwyFQK2C4Cs8Rem4iJCJ?= =?us-ascii?Q?0LLD4ReR3Didh5kMOSHN1lbIa650PqbHpbIPx7RYXxFNdbGdxsaGEqBntpo2?= =?us-ascii?Q?HHvSnXdXt7ddQn75sZijKDFxjNr2ozqb91z032siyc6Yj4+tNGFxMXlstXkh?= =?us-ascii?Q?GmMlZlQU8jxZu0jZjigYKWo5CVdgsa4amMdVqTnARHKNe53andcz2lt7VRuC?= =?us-ascii?Q?Bu3U2HGykuEcGuyBrQVXCoiaGsCrQCDFBDI3MJyzl6A4FPSBZTB1OISGuYOd?= =?us-ascii?Q?/ya31qBn+Br8iISJBMW2W+qyfuFm7/eU24R8n1GLTTONMHZScwaKZRpCVUST?= =?us-ascii?Q?Wd0vwDJ9+/K68GK3+Qd2MFXGoGcUGY019PLw/myvgOHHrhPUWkX2tym9l7eS?= =?us-ascii?Q?G0J5R1K389i3shXNTeKLBC2PSchkfHpTes6rjHI5IQG6M5dKYNAIswKwzB6I?= =?us-ascii?Q?t5LYGa1eb0wVk/6sZija5FKZJ5gRTN1nqGPawQ+o0E6vekJdEsnaWROM8HZ9?= =?us-ascii?Q?/+7wNPNEtfyLblGXpDF0R8rNngYzj4YaNZCby/6IolFVeZgdcOL634yVGTLV?= =?us-ascii?Q?dOL1iylDMz93RF0BF7EY6VJYf18UI4IKIbboMh3pmoMhgAQSM3EKRwisbrK4?= =?us-ascii?Q?TMhtJiYUcNbVttr4lcHUUhyalM476f5bR2qadFP/thDD+d+8SIjt7NEMxMNl?= =?us-ascii?Q?pDe0TOXnHlhlO066STj8Rh+JsGlYZ1kQ64vlAk0QN5e3Edna+t28/f2LHbX/?= =?us-ascii?Q?eFk7j4JENwHSqBPobgramPhr4KR7hW8uKe9ltgF+y8zQhx3pVJlI5hPoL3Pb?= =?us-ascii?Q?A5B8lsSufaLeNv4IdpJMn0c5AQY3gh87Cf8gGPt25wgK57a5XdnFmZXHP3kg?= =?us-ascii?Q?p+1+cXDC6i/B6v5FMGV15YIMLyHF2trrqT/wx/VeKTsXKq2TGwKfHUoMZbN9?= =?us-ascii?Q?vvcxuC/Eoub+2OghAUBJIQhlaPJXdplQaLXxZYJ7?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7000a825-5c15-462b-b94f-08dd93f03f0d X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2025 20:37:01.7297 (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: RhaozQzPtByhglth62wiSvHLUwUlXKS5km0aBIPh8NUTAzKOg7sVPc4/E8f42xr6L1LEsUjrfOBNqqaYAKcbLw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8135 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 24B5RO7G5CSLWLEKODN54VRLCSWDXBME X-Message-ID-Hash: 24B5RO7G5CSLWLEKODN54VRLCSWDXBME 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, Nathan Chen 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: 1747341503556116600 Content-Type: text/plain; charset="utf-8" Add support for an "iommufd" virDomainIOMMUDef member that will be translated to a qemu "-object iommufd" command line argument. This iommufd struct has an "id" member to specify the iommufd object id that can be associated with a passthrough device, and an "fd" member to specify the fd for externally opening the /dev/iommu and VFIO cdev by a management layer. Signed-off-by: Nathan Chen --- src/conf/domain_conf.c | 108 +++++++++++++++++++++++++++++- src/conf/domain_conf.h | 8 +++ src/conf/domain_validate.c | 44 +++++++++++- src/conf/schemas/domaincommon.rng | 14 ++++ src/conf/virconftypes.h | 2 + src/qemu/qemu_command.c | 13 ++++ 6 files changed, 186 insertions(+), 3 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c8d481eb5c..9330c47b7a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2814,6 +2814,9 @@ virDomainIOMMUDefFree(virDomainIOMMUDef *iommu) if (!iommu) return; =20 + if (iommu->iommufd) + virDomainIommufdDefFree(iommu->iommufd); + virDomainDeviceInfoClear(&iommu->info); g_free(iommu); } @@ -14292,6 +14295,54 @@ virDomainMemoryDefParseXML(virDomainXMLOption *xml= opt, } =20 =20 +void virDomainIommufdDefFree(virDomainIommufdDef *def) +{ + if (!def) + return; + + g_free(def->id); + + g_free(def->fd); + + g_free(def); +} + + +static virDomainIommufdDef * +virDomainIommufdParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt) +{ + virDomainIommufdDef *def; + g_autofree char *iommufdId =3D NULL; + g_autofree char *iommufdFd =3D NULL; + VIR_XPATH_NODE_AUTORESTORE(ctxt) + + ctxt->node =3D node; + + def =3D g_new0(virDomainIommufdDef, 1); + + if (!(iommufdId =3D virXPathString("string(./id)", ctxt))) + goto error; + + def->id =3D g_strdup(iommufdId); + + iommufdFd =3D virXPathString("string(./fd)", ctxt); + + def->fd =3D g_strdup(iommufdFd); + + if (!def->id) + goto error; + + if (iommufdFd && !def->fd) + goto error; + + return def; + error: + virDomainIommufdDefFree(def); + return NULL; +} + + static virDomainIOMMUDef * virDomainIOMMUDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr node, @@ -14299,7 +14350,7 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlop= t, unsigned int flags) { VIR_XPATH_NODE_AUTORESTORE(ctxt) - xmlNodePtr driver; + xmlNodePtr driver, iommufd; g_autoptr(virDomainIOMMUDef) iommu =3D NULL; =20 ctxt->node =3D node; @@ -14336,6 +14387,11 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, return NULL; } =20 + if ((iommufd =3D virXPathNode("./iommufd", ctxt))) { + if (!(iommu->iommufd =3D virDomainIommufdParseXML(iommufd, ctxt))) + return NULL; + } + if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &iommu->info, flags) < 0) return NULL; @@ -16384,6 +16440,25 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, a->dma_translation !=3D b->dma_translation) return false; =20 + if (a->iommufd && b->iommufd) { + if (a->iommufd->id && b->iommufd->id) { + if (STRNEQ(a->iommufd->id, b->iommufd->id)) + return false; + } else if ((a->iommufd->id && !b->iommufd->id) || + (!a->iommufd->id && b->iommufd->id)) { + return false; + } + if (a->iommufd->fd && b->iommufd->fd) { + if (STRNEQ(a->iommufd->fd, b->iommufd->fd)) + return false; + } else if ((a->iommufd->fd && !b->iommufd->fd) || + (!a->iommufd->fd && b->iommufd->fd)) { + return false; + } + } else { + return false; + } + switch (a->info.type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: if (a->info.addr.pci.domain !=3D b->info.addr.pci.domain || @@ -22078,6 +22153,27 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= ef *src, virTristateSwitchTypeToString(src->dma_translation)= ); return false; } + if (src->iommufd && dst->iommufd) { + if (STRNEQ(src->iommufd->id, dst->iommufd->id)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device iommufd id '%1$s'= does not match source '%2$s'"), + dst->iommufd->id, + src->iommufd->id); + return false; + } + if (STRNEQ(src->iommufd->fd, dst->iommufd->fd)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device iommufd fd '%1$s'= does not match source '%2$s'"), + dst->iommufd->fd, + src->iommufd->fd); + return false; + } + } else if ((src->iommufd && !dst->iommufd) || + (!src->iommufd && dst->iommufd)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Target domain IOMMU device iommufd does not matc= h source")); + return false; + } =20 return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info); } @@ -28310,6 +28406,16 @@ virDomainIOMMUDefFormat(virBuffer *buf, =20 virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); =20 + if (iommu->iommufd) { + virBufferAddLit(&childBuf, "\n"); + virBufferAdjustIndent(&childBuf, 2); + virBufferAsprintf(&childBuf, "%s\n", iommu->iommufd->id); + if (iommu->iommufd->fd) + virBufferAsprintf(&childBuf, "%s\n", iommu->iommufd->= fd); + virBufferAdjustIndent(&childBuf, -2); + virBufferAddLit(&childBuf, "\n"); + } + virDomainDeviceInfoFormat(&childBuf, &iommu->info, 0); =20 virBufferAsprintf(&attrBuf, " model=3D'%s'", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 75568ff50a..ce447e9823 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3010,6 +3010,11 @@ typedef enum { VIR_DOMAIN_IOMMU_MODEL_LAST } virDomainIOMMUModel; =20 +struct _virDomainIommufdDef { + char *id; + char *fd; +}; + struct _virDomainIOMMUDef { virDomainIOMMUModel model; virTristateSwitch intremap; @@ -3017,6 +3022,8 @@ struct _virDomainIOMMUDef { virTristateSwitch eim; virTristateSwitch iotlb; unsigned int aw_bits; + virDomainIommufdDef *iommufd; + virDomainDeviceInfo info; virTristateSwitch dma_translation; }; @@ -3747,6 +3754,7 @@ virDomainVideoDef *virDomainVideoDefNew(virDomainXMLO= ption *xmlopt); void virDomainVideoDefFree(virDomainVideoDef *def); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainVideoDef, virDomainVideoDefFree); void virDomainVideoDefClear(virDomainVideoDef *def); +void virDomainIommufdDefFree(virDomainIommufdDef *def); virDomainHostdevDef *virDomainHostdevDefNew(void); void virDomainHostdevDefFree(virDomainHostdevDef *def); void virDomainHubDefFree(virDomainHubDef *def); diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 4861b1c002..88649ba0b9 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1838,9 +1838,9 @@ virDomainDefCputuneValidate(const virDomainDef *def) static int virDomainDefIOMMUValidate(const virDomainDef *def) { - size_t i; + size_t i, j; =20 - if (!def->iommu) + if (!def->iommu || def->niommus =3D=3D 0) return 0; =20 for (i =3D 0; i < def->niommus; i++) { @@ -1851,6 +1851,39 @@ virDomainDefIOMMUValidate(const virDomainDef *def) _("IOMMU model smmuv3Dev must be specified for = multiple IOMMU definitions")); } =20 + for (j =3D i + 1; j < def->niommus; j++) { + if (virDomainIOMMUDefEquals(iommu, + def->iommu[j])) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("IOMMU already exists in the domain confi= guration")); + return -1; + } + + if (iommu->iommufd && def->iommu[j]->iommufd) { + if (iommu->iommufd->id && def->iommu[j]->iommufd->id) { + if (STRNEQ(iommu->iommufd->id, def->iommu[j]->iommufd-= >id)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("iommufd ID must be the same for = multiple IOMMUs")); + return -1; + } + } else { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("iommufd ID must be specified")); + } + if (iommu->iommufd->fd && def->iommu[j]->iommufd->fd && + STRNEQ(iommu->iommufd->fd, def->iommu[j]->iommufd->fd)= ) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("iommufd FD must be the same for mult= iple IOMMUs")); + return -1; + } + } else if ((iommu->iommufd && !def->iommu[j]->iommufd) || + (!iommu->iommufd && def->iommu[j]->iommufd)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("The same iommufd configuration must be s= pecified for multiple IOMMUs")); + return -1; + } + } + if (iommu->intremap =3D=3D VIR_TRISTATE_SWITCH_ON && def->features[VIR_DOMAIN_FEATURE_IOAPIC] !=3D VIR_DOMAIN_IOAPI= C_QEMU) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -3115,6 +3148,13 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *i= ommu) break; } =20 + if (iommu->iommufd) { + if (!iommu->iommufd->id) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("iommufd must have an associated id")); + return -1; + } + } return 0; } =20 diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 8d1768b24f..41db338c71 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6231,6 +6231,20 @@ + + + + + + + + + + + + + + diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index c70437bc05..47392154a4 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -142,6 +142,8 @@ typedef struct _virDomainHubDef virDomainHubDef; =20 typedef struct _virDomainHugePage virDomainHugePage; =20 +typedef struct _virDomainIommufdDef virDomainIommufdDef; + typedef struct _virDomainIOMMUDef virDomainIOMMUDef; =20 typedef struct _virDomainIOThreadIDDef virDomainIOThreadIDDef; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9deafefaad..d683d0eef7 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6166,6 +6166,19 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, if (!def->iommu || def->niommus <=3D 0) return 0; =20 + if (def->iommu[0]->iommufd) { + if (qemuMonitorCreateObjectProps(&props, "iommufd", + def->iommu[0]->iommufd->id, + "S:fd", def->iommu[0]->iommufd->f= d, + NULL) < 0) + return -1; + + if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) + return -1; + } + + props =3D NULL; + for (i =3D 0; i < def->niommus; i++) { virDomainIOMMUDef *iommu =3D def->iommu[i]; switch (iommu->model) { --=20 2.43.0 From nobody Sun Dec 14 02:02:12 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 1747341540689418.89820374088856; Thu, 15 May 2025 13:39:00 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id AE3711474; Thu, 15 May 2025 16:38:59 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 4E1C214EF; Thu, 15 May 2025 16:37:31 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C377913B4; Thu, 15 May 2025 16:37:22 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2066.outbound.protection.outlook.com [40.107.236.66]) (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 CBC70148C for ; Thu, 15 May 2025 16:37:06 -0400 (EDT) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SJ2PR12MB8135.namprd12.prod.outlook.com (2603:10b6:a03:4f3::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.32; Thu, 15 May 2025 20:37:03 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400%3]) with mapi id 15.20.8722.027; Thu, 15 May 2025 20:37:03 +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=qDsyXP2X5xgFeVXGfEjZcn9mbikRowWW9DeBa84718mq4DuMxOBbqlqIJxpsEJ3zI0DihxQs5LXXjv1zm8vodSvQfnDlL20GVeHMT89uu5ZlwRRdSYV2Qjjtbb2T4O8E7PKnmPMRZPQJTRAGPzQzCofekR2uLDvEPNtG/pUrDORnWzWP3RDHpyVTXjUinC7PWBMQqKTfZK9yxhyOH9cMz8i4vV1/PaB8ZBJeOFDZbA2L16vME8ipjptfKfaqePLM6n5glIRkXWymRSGhqwmuab8VTbGI125RmR6aSDlSVX/j6fiGWovGsUX809uaqUyl51abykUG1dtyhk0UN0q21w== 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=tHSKHaQQB2U2vRBEbnH1KZB/J0ildrx8SmWYgjFcQpQ=; b=JrkX9SNr6fVwdVz5H3QU03DONMeAkWeNRlbFb7ASHxQSLYk7geYJkFuCloGp2dIQHJ6ARw/P7Nsj4JBGYiPvg+mp1pqtnbKMiv4q1noKJOTfxMDZ6YH9uz+Agw63olC+wUcP1CzrfV98iWy8VkVoBFnzqIOkyk6jnqgOr9V5mZeYYOhAnW6JQfKlkNWlxEPAw0u3RU8AcaccDNxAs9OzxLSZzl+2s3AF1iY94vUXlng/rUn8KQQ2fExLD+/k/3xY1tSoClpRKrWgbT2s29ZhxJAq5/6ABgWIhKqXGCsEDrG1kaYJcF7TYXPMPCKs9PI5iOo4BsrCPHfBLZofxhQP1A== 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=tHSKHaQQB2U2vRBEbnH1KZB/J0ildrx8SmWYgjFcQpQ=; b=TzMs/RtZyaibAU0S87I+hPnHW4K1PiNXPyqPN48Qq2XpPteOGxNIbHk5Yzo5iz6PYs2XbH4igE8IdjqukNuMfJaF84uNRNl2/bOmXbcyRvzgNSIQWX5izcBD7WxTUeql69CnzeJYAc0oIZci3vVaE4z6bMW8jEXVKIDucjUvcJlRi4JiAngjJR3hEyRrGWVgPf7OcMZ3gFkNy0YCkcAp5I8Mj2cPfIaVvWpsGMfLfUqOBF/BfelTMc5imuLYLATriolNhv4u23zuDukaS72EgMgUfvphwx2E9PO7+o/+O5l8FTMdTYPh//+25W4wZOhKXuswlsnkG3LwQAEzjbr1cA== 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, 15 May 2025 13:36:41 -0700 Message-ID: <20250515203643.21109-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250515203643.21109-1-nathanc@nvidia.com> References: <20250515203643.21109-1-nathanc@nvidia.com> X-ClientProxiedBy: SJ0P220CA0029.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::13) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SJ2PR12MB8135:EE_ X-MS-Office365-Filtering-Correlation-Id: d8409fd3-7af6-4d30-67c1-08dd93f04021 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?DP152ReOtWjjVY1IiArDI/Pa4NbFVGLcQbwf6T/G5Lf8JD6hlM689xz8BWu+?= =?us-ascii?Q?BLHPm+XlcF8wU4IfIPh9GwAO2oNTHUZsWvHu3SG7+0uoIK1/eLJqHcN1Zb/k?= =?us-ascii?Q?3UDXZ5LIPWzAi/zgUh5TgJy/Iif3vIhvWQ+trRCK3FUxRoJq03LQwKtLaKJI?= =?us-ascii?Q?WrSoqJv4DCgoOlhmLJKyUc/dk6odQLeWmFqYdKsMt121tPozSs4j5X3Wh/pC?= =?us-ascii?Q?Sa+riYcTY+3PUhN7A0aWCfpmql0RP7P5CKQYhuxo3gp25rwpFBIVMSaUuafp?= =?us-ascii?Q?YCp/7Rre0brhhVTtPqIagOemU2YTNAEO6J9s2BNa5GYuwS/WlYu5BNYN9cRi?= =?us-ascii?Q?UBURvFpv3xg0+de0bM/Ovx2U9eAoPBW/ea3qRjfptkml2d10g2pQxo4jOFhF?= =?us-ascii?Q?f4bxSM3HSy9l0RajCJzTD4eJR1coMp5dfuzJQswIvTqbVin+OEPumueEy+1J?= =?us-ascii?Q?kKhoGY9Y/89/CtWOPUJKdzs2MqRnvugi9hWBX0ckNAH8Lh3PGkBJlA30RV4q?= =?us-ascii?Q?S3fwO+m/akcJfmzKCV4zRpdKn+EcgWJxipQkbc8Ylll8OsyEqL589HB+ifIN?= =?us-ascii?Q?dmYr+7JB0/3CAhwU+varYEzAU8fC4wW/nSsUAEdLV4zS9tyUvmUrfRMKfiF8?= =?us-ascii?Q?ZrXkMjzLkHUSYgGq5hZIwUuGjkYiLCQAe9Kr2O3wB6ghUtJlEHIC7FIZ+QSq?= =?us-ascii?Q?1ePvG/4Joegwi8SlCR6GpqbbWPdetIVZLykoeFDv+mJjiW47VJfr8fBAB9Pb?= =?us-ascii?Q?f7hefMwaXOeqd3lONQAVpmPKfLIlesy8M1p67wR/c1vpkXnqcozPzs3DdD5h?= =?us-ascii?Q?67pgt4GGcww+LpxufVIP4kuXqqspLru4jMgWT7TiV+RlZAk8zoJgvhQjSNro?= =?us-ascii?Q?cZcaEOvaXbTt05EICo6pkKtpsVEee/9wpnQBpZPi895FEIZ4ww8ulGgyUpTK?= =?us-ascii?Q?X4Qs5+kNMRL/Aa97sagihTnv4geP2qWvz3pBOXZYhyvMP4EOXmBl3pWxiQIU?= =?us-ascii?Q?WmUfXfVLgMKqOxCEFEZ3D/HHHZClaNYpIm/eYeum9/1DJJqL4oa2VDEzXlPn?= =?us-ascii?Q?BsJAl7fGVZ77uXwibVABsBGy5EDc8NRSBS7xYXmVJSiJ1m2O7V1SlQ6zjfhR?= =?us-ascii?Q?yibPQ+WyKap5j2FR4dvbjJOfJ5/1KpnyI/emqIEuEqrUKtsF1sXOQh582Co6?= =?us-ascii?Q?6sxhyXC2YbT1pbmAYuvqxc9Fn1zAguSDeSmJIMYjmEGZFyIQxwomX6arfqkt?= =?us-ascii?Q?thMULO9kQaKixPfgCLlrJogp/b5iezZfmOX17wKEyGqdHQv/HRhS/dxmmghZ?= =?us-ascii?Q?hfpe26TIrBRkZAL3ComLM6q9voMGZ0gT+19sU8SQsfscbVn2Yfz8fynS9/1V?= =?us-ascii?Q?LcLD6MZo4NFrJ0Sj8cbvGhAAn4tYluapJDErSqNhlA/IKTapxQ=3D=3D?= 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: =?us-ascii?Q?IJLC11PB8uLF0eKJobqC7b5J/DtqKr4tiBNVOSZT1MRM6pm6t2G5tnj2KaGs?= =?us-ascii?Q?508wvEoxVtlTcsdbF9GVl/ab4BvbrRzseil4WPsiWuAv3DRCvSfXbVGwxwhc?= =?us-ascii?Q?LFpHtUGB53you/jTO7d0m1fZuxb6XdqebUnX9TFOmcwq9tJxyHuy9iTdNyDC?= =?us-ascii?Q?XR2SN0l3PbpQgvOi7fNkastMY2N0jTnGXaOjmuJMDvva8QhJWmFThrz46Xpf?= =?us-ascii?Q?iBIcGk76FWyDs/FBV7eDFjFZJcbfiQAAwMeW1fkQ9e9L69BG0AIDepN0dtGN?= =?us-ascii?Q?MU5HS2/Ovp83sQMF2UgCwOYiJuw/lEW5+lxenIuaI+Of5G+pKFW1fbp42FET?= =?us-ascii?Q?JacxVZ/xDwNq3ZRWKqpaEwuW/Z/CxVQtt5XTQDTQXJgoq/WKx3ytscbOn9WP?= =?us-ascii?Q?dXWK2rtf4ZsUZXXzx523sra82jfcvHNW2RRBQuXC6mTN1ZoU8h1ZXwPkH9Kz?= =?us-ascii?Q?hvll+QU+31WImqZ2a0qiuB+k65A1w43Qfh134gAOkmp/iaZgqptXLhlauSjj?= =?us-ascii?Q?E+v1J6/0gypp2i5jYs4416LHdVWp9Y0g+PJzSeCrNCc8Fcq1iVFFOTZBgQ9p?= =?us-ascii?Q?J/ugJ96EYrrL9DhEDl9108zmhaQFYd7IiCxLNwkZqYdVQd/HlAWBKbnlHtpg?= =?us-ascii?Q?rmldIqm0xw0DHUYa5/bFdhZuD5pvpjCcpfMNys98kJGanbV1w2BU+PkUSfN8?= =?us-ascii?Q?SoYs+XYL2vy8ICQf3CcdotFWpaVpr8mJDVqDitiWODNq3OPyoDeG5/2QWnAf?= =?us-ascii?Q?XujFFggeMlVtUZWtpqLT70NCyRi5ww+fYEzX3djDP3o0pLkxKdzoj1TpbpcX?= =?us-ascii?Q?iA/LJj/OpXT7dqRJV38Eq73hdHGRsxKUK9dD/Jv5+nXA/LCuFqWqj4G2UThj?= =?us-ascii?Q?xeNNiJwtQwkkU2UnmaD+UIyBO1biSZspUHci/z8LdRlTlU8HQyZRGGUc5lsi?= =?us-ascii?Q?ftMRLUxnC+xHc/Nhr/r3GUKYP56b8gDiHCyq6p5jajlSqrYW3f8O22nYLN19?= =?us-ascii?Q?22XtfAr3Utpw/pLVmSV9ge096XxdBAm4Co+KDfILRfOOGl+7y6hWrtmjkCeg?= =?us-ascii?Q?w2ojZmlwK1D74ga0Z9I/JTMgg2k9TtXU3NB6DQB+DjAiNnFROPO0fPqlHhqo?= =?us-ascii?Q?HrW8uMRnMxkIWoRzpNtNFXFG7Pg/N29VeI5zNj9+HvTH7306DZ5oVU6gaWvb?= =?us-ascii?Q?ubJ12jr27iyE1o3DEWu83lwDFAItWvzAa0YYfdozbZLYEkAph2cYAbNhE6L3?= =?us-ascii?Q?TjjkIds/e8uJ4/0p65ZLBmn2ibc1zjHRXjdzsN8/Xr/D0mEk+b1BGoV0TvcA?= =?us-ascii?Q?QqViBKsyIcdi9yPNOCLujczCasLsnZ2/lvbFjyzhBfZySO5xfWQP7uuEyCwv?= =?us-ascii?Q?kOyDOEmgWMMl6pXyew1P7zmhLr74v9EP9qYA16NT5I3OTjRo+ph80skkFzA9?= =?us-ascii?Q?jONOOAVvvd5FZ3Wq1s+Ko1y/th6vb1yyhGDuLdcH+1NqJK8hCcwZzQQ04C/v?= =?us-ascii?Q?sLi3JRKdildfF1UT5N4YlpaRWuy3lTtK++Z50Fu1948SQTjiZhwRPZY2XkLX?= =?us-ascii?Q?ge8tMgcpXx2+FDOqtZkfrQ8mkJoCk+4VIF8mHIyg?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d8409fd3-7af6-4d30-67c1-08dd93f04021 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2025 20:37:03.4841 (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: iBiMSmxxjq2IRJVuZkDe0ncTNTOND0eE43tW3cfUWjTKoeaqHl1dfxI4NccxU9s/TROoTrhnvbXUuzCR2Lz6gw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8135 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: W3CIKMETBCBWAMH2FUWJE7KAX6HSAGMS X-Message-ID-Hash: W3CIKMETBCBWAMH2FUWJE7KAX6HSAGMS 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, Nathan Chen 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: 1747341541397116600 Content-Type: text/plain; charset="utf-8" Implement "iommufdId" and "iommufdFd" attributes for "hostdev" devices that can be used to specify associated iommufd object and fd for externally open= ing the /dev/iommu and VFIO cdev, when launching a qemu VM. Signed-off-by: Nathan Chen --- src/conf/domain_conf.c | 31 +++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/conf/domain_validate.c | 14 ++++++++++++++ src/conf/schemas/domaincommon.rng | 17 +++++++++++++++++ src/qemu/qemu_command.c | 2 ++ 5 files changed, 66 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9330c47b7a..47b7e9acb1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13582,6 +13582,19 @@ virDomainVideoDefParseXML(virDomainXMLOption *xmlo= pt, return g_steal_pointer(&def); } =20 +static void +virDomainHostdevDefIommufdParseXML(xmlXPathContextPtr ctxt, + char** iommufdId, + char** iommufdFd) +{ + g_autofree char *iommufdIdtmp =3D virXPathString("string(./iommufdId)"= , ctxt); + g_autofree char *iommufdFdtmp =3D virXPathString("string(./iommufdFd)"= , ctxt); + if (iommufdIdtmp) + *iommufdId =3D g_steal_pointer(&iommufdIdtmp); + if (iommufdFdtmp) + *iommufdFd =3D g_steal_pointer(&iommufdFdtmp); +} + static virDomainHostdevDef * virDomainHostdevDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr node, @@ -13656,6 +13669,8 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xml= opt, if (virDomainNetTeamingInfoParseXML(ctxt, &def->teaming) < 0) goto error; =20 + virDomainHostdevDefIommufdParseXML(ctxt, &def->iommufdId, &def->iommuf= dFd); + return def; =20 error: @@ -21193,6 +21208,16 @@ virDomainHostdevDefCheckABIStability(virDomainHost= devDef *src, } } =20 + if (src->iommufdId && dst->iommufdId) { + if (STRNEQ(src->iommufdId, dst->iommufdId)) + return false; + } + + if (src->iommufdFd && dst->iommufdFd) { + if (STRNEQ(src->iommufdFd, dst->iommufdFd)) + return false; + } + if (!virDomainDeviceInfoCheckABIStability(src->info, dst->info)) return false; =20 @@ -27511,6 +27536,12 @@ virDomainHostdevDefFormat(virBuffer *buf, if (def->shareable) virBufferAddLit(buf, "\n"); =20 + if (def->iommufdId) { + virBufferAsprintf(buf, "%s\n", def->iommufd= Id); + if (def->iommufdFd) + virBufferAsprintf(buf, "%s\n", def->iom= mufdFd); + } + 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 ce447e9823..78507d78b7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -375,6 +375,8 @@ struct _virDomainHostdevDef { virDomainHostdevCaps caps; } source; virDomainNetTeamingInfo *teaming; + char *iommufdId; + char *iommufdFd; virDomainDeviceInfo *info; /* Guest address */ }; =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 88649ba0b9..292398b115 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1401,6 +1401,20 @@ virDomainDefHostdevValidate(const virDomainDef *def) ramfbEnabled =3D true; } } + + /* Check for unsupported conditions: + * - A hostdev's iommufd fd number is defined but its iommufd id + * number is not + * - An iommu device is defined, iommufd is not defined, + * but a hostdev's iommufd id or fd are defined */ + if ((!dev->iommufdId && dev->iommufdFd) || + (def->iommu && def->niommus > 0 && + !def->iommu[0]->iommufd && + (dev->iommufdId || dev->iommufdFd))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unsupported hostdev iommufd configuration")); + return -1; + } } =20 return 0; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 41db338c71..6c1f901eb4 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6442,6 +6442,12 @@ + + + + + + @@ -7809,6 +7815,17 @@ =20 + + + + + + + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d683d0eef7..3a8b71a00a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4724,6 +4724,8 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def, "S:failover_pair_id", failover_pair_id, "S:display", qemuOnOffAuto(pcisrc->display), "B:ramfb", ramfb, + "S:iommufd", dev->iommufdId, + "S:fd", dev->iommufdFd, NULL) < 0) return NULL; =20 --=20 2.43.0 From nobody Sun Dec 14 02:02:12 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 1747341649917181.38437750430694; Thu, 15 May 2025 13:40:49 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id DED6E146D; Thu, 15 May 2025 16:40:48 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 2741B140C; Thu, 15 May 2025 16:37:37 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id B8B1A12ED; Thu, 15 May 2025 16:37:23 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2052.outbound.protection.outlook.com [40.107.236.52]) (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 8EDB714A9 for ; Thu, 15 May 2025 16:37:07 -0400 (EDT) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SJ2PR12MB8135.namprd12.prod.outlook.com (2603:10b6:a03:4f3::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.32; Thu, 15 May 2025 20:37:05 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400%3]) with mapi id 15.20.8722.027; Thu, 15 May 2025 20:37:05 +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=ZzqmbNHNLl4oEsgnil2PO5hyL3DY1xQ+1lO7otf34xIJobVtijMvjXAuzvayiN7iAAdnne5luw1ksdtpHSjtlT3aSy3AEtlK6JcxLQUiZBNIefXPYPdb5zEtpJkmIc2fEC2TJyfJpmU0b0uj8KQdTEL66jWe7jBBZvPqexswHhie8HXvfRL8Q2Wga0Ey1nDmyicC0DPjPA+MOw2cGFmD7ZLVNi4XevPi4utwCeJPyNuORXx0VjXV9VUKTBuqE8e5nb4Sd/v4YSXJ4LsF8vm2VhRVrzFGmLVqQ0/gLOT+XUUfVGOPlqnq198++dQLUjvHWqGM00pmHJmhWR/NRe/D5w== 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=Y9SS5T7Hrevpp5wvQ6NifOlG+soeXSEHniQBfJD4Bwc=; b=snCxaMj88y60DBMQTWyCnc/vDWbu/igpP/+k+ULRl7EF9StAYhBDxvSXG9fGLXVZ3VjAWW1ADvdBPra9owqXV0PiNrmTZCR7mbeOn+cS+e/k32jwYm08iOCyU1u5HIhbXb/VntPUlphB4ItNzYYQEs7BXuteW72YouIdjbk1kUOe6ktJwoae0TD8Sk5/eV68+Kt7rYnChFE2IrUVDzITdqpcgufiRzYE4ud08v35gzcvzvST9xxtO59HsfhaHhdY00Y44/FlrM6kwZFBIMC+tBmMKcM+7hx42KHa2B8f/HGoesYqN5W5EFSXtMPYD6W7mZr05OKrM0Sy2b/T9wN5tQ== 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=Y9SS5T7Hrevpp5wvQ6NifOlG+soeXSEHniQBfJD4Bwc=; b=CERvQhctDo/8Kqm0ZPfrbCN0AOr0ucSkfyDWDxOdMr0QjYq+ge41UfjnD1CyY39jNfsThUgPXHOrW1z9pbHsNMmrRQ+nVJUg+hJZ2TY/tTIat9avRYjCdM9qUhizcItPsajOQQA/eJlc+qwKmk45QCzwV+jadgHA2qNr/7yyA8++2rv46v06JMC8qhxD5nA0HQl8HAI8Qp28jD0S4+DzY2MtZuTFzIHa+rjsvDpZyBv4vh0sjLeXPOMMMRroRfhjadVy0HAHkwaDLhW2l5DN0lm+MTEd+y0BLavjdQDHVff2PpjLzJBWN9yiMtEj9RipbyTRfs2Mmg2sooPc1MGxpg== 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 4/5] qemu: Update Cgroup and namespace for qemu to access iommufd paths Date: Thu, 15 May 2025 13:36:42 -0700 Message-ID: <20250515203643.21109-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250515203643.21109-1-nathanc@nvidia.com> References: <20250515203643.21109-1-nathanc@nvidia.com> X-ClientProxiedBy: SJ0PR05CA0065.namprd05.prod.outlook.com (2603:10b6:a03:332::10) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SJ2PR12MB8135:EE_ X-MS-Office365-Filtering-Correlation-Id: 553df518-2e52-4198-3975-08dd93f0412f 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?85VlOnGvd91iHC8Owkunkpyel0POehdI82khVelRW6lIFUjNHC7Pl0yVk+3g?= =?us-ascii?Q?JPkvb9Fn0HAt7EWxuBMk1+2A7qQ+tT1uMtGGDWykzmkA6JeXPqiKByxqACWV?= =?us-ascii?Q?B/TP3jnvHOxyDEpHQp4o/Fx/ILCq6NxwVSN8NvTwPGLlwgVdjkuHQlmu/8iS?= =?us-ascii?Q?1RSGwsEWPa0x+l3UbfVM27yGwj/uJXOu6hi/98Y9Zkdm8R9K0XiL9bScAOkU?= =?us-ascii?Q?fCcLRx0TRNhIVOHTNooqW3pjTGVsBBnFTuaShG/JG0eZAXYYj63qKBkkApsM?= =?us-ascii?Q?78E5LvGwBucEb1K7Sfpk5ATOaZno62XUac98JkmYA0cpA+sertjEAB9VqLiA?= =?us-ascii?Q?7puvzir9klVKcCnhtse/5nqzmYTqTRGXC8CuX1+fgMmXz7+VeKr6Ih1MZMvc?= =?us-ascii?Q?llB+wvnYtk2Rx+YqZegjbR8z+6+/YwTJqoiHGyTz/XVTNwCP0s8tdllGWbt+?= =?us-ascii?Q?2cKkBo86iO66daAKIc718FBwU/OFG6cOeWwg0+gbpM2QLsbPhIBzBYV7VQaP?= =?us-ascii?Q?Setw/MXffaczamqO3pBd38YSKPFUPtHWd454mGfrTmxrWNP7spR4PeNTc6TQ?= =?us-ascii?Q?gI30L0czuEiWT+gqjo94knSTKJzBYs0ybj60sdxCXK8X8My5DFkWPnvHb2Nu?= =?us-ascii?Q?YMMaN8EY+DVPDaGJaTLuM2BWdzqbHSEQLDQkj+xpwR2ze0RqknVrxptPK0nh?= =?us-ascii?Q?ILCYG3BQTnnbm1buoR2nVqF0PwN5Dajk816ftu19lOKuSPF/Muzzqnj2WlL6?= =?us-ascii?Q?dtB1usVJf1QN06JsiDrEcIfRtLZrW8nh6z0wsF/MzIXAJPvxBre30awli/dK?= =?us-ascii?Q?nF0d4RBlY1d/vekD2zTRATBhDWr6Aof1Kpx9Da65PHhcKnOpijX+uTmW6xkI?= =?us-ascii?Q?94pPBkTDqpK04dUE8D+kUr7wlombHcUp0mymY1OOe2yGkuN18/o+/uLahWsk?= =?us-ascii?Q?PrRTCPoxesl3X6TpUjHn8iuoYiTOmIfMnrmOmAtRMQyWIS0YUF9nB4WyAdKn?= =?us-ascii?Q?kD7DNcNg8OVskX6hZf7qJKFzDTvgx9H5BoZGa9zZf0+dDGfTr/UXWUbHgUoG?= =?us-ascii?Q?85fZpcgT1CDCmYnd4wdpyH0eZZJXgVOtkMMaQc8JlGM+rXrM/EVGItNK/DkD?= =?us-ascii?Q?ItuuBn/7KIFa7m6HI2oo9q8MQt4pT7AZg4dinRuRF3YbgAuJFpck5Sqmk+9d?= =?us-ascii?Q?13DObR6HwGc1oJA6Dm9Qyvb4tm1MEdXDjmy26IGrF9LLPUV3J5euV1qeyP5I?= =?us-ascii?Q?EA7g3BBpBFNg2azrkfXQxjKDiyiL6S/NhoVjqMQCatI+foi8ZVnlBiaMx4bf?= =?us-ascii?Q?n089+LNJOlpkBvu3FT9XSVgmcKeEogvSbgHNANeFnQ3Q1rXc89BO5MMHbsDo?= =?us-ascii?Q?U7ypcvxtS5HIkCKqDwhrtgkCIJXsX1dF6oMopAKVDIewuPoSDw=3D=3D?= 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: =?us-ascii?Q?N4mfxJsP6qTgPj3kCkqUM/WiihuDTvjp2DhIPvCRXi/jRNmxKCbYLUveavOu?= =?us-ascii?Q?zXxVpCBmsnteaY1CWx/e9GPgPC3tnTVAcCPkAaxlnZ3e4L1DQ1IHSF/lHTUh?= =?us-ascii?Q?6XSIkDSN9rTDBU+hA8KjyZTdOEdQaEhf9cA2SrC2BucIq9JO43uhk4xvoAGX?= =?us-ascii?Q?KGKTof0OR8+HlOoXebjojEvwfThLDCOs5PczOK4uROyUXAH0TEkr8Cxw4V8+?= =?us-ascii?Q?atlzJtVAFCGv/NZ6uAgO/AM0HYRBqBK3gd5fOAjQ17i9atzjOKpmU25qlOwU?= =?us-ascii?Q?cpJc44NGAtucDfkY53EI1HCR5gdQTzDOqPnVdN0S7jxjilD2CNqCPL6iRI/g?= =?us-ascii?Q?mkMKhLZ3dA54oxDSDfOWCdtnAHdzPjh75tbOvgZ70P9MgtRy9kwvGB6zZo/H?= =?us-ascii?Q?w4TfYABx9i4nxD5qUF1+ZHdIndGqqE4glf/PZRgdf3aEnsEEChq5GfOgX8vk?= =?us-ascii?Q?JX0xkUNX/9TY5xSw20fRSICZ6az+Kaemb/FsgewvM1q5I0iGuw/RHbcb22Fy?= =?us-ascii?Q?6BGOAc9UdCqlRDodnFVjWYKDac3q7yjtGynkaqI1mRIvTcxN2GQns4CuV+om?= =?us-ascii?Q?wrLrXkqef9Ifc3j570+eoIIk5ucuNTk4vSl0C2/na60wBjYR8c34DFCNZ8TT?= =?us-ascii?Q?t/+33p1isInvZPSaPQaHAVcjb1xxvo6c/heS8wMuetp8yejExHoPg5sONj0w?= =?us-ascii?Q?z1Uie7lPWam+gWpdKiF/+2KGoy9/pPG2s4dS5lly1l9CFnEWKCH0CiDTrm6V?= =?us-ascii?Q?kdffa1TivKBaNHgOAqLn8a9vv/bD7nFPqkYXOEm3j1Dc/E0I1HYafNOiHs4a?= =?us-ascii?Q?TMKlZf/4I3DZsF9DjpCX8i2xfkn9DE16DL8Kzjz/JAGRYs02Fy/hGcX1rBDV?= =?us-ascii?Q?iNnmk3GBKwzaBtk3n7hHPKgfpvXIMoFRcOVhgWXfliM+Qwq3NcjnVhB40d3h?= =?us-ascii?Q?GyW+tngoxltwzOF5OwePSWvzpDUbOT2hKy0dgPNogK9jmJfkQ3v41ojF7ys9?= =?us-ascii?Q?WOqXQjo/jVyBGljSsZyXcq9ac7qKiSu3hkkS5kz9KccMhwb7lGNP9x3/u/Vs?= =?us-ascii?Q?QNk3vxFjqbgQKWBW1lhxXX5kb+E6uHM7rgqu9kUpDwPTIcaSGfjoSBCbbjkT?= =?us-ascii?Q?0VJ7Vxv280CmOZdr/l+nJdGlPTlWD55vZToCVwpb4ru7NdNztlw7RZutNvu+?= =?us-ascii?Q?zcKCgNEjlgKThK5GbDdp341kVnBf4lb6A4/OsZ7uRky6FcbiQ4mKRBIdRfl6?= =?us-ascii?Q?VoYf/t2it4UQpBU7Tnpc0RRaEAreaw1hurgQthFUVcXQwWRpcYWoECXYyryM?= =?us-ascii?Q?kE8YcyVH/i1bMyPaSeYxWLq1CHRJISBYgh0ftscLsue2TXl1fJsuPvIx+GkB?= =?us-ascii?Q?ntYV5eJGT8v9/Ovs2UdLfaCticdHA1R+bY1Caar2kUL8Sbl/kEuT8Fa+9Kbq?= =?us-ascii?Q?UyPaJbjS4K0HwYlS2JMxCrZLPylXaNjT+drLKiwSlYiPPu73zlv1qFJTf6MA?= =?us-ascii?Q?IlXOQ6K2A9G5EOxsqTa8Yzy1gxdbuiohV5LMhV4OD2Znl9KdvMmM9ZFSatcb?= =?us-ascii?Q?rXNe+b9KqcgDqpwWIm1m7xlMMeME/YHWChW6diaV?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 553df518-2e52-4198-3975-08dd93f0412f X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2025 20:37:05.2715 (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: 5zNEw5uLtQpdvJKwsXdjCKVG+QVFiQXVwmdCdF9UU4BckjbFEjNqaqVptsgmG5O+lbM5irPCn5fJibeUivSj5Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8135 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QZHJUZFOZ2N4SVLWJHCKSPU4ZMFEEGNX X-Message-ID-Hash: QZHJUZFOZ2N4SVLWJHCKSPU4ZMFEEGNX 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, Nathan Chen 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: 1747341650462116600 Content-Type: text/plain; charset="utf-8" Allow access to /dev/iommu and /dev/vfio/devices/vfio* when launching a qemu VM with iommufd feature enabled. Signed-off-by: Nathan Chen --- src/qemu/qemu_cgroup.c | 47 +++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_cgroup.h | 1 + src/qemu/qemu_namespace.c | 36 ++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 48af467bf9..df4e73ad15 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -462,6 +462,47 @@ qemuTeardownInputCgroup(virDomainObj *vm, } =20 =20 +int +qemuSetupIommufdCgroup(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(DIR) dir =3D NULL; + struct dirent *dent; + g_autofree char *path =3D NULL; + + if (vm->def->iommu && vm->def->niommus > 0 && + /* Check if iommufd is enabled */ + vm->def->iommu[0]->iommufd) { + if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DE= VICES)) + return 0; + if (virDirOpen(&dir, "/dev/vfio/devices") < 0) { + if (errno =3D=3D ENOENT) + return 0; + return -1; + } + while (virDirRead(dir, &dent, "/dev/vfio/devices") > 0) { + if (STRPREFIX(dent->d_name, "vfio")) { + path =3D g_strdup_printf("/dev/vfio/devices/%s", dent->d_n= ame); + } + if (path && + qemuCgroupAllowDevicePath(vm, path, + VIR_CGROUP_DEVICE_RW, false) < 0= ) { + return -1; + } + path =3D NULL; + } + if (virFileExists("/dev/iommu")) + path =3D g_strdup("/dev/iommu"); + if (path && + qemuCgroupAllowDevicePath(vm, path, + VIR_CGROUP_DEVICE_RW, false) < 0) { + return -1; + } + } + return 0; +} + + /** * qemuSetupHostdevCgroup: * vm: domain object @@ -830,6 +871,12 @@ qemuSetupDevicesCgroup(virDomainObj *vm) return -1; } =20 + if (vm->def->iommu && vm->def->niommus > 0 && + vm->def->iommu[0]->iommufd) { + if (qemuSetupIommufdCgroup(vm) < 0) + return -1; + } + for (i =3D 0; i < vm->def->nmems; i++) { if (qemuSetupMemoryDevicesCgroup(vm, vm->def->mems[i]) < 0) return -1; diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h index 3668034cde..bea677ba3c 100644 --- a/src/qemu/qemu_cgroup.h +++ b/src/qemu/qemu_cgroup.h @@ -42,6 +42,7 @@ int qemuSetupHostdevCgroup(virDomainObj *vm, int qemuTeardownHostdevCgroup(virDomainObj *vm, virDomainHostdevDef *dev) G_GNUC_WARN_UNUSED_RESULT; +int qemuSetupIommufdCgroup(virDomainObj *vm); int qemuSetupMemoryDevicesCgroup(virDomainObj *vm, virDomainMemoryDef *mem); int qemuTeardownMemoryDevicesCgroup(virDomainObj *vm, diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c index 59421ec9d1..150c6ceae3 100644 --- a/src/qemu/qemu_namespace.c +++ b/src/qemu/qemu_namespace.c @@ -676,6 +676,39 @@ qemuDomainSetupLaunchSecurity(virDomainObj *vm, } =20 =20 +static int +qemuDomainSetupIommufd(virDomainObj *vm, + GSList **paths) +{ + g_autoptr(DIR) dir =3D NULL; + struct dirent *dent; + g_autofree char *path =3D NULL; + + /* Check if iommufd is enabled */ + if (vm->def->iommu && vm->def->niommus > 0 && + vm->def->iommu[0]->iommufd) { + if (virDirOpen(&dir, "/dev/vfio/devices") < 0) { + if (errno =3D=3D ENOENT) + return 0; + return -1; + } + while (virDirRead(dir, &dent, "/dev/vfio/devices") > 0) { + if (STRPREFIX(dent->d_name, "vfio")) { + path =3D g_strdup_printf("/dev/vfio/devices/%s", dent->d_n= ame); + *paths =3D g_slist_prepend(*paths, g_steal_pointer(&path)); + } + } + path =3D NULL; + if (virFileExists("/dev/iommu")) + path =3D g_strdup("/dev/iommu"); + if (path) + *paths =3D g_slist_prepend(*paths, g_steal_pointer(&path)); + } + + return 0; +} + + static int qemuNamespaceMknodPaths(virDomainObj *vm, GSList *paths, @@ -699,6 +732,9 @@ qemuDomainBuildNamespace(virQEMUDriverConfig *cfg, if (qemuDomainSetupAllDisks(vm, &paths) < 0) return -1; =20 + if (qemuDomainSetupIommufd(vm, &paths) < 0) + return -1; + if (qemuDomainSetupAllHostdevs(vm, &paths) < 0) return -1; =20 --=20 2.43.0 From nobody Sun Dec 14 02:02:12 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 1747341687818979.0346693307642; Thu, 15 May 2025 13:41:27 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id BE4E113CE; Thu, 15 May 2025 16:41:26 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 97A1D1441; Thu, 15 May 2025 16:37:45 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 15F6E1468; Thu, 15 May 2025 16:37:40 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2079.outbound.protection.outlook.com [40.107.236.79]) (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 C86DE14B6 for ; Thu, 15 May 2025 16:37:10 -0400 (EDT) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SJ2PR12MB8135.namprd12.prod.outlook.com (2603:10b6:a03:4f3::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.32; Thu, 15 May 2025 20:37:07 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::529d:478:bc5d:b400%3]) with mapi id 15.20.8722.027; Thu, 15 May 2025 20:37:07 +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=M+5HRh1B61nlwohc7qw3XrUnrwHXAINcdZ9np1Mhd5mReZ13p9hsukFLGfJRgjkLq9Q8rA799qXqI105SCFZo71uMyBIoLQxLO69lwZLHP4ifCdy5v3Po+7vsZ00bdc5GkFpKTDpnxFrulZaIDs8yYKkqbSeeClkoiYwIpSneU30mHrvbJBZ08fQVJuGk9Q/ozyeWrJtCThnTldknAum5sJ85fwfH8pkK1JG3IC6LacCGBt7zFH1J99Ox1fswk309yCpxmoLKcxq491QE+kH+jDDUtA1uOhhTGJicB6MjKFFASeCeHZtA0Mzbxfh1nnB+cMjzDrF3sa1NlS7euFxhw== 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=yvblt9c8bQuRVp92A5GiRMCDKxqVMHZiTW2XYaxzV7s=; b=AceL3uw99GrUhTaq+6lXR2b7n97nthyp5SXSe8h9u0EbrO3X/UlCyEUer90IOdKoRsByYS/J35Ma3E5WJ75Rm7iXHKNqzdIinx5JKtj/GPbgDEdtZu9cKF/Y35YUlHFHn84s94WkTPEqfGAWL6Kt96PsnpLILqjHlVUl+dFJlCYw6cOLjpvERD2kH8XRzQVceIS47JrLmQ8g/2Vo961uM3NIc8Uc+6TQQh3gVTH6pJhKyRH3dpyw7H5rFI1WIghkARmm3rD3L3fy04AE8DCywtmYM8cIhWEPHIi+XZ1g68Grzq9XSt8DlkHBmS2U7cYgLFJJI0ZRFAXdH7e529eckg== 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=yvblt9c8bQuRVp92A5GiRMCDKxqVMHZiTW2XYaxzV7s=; b=VTqeZAVIm14cZRqNA6tavtv8OZ722eLdJGfbrduslR4+Sb/OO+9TnuL6AwLHrNR4Jc+Q8PwdVKehcPh3rq5SDte0uFx262EQorFXOe+EHG7WAepFr4XqE6QSb0tUWZgL5iezKIThpcH+imJT0R5ZCSP0tjEtyMkV3w0Wvl7rc+xcmMQbMdv/5DsUMqvo003inrY9QxwJQFNk2rhxoCjHiuzc3dOXUqxEX/EnNU0Tu3NmGKvNzbNC5WKkTQ8t0rhkKvQ31+4gNrLYEfT7ht6joNqjl93bfA9ycNl7pHk2wqYczYmNrfcWLw4TiRsyEIfhZ9qAl254X/JtKky0tVm0Dg== 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 5/5] qemu: Add test case for specifying iommufd Date: Thu, 15 May 2025 13:36:43 -0700 Message-ID: <20250515203643.21109-6-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250515203643.21109-1-nathanc@nvidia.com> References: <20250515203643.21109-1-nathanc@nvidia.com> X-ClientProxiedBy: BY5PR13CA0035.namprd13.prod.outlook.com (2603:10b6:a03:180::48) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SJ2PR12MB8135:EE_ X-MS-Office365-Filtering-Correlation-Id: eea3f430-617d-4669-2554-08dd93f04256 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?gVLEJ9L4MnAQ5+ePUs4WE/M2KbeospH9smcN235KouyhuR64wcUPiTcCd30Z?= =?us-ascii?Q?OkkkuXOgZLYXs+p/zHbGwmf74aOi9Pt+k6JWgzE9XMiNZ90s7xP2wGziZve5?= =?us-ascii?Q?ETnguZJQd8oo+VuDzpXbMA8A2jXpssRN1ZMkzTGJjv3rlzejUKalGEZDXjjs?= =?us-ascii?Q?fSVT/ZVUYRpFjw6wETN/zog6lueG1GnqrYqEG5Tsi/JnZBt6C1PAjpIqf564?= =?us-ascii?Q?P2A+BWsXRWOchcRmZN3OoWZ/0eLxyqzKV5Zq86O1u8xG1Atyze8cEbPtcq45?= =?us-ascii?Q?8RHiMR7zQ6psaih1uBM2f79rt5v2U0kH8H3Cfh5ZltbtxT6DkTlMMiz0lgRv?= =?us-ascii?Q?avB7PUoYmcRrxIfuP/wU//4ohA+t3LtTZc/Gm5neGYJk3WhBTzKpSkBuPJnu?= =?us-ascii?Q?rEvSNcy01GV4gmi+idM0iwxCzT7/It1chE38afaH1sqiOWnoz2lcW7jjm5BR?= =?us-ascii?Q?lvpMNKIPFlaTXofNO5Wxs1GFCvBntfdu0Jm/zxTfthop4eqdvbutg2gPu/C4?= =?us-ascii?Q?FWhUbEZE5I8DrhtgYjykQaNktpukgKKSIx9ah2ZiNbz9Em8YwPHp2DyZ8Hrw?= =?us-ascii?Q?8fETL615D95Ymui8obr9YwKgArjxk6a+vnZpzu0xtWuBEFZvolC0vyZ09AF+?= =?us-ascii?Q?C6CHHqIsUBFi+ZelJX7unkgALkAXjDDOG1ZFh3Kg+WGZlWK2Lxnpa0K9/Y93?= =?us-ascii?Q?LQIDrWz0zBFUWD+W0PUK1qN+nmV6PK516GhibZfmR3c/9NiWYftau8LKB6bp?= =?us-ascii?Q?uFV1XUeQOZcLhMZJMc/lcAP6gzzsRk7ciFpjzBUT0VgRxLsyCsfGYTcNN8Vu?= =?us-ascii?Q?8df5TuvRPFHumkBQDNBcrqgGyLPNWVZS8foEYtabXiuB0vpIVd9OHydE2JX5?= =?us-ascii?Q?gyMWTosFNemHf9TBbtK088QCW8vmSkakhxQ4P/DYBWRGU7fp6/HvjwAOFiEM?= =?us-ascii?Q?LXYeukjfFkovIOIHguUoT2arGp46Etkz18IQWlRTAmInoe6IxnSz70oALa/s?= =?us-ascii?Q?oIFjGqTT3IubstPlZs/Y1ekWc7DrVrFhUb/4bZ6J1Hjt+wTe+NvS6VMJGZOh?= =?us-ascii?Q?7wHmarL7TIsNqpWiZ3yTp6WDJB53aLC4DKvLtVV2LniaD3huYuLN6Afj4reY?= =?us-ascii?Q?dxG5AN3bCWHSBh73LWsVrfrln7Z0hkWryIjaQd8nwwvSsLG38upjumcrJHth?= =?us-ascii?Q?7QrbWY4FLu4Jtn/w6IykRDlWBxxkgtdtxlshEktnOZHTA4c++NnePmN1SbU/?= =?us-ascii?Q?u3yjR2v/AaxjWXi8tz/dvAPDPD4+FYjQYjUME9nOy4dtD7Bu5cU064GcEt7T?= =?us-ascii?Q?V13u9HKCwMhv5qSdqj3xexqJQjPesub2ArlOflOIooP/CoWhIIe7xSM1lNUP?= =?us-ascii?Q?NPef6Ursx8Ppe8jThWJYRjgL6QDALG+CTfHCcvmHOkB7pAQ9j6HFBCtMdj9y?= =?us-ascii?Q?Oo3esuYhe/M=3D?= 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: =?us-ascii?Q?47dSTuRR9yxZI6ABDy509s5+36mhQFHuIBHLAlHm6WdDbzkd2k0Obh4xqEUS?= =?us-ascii?Q?n9sAbwCI+oajv302ZqPmrnbVHt/W8f9ErgITp8gY9oS4ikEkwCiMHOl1uDHX?= =?us-ascii?Q?YFfj5h6jk9Fh+Q0otjP8cM74a/uBNXWivEuHTFQP6ijAPfctkqeBoYkbuSeo?= =?us-ascii?Q?3yCFkozbAN8Y57b6PklE+NPyCGKq9Q8tjPa1qkk5+W2n3+CGXTX/+hxpKACv?= =?us-ascii?Q?p+1KWUw/zOFsrjDbO4J8jYIA3f4Dgxe/53+7f2LCGBmU4W/enJHRWdcqkWRh?= =?us-ascii?Q?1fhDh9MJcqQKK1qfPWt21UWJhCCERGNeBhDhQF7ohBfNuZqEuD+fC4pag4Ln?= =?us-ascii?Q?Z1AFu0cJ3eCNfxhTS47K3n3GWuJiKw1H43vtcyaIoTVJRNUBKZ7RyPSBTvZ/?= =?us-ascii?Q?YTwd6so8u0wCIIswc7aWMgcqol+/c/LcKjBld0XkTBPpKDNGKokQJIEacFf/?= =?us-ascii?Q?45cnSpyDHg3P1YQeH476BvXUt378ks2GRbaiDr5MD+K1v9Ly7ji/B5MgXLff?= =?us-ascii?Q?V+DH0uupJxN5cdszvfc5bESBJYSSIfKKckFrZufbGh5CM5WjK2SrXLqf6k7O?= =?us-ascii?Q?s6OVKf8nNpDnuU0pez+zT6nEZxNzQLN7yBYCQ0cQtbCAGFmSLr2Mtjs/mxwE?= =?us-ascii?Q?2emFeQhjycv+iaf+p+Wc+QgrfBFy/G1Md2ytdeLVGY1FPbDlR8djEvICZa8e?= =?us-ascii?Q?+FVgRPA8rPC9aCkasfJzNHEA0IwX7KY5T2ZfBiWvaoGH8fdRTttXYn4Xp07Z?= =?us-ascii?Q?5AJ10Qj7pWOmohLJgJWtqhKOyxe2sBQkHwvoVd/8cN8MG0N/fBpnAOi7XYvl?= =?us-ascii?Q?uLj9pYtR606EPu8ifdJUvaoQjeCFUxeB0FJ8/ilFNKYT6uSMy66jOXT8eKZu?= =?us-ascii?Q?WghLrpM+2kyN1N7qkfNbVhTAOfFdnDt0OFVLYn/xFR3mf/DPYCXHVMMQ9up2?= =?us-ascii?Q?AeZ7PX1mkfxjsgEM88qxZcRtNlMOy3Bq1IAivuk+EUn9YAFnuPBDpXlhlJp4?= =?us-ascii?Q?V4YF5i6rC6+q/XZW1aCXK2f0L5HMjAioSN3MgkFTEOXYeMi+ukqOC2S8iqZb?= =?us-ascii?Q?oj2czI9dZfv6B42iLdFzVhMTH4+O+uHWPxuQePto4OBM51p6w7okJJGMs27r?= =?us-ascii?Q?1cApQwx9bL3/ndqUp0Q82js/H1HDNjveglaHOkpGghUJKYDpDwSi/UEdwNpq?= =?us-ascii?Q?oT23lSGuy4LC8HBAydXNX+G0gnpgzQs4ku29J5S9ZSYa2J+Eu0Q04LGJFB9Q?= =?us-ascii?Q?lqZO9BrAND1XOZ2vO/AY+2FEKCbo8IAoDSO2xKl5RsZz7p92BQk3VJAdaBSn?= =?us-ascii?Q?hIzHrKXOXl+9azeVmXsMUfvUNMFX1djTFZ6c9LJiDfecpRF95Sz0iQJtU5sw?= =?us-ascii?Q?rI0hnEMsWLWLhRJrCVJ/s5KDqo5aw7RmPob6If51mngFCDCfRBMqAjDD2W/f?= =?us-ascii?Q?6F53N+1CvTnYazdET93vjHN/3/3HlstJfjNbqnkXxQ96uhoYC+LVRlNaND/r?= =?us-ascii?Q?hwznfCLLMxNmvMxAkD81MfuTwOQc+MSZklVjzSiOO4DMmiMu/dn9GVuc6IMQ?= =?us-ascii?Q?7mOMgJF9BrtxHxrHgNCiYkz229woDozWDKkeaZth?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: eea3f430-617d-4669-2554-08dd93f04256 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2025 20:37:07.1668 (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: ebNGQGjOfGAQm1ltSQ8ksSCfTWlAKx6mdUjYFuaGyiC6FmRYYB8u7VA7fDhGvFTvOH1RpCBKfzIBslfL/S40rQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8135 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: MBJPJO2G4FKUU37LWIQO6V4HU3D3Y24Q X-Message-ID-Hash: MBJPJO2G4FKUU37LWIQO6V4HU3D3Y24Q 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, Nathan Chen 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: 1747341689593116600 Content-Type: text/plain; charset="utf-8" Implement a sub-test in qemuxmlconftest that takes an iommufd attribute from the iommu device stanza, and iommufdId and iommufdFd hostdev attributes in a VM definition. Translate the VM definition to a qemu command line that associates the hostdev withan iommufd object, as well as a fd for externally opening /dev/iommu and VFIO cdev from an external management layer. Signed-off-by: Nathan Chen --- ...fio-iommufd-intel-iommu.x86_64-latest.args | 43 ++++++++++ ...vfio-iommufd-intel-iommu.x86_64-latest.xml | 80 +++++++++++++++++++ .../hostdev-vfio-iommufd-intel-iommu.xml | 80 +++++++++++++++++++ tests/qemuxmlconftest.c | 1 + 4 files changed, 204 insertions(+) create mode 100644 tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.= x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.= x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.= xml diff --git a/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64-= latest.args b/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64= -latest.args new file mode 100644 index 0000000000..aaf54fc93f --- /dev/null +++ b/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64-latest.= args @@ -0,0 +1,43 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=3DQEMUGuest2,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-QEMUGuest2/master-key.aes"}' \ +-machine q35,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dpc.ram,acpi= =3Doff \ +-accel tcg \ +-cpu qemu64 \ +-m size=3D219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'= \ +-overcommit mem-lock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9466-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus= ":"pcie.0","multifunction":true,"addr":"0x1"}' \ +-device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus= ":"pcie.0","addr":"0x1.0x1"}' \ +-device '{"driver":"qemu-xhci","id":"usb","bus":"pci.1","addr":"0x0"}' \ +-object '{"qom-type":"iommufd","id":"iommufd0","fd":"22"}' \ +-device '{"driver":"intel-iommu","id":"iommu0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-global ICH9-LPC.noreboot=3Doff \ +-watchdog-action reset \ +-device '{"driver":"vfio-pci","host":"0000:06:12.1","id":"hostdev0","bus":= "pcie.0","addr":"0x2"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:12.2","id":"hostdev1","iommu= fd":"iommufd0","fd":"23","bus":"pcie.0","addr":"0x3"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:12.3","id":"hostdev2","bus":= "pcie.0","addr":"0x4"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:12.4","id":"hostdev3","bus":= "pcie.0","addr":"0x5"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pcie.0","ad= dr":"0x6"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64-= latest.xml b/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64-= latest.xml new file mode 100644 index 0000000000..4f9cfa2f1d --- /dev/null +++ b/tests/qemuxmlconfdata/hostdev-vfio-iommufd-intel-iommu.x86_64-latest.= xml @@ -0,0 +1,80 @@ + + QEMUGuest2 + c7a5fdbd-edaf-9466-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + qemu64 + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + + + + +
+ + + + +
+ + +
+ + +
+ + + +