From nobody Fri Nov 21 10:01:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1762387087115924.3770415664326; Wed, 5 Nov 2025 15:58:07 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 75FF043FD8; Wed, 5 Nov 2025 18:58:06 -0500 (EST) Received: from [172.19.199.29] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 56457440A1; Wed, 5 Nov 2025 18:55:23 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 46AC544013; Wed, 5 Nov 2025 18:55:03 -0500 (EST) Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011034.outbound.protection.outlook.com [40.107.208.34]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 44F6743FD8 for ; Wed, 5 Nov 2025 18:55:01 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MN0PR12MB5859.namprd12.prod.outlook.com (2603:10b6:208:37a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Wed, 5 Nov 2025 23:54:54 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9275.015; Wed, 5 Nov 2025 23:54:54 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EINgBokjlc/KIVA1x8g52AVvg/VOUOm7iHF12Tbt7TT6O/isBKh8p5sxjfXGUgAtLO4NNwWZVQxEr8BVzWDYmZYxzd0LXs/BqwrR946k3UZgGlt9853PRAVKKIyQxb3jdmpHjkaeyI213hi+XJoGmF9CsW+gfrMhxBxYjGrND2uHDEXeV9ELA3A1Cw0zcyrhVzm4EN76kmXRUTV+OagGyDG6Hq1is+RDF2qxfuutmlVBBpigpEmUDmdlvCPhDVGCr075nmzXCQDb8Kd/ZSVte0lCkfNHkzUXfLWCEw6hXKm7ww/SbSjSXiUbldx45F+5zA6r0NK5RyUlss9y1OZPsQ== 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=WI7ouIV81D7GGdrf7vo6LVE2/G5mv2KhmMqutI9gAyQ=; b=TArJZ7KQou+p0/58X7T2rafNfMR+dameEc5ZZRs52ywtuyn5h1alJyDPETXqj+GQ8/OrVhCHmaSMqWUzYjN7waDMaICR7BdcoXXe5IV7qDWHmbRivcgFvPdEijjtWlGyGQ/01xUa96sLyxESi4WlyvJinGoxmcnOcjwHUUITjjIsoXO9Zlw9CMuNex5Mv5YCSa+TUl10FjEqcZKLiey1tLBY/Dm/weUat5EiDX+0c58NqqVwNDZHQ29+V+Po7wJG2ihvW3u1ADNFiATxFvCsPSLth7ViCG6RO8EEzyReFj/lua7xS021Y57Lq+6BpdrL/1OCB7cbtla3DJ0Du6RGsA== 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=WI7ouIV81D7GGdrf7vo6LVE2/G5mv2KhmMqutI9gAyQ=; b=ryxZr6rsnjyGsss91hMHgYUHrZ+Nj219EzkRo19tn5L9zEIXxkLdXyNte0ZYXrUZa9LHF7DQie+WmWxVxuC1NmO0CxI9/Onq2Hr7GmIIEJ4bgptOPrTFBE4LhVsnmpEqwmslJ53jDy2tWu4q27oV44ZIpjr7YrA/gFoML20VYuwK12kUMpzAbwoVvi5HR9ceroSElyvUITCsVU9yaMgRK1axMkm8gO3947PZVxuNXkCv9SMWOOq9pPz34TODCKWDsXbHSUVAdvzUf085SAZNROU8WWntQ+V81IfcdwYmzvxOpbhbCTpUQS8UJZn8ScR0TFPSsQiCAkTRAvDS/4IMOg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v3 1/3] conf: Support multiple device-pluggable smmuv3 IOMMUs Date: Wed, 5 Nov 2025 15:54:37 -0800 Message-ID: <20251105235439.829536-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251105235439.829536-1-nathanc@nvidia.com> References: <20251105235439.829536-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0004.namprd03.prod.outlook.com (2603:10b6:a03:33a::9) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MN0PR12MB5859:EE_ X-MS-Office365-Filtering-Correlation-Id: 23eb1c49-e0c6-4415-1856-08de1cc6b741 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KSePZfNaIB89iskrgRpkpe3SZSCB0e4uO2jXYulL32W46RQqwIFZi90S2W2C?= =?us-ascii?Q?6P9T3GAv1qBLPvm2LnqG2BqdMO/K4TtvIlnMVvsbz+5arrv4UBMONDqdY5+t?= =?us-ascii?Q?MYxytDKdwas8oKm8sPLUO2Wr1iTwJ22LFQF2bszkv7OqCfA69zUfZnnLthZm?= =?us-ascii?Q?RR1m4r/SxvZF004xO+kPfiJ2tdft5zrlT0mGbwS62HXT+3+S/GBdida6vdb0?= =?us-ascii?Q?LZitaEuZ9o+xIMka1GcpMYfd3imHx0TakLw5CTmtSF2XIxmCv3B4CIRXshCY?= =?us-ascii?Q?YTn00OVheRhBRZg07i463scukU76xYr10d/YBw9cXayUq77i5vlov4SJ4qpJ?= =?us-ascii?Q?XN4qNL15bRUmwXJ4yLvv8GiBu7Ca3fsqVd/8fefJpXW7Qe7hF4iEt3YllWQc?= =?us-ascii?Q?CMmLb3+AXqrj8s+J0Dq3iKXpvurRkp7DNVWiMG5RDbm3gqRiU/ECvtMdhz9u?= =?us-ascii?Q?0/ru4HNduKVXzW1AwJWDgNvmKiLiK/SHbLuhuqpEEN2Esr/ExiKECqo76Xxf?= =?us-ascii?Q?I1lMNGqMYlI1VcSULh+A1KA5pL0ahFI+r1yMzWDsh+AbhDOpZuUPP0FnqtQF?= =?us-ascii?Q?IDF0i8cM7pTSl+bqX1u0N2FNeAAXJmaxnqaXGWS0thjgvgvye7iVhy8tzzPC?= =?us-ascii?Q?aQZbaEpM8LDiPaCqyEjrw+J3Gf5bYh3qOzwWLdvbo9xmtETRfoqTdSex2n+I?= =?us-ascii?Q?iSmhmQ50ZgsEq08G1rWe6EVo4N9kTVV1+l4SM1EWHdj2aNVRiLmq95rs4F7w?= =?us-ascii?Q?Ael5P2A+kfNNNmRyn5n4eZIX1bH5hY91DKLhkdWypTVMiIaP5IxYayp/0/hk?= =?us-ascii?Q?f0jp6x09A4VzIhluIHoZo45RU9VIFQcFJuO3ekAqTz3ltLybQXU1uzqwOkAg?= =?us-ascii?Q?ugY79NFz1to/ipTykWZSfe1Jb+ZCmpt7FuuBnUuqnRkOrtFEw7KNndw7jUOH?= =?us-ascii?Q?OXolFyNRRaRs9eaKb0P9AtgXphrRMI1ucyN9GGQzTulVvxJgT/61SWO0Po+S?= =?us-ascii?Q?Y6T8TpU+jZnBcVIJcUc4DTC2nLoNxipiN+r570POE2pnYSdJvUnJuuSIjVCP?= =?us-ascii?Q?cNr4c6JNNyREzlUE2mVpUFJCfdU+gXIxTtMHxW9N6LqD8vq/YBK5CgKNUOuK?= =?us-ascii?Q?3IluNNostaW/W4K07BjSqDzTPbhepQx9GcayAZJbXVE8rCwYqXJTnfhHZN7i?= =?us-ascii?Q?8pBcgBz4rdziiW3HbLFV7gMLHQkF6UNW+tn9chgJCUGghgXV4pYQ+j3cso0G?= =?us-ascii?Q?BA0TPusd7Bv+vIr1ZKrwtV7qeGTG5PmLZrSTP6l36eLATaHUOA4XdbYXUOHR?= =?us-ascii?Q?PD8eFyd2Lx3EFFnYTlbTyM3DigPHgAxT4WWxEbBgxZunDlXhUW7sYRDoeftN?= =?us-ascii?Q?gbxygyXDEJ9s5gWn4MX/h9RmIMkBDICOFHEsiTmg0OXqNHIu220GT66nqwKL?= =?us-ascii?Q?JxrqmvyfOTVQuxm5T+9o0SYNSXUGdymq?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?rh8kmLZyMCLaL2K+ExqYPN+Q06k/8Qo70QL590nYJ5UHQdAQuadWrxOY5fey?= =?us-ascii?Q?LfB/44sMRu/lT+PJJPoVZjAs1jyvRiuAew4fy296pvQwPla9Pm12mPtnO98m?= =?us-ascii?Q?BGXSNLcNsDS+DGZAXxu8LIBQhJY2l5WxWoJw8o1FBqdPE0PW0HuzK0x0rcp6?= =?us-ascii?Q?qI0J+lb+BJkzua0wbbMme5PmehQJ+GiF6REwv0ZHnQ/JErd/xDWKPvjSc3sq?= =?us-ascii?Q?UPiFhEApDNh+0zbEvOnxRYPYwbdIjTw36TRuS0P0fJO1l2+hJCnBTsddIttc?= =?us-ascii?Q?sNoCVjmad876w8FpYBKJ7gI0+f3Mu0itICGMOEpVK+BHjWSiTP77felIge5q?= =?us-ascii?Q?TUxMJR8Y13m2A+JcU10WzKkclTrNAAuauR64hkawXjnZNshEgGuGwZmE9Aay?= =?us-ascii?Q?k34TG+Woegv7EQ+XIBZ1AIaW1UoWtsjOFozfM+TE2y4uvrUW9CSkqghMKgdM?= =?us-ascii?Q?ASa10c8lxcB8DHJOx2T4+lnAg6AblC2HswFfOrmQ7x4U70GJ/TI/lIr71BEi?= =?us-ascii?Q?Idl148aFtv1M7josoHPKCVoQksTe8WAt4pG+E37OmLRGGqdyKBi5YZq9DaGR?= =?us-ascii?Q?BR9cTb5wchQh+zDofh4rxSf5VNEzONzvSu3maoUXBpWzDKTDqX9On6adhlaG?= =?us-ascii?Q?uAj5D2WqdUs+aXL+FCvxRYRU/BnBMN1gF6w0zEbVKE5NESotixX2osoJs6CI?= =?us-ascii?Q?HwRVzPPb624O+N4g5UzBtltS6cdaPQOtandbrIdP+Ss2+VLWSwRig2JrNXhi?= =?us-ascii?Q?BMEK7LyYnClN7gShm7Euua+NTjDNdJyg52e3H5kC+ppsv/3h0xJQWbI7AzpV?= =?us-ascii?Q?lyQgWQzo+P7wADzVLo9e9nNugqlPJsc8rMn3BwuexxSkBP9w2KrPlcMiX+U6?= =?us-ascii?Q?fU4ltjQUHAlOAuD1Xx+kFUX/vy4YjC1f1u89u1jQ3VG7LXDs8cIzysEZVSFT?= =?us-ascii?Q?js6mE/BdNasr6YSAT0kOKNN1K4d9l6C3BNurWpdI5vFfll40fAreuIq8dxa8?= =?us-ascii?Q?wnHXRkFoxNX04SlzBg+eoiqC5DJgYQKHmL18jvhSWOzmPRxOZqPEN2p8jIr4?= =?us-ascii?Q?gtGs/75O0LIJGTwR+bVUtPjbMX0rpvB6etWzTWwXv78a1Mv1c4pKXfsmr0f5?= =?us-ascii?Q?TNLjSLw4Mtt0jxf/lz+lr7i0ztXNB0tLCZKp/HIm3pIYkpr47WaaFDAbewgo?= =?us-ascii?Q?vOGaG7g/+s/ZbcuuT33/IPUb2BLjxq5TQ7w4g2ykjrfGVTKcQhlOzGzJHWcf?= =?us-ascii?Q?pVzmRLlmRyEIv62i9dQpTlwKtkVBtLaPwm//nAaRnKaLEIe8y1iZPltbGGLy?= =?us-ascii?Q?wKceGXFcBw932wJma1fOkZ5FR9M4hIU/sZ/ZIBLzpTBAiYMCIswFShh61G65?= =?us-ascii?Q?vJfbek3OTb+oQw5hB2p5FG3F6nOiKjNFrY1XCEOboKZpEtnKT6vnc36AdJVb?= =?us-ascii?Q?J5gmkgf+B8ez9+dY+PpinvTCSo0/Xou7kSeCUoRt4vjubeDJz/uDKIJo8or2?= =?us-ascii?Q?QssnC8I2rsPDEIBDcb05riLhqROMGexggt8dIOf4bLgTfXTym1rChyaQIJU3?= =?us-ascii?Q?OH6a3tfjsPLoMMm8Th98KzCsk7Ych6GoYwH6FC7s?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 23eb1c49-e0c6-4415-1856-08de1cc6b741 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2025 23:54:53.9381 (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: cLWK9QHZp82jHCZikdfvfxc8i7RCql7mV0GZA9upAz0U2zkyKfyBj/a8KVDA4hZTvRKsxe8VORymg9ILBE1jjQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB5859 Message-ID-Hash: UZQFE4RQPTNNIN7R45MEISQHBTXNAMMI X-Message-ID-Hash: UZQFE4RQPTNNIN7R45MEISQHBTXNAMMI X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1762387090180154100 Content-Type: text/plain; charset="utf-8" Add support for parsing multiple IOMMU devices from the VM definition when "smmuv3" is the IOMMU model. Signed-off-by: Nathan Chen Reviewed-by: J=C3=A1n Tomko --- src/conf/domain_conf.c | 84 +++++++++++++++----- src/conf/domain_conf.h | 9 ++- src/conf/domain_validate.c | 33 +++++--- src/conf/schemas/domaincommon.rng | 4 +- src/libvirt_private.syms | 2 + src/qemu/qemu_alias.c | 15 ++-- src/qemu/qemu_command.c | 127 +++++++++++++++--------------- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_domain_address.c | 5 +- src/qemu/qemu_driver.c | 8 +- src/qemu/qemu_postparse.c | 11 +-- src/qemu/qemu_validate.c | 2 +- 12 files changed, 184 insertions(+), 118 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 396cd1c0db..a587dbf3e1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4141,7 +4141,9 @@ 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->iommus[i]); + g_free(def->iommus); =20 virDomainPstoreDefFree(def->pstore); =20 @@ -5013,9 +5015,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->iommus[i]; + if ((rc =3D cb(def, &device, &def->iommus[i]->info, opaque)) !=3D = 0) return rc; } =20 @@ -16536,6 +16538,42 @@ 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; + + if (a->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + !virDomainDeviceInfoAddressIsEqual(&a->info, &b->info)) + 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->iommus[i])) + return i; + } + + return -1; +} + + bool virDomainVsockDefEquals(const virDomainVsockDef *a, const virDomainVsockDef *b) @@ -20205,19 +20243,22 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); =20 + /* Parsing iommu device definitions */ if ((n =3D virXPathNodeSet("./devices/iommu", ctxt, &nodes)) < 0) return NULL; =20 - if (n > 1) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("only a single IOMMU device is supported")); - return NULL; - } + if (n > 0) + def->iommus =3D g_new0(virDomainIOMMUDef *, n); =20 - if (n > 0) { - if (!(def->iommu =3D virDomainIOMMUDefParseXML(xmlopt, nodes[0], - ctxt, flags))) + for (i =3D 0; i < n; i++) { + virDomainIOMMUDef *iommu; + + iommu =3D virDomainIOMMUDefParseXML(xmlopt, nodes[i], ctxt, flags); + + if (!iommu) return NULL; + + def->iommus[def->niommus++] =3D iommu; } VIR_FREE(nodes); =20 @@ -22667,15 +22708,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->iommus[i], dst->iommu= s[i])) + goto error; + } =20 if (!!src->vsock !=3D !!dst->vsock) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -29531,8 +29574,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->iommus[n]); =20 if (def->vsock) virDomainVsockDefFormat(buf, def->vsock); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 81e735993d..f44e275270 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3303,6 +3303,9 @@ struct _virDomainDef { size_t nwatchdogs; virDomainWatchdogDef **watchdogs; =20 + size_t niommus; + virDomainIOMMUDef **iommus; + /* At maximum 2 TPMs on the domain if a TPM Proxy is present. */ size_t ntpms; virDomainTPMDef **tpms; @@ -3312,7 +3315,6 @@ struct _virDomainDef { virDomainNVRAMDef *nvram; virCPUDef *cpu; virDomainRedirFilterDef *redirfilter; - virDomainIOMMUDef *iommu; virDomainVsockDef *vsock; virDomainPstoreDef *pstore; =20 @@ -4317,6 +4319,11 @@ 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 17955decc0..9fae071975 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1856,21 +1856,28 @@ virDomainDefCputuneValidate(const virDomainDef *def) static int virDomainDefIOMMUValidate(const virDomainDef *def) { - if (!def->iommu) - return 0; + size_t i; =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->iommus[i]; + if (def->niommus > 1 && iommu->model !=3D VIR_DOMAIN_IOMMU_MODEL_S= MMUV3) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("IOMMU model smmuv3 must be specified for mul= tiple IOMMU definitions")); + } =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 (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; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 75b5124c33..ae3fa95904 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6964,9 +6964,9 @@ - + - + diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7269dd3786..f62ffa45ab 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -494,6 +494,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 b0bc057bd1..400ce73283 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -650,10 +650,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 @@ -769,8 +773,9 @@ qemuAssignDeviceAliases(virDomainDef *def) if (def->vsock) { qemuAssignDeviceVsockAlias(def->vsock); } - if (def->iommu) - qemuAssignDeviceIOMMUAlias(def->iommu); + if (def->niommus > 0) { + qemuAssignDeviceIOMMUAlias(def, def->iommus); + } 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 c56c321a6e..97fe4267ec 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6244,84 +6244,85 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, const virDomainDef *def, virQEMUCaps *qemuCaps) { + size_t i; g_autoptr(virJSONValue) props =3D NULL; g_autoptr(virJSONValue) wrapperProps =3D NULL; - const virDomainIOMMUDef *iommu =3D def->iommu; =20 - if (!iommu) + if (def->niommus =3D=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->iommus[i]; + 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->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 - if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 0) - return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; =20 - return 0; + return 0; + case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: + if (virJSONValueObjectAdd(&props, + "s:driver", "virtio-iommu", + "s:id", iommu->info.alias, + NULL) < 0) { + 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 (qemuBuildDeviceAddressProps(props, def, &iommu->info) < 0) + return -1; =20 - if (qemuBuildDeviceAddressProps(props, def, &iommu->info) < 0) - return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; =20 - if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 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; =20 - return 0; + case VIR_DOMAIN_IOMMU_MODEL_AMD: + if (virJSONValueObjectAdd(&wrapperProps, + "s:driver", "AMDVI-PCI", + "s:id", iommu->info.alias, + NULL) < 0) + return -1; =20 - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - /* There is no -device for SMMUv3, so nothing to be done here */ - return 0; + if (qemuBuildDeviceAddressProps(wrapperProps, def, &iommu->inf= o) < 0) + return -1; =20 - case VIR_DOMAIN_IOMMU_MODEL_AMD: - if (virJSONValueObjectAdd(&wrapperProps, - "s:driver", "AMDVI-PCI", - "s:id", iommu->info.alias, - NULL) < 0) - return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, wrapperProps, def,= qemuCaps) < 0) + return -1; =20 - if (qemuBuildDeviceAddressProps(wrapperProps, def, &iommu->info) <= 0) - return -1; + if (virJSONValueObjectAdd(&props, + "s:driver", "amd-iommu", + "s:pci-id", iommu->info.alias, + "S:intremap", qemuOnOffAuto(iommu->i= ntremap), + "T:pt", iommu->pt, + "T:xtsup", iommu->xtsup, + "T:device-iotlb", iommu->iotlb, + NULL) < 0) + return -1; =20 - if (qemuBuildDeviceCommandlineFromJSON(cmd, wrapperProps, def, qem= uCaps) < 0) - return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCa= ps) < 0) + return -1; =20 - if (virJSONValueObjectAdd(&props, - "s:driver", "amd-iommu", - "s:pci-id", iommu->info.alias, - "S:intremap", qemuOnOffAuto(iommu->intre= map), - "T:pt", iommu->pt, - "T:xtsup", iommu->xtsup, - "T:device-iotlb", iommu->iotlb, - NULL) < 0) - return -1; + return 0; =20 - if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) = < 0) + case VIR_DOMAIN_IOMMU_MODEL_LAST: + default: + virReportEnumRangeError(virDomainIOMMUModel, iommu->model); return -1; - - return 0; - - case VIR_DOMAIN_IOMMU_MODEL_LAST: - default: - virReportEnumRangeError(virDomainIOMMUModel, iommu->model); - return -1; + } } =20 return 0; @@ -7158,8 +7159,8 @@ qemuBuildMachineCommandLine(virCommand *cmd, if (qemuAppendDomainFeaturesMachineParam(&buf, def, qemuCaps) < 0) return -1; =20 - if (def->iommu) { - switch (def->iommu->model) { + if (def->niommus =3D=3D 1) { + switch (def->iommus[0]->model) { case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: virBufferAddLit(&buf, ",iommu=3Dsmmuv3"); break; @@ -7172,7 +7173,7 @@ qemuBuildMachineCommandLine(virCommand *cmd, =20 case VIR_DOMAIN_IOMMU_MODEL_LAST: default: - virReportEnumRangeError(virDomainIOMMUModel, def->iommu->model= ); + virReportEnumRangeError(virDomainIOMMUModel, def->iommus[0]->m= odel); return -1; } } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a42721efad..889427f289 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8371,7 +8371,7 @@ qemuDomainGetMemLockLimitBytes(virDomainDef *def) int factor =3D nvdpa + nnvme; =20 if (nvfio) { - if (def->iommu) + if (def->niommus > 0) factor +=3D nvfio; else factor +=3D 1; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 6d5c4785e8..7233df888c 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -2396,9 +2396,8 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, /* Nada - none are PCI based (yet) */ } =20 - if (def->iommu) { - virDomainIOMMUDef *iommu =3D def->iommu; - + for (i =3D 0; i < def->niommus; i++) { + virDomainIOMMUDef *iommu =3D def->iommus[i]; switch (iommu->model) { case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: case VIR_DOMAIN_IOMMU_MODEL_AMD: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a1b1edcbbf..54926064da 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->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->iommus, 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->iommus, 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 fd27f8be27..3b417ea5d0 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -1470,7 +1470,7 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver, } } =20 - if (addIOMMU && !def->iommu && + if (addIOMMU && !def->iommus && 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)) { @@ -1482,7 +1482,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->iommus =3D g_new0(virDomainIOMMUDef *, 1); + def->iommus[def->niommus++] =3D g_steal_pointer(&iommu); } =20 if (qemuDomainDefAddDefaultAudioBackend(driver, def) < 0) @@ -1558,9 +1559,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->iommus && def->niommus =3D=3D 1 && + (def->iommus[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 747e54bf44..357978fc2c 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -907,7 +907,7 @@ 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->iommus || def->iommus[0]->eim !=3D VIR_TRISTATE_SWITCH_O= N) { 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); --=20 2.43.0 From nobody Fri Nov 21 10:01:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1762387165799868.6687512352689; Wed, 5 Nov 2025 15:59:25 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id D1DEC44139; Wed, 5 Nov 2025 18:59:22 -0500 (EST) Received: from [172.19.199.29] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 87ACC4421C; Wed, 5 Nov 2025 18:55:27 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 826EC43FF8; Wed, 5 Nov 2025 18:55:07 -0500 (EST) Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011034.outbound.protection.outlook.com [40.107.208.34]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id DA6A443FDE for ; Wed, 5 Nov 2025 18:55:01 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MN0PR12MB5859.namprd12.prod.outlook.com (2603:10b6:208:37a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Wed, 5 Nov 2025 23:54:57 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9275.015; Wed, 5 Nov 2025 23:54:57 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K0Ht7I7kDh53R/wxFlztcyit0UCagLodY2x1ROTO7FDfiym/0ERgYUwUrXOtZTvD4DuDa/NbrVoqfhkb8Dk5yGhg3s1zMwibPj7hELT8aWpN/IV0P8scUsvIQiU3Bu7uTppeF9au3QGZrNpQfW33FoszpChAXjqgg3wbIJzetAQmOrD+WtbbsaZsJLuHedIYDHwZOV6RD8ma+BZ1tobT44fTWEEGl0yg33Yzyoshj54ddeYfxpxvSA1/qSttGgO0ghsNXDTua8tok6GkPYSkLqrRq6+gsEZj+A6suUNaCR0Siy6YBWz4+5Le7imk0TLV8kfPy+/ksJrQ1ieyCDIudg== 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=qhK1MRYXlZSlw7RLgQb5JGUAIZXy5eYhynoY2c8Aa/o=; b=ljJ4O75JeeN50cuezB3P/6tfd4swMEnBNfRi3Wl4oEJyATa9uEm0p6Ly/ms4uGgdL2K4UVapqtneU+vZxNW0YJ0elXJG/eZ9YENR1K+wmG1WXHNv+0Rk3MDFXdJKNW7/GU3ZtaIqwWNJzn2kqzVtUaHZkserDc8b8sy+yEWB9L0+h5/NPOFVTXylRfiQOm5Q4olyky6O1D2PYRK6YCUoBjbj6U6IyUOh4J4BCuwbz3A+rCgCt93Q3hyfujKQ33uPpN+UgFtU7yAGlXJu0ToN9UNii2PXRIlRNunwS33vPaIhUtVuBFRLK1AJxY/6TuEX6kqwqasa+w1U69xdJeAWxg== 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=qhK1MRYXlZSlw7RLgQb5JGUAIZXy5eYhynoY2c8Aa/o=; b=CmNWelHiacJpwo9C0PEmQ8w8vDCRSKRWo/4aqaAcA681tZUxvZXWkzpkLiWl27p0IaQLMsMWIBysQ60KuoO8zXtT7TmsjTIGPmQwUdcLpVu/v3cnqOwJtAGS40MXpV8tBZIjBw4x6LAttIuKKWSkzgXyqeIar2ebfrVeHmaaImMYXolH9Uf5nxWUqoHbdo/QXAT8dBHipbPNBMclbdmlR/9b/GiE6Jsx857vye+q6TWXR95rQ+hgtrRGcwm7JABvENlQZRRXeFVhSa0RM/MF7B2grA6JZzLy964pin+O+hYKZD2zA0BUY2rpVOQ8Zg6tmFghfRr7exWCtFv+HavxGg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v3 2/3] qemu: Implement pluggable-device smmuv3 Date: Wed, 5 Nov 2025 15:54:38 -0800 Message-ID: <20251105235439.829536-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251105235439.829536-1-nathanc@nvidia.com> References: <20251105235439.829536-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0026.namprd03.prod.outlook.com (2603:10b6:a03:33a::31) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MN0PR12MB5859:EE_ X-MS-Office365-Filtering-Correlation-Id: f7a9921d-2a03-4c7d-69ff-08de1cc6b932 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?jxK4eAGQTEe06bMjOjzRITtAw70dT7RcbeJWoqzgyEKwTX3G0/rIr5FeSzgy?= =?us-ascii?Q?NFVJ2GasWYVTsDzoGZzn6VlBeN1NEO2vxh204ukA6Ra43BSKd6vFzLRybaI+?= =?us-ascii?Q?f35VnAPhmTu2AL2X+L6cK36lbOm0FHGIW8PXvAga6H3qkFfvaesIO0//2pqa?= =?us-ascii?Q?vUW+s7msqyZnVs8GD+S9Baiwr2zD2gw6wLooFvivP4/IPD0l/mUsrsm9JLGY?= =?us-ascii?Q?eIWhQYAtymnNGfG0CtQGEmsTb8H6AremWWEQOxxvgh3ww8f+MQzwOOSalpDk?= =?us-ascii?Q?b7+Mk9KN7L3ZR4bam36tmbOC+EI+Lj8VVBnkZO+6xcdAGkP+89zxdLxlFc9k?= =?us-ascii?Q?rT339IBGTHbKGTTFGmbxFQHp00XIiaMA+lk0EiD960Xl5G8vVGWHr/qUCxW+?= =?us-ascii?Q?S47zkvhAycteFAiWsiXhvIR5+hB2XRE0iV+YbCPhV/3UJPsBF1vlEVHHNnwC?= =?us-ascii?Q?9RHA0yNK8//5le3DbsUg8a/ZNsdvdkoLCKnv5CPvQWLu6r/Civr8yJg03GW2?= =?us-ascii?Q?SoUV8y8BuKFL85xCda/2vgtlZpATy/ltH6Gu3shcpx+8LSg9FxxEUk6taz8c?= =?us-ascii?Q?y9l1w8dhJc/mrIleWxjnsFVp3bwZ2w1NbjiplCSeQEyw02MparoJN9+rnNiA?= =?us-ascii?Q?sF3MJSv2NVSveejlXdks7NTnNLKDByscXrz+ijIm8+hmuU62f4minqTchOuo?= =?us-ascii?Q?Yd2TBtJ2fkkEtVJUB3OqK3+YiOHAq08SlrLyo5h7P2Zkmr0OHcSVEjBt3w+G?= =?us-ascii?Q?RyIpzo509QHQqHkqPaFEuBLRk/R3qi09sHi7Iwu6tql9qLuzZNoCRioa9ypi?= =?us-ascii?Q?zdtsgrrrzmIMFW5dxvsSIOLt8YgljCrShYmUBDYgeyuG9X80Q7RodCM3g8Fv?= =?us-ascii?Q?rIDKQITivncjnpNhUMkFve1gZxjjFfMiRY8dUwL9cOuzIRq+yPpRREMGAx9t?= =?us-ascii?Q?RXn4WZZqGtSVr8oASinlfD6slBdewh5e/hp4Z3yBeNAVIT3hGqUqFT5ejfA2?= =?us-ascii?Q?Gndp4qu3O5Jh8XqPcReG5TwNUtQWIl5X0QEqQ5xv/jKWwiFmyMyMG/M/Jjs4?= =?us-ascii?Q?Mr+uL3G+381eqiR4+LHJ/MtsEOvZ1pOku6EWapOKyAfKJGX0ajVcplDESsq8?= =?us-ascii?Q?vEoMBC/WgtjYZrrplK+j4u1w9kbp/fWarumqlVrrs1zS4hBXKI7Ga3l+1odI?= =?us-ascii?Q?HHRylkkAozhMgTL2zOgT5BbmdlpLUnvunMWeO/D32WDPpcuB/kiuB/5TU/zT?= =?us-ascii?Q?yau/XVHcfXQbWoausd0v3twr0uFrPJL0onljYEpdAtRdfuR++xReydqXCqrm?= =?us-ascii?Q?g2Iafd3f/xoQ74eYQTkQOUl/twj5XlvPyW5up+m85BYLDYBneCZNG/iZDNow?= =?us-ascii?Q?Vq6ki2BWTTNZIFZcZeitQZVtbpLDy+NPJfqjUl2wV296F+jareenFfs5PnwJ?= =?us-ascii?Q?6L9n5XY951T2oACR8kkpg7JRbHxXB4IF?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?FTsiHUh9W2m3NQP3tKCsmKzc87mWRoG5KUD+pzpD6h2WMK5DsDGg9ESXoCJy?= =?us-ascii?Q?xn8AzGh+qIh6TlAS+T8uJDIzFOxGBKivlGyiueFWEhFocajBF2q1iUGd4td3?= =?us-ascii?Q?LNyb+an32JK5DOaFcM9soHutEyNv1/6NZOpZRQ50m6WHsarOyjLmx8flHq2N?= =?us-ascii?Q?gPC/iN7eDAnfzQCEhQUaicKRs6xIBzSPrZhWatM5+vXJfBtvGmA2DCMGvSrg?= =?us-ascii?Q?+KYcAqb9jaLZ63VbHN+tMEqWcQE1oO89JupQSdM+F8cDcIER49qWW92gZKBK?= =?us-ascii?Q?H/oeewM34AU3CzQy4He8qJT1miOyVUICtEUtTnqydmPPh9Fww3ITiPeDn6iU?= =?us-ascii?Q?/qpdRG3tvGRttdOet/Q1+/7z7wutGPIag9XWkuE/i9/eEm94qczW11oP4R5T?= =?us-ascii?Q?TFRoS6HI4max2RgK0b77FAZbs4+8wW9nMoP0qiOz7+oTF8xXbyjMf34ilALx?= =?us-ascii?Q?2RWpvCq6CwoeJhgvvVwL/3u/q7Q9siHK81aMzPnqMu8K3IsDnIbX3AmsMpGO?= =?us-ascii?Q?gpnRsXjm1lO/gp4wIG1JDfe47TduxqiJ7MtfU0qKr5BHLkpss/MoCbBrrDcq?= =?us-ascii?Q?s9WTsjrZbaC6g7RVC301ju/RoumaSFb2lZCc+xLnwsvNIu9PAiQeXjUhb15Q?= =?us-ascii?Q?QMpgs38+MlUerfviiErOqijyfJAjRv6MxWS9zqXSNFtNpQkeDYgV4QMKwZlK?= =?us-ascii?Q?lKSrKe6lO+fbmn08zBhj4YuvdOdnVcqUYDIM2CmPxZp/QVD1P18Gm+BA00uV?= =?us-ascii?Q?FbKse5rpPYwezjXF4pe4pKaf44KzzKk0PY9zG7dZpQVGHvgVg5u+jLUVt+w0?= =?us-ascii?Q?wtRSswT+pAZrFZcn/0WgRNVN9iy2zvmvr4jnRdVcpEenD5e9vMRXYLLyH2QV?= =?us-ascii?Q?lJPBt+cim5CPLgph2ekZ03FlLlRMCBSk2f08k2WnwTvBm/+RHKSSily4PfQq?= =?us-ascii?Q?+VjboZFz/m0HrSgcGydoK2W9rFH9c3ZzG1rLyjgeo+VCmm/K9Hl9dx76vXKy?= =?us-ascii?Q?x1Y9bl+IQ791h/l9dYovyzGDvRoxAOAx2k0z5XPsaJd/GXUZy73UFNJBtIke?= =?us-ascii?Q?Ay7B3UBdelMcKll+Ur7+QW+KFJ/VUb96EmdNAwIZMPv6+SP0Uh7nGTMN4L6t?= =?us-ascii?Q?LKjC2J8T2CRA+9jJ2nrTpCexYPpycYZjMaxFcrUJ/xOkFAu7IGydd082TrPn?= =?us-ascii?Q?dvkMVF5iCj/RovY2Luhu2zA1SSuezqlGKeO5yKn48gIX/NdGAmDy41GFtxkh?= =?us-ascii?Q?vxicEYgOi6q0nyHyHwT7SYvwVIIZKTrCmtp8LidOnHL1LbmUtNv64/b6ibfn?= =?us-ascii?Q?boGjx9uRPzfEDWt9ALLcicC6omr86ad/G5sU25XCAMH2+ZRyddIITQGqxph7?= =?us-ascii?Q?BLGlvyp/QQMSv2X66PgFU8gHogiiLabiQZGPU5F2AMxp1a6fZyoEt7odQZ6e?= =?us-ascii?Q?4k70egMAsc+Yjp2XFEoYq4FymF0bdsk7vH/dU6X5LpK+YY1iZfzU0pB/eEQt?= =?us-ascii?Q?fIdimSE/8AWvW3yuW+yTyqlDH5VLooNfltgfyKfX8fKVQ5EgkQSjZijo9NBH?= =?us-ascii?Q?0ZvgdM4FmE2aojgpsalB9gGrcDNoL3hvmRtahU/e?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f7a9921d-2a03-4c7d-69ff-08de1cc6b932 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2025 23:54:57.2929 (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: zQMDDEpkc2OIJpFrRMM9Pp8pFa8fHZPotlPWEIIz6AJ5GzBA1/3tlNhH7x5tUcgjwlwHVbIcNDHehXoIKo/LYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB5859 Message-ID-Hash: ALYNDAV3T7OYH7O6V4QVGHL27JZI4SII X-Message-ID-Hash: ALYNDAV3T7OYH7O6V4QVGHL27JZI4SII X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1762387169474158500 Content-Type: text/plain; charset="utf-8" Introduce support for "pciBus" driver attribute for "smmuv3" IOMMU model. The "pciBus" attribute indicates the index of the controller that a smmuv3 IOMMU device is attached to, and differentiates the device-pluggable arm-smmuv3 model from the virt-machine-associated smmuv3 model. Signed-off-by: Nathan Chen Reviewed-by: J=C3=A1n Tomko --- docs/formatdomain.rst | 4 ++ src/conf/domain_conf.c | 16 +++++++ src/conf/domain_conf.h | 1 + src/conf/domain_validate.c | 28 ++++++++++-- src/conf/schemas/domaincommon.rng | 5 ++ src/qemu/qemu_command.c | 76 ++++++++++++++++++++++++++++--- 6 files changed, 121 insertions(+), 9 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 4c245f41a9..a181462d13 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9238,6 +9238,10 @@ Example: Enable x2APIC mode. Useful for higher number of guest CPUs. :since:`Since 11.5.0` (QEMU/KVM and ``amd`` model only) =20 + ``pciBus`` + The ``pciBus`` attribute notes the index of the controller that an + IOMMU device is attached to. (QEMU/KVM and ``smmuv3`` model only) + The ``virtio`` IOMMU devices can further have ``address`` element as descr= ibed in `Device addresses`_ (address has to by type of ``pci``). =20 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a587dbf3e1..f3c1b3996e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2815,6 +2815,8 @@ virDomainIOMMUDefNew(void) =20 iommu =3D g_new0(virDomainIOMMUDef, 1); =20 + iommu->pci_bus =3D -1; + return g_steal_pointer(&iommu); } =20 @@ -14497,6 +14499,10 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlo= pt, if (virXMLPropTristateSwitch(driver, "passthrough", VIR_XML_PROP_N= ONE, &iommu->pt) < 0) return NULL; + + if (virXMLPropInt(driver, "pciBus", 10, VIR_XML_PROP_NONE, + &iommu->pci_bus, -1) < 0) + return NULL; } =20 if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, @@ -22194,6 +22200,12 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= ef *src, dst->aw_bits, src->aw_bits); return false; } + if (src->pci_bus !=3D dst->pci_bus) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device pci_bus value '%1$d' = does not match source '%2$d'"), + dst->pci_bus, src->pci_bus); + return false; + } if (src->dma_translation !=3D dst->dma_translation) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target domain IOMMU device dma translation '%1$s= ' does not match source '%2$s'"), @@ -28525,6 +28537,10 @@ virDomainIOMMUDefFormat(virBuffer *buf, virBufferAsprintf(&driverAttrBuf, " xtsup=3D'%s'", virTristateSwitchTypeToString(iommu->xtsup)); } + if (iommu->pci_bus >=3D 0) { + virBufferAsprintf(&driverAttrBuf, " pciBus=3D'%d'", + iommu->pci_bus); + } =20 virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f44e275270..4cf05d54e8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3055,6 +3055,7 @@ struct _virDomainIOMMUDef { virTristateSwitch eim; virTristateSwitch iotlb; unsigned int aw_bits; + int pci_bus; virDomainDeviceInfo info; virTristateSwitch dma_translation; virTristateSwitch xtsup; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 9fae071975..7f9d2c2fb6 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -1865,6 +1865,11 @@ virDomainDefIOMMUValidate(const virDomainDef *def) _("IOMMU model smmuv3 must be specified for mul= tiple IOMMU definitions")); } =20 + if (def->niommus > 1 && iommu->pci_bus < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("device-pluggable IOMMU with pciBus attribute= 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", @@ -3119,13 +3124,28 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *= iommu) { switch (iommu->model) { case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->aw_bits !=3D 0 || + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virReportError(VIR_ERR_XML_ERROR, + _("iommu model '%1$s' doesn't support some addi= tional attributes"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + break; case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (iommu->intremap !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->iotlb !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || - iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support additiona= l attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3137,7 +3157,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) if (iommu->caching_mode !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->eim !=3D VIR_TRISTATE_SWITCH_ABSENT || iommu->aw_bits !=3D 0 || - iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->dma_translation !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3147,7 +3168,8 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *io= mmu) =20 case VIR_DOMAIN_IOMMU_MODEL_INTEL: if (iommu->pt !=3D VIR_TRISTATE_SWITCH_ABSENT || - iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT) { + iommu->xtsup !=3D VIR_TRISTATE_SWITCH_ABSENT || + iommu->pci_bus >=3D 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some addi= tional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index ae3fa95904..9afc679258 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6322,6 +6322,11 @@ + + + + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 97fe4267ec..ad749afc41 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6239,6 +6239,62 @@ qemuBuildBootCommandLine(virCommand *cmd, } =20 =20 +static virJSONValue * +qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def, + const virDomainIOMMUDef *iommu, + size_t id) +{ + g_autoptr(virJSONValue) props =3D NULL; + g_autofree char *bus =3D NULL; + g_autofree char *smmuv3_id =3D NULL; + size_t i; + + for (i =3D 0; i < def->ncontrollers; i++) { + virDomainControllerDef *cont =3D def->controllers[i]; + if (cont->idx =3D=3D iommu->pci_bus) { + if (cont->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + const char *alias =3D cont->info.alias; + + if (!alias) + return NULL; + + if (virDomainDeviceAliasIsUserAlias(alias)) { + if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PCI= _ROOT && + iommu->pci_bus =3D=3D 0) { + if (qemuDomainSupportsPCIMultibus(def)) + bus =3D g_strdup("pci.0"); + else + bus =3D g_strdup("pci"); + } else if (cont->model =3D=3D VIR_DOMAIN_CONTROLLER_MO= DEL_PCIE_ROOT) { + bus =3D g_strdup("pcie.0"); + } + } else { + bus =3D g_strdup(alias); + } + break; + } + } + } + + if (!bus) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not find a suitable controller for smmuv3= .")); + return NULL; + } + + smmuv3_id =3D g_strdup_printf("smmuv3.%zu", id); + + if (virJSONValueObjectAdd(&props, + "s:driver", "arm-smmuv3", + "s:primary-bus", bus, + "s:id", smmuv3_id, + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +} + + static int qemuBuildIOMMUCommandLine(virCommand *cmd, const virDomainDef *def, @@ -6286,9 +6342,6 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, return -1; =20 return 0; - case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: - /* There is no -device for SMMUv3, so nothing to be done here = */ - return 0; =20 case VIR_DOMAIN_IOMMU_MODEL_AMD: if (virJSONValueObjectAdd(&wrapperProps, @@ -6318,6 +6371,17 @@ qemuBuildIOMMUCommandLine(virCommand *cmd, =20 return 0; =20 + case VIR_DOMAIN_IOMMU_MODEL_SMMUV3: + if (iommu->pci_bus >=3D 0) { + if (!(props =3D qemuBuildPCINestedSmmuv3DevProps(def, iomm= u, i))) + return -1; + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qe= muCaps) < 0) + return -1; + break; + } else { + return 0; + } + case VIR_DOMAIN_IOMMU_MODEL_LAST: default: virReportEnumRangeError(virDomainIOMMUModel, iommu->model); @@ -10822,15 +10886,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 --=20 2.43.0 From nobody Fri Nov 21 10:01:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1762387240984188.54947828823333; Wed, 5 Nov 2025 16:00:40 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id BAF7B43FDE; Wed, 5 Nov 2025 19:00:38 -0500 (EST) Received: from [172.19.199.29] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id F1A3544136; Wed, 5 Nov 2025 18:55:31 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id C81E943FF0; Wed, 5 Nov 2025 18:55:08 -0500 (EST) Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011034.outbound.protection.outlook.com [40.107.208.34]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 6C68B43FF4 for ; Wed, 5 Nov 2025 18:55:02 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MN0PR12MB5859.namprd12.prod.outlook.com (2603:10b6:208:37a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Wed, 5 Nov 2025 23:55:00 +0000 Received: from PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb]) by PH7PR12MB6834.namprd12.prod.outlook.com ([fe80::f432:162b:b94e:d2cb%6]) with mapi id 15.20.9275.015; Wed, 5 Nov 2025 23:55:00 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mI6gZ1NPAY1RImya/8MLazxac7IzKrWjOSzDgtKez4qoV3IrSJzlQ5b76BkbQW1YfqH+kVDwC3pz+PvGJBRJw4nhzW6s0TKxp9DnHE4tLJKoXbKalj5zD9ZVooTweCt2cHCytzgVylEUmn+HbJ9Qh/NRNGXYI2JHHbuFCimLiXkO//WB5qmfQhl8gkAdhFDQZdu3OUoFefqPDDt7SUTkwiitSWjyDM1UB9xzDHFDoLV4E1q6hAHuRqg2pZxZKHszunx+M2a/3s5wvrPdU0hpbXQElx5ULugXrRkohnjSnGNBGZxgW+0OcwxkWh3mFhbVYIy4aEV30wDpwgK450Wj5w== 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=D9C5unuY16JUMxiFF9OX1nfqoN6t0kZBDezZIWW81Tk=; b=Y0LSJn8+yrmHPFLBmW1X7PiMTnHLZjNM8HMyrAHXPHib0EFJps9SKwYC8x7L8LiunN+EZ8Dk5bp3VW5UXq1h4gbTQihfMR36NZki+UrUj65fQoSI8axnKLQpInkZvzQHYptjVIrP2u7jJiIyJY54degi1pgyrYWOwCRsW9ZySgSDYqjM27Axa9EfJ+KxsZ0peX2O+g9/YApx9avHuHpMWwSIYPwasRgTg8254ajRv0aYXT+OmcBGEm8FryPgVZy9gu+sH8BRUYcJfGUVnq+aT/es6rAnZLhMK8U/5wX+sy7cWwtS376MDdwBmKp4EdZvx7WF7OJzxKsNakFP796SoA== 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=D9C5unuY16JUMxiFF9OX1nfqoN6t0kZBDezZIWW81Tk=; b=EQIrQOG2gB/nxhnSsvIIhw8GYMfhnA+soz6xeUT709eG56Up1YyxS+WnydWp/KcYYuisZqiF/c1unQEEzCh6vhxYC7PqpteWyHz435WbbTQze4eZASbatYmlBeuFOpnEELKzybYphY4uDPe1Kysfd9vkNTS3/luahjifmHtbw1sulLqgPy6/kvo6Ff8+7ge8rGIJMGJULw9AD2wYhr6N0SyOQ9XPiwLKeYLA2VOEcNSIgaS3M9nwfJzHNLNKLA3viqxkcjGe0KDjnI58wJXvM92ZKBLelaNvY8S6f9sTYCd/2Jxjke8T/B2NfjqhBjkHPBpzGOpmTxFDvraQM1TKpQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v3 3/3] tests: qemuxmlconfdata: provide device-pluggable smmuv3 sample XML and CLI args Date: Wed, 5 Nov 2025 15:54:39 -0800 Message-ID: <20251105235439.829536-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251105235439.829536-1-nathanc@nvidia.com> References: <20251105235439.829536-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0022.namprd03.prod.outlook.com (2603:10b6:a03:33a::27) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MN0PR12MB5859:EE_ X-MS-Office365-Filtering-Correlation-Id: f018d722-5339-49ff-3cce-08de1cc6badf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?NTjUN1PHPlpBgrlO020gwixr58UTcL1sQEKIbp2B9AUe0HIPN7KpZ1vQQox/?= =?us-ascii?Q?i6Y1z1VBl4DzCmjHzILVBn8zd+q0PqQilDkLD5OZuyYOwTmz5VNlK/FKaA75?= =?us-ascii?Q?ZtkhU0kAZV4qou5h6aDYnC65DHqcyDk6MMh/Onfrhgq5t9swgneHqt7ZcBn0?= =?us-ascii?Q?0J6lofoW9yi61T84GtIagMdRaPnxUbgOiTmTmSogJXAKd5uu96LDQUI8wCOt?= =?us-ascii?Q?jcYar93mRPKrAgeZEfBFt2XiBYOkRMOmqscLEpLHLNl2GCqD0/pC36d1leVX?= =?us-ascii?Q?8+lkQhfLl14FjnHIIVNP0tsRRx3dpwZYnHgRqGtWGm1ic1Z0F1y7BiwbkHdo?= =?us-ascii?Q?UL15SVEMZ6+wPQzzCv288Z7Y6E034g1jVgc4+uLgcZFNUEz46RmtPm61L87O?= =?us-ascii?Q?yQfp/K9p5gthoZl5JtZ3VHGSCbAaZAZTsjEniWMP5HXwVy2CzxJHfQo5fBV5?= =?us-ascii?Q?iL8hqjxOnt90xYVhL2Kjyj52SfeD2T7TItY+eAhgq7hpNGYMhV191CQGRmZ5?= =?us-ascii?Q?worZ8gstna2mEEnfW1y43KzA2sNFvoVRN+OAF+8l8y4y1YyYmh6W4eIXsKV5?= =?us-ascii?Q?1lwGxUn5aBnSK7DdaENpP+8+PeuLihnK9rB0xonNOawiE4PK54PPpiN+wzWd?= =?us-ascii?Q?2hR7uHLk7Rsl3vnuRCqEdTxt1vM4a0i4U2u7Z0DEn6XTWhUlSEOLozp9+dKB?= =?us-ascii?Q?VqWCboS7I/OcY2vX+lHF1c+tEGvr+WdOUjGAt/gWKO8GhzbMwz6Dh1z6olDi?= =?us-ascii?Q?sPQoBqiiFHpPH9MmyI5QpDCflzB61HD52I8w0Hvkee82kYTxQrdvUhHHfqA0?= =?us-ascii?Q?c/iOGrbU7Sb3AtQ9H7KDnAb/JNpICesjfEgNJOKm88IprUH9I4tvImnK1CGK?= =?us-ascii?Q?7wnBTcTeQDvOp86nrm+AL6P3nuNX3UmJB060jODocO0tRgV8/RWWfj+2nXEn?= =?us-ascii?Q?3lW3XaeTjB1pg1p1lt3o+wn4PBq3m9w7T6EpWE2ZZsBStbwrxe7Ok7DDMJQH?= =?us-ascii?Q?L6ApFdQG68nOPdwlNJ/1eyT8bkmgTsaLr6xMPO69dZMd6xJ8exzr4jI1CkpS?= =?us-ascii?Q?zt01jVPIhxw5RG0nDXJRo4j5sowb2+JpkQuv92IslQ3SBxrnGNdSGXuOIwxA?= =?us-ascii?Q?SAEgdqPdnoA9pn0upM8oUKeemDVB08vyG7vX80KjmNPLE4Br2rn+rtftuuKU?= =?us-ascii?Q?sV+2nuFj8BZ+jb9hhhpkuPSnb1/Dsj2FdFfuG1BimItxIxZHW5UR8WrIANPi?= =?us-ascii?Q?K7ZmcEL5mBXcccTTwTNzFxKeGjSjp+sk2/vI8/VyM+vFiaG2eCsjIUII4QhU?= =?us-ascii?Q?1KnnogD6D1sO13B9HVKn0BeyTNlCjOzXj/S2yPR81rtRchXcRaJbYJ87DBeV?= =?us-ascii?Q?JDDis6onAjjxJkFQol1ijDLruD4dKZbxsePodFHmfABWpogGCtv7nw0fCL+x?= =?us-ascii?Q?HAadeGfN4npGibGO/5+spvv5NHn/CmKe?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH7PR12MB6834.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?PwJTuUYLEdVqW29v/5SvUbfXvcPi9WbmzuRbe5SRbKnnbmRV0PKNjGgECb1a?= =?us-ascii?Q?tJonLolAH9w5hiqWqYmECYD8IItVKZe5v9oUqIHjx1Xbix2ZFzy5LTTi/RqT?= =?us-ascii?Q?e7/D85sxbZ7xWvG/2nwSPfK1FoHvwTSGtQNYBLx/ucQdfUteBu07Nnf8SA4k?= =?us-ascii?Q?0K0pRiXzrJ74ILmYLQpsolfmjXg+lrflJR/Gy1KvTx75r7zBo5+bSYxvxkwG?= =?us-ascii?Q?KTmSHHYKy/LfpEoF4efJmLlAw27o6JPbdwS77LeKN19+UMQ8i+7qgaoJU8n+?= =?us-ascii?Q?B/AUC6sGR9f3JnmI7sTPMbkGdW1Q05f32rT1O37LbwaNPT5RUF8G+jvyzVzp?= =?us-ascii?Q?Ajx/9iprujolg6umGZJjcT6Yzpykfy6FroelBNt9R9gue/GgtJPe92k1Hu0E?= =?us-ascii?Q?Kd7nP/Da/HDqIv4YzZuusZYKdBJTI9H8824TZKKBLPDPXuCazVj0v32+cuQX?= =?us-ascii?Q?LyoUdjuP8BBCIqxwwxsYrZSEnD2Smv4CCRVBsCE39GRd9PgdULQB/dqmhj1N?= =?us-ascii?Q?je2cwlQyGUct46MwlOPMyzT9QgNLeB2cO3FhlSy+thY9J69RTDbEKXufG58S?= =?us-ascii?Q?3/PVOM6hAgRiYzIs3jChSzXQNhMmPIIC/PFqgPdwZEsFQOs9TCzu+fxeW9Yf?= =?us-ascii?Q?wBezKUg7RUqcTECF95Duv3zhapjrciLaEG5r2DDUYuqzYZxoCT5tmeQb7yjH?= =?us-ascii?Q?KKZRfMRuN3YfdmKNRh17a2ODytb7bmfUResFofY/QvMTrZLR8I8jxDXbln4T?= =?us-ascii?Q?K2eQ4TTh0jb5wGv++XG9qygxzr5hy/1iNzg5p0AjkBXyYYZ6R4oul/eELZTM?= =?us-ascii?Q?qJgLTAorCGNZtmhIh4BbG7Fc/LmVZQgsyW2zPwX9+5s1UslpdqpcC0BcY3sz?= =?us-ascii?Q?H4IpIYfM1a1k6sGsWC5JdkdQyPxBzgyINTm1RF7gb6VKADWOWc4IBppncJgL?= =?us-ascii?Q?cmcvuZmlKV8Q3pfsmhGgKjktAJVhpnP9yDYCgvF/mkfAOcd7REbOx+oJKPrw?= =?us-ascii?Q?15m/HgEMNhTu+JhWjxXSsaxmfgOkRzmeUACE97tbBv+KrQasivkPgT6iDoXS?= =?us-ascii?Q?b2rcZ6qwSFf4WwiG8lYUiWcMT2PLjeE8Laj4km0SP9RZT8YIOxR9I1nXHeVm?= =?us-ascii?Q?Na3AcM/UdagdAS5RdI/3Rdo1LHwtEIuPIVavf5+kcGTp33ZKZQcIcmzxWrCx?= =?us-ascii?Q?crrUBwEQgla0q3kJtxVRfF0KWCe4Gn16kcYpBFkcXeiN3wocYsIxDGXgVKEt?= =?us-ascii?Q?rvRT7/yJDKZnzkd+2SSczVZXzNUfL8CVtZOjBPXy1M1RsqHLuG8+BCOYLeke?= =?us-ascii?Q?p6LKCKXgHyBEGOl2YjoRfmxrGjOg7Qk/OLArVeyyBtizXgUhuPbsud2u9xeN?= =?us-ascii?Q?yMmolxlf2jnDv/rZNbh6m6HYTVYYaaIqOM+ydr8cf2GniVM5fREWIj4Ofwtp?= =?us-ascii?Q?KvOlOzumWxYbFUZ3KKFPckSex/Wny5ncjtE8QQHnrecDC6u6N1wkE+16c5gy?= =?us-ascii?Q?pQ2SsX8n7upwMpI0szH1c5b5XrAKQya0RDP2BXRHzFRRVc8c/KZdv26ie0Lh?= =?us-ascii?Q?u4jZiUwAXoCeenZKKS6ryotm48uDFV/PNeobnoYi?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f018d722-5339-49ff-3cce-08de1cc6badf X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2025 23:55:00.0885 (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: XBe8V0KByqi1spBaZ6H7WR/SsyWt2QEGL47BzzcosyGWCHmFrKWlQumKv1gKOuc0Dh4wHkyRJ0dOfWANT5DoYw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB5859 Message-ID-Hash: YVK3DSOJNLCNDYX3STIKLD7WSOLKUO34 X-Message-ID-Hash: YVK3DSOJNLCNDYX3STIKLD7WSOLKUO34 X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1762387243471154101 Content-Type: text/plain; charset="utf-8" Provide sample XML and CLI args for the device-pluggable smmuv3 XML schema for virt machine type. Signed-off-by: Nathan Chen Reviewed-by: J=C3=A1n Tomko --- .../iommu-smmuv3-pci-bus.aarch64-latest.args | 41 ++++++++++++ .../iommu-smmuv3-pci-bus.aarch64-latest.xml | 62 +++++++++++++++++++ .../qemuxmlconfdata/iommu-smmuv3-pci-bus.xml | 49 +++++++++++++++ tests/qemuxmlconftest.c | 1 + 4 files changed, 153 insertions(+) create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-late= st.args create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-late= st.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.xml diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args= b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args new file mode 100644 index 0000000000..092fcf4623 --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-guest \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-guest/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-guest/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-guest/.config \ +/usr/bin/qemu-system-aarch64 \ +-name guest=3Dguest,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \ +-machine virt,usb=3Doff,gic-version=3D2,dump-guest-core=3Doff,memory-backe= nd=3Dmach-virt.ram,acpi=3Doff \ +-accel tcg \ +-cpu cortex-a15 \ +-m size=3D1048576k \ +-object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073= 741824}' \ +-overcommit mem-lock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-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":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","ad= dr":"0x1"}' \ +-device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","ad= dr":"0x2"}' \ +-device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bu= s":"pci.1","addr":"0x0"}' \ +-device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","= bus":"pci.2","addr":"0x0"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"smmuv3.0"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"smmuv3.1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"= }' \ +-device '{"driver":"virtio-rng-pci","rng":"objrng0","id":"rng0","bus":"pci= .3","addr":"0x0"}' \ +-object '{"qom-type":"rng-random","id":"objrng1","filename":"/dev/urandom"= }' \ +-device '{"driver":"virtio-rng-pci","rng":"objrng1","id":"rng1","bus":"pci= .4","addr":"0x0"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.xml = b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.xml new file mode 100644 index 0000000000..c0618c02ab --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus.aarch64-latest.xml @@ -0,0 +1,62 @@ + + guest + 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 + 1048576 + 1048576 + 1 + + hvm + + + + + + + cortex-a15 + + + destroy + restart + destroy + + /usr/bin/qemu-system-aarch64 + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +