From nobody Fri Dec 12 12:55:01 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 1764098388615361.4897270948385; Tue, 25 Nov 2025 11:19:48 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 99D7C44B0C; Tue, 25 Nov 2025 14:19:47 -0500 (EST) Received: from [172.19.199.68] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 3822B44B96; Tue, 25 Nov 2025 14:17:31 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 3605E44964; Tue, 25 Nov 2025 14:17:17 -0500 (EST) Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012028.outbound.protection.outlook.com [40.107.209.28]) (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 996074495C for ; Tue, 25 Nov 2025 14:17:14 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MW6PR12MB9000.namprd12.prod.outlook.com (2603:10b6:303:24b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Tue, 25 Nov 2025 19:17:07 +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.9343.016; Tue, 25 Nov 2025 19:17:07 +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=HTosy31MtnMnOGr+U9LcMaSRr1fzxJrCyosMdC1vt/MpM+0Atjfiwdm+LM9z3mWpoehfrR8VF9CrzGFotlLjxhssO2fsFuBklTxq88p24Zx5MrnEbeoyGxjI+uY8fyLLDVBcG428bG+42J3ulh5B2KNq835HSbZ2zJXD2sPnRaKHp3bH+awqNOque9ai000qgz2SWWJj+sOyYJ2DYSyiBmQqLYBrkf0c5q74J6M6FSeoLKNIkjEKC2XrbLcxBHGbS75LsAU3tBwDi1wHUEABle/ESfqms1ys0GVKcaz0/Oe75t9tzn/hWPTtYplDOgk2bhTbazDLeRs/FphnZ1HsXA== 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=+Am1M50MWokdH+PagMbywP/QN+duahZlwmrhEpuUUQA=; b=RNAn4qYIWUcLEgxxpMreDV3eoAiUSJLBOuvH8tPk3s9VYpdUruvGec0Peb0wWKWOg/zutKjND6uFYaNshhPPgTg5Z57n43NFZY6DVpjLZz7Lkje8OaX46b8roGetIvgdwYJSHlM531DgUwlNgRJrlVsWGlCHMjVGRb+gSeULPEIXF6SkrY9xlWI+DJ8g32xkJgQh70/7Vv9Kc0fZcIfyINygf57SrzcYjgZp8bhknHXH3eNUK4TxDNf0U7vXCUIInql6UOX0fsr9lwaB1CHKmrSDOJMH9JE53W2Wb1vq9npEPlFCgZiRU/i8I7vKyBHIa+lEybnzx+txdyu27w86GQ== 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=+Am1M50MWokdH+PagMbywP/QN+duahZlwmrhEpuUUQA=; b=ooiCN6uBsWjf0lXykap8Yy5WE6IjkpVJBNVMcebBnzWD2EHTRwR7lXosjWwbmyE8qLJE0EeXewBSNSFBH8vJV2I9bd1MkF/hdcflp8o7b6zYaXFsCehlSFw59bX/iyR4qoUGhtwHhN6bhK4QuVpl3ywrf09/AQ2eubR50ERUTBYDePdKzF/aW/+8+fOS+Elo7DU0LTXocCPNngi10nTuQHSO4TcheINmDe3by2rxTEoOVGFMhgm0le27rltd8AC3F0zIfnMb0auMMF5sTuIDaGw1s+HX5S0lBlF3T9qAsUOm9doXo7wJHz7i69Qfhjg8jYBn1lin3X2T7RHI3tr9IQ== 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 v3 1/4] conf: Support EGM memory device model Date: Tue, 25 Nov 2025 11:17:01 -0800 Message-ID: <20251125191704.644477-2-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251125191704.644477-1-nathanc@nvidia.com> References: <20251125191704.644477-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH3PEPF000040A1.namprd05.prod.outlook.com (2603:10b6:518:1::52) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MW6PR12MB9000:EE_ X-MS-Office365-Filtering-Correlation-Id: 4625f1f9-d1b0-493b-5889-08de2c573954 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mGEgzzwDNvQ0So0UXVZOjN/2UZBdu+ks2lRM2b9p1gU4du8aaSQmc6+BPwji?= =?us-ascii?Q?mZ67EOfWqv4g5prbuxmVNPQPtOznk4yQl3NSN25L2gGIjLliT//hbWEki14p?= =?us-ascii?Q?Y/yqCLYR9mAdG2FPxgn86XKT2R2E+BAkOYhcSiZKuRZXu4L3f2GfwWH0xio3?= =?us-ascii?Q?1sI7A6Ry2LwRCmTLXMKN3EsihzDlNFU52ZjnPuUncS8A/BxXX48T4SDZKBHT?= =?us-ascii?Q?qwpTNOBwFXSSnGvS3/6m7ojmidJUw0/svkx5XaKwqE7MEehQd7nJPKuXHDsL?= =?us-ascii?Q?m1ooCsiUgD6IeSWFlx841QbcFFa7+GhQQOoOknykWlx7qHBrxgogpcbcyNZl?= =?us-ascii?Q?TTy/5BM/pARN6uCbDGEpQdCQcZkqntW9fBQc5Ab8P/TPQMJxPz47rVeF7NYH?= =?us-ascii?Q?GnwBoc3APGqNUaIzL43TD57aUZ/P15GBhaZu9MvJswau6H+wHmTrPPg7NMTR?= =?us-ascii?Q?cr0ZDS/iXIIgfUZe7fAskFLpvwz9FrEVunuEeC/8mP6wiKGXzcLYY5FMkCOq?= =?us-ascii?Q?gqTbgbo8M54PB2hyJCMX4Vh/h5Bimb6tcSZYDylhrooHxHXhEhMZoUq2jq0A?= =?us-ascii?Q?Blc0jYmGm/riKHTT5yM7UakQWexp6ANrhdFrySsn0CLuhq8OKSXnHZZsfLrA?= =?us-ascii?Q?47UMG0H2bIqaAgI2uwtEB0ri86ThDL3sHDYci0F3yRzcbWFgNpCJzi2S2jsl?= =?us-ascii?Q?7YpsQJAFmYEaGA5SN/Byhb0rSIVmtX7hmbUICSpizyEkdkCigZFxKYoMm4Lc?= =?us-ascii?Q?VlMnkIYMl4PRVioT67Kk+cec3I5zsTFqsHNjArbuM+tkXMtiR7pSDuIgRTlu?= =?us-ascii?Q?uglfUlHQMbAi5DpaIZTlt6Emi9yg92OHnq3yaKCNranSzuPPIdm3gT1ysbr7?= =?us-ascii?Q?bKB5syUqzpWsggN9BCUj32gDHiJilbideDCOViDkk54wbL7qrclKDven7TJf?= =?us-ascii?Q?OVmtsGoRyk1rzVMgQWB6R2Jvo55o5nPX6yAL6j82nbsX8ZbNnD/A4xQPZPKK?= =?us-ascii?Q?d5XFIAitWUPEBEGQWt3aOFR7v3l6HqGK/4MA3DS5dy2dSdXIYPNqqaLtLLak?= =?us-ascii?Q?N5GILf03ZF67vIwzlwL1F3+gbmcPOvYluCSSvt3qi6HZQ9y++Rn2/+wwoVci?= =?us-ascii?Q?WSBl1FcxNycM9/vSpY0/fqzFR6bBD5fLbsO+Kz0G52yrtFCDNTGto3AIiaHr?= =?us-ascii?Q?PDo5sdAnnhyPp6EktdhvxI3TMjNx/ZyWD5ulG2nMTB+tMF4af60/IQaXG993?= =?us-ascii?Q?I2gZse8SeX1cR5StAYug9HDxpNIrsEhCX22IYHS9fdLfc/KYFAta/eiReWwT?= =?us-ascii?Q?A6zvtG1CZ708/YHddq7+7W3f7AY2+ExtwI13tgZgsWaeLkFNvqJaME+hj6tj?= =?us-ascii?Q?kwe45P60Orym0xdCvHuoZt7+Cde/CUaznsE+FJka43bW72coVub7dRLlYmU4?= =?us-ascii?Q?N43YLY9sgrgifQeNqsIW9LemDumqiIex?= 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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vK79TNksczenXkflFm/nr6JGjXCK2pjSTlurK8bIfBNVXyIt8CTz9YDe21nv?= =?us-ascii?Q?PaJtJorchTUJJJjXmTBCnUNTbBsdy2FzwK2I2UnYbfHLoWhwMvxO4F/sQE2k?= =?us-ascii?Q?Stx0W1zV6psV12w+A246Vk0bWDdr8r5sCSt4tbNnhKlDe1AfXnn6sH/aACKg?= =?us-ascii?Q?8a3h1ESyUgPJ2pFUYRiC8CPAFH95Yb6UY/rphxoEoTBt7mhwy52sMlUi5ecH?= =?us-ascii?Q?i1iN5UPT6ZGfATCF5Fsf0ykr1L0TKXKpNmhe/NJgXpMtP5UsPzTo9cOXGUk/?= =?us-ascii?Q?yf4FfZkVP10BjdEShlzv+ZOQ+wB+w1piL8/GRX8cT6hqZiRcNYsylUKoMEyX?= =?us-ascii?Q?9XQiwZ241EC9q82WIjdkXVkapQJd284nl4nKtYTHryf4kYP2tBliv6510JNE?= =?us-ascii?Q?5hEB+cT1WfL7GO2dlpUlcc+paGHveuenzTWL3gplvTh70zs7CNW9zoGBeOim?= =?us-ascii?Q?99Mky6cwMspTbdOs6dW+2oysqDKUEZx3yOO3tsvgr7SC8knKeWNkYu+eS7TW?= =?us-ascii?Q?T1QNqOxoGcrkEqHgEtRDm+u8GJDAoyub6XDJpvOuiBuy5SMSwcmueyndLq2F?= =?us-ascii?Q?UCUMKt39Ay69CCAqeFXIZ7nq0ul5xcKp6WgkVWWAGTv99lzTWXgIRmgJ57u4?= =?us-ascii?Q?ty+V9p5aHaZcIkLjNeMCvfC9X0M8e8efK6JycRnHD4MAaWR0T0Nirf66Mmbp?= =?us-ascii?Q?egtwQ6xTUSSgQ3VPOOyV/OUtgwmT9DihYqbdRgsnHdjgiORSq8SVXKXdO940?= =?us-ascii?Q?Z5k85OjqAnrQwAHtESxr2DfajpzzLmOBscskEvLLBv5sevxxEdXJebEo45cv?= =?us-ascii?Q?fUf2ezkHZY50Z9hUrp80eJN0UaRAqOo7gnvx6ZZjHOUqEm2XJ+P+jPFpg7dE?= =?us-ascii?Q?m1ptgQJHocLJVLvgaT2FYARklDK6/paaHHKZ4nwxas9wtOilT2N9FX9teZNi?= =?us-ascii?Q?AA7hg04z+xyZAGEqUIv7avBD7vRG7M1e9jhjFWK9PivJSbQwONW5wQyyWmiF?= =?us-ascii?Q?T5cmCUCsO0hh4z7cW+y/N8XGOxt5Djsr1m+d0D7PxRuJlQBHeeuiSGkR75xJ?= =?us-ascii?Q?dF+VtahmAXcVHAKRLaJPMZwcPrBc4QC3uik8HrOQD7HvwfgFnvyRN+IlicJ0?= =?us-ascii?Q?1pQNRFfefmMspagvtYp1SY6vdSJNRG+0Vh5w75L0KGcFEOC3VlJ8dq7KfuD+?= =?us-ascii?Q?wUbr5sfQQtb4r6oUdxVJKKUWw0d3jY2Y2CmJrVjvqltbsJrLJag7zvgo75R6?= =?us-ascii?Q?vlByUa1+SQ7jicMJhcdalm+TnqGu+km0N16Rrk3dlzPFvjyQeenfvamdgPb6?= =?us-ascii?Q?w+LXXNMWZa58ZSs8awHw55hWItm0LjHDk77TMgyptXbM9n8arjtPFI+J6EyL?= =?us-ascii?Q?I99RG6WJ4EoxoHtF5CSlAeDUhkTy9iJqBwGKcIobr0P7IWY1JnbSHhK0Fmfe?= =?us-ascii?Q?PdMoyjTn9G501CXyIpirZATCBNPUbqp2GAAdHmGSC2ZJO+6oJrSJ4A12QCjl?= =?us-ascii?Q?Y+erEp6G+FWUl68w0HsyFBdvCgw1+tHaCY8uvjBQy8986vqJQ+SOMmtnHh8z?= =?us-ascii?Q?6/iai8YTpnklEoh7NtGIBBT9QyIuUH8aEZ6qiLAZ?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4625f1f9-d1b0-493b-5889-08de2c573954 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 19:17:06.9805 (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: eyKJreuvA4aCNZFv1DFM3nB+hW56AGM0v9ISAZRYREzNjOvr58kwhuQ+VTZqY8juQcpRCzdF/asQpcPuvO5cmg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB9000 Message-ID-Hash: PJ5AUVIBMQ2FW3LXTSAJAXEHEU6I77HR X-Message-ID-Hash: PJ5AUVIBMQ2FW3LXTSAJAXEHEU6I77HR 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: 1764098390460019100 Content-Type: text/plain; charset="utf-8" Add support for EGM memory device model with 'path' source attribute and 'pciDev' target attribute to denote host EGM device backing path and PCI device alias to associate the vEGM with, respectively. Signed-off-by: Nathan Chen --- docs/formatdomain.rst | 18 +++++++++++++++++- src/conf/domain_conf.c | 29 +++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++++ src/conf/domain_postparse.c | 1 + src/conf/domain_validate.c | 15 +++++++++++++++ src/conf/schemas/domaincommon.rng | 6 ++++++ 6 files changed, 75 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 1467fc7e10..56fa931747 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9029,6 +9029,16 @@ Example: usage of the memory devices 16384 + + + /dev/egm0 + + + 524288 + 0 + ua-hostdev0 + + ... =20 @@ -9040,7 +9050,8 @@ Example: usage of the memory devices persistent memory device. :since:`Since 7.1.0` Provide ``virtio-mem`` m= odel to add paravirtualized memory device. :since:`Since 7.9.0` Provide ``sgx-epc`` model to add a SGX enclave page cache (EPC) memory to the g= uest. - :since:`Since 8.10.0 and QEMU 7.0.0` + :since:`Since 8.10.0 and QEMU 7.0.0` Provide ``egm`` model to add a EGM + (Extended GPU Memory) device. =20 ``access`` An optional attribute ``access`` ( :since:`since 3.2.0` ) that provides @@ -9175,6 +9186,11 @@ Example: usage of the memory devices The physical address in memory, where device is mapped. :since:`Since 9.4.0` =20 + ``pciDev`` + For ``egm`` only. + The PCI device that is enabled to access the system memory via + association with the EGM device. + =20 IOMMU devices ~~~~~~~~~~~~~ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 541dad5bdc..2cda32fa6e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1522,6 +1522,7 @@ VIR_ENUM_IMPL(virDomainMemoryModel, "virtio-pmem", "virtio-mem", "sgx-epc", + "egm", ); =20 VIR_ENUM_IMPL(virDomainShmemModel, @@ -3611,6 +3612,9 @@ void virDomainMemoryDefFree(virDomainMemoryDef *def) case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: virBitmapFree(def->source.sgx_epc.nodes); break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + g_free(def->source.egm.path); + g_free(def->target.egm.pciDev); case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -14084,6 +14088,10 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node, } break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + def->source.egm.path =3D virXPathString("string(./path)", ctxt); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -14160,6 +14168,10 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, addr =3D &def->target.virtio_pmem.address; break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + def->target.egm.pciDev =3D virXPathString("string(./pciDev)", ctxt= ); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: @@ -14381,6 +14393,7 @@ virDomainMemoryIsVirtioModel(const virDomainMemoryD= ef *def) case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; } @@ -16247,6 +16260,12 @@ virDomainMemoryFindByDefInternal(virDomainDef *def, continue; break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (STRNEQ(tmp->source.egm.path, mem->source.egm.path)) + continue; + if (STRNEQ(tmp->target.egm.pciDev, mem->target.egm.pciDev)) + continue; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -22196,6 +22215,7 @@ virDomainMemoryDefCheckABIStability(virDomainMemory= Def *src, =20 case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -26700,6 +26720,10 @@ virDomainMemorySourceDefFormat(virBuffer *buf, } break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + virBufferEscapeString(&childBuf, "%s\n", def->source.= egm.path); + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -26762,6 +26786,11 @@ virDomainMemoryTargetDefFormat(virBuffer *buf, } break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (def->target.egm.pciDev) + virBufferAsprintf(&childBuf, "%s\n", def->tar= get.egm.pciDev); + break; + case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NONE: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cb35ff06bd..e38f133bcc 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2745,6 +2745,7 @@ typedef enum { VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM, /* virtio-pmem memory device */ VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM, /* virtio-mem memory device */ VIR_DOMAIN_MEMORY_MODEL_SGX_EPC, /* SGX enclave page cache */ + VIR_DOMAIN_MEMORY_MODEL_EGM, /* Extended GPU memory */ =20 VIR_DOMAIN_MEMORY_MODEL_LAST } virDomainMemoryModel; @@ -2777,6 +2778,9 @@ struct _virDomainMemoryDef { struct { virBitmap *nodes; /* source NUMA nodes */ } sgx_epc; + struct { + char *path; + } egm; } source; =20 union { @@ -2802,6 +2806,9 @@ struct _virDomainMemoryDef { } virtio_mem; struct { } sgx_epc; + struct { + char *pciDev; + } egm; } target; =20 virDomainDeviceInfo info; diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index 38e731348d..0181d21f0e 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -632,6 +632,7 @@ virDomainMemoryDefPostParse(virDomainMemoryDef *mem, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: case VIR_DOMAIN_MEMORY_MODEL_DIMM: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 4558e7b210..4d4febfbfc 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2494,6 +2494,7 @@ virDomainMemoryDefCheckConflict(const virDomainMemory= Def *mem, } break; case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -2540,6 +2541,7 @@ virDomainMemoryDefCheckConflict(const virDomainMemory= Def *mem, switch (other->model) { case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: continue; break; @@ -2720,6 +2722,19 @@ virDomainMemoryDefValidate(const virDomainMemoryDef = *mem, } break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (!mem->source.egm.path) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("path is required for model 'egm'")); + return -1; + } + if (!mem->target.egm.pciDev) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("pciDev is required for model 'egm'")); + return -1; + } + break; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: default: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 1f9ac102a0..4ccc594659 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7486,6 +7486,7 @@ virtio-pmem virtio-mem sgx-epc + egm @@ -7617,6 +7618,11 @@ + + + + + --=20 2.43.0 From nobody Fri Dec 12 12:55:01 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 1764098478581124.2604317789478; Tue, 25 Nov 2025 11:21:18 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id A59E144AC8; Tue, 25 Nov 2025 14:21:17 -0500 (EST) Received: from [172.19.199.68] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 6B9E144C05; Tue, 25 Nov 2025 14:17:37 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id DD13741C64; Tue, 25 Nov 2025 14:17:17 -0500 (EST) Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012028.outbound.protection.outlook.com [40.107.209.28]) (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 521114496C for ; Tue, 25 Nov 2025 14:17:15 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MW6PR12MB9000.namprd12.prod.outlook.com (2603:10b6:303:24b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Tue, 25 Nov 2025 19:17:08 +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.9343.016; Tue, 25 Nov 2025 19:17:08 +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=HTB+TABz57JokpC3eX1n+tTjMCnKBoXDq7xmIVFd8/4XR18tMLV8TtPcYRATdYKVHJzPvRL3vkEfmo4VB3GjIwrYZjMP9GbCzBCi25dmbo9lXEkk845/j9dQ4AAIKkRWfxXJlnHH9RkWKd4BucxSLpNGpqGoJzOLRLzICpR2oNqw/bLZ0A9l2SGmHo/TdoUyKORkYyi6ldnZAp/WHe2oAP/62wYlvDzgW4yLFvsuzufIPrzWjEI4Lat28BCc9H3JAfC+0YYkwTvxvgizwNDC0nnm7SWSZTawMAw9Jihlv1fRA9WJOho3O+p5NT4jZQQzkPGRcthljfwmTq3MczjTJg== 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=jUoUjyaAR6dIyTw7eE5UcDhSHBJZZefZm83rXfIYyNs=; b=RSwU1K8rxQs1dG7BY9bBhhDscvwN5qqBUpVLuFdQNUTmHrpMk+iWmFp+gfjnGMpMRKTzN5JrECJLqy4Hhb3hnvoLIRxCd0201ThtPwlivqoBAY7t2XX8/A6/NH5AnJkK1WRq1st6B94Ef7y0EaOE3bC0KNj8qOg+JsPoiz+R+g+N0MUUOQYlf0psqEobznA4rnqEV3G2dwl+taiiZSwxDvmn/SGTHTyV/3GdplylfYQpfaq/O5A0OxEvy9eMvTJr4NuxJHMN0DzVH4Nj/qRFL5ASVWZNNUb9uolxVu/YNcG5OW7niZwCW3o7tUlfnLp2sWNuO34V68uHXHkHJoKDFg== 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=jUoUjyaAR6dIyTw7eE5UcDhSHBJZZefZm83rXfIYyNs=; b=CIZMdS+O8Mr41pe1wCmyv1rwEExxsC3YvCJ5hFOh6zk9Rugz1LLwpok2MfvuXERhBFdjAGrxvY4vbpjXipLq6rI7pMceqbH3cMxz4ZoKCYi4xaPaUIxdCjpL5rUIeuMyNRQaSBs4cBc6l/wdJZFNnooN2r6udcSWiG3L+UVrUDAD09UzF/9shO96D041SZyQ3zKidQ/itt01zy5QcaYzpz78Y7HWbYcXWZsvATsbgBpU4MVBlaNHTTxn/EFylouZw904H1DNYAEGD8G7iOv5FkE43MgaoqXFte/wesAPWDN6wlWO2t4T2xi6AdiCSqHPfHf6XylWlTAAGCcLa/YElA== 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 v3 2/4] qemu: Add cgroup, namespace, and seclabel setup for EGM memory device model Date: Tue, 25 Nov 2025 11:17:02 -0800 Message-ID: <20251125191704.644477-3-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251125191704.644477-1-nathanc@nvidia.com> References: <20251125191704.644477-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH3PEPF000040A6.namprd05.prod.outlook.com (2603:10b6:518:1::55) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MW6PR12MB9000:EE_ X-MS-Office365-Filtering-Correlation-Id: cc06b600-f151-4533-31a5-08de2c573a11 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?1G7OhfA31YBxF++B2QDDQAKv8N44I8Y1U4UKbYLsPFKqyxP8ITfakGsu2Cci?= =?us-ascii?Q?CZPaBB8e4cflswnFNZ76apZHBq1Rmv1pdy9AhRwxdtp1+XvDguTcvrEp86Vb?= =?us-ascii?Q?KpyXBfcDUSj1LtY4b5ddi4O0Z98OnzXGKu4Ho29dygix2vOj05Wfh7DXQm8y?= =?us-ascii?Q?a1ED0LjjeWWuORQvLolmN/hvHuakz3bIFXx3VrqzOc9saje/oYQWYuxqzypa?= =?us-ascii?Q?TGOcnwqHTbaNqQe+3b7leIATMxYQ1U9oZNlp2RHRl9ws6hko05/Nuw+sTp0a?= =?us-ascii?Q?i9umO33d0DSJqv/rkF3vIF+VmM/RQPW/EUVlnhRpnQrD6qEHOWWf+s/5hBXD?= =?us-ascii?Q?j097UyTyPOz6PY29R+7hfqPGyiBZ7yDbYGMS0C/ZPzDfQjbX60ZYabDGU/jt?= =?us-ascii?Q?UFa5ZnB3zl0PW3L25FOKjVUOvQYvdGDAz64xmM40C0aZg/aNZNyN8sKHR+ii?= =?us-ascii?Q?KjQNp9l/UynzlgUabr95El8WTcsX5AS7BNdEVI9pOyrQQFA9qK/MXP1OKWT8?= =?us-ascii?Q?As4qwxfPoS4jCcVHZ6VJ80ZbZgjvnrOfJroS3XGY7YIp1Ihwi6EDCYKln4vW?= =?us-ascii?Q?Vd43z0YPC2TKdWQ//hTTjle8Og5zEWgXjTs6XhrlOgqfc9HVCfqnISoazKWl?= =?us-ascii?Q?exW/BwEeawEX0rK5fFRFWm3BXXB6n1EkFhPGCd7uB7duHRStbRuy0MoftAGR?= =?us-ascii?Q?SpKJjImAefFPq5tZddyCtMJlmAW/P8moxqmN6lCnY2J9rblLP1Hp0jZYXHp3?= =?us-ascii?Q?VMQ7Vz9h95gP3s4/krvBwFTt/z2dyfDpHJ49mrC9b2jNyHeX5ouoPgkLeVeB?= =?us-ascii?Q?oC+w0zXGbi6F1mNfX77PCwW/SaixoFnzl1IKBKuI0cnOUMDDgKsO3UbbA29I?= =?us-ascii?Q?YJsW7w530dgk/w/5/CNMWrCmoTqODRfte5ngB6dEA311PluNP7zZsRZHYt4g?= =?us-ascii?Q?exiawcZgmHBfDTxYqPikBOFz4emoYx/NSg1dPZ/zJLwEq6x/fc8EwPEs2o6e?= =?us-ascii?Q?nkirQmRE3J8p7brA/9QnzujqLS1YI75HuXUi5+5xJ9o3sQbgbqR5cR0vFI1y?= =?us-ascii?Q?IQSW+SN8lyj7BqlI8csabuz7xXguom6a5ZOE8zRL1DwVVXwdPQ+VbG4e9ilz?= =?us-ascii?Q?g7VBoUY9iBAiLVwVnMkkZoGdnwl28sukkIBFMznic8lCqF8N/3EQE6FqPGPl?= =?us-ascii?Q?v/gkCWwlF/121yZmIJEuAA+6zE9SGHCAmityoRQwRDjoE0CzDyOKZjAtHh24?= =?us-ascii?Q?AS2GAE7jaP7QCuqo7+MkLPQ87ju1RwmFH3VB2wvOruzYRYUiuSmHYOfC8sdp?= =?us-ascii?Q?Phz7tYM13mmjmksdF312zuZWCVeBwGPBTCa8EsxWqz9nCu8CnU/iBhxJXlpE?= =?us-ascii?Q?qTCvTrJoltXNgz240sKJm8qDuNRVfnJRN5pcgO5vkdsjdWtsZU+C8I+SZytO?= =?us-ascii?Q?+/Ljym57/mhMeclyUxyXTSPH5xibCjdK?= 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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?iwNSrcmyoHHpsqFCzWBdPA9xkz/+B+REVsFK58o4SAm9nDhIQKpABA1YwKOu?= =?us-ascii?Q?XWCKclyWazVzA+7Q4S3w4XA1QHZyClPn2yxIpJqW7TlBDfEFyHqlVC3GTyz+?= =?us-ascii?Q?EQIgm6MPeCngiG9ynCmx88HiP6JK84RM6BKfmlUG4h5njoQVgL7fvTRjW9l6?= =?us-ascii?Q?p6IDuvOJ8kU+0Z7NwSbzeIZjFBY3RtpLVmmB2NeF0gBshgHasOIwp1lNrkMG?= =?us-ascii?Q?Qwbn8j87cMW+3qPrbnqpkDCr0eGmB6Xk7kIEMqkHE8/IN7kv8bRQKDl0FDcg?= =?us-ascii?Q?FP+Rxna42dZnJOFnpW50ZWAFdVtDC6jG64U3oS31jmRBIPkLFn/E8q+H0jlE?= =?us-ascii?Q?EWYRdmWzSO50lB+LxJ1VYEiBgXDg/OUNzu+LDw9kNjTRNDurYwgMS70sO5/w?= =?us-ascii?Q?oaTeNY4qI8pG35vGCE0PT5V2NiYo6/JKQztxMYUhGoLbJPChmpQD4hq/tzPu?= =?us-ascii?Q?/zU/5l2TD2xaEDVFgEFjo4gBIR7xcwiRZWJhT/VIVwpqZYjnkDcGbxlPPvlX?= =?us-ascii?Q?+Yqk6luWL1g5ov9AS3IHh+5Ld6mutceV0idAeKxKLkDsY1EJ47SEPD8R+bZg?= =?us-ascii?Q?3uChR0Hw3Q2ykYS+Ne8XZzvCafFEYjM9aQqf+EjmTYKYGNRnXgPyMwkEy8W1?= =?us-ascii?Q?aYzkuCwB9sWcdQmDxYSV9MHZhZS7ltGTNZz4BIEmOamEIIdRo/NUgy4cGmgQ?= =?us-ascii?Q?sosjJbIIMZfkbjJpOaNbj6E9qr1AGUCWcv33CxCC0gtdypV+AkhxsP2/6yY2?= =?us-ascii?Q?NsiAje8OD4FwMinRm3X9K1NFP3g6ani1r6N60ftwYpyUOtpNNf4RVp16Pbnt?= =?us-ascii?Q?MTdGY4qzTf7PfYdLevKmKkZFhDdcPXd55oZpS8DP+nJmXnJLtD4iezMJ72aY?= =?us-ascii?Q?FvXB+qfvO00uKRmBubl99wEQfClX1mH8tp5v+paa7U1eCmMRtqqWJGCGCm8d?= =?us-ascii?Q?QNgAnXsIWWykIZpDIN475EcnTDMrzrWhdHbdbJYfE6/EAAQf4zWBKp/J5IiO?= =?us-ascii?Q?XN8KL40kjbezD/dBwITvXKUgy7qr0/EhqZDU72XT//S8Bdp6L69geU0olTHA?= =?us-ascii?Q?xGBwt3qKiYG8CODs/lLhhyK0WmgopldtJitEHVWPrfo2VXwNdGnYGdtmWqPU?= =?us-ascii?Q?0oTaCpYMJVcTFKrJhIEendnoD03evP2QUS4bvx/fF2F54qaDbFyo/MHTHY0G?= =?us-ascii?Q?S9cAwW+s71dPZ2AWmld/l95vRvoA0yFiIJSoJ5iInDGFuhZAP/0o+QlOECVi?= =?us-ascii?Q?CX1FF1qCoaBgw8U0GrsEao+OzvMANhoIItck/XvZXEwu9cSdi3u4KKFd385X?= =?us-ascii?Q?0EyEqq7NQ84UZUK+WBvD40Pp/SEwP23j6RmD7HrL9nPikdSUo1pOGUWL6UPa?= =?us-ascii?Q?oMDQe9nC69aFGq51axs1D8gZDLF47r45ratSdarFHOFWTlIoEdQiHij+tQwR?= =?us-ascii?Q?TGRz7rpCNmzBkIPhGLI5jiIthTFmeaItp628ritTtXt1BgNiUwNbXxDcGsrY?= =?us-ascii?Q?+3Kty9tHO4xfHYGA7tNTvK+aU44lclhUp+KyBDnJkeNILrmPknjpAsryCsk8?= =?us-ascii?Q?1n6LtrKAUmSnleKfg9T0944thG58RAPeHXdLLTBT?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc06b600-f151-4533-31a5-08de2c573a11 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 19:17:08.2225 (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: Vn337NNFL1ifP4Q/ZxP0FTt9X0rbVdmbcDiOxpsA13ZqfVGVMFEu0xhq18uVCzr2k0uqqSKKwA8q7WKN+bfUMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB9000 Message-ID-Hash: AULY672BML6UYJ6YUY4U7KVT42DZJFEW X-Message-ID-Hash: AULY672BML6UYJ6YUY4U7KVT42DZJFEW 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: 1764098482786019100 Content-Type: text/plain; charset="utf-8" Implement proper isolation and access control for EGM memory devices: - Add device to cgroup for access control - Set up namespace mappings for device access - Ensure proper permissions in containerized environments - Allow EGM device path access to bypass SELinux, AppArmor, and DAC permissions Signed-off-by: Nathan Chen --- src/qemu/qemu_cgroup.c | 10 ++++++++++ src/qemu/qemu_namespace.c | 3 +++ src/security/apparmor/usr.sbin.libvirtd.in | 3 +++ src/security/security_apparmor.c | 2 ++ src/security/security_dac.c | 8 ++++++++ src/security/security_selinux.c | 6 ++++++ src/security/virt-aa-helper.c | 4 ++++ 7 files changed, 36 insertions(+) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 7dadef0739..8b70740121 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -577,6 +577,11 @@ qemuSetupMemoryDevicesCgroup(virDomainObj *vm, VIR_CGROUP_DEVICE_RW, false) < 0) return -1; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (qemuCgroupAllowDevicePath(vm, mem->source.egm.path, + VIR_CGROUP_DEVICE_RW, false) < 0) + return -1; + break; case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: @@ -615,6 +620,11 @@ qemuTeardownMemoryDevicesCgroup(virDomainObj *vm, VIR_CGROUP_DEVICE_RW, false) < 0) return -1; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (qemuCgroupDenyDevicePath(vm, mem->source.egm.path, + VIR_CGROUP_DEVICE_RWM, false) < 0) + return -1; + break; case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c index c689cc3e40..f6404cb280 100644 --- a/src/qemu/qemu_namespace.c +++ b/src/qemu/qemu_namespace.c @@ -394,6 +394,9 @@ qemuDomainSetupMemory(virDomainMemoryDef *mem, *paths =3D g_slist_prepend(*paths, g_strdup(QEMU_DEV_SGX_VEPVC)); *paths =3D g_slist_prepend(*paths, g_strdup(QEMU_DEV_SGX_PROVISION= )); break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + *paths =3D g_slist_prepend(*paths, g_strdup(mem->source.egm.path)); + break; =20 case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: diff --git a/src/security/apparmor/usr.sbin.libvirtd.in b/src/security/appa= rmor/usr.sbin.libvirtd.in index 6267e4f737..2a6a4b979c 100644 --- a/src/security/apparmor/usr.sbin.libvirtd.in +++ b/src/security/apparmor/usr.sbin.libvirtd.in @@ -47,6 +47,9 @@ profile libvirtd @sbindir@/libvirtd flags=3D(attach_disco= nnected) { mount options=3D(rw, move) /{,var/}run/libvirt/qemu/*{,/} -> /dev/**, umount /{,var/}run/libvirt/qemu/*{,/}, =20 + # Allow bind mounting EGM devices into qemu namespaces + mount options=3D(rw, bind) /dev/egm* -> /{,var/}run/libvirt/qemu/**, + network inet stream, network inet dgram, network inet6 stream, diff --git a/src/security/security_apparmor.c b/src/security/security_appar= mor.c index 68ac39611f..ea04e756d6 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -631,6 +631,8 @@ AppArmorSetMemoryLabel(virSecurityManager *mgr, case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: + path =3D mem->source.egm.path; case VIR_DOMAIN_MEMORY_MODEL_LAST: break; } diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 2f788b872a..2d79009ee9 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1890,6 +1890,9 @@ virSecurityDACRestoreMemoryLabel(virSecurityManager *= mgr, * don't need to restore anything. */ break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + return virSecurityDACRestoreFileLabel(mgr, mem->source.egm.path); + case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_LAST: @@ -2121,6 +2124,11 @@ virSecurityDACSetMemoryLabel(virSecurityManager *mgr, return -1; break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + return virSecurityDACSetOwnership(mgr, NULL, + mem->source.egm.path, + user, group, true); + case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_LAST: diff --git a/src/security/security_selinux.c b/src/security/security_selinu= x.c index 2f3cc274a5..b288778634 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1666,6 +1666,9 @@ virSecuritySELinuxSetMemoryLabel(virSecurityManager *= mgr, seclabel->imagelabel, true) < 0) return -1; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + path =3D mem->source.egm.path; + break; =20 case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: @@ -1709,6 +1712,9 @@ virSecuritySELinuxRestoreMemoryLabel(virSecurityManag= er *mgr, if (virSecuritySELinuxRestoreFileLabel(mgr, DEV_SGX_PROVISION, tru= e, false) < 0) ret =3D -1; return ret; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + path =3D mem->source.egm.path; + break; =20 case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index de0a826063..0e387dd4be 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -1194,6 +1194,10 @@ get_files(vahControl * ctl) return -1; } break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (vah_add_file(&buf, mem->source.egm.path, "rw") !=3D 0) + return -1; + break; =20 case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: --=20 2.43.0 From nobody Fri Dec 12 12:55:01 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 1764098640818714.4696822638407; Tue, 25 Nov 2025 11:24:00 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id D8B7B43EE8; Tue, 25 Nov 2025 14:23:58 -0500 (EST) Received: from [172.19.199.68] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id A2C8344C53; Tue, 25 Nov 2025 14:17:42 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id A9AE544B6F; Tue, 25 Nov 2025 14:17:25 -0500 (EST) Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010032.outbound.protection.outlook.com [52.101.85.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id C01124495C for ; Tue, 25 Nov 2025 14:17:19 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MW6PR12MB9000.namprd12.prod.outlook.com (2603:10b6:303:24b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Tue, 25 Nov 2025 19:17:09 +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.9343.016; Tue, 25 Nov 2025 19:17:09 +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=xaiJtqYiY02jOMzP4d/6bAAq0RaBQNs/H9LurEskvn4IL3fg6GZ4M939+rix9tIqAlPCPxdQgrIbUh6SNFthDnNJV2g/aK4ebv/fVjscZWOR5jgo/2mkvI7wzi9V6IRK8VWGpVG9KWtAJKDC1wFTfn+AZR5s4DwbXNt/rfFvbYrtD4tz0bW3qGpaVuuLzazzEmtMaOhVDcxzJ50WVdwQivCWxcn2ukkM81PSKmaeJ98N89LwlmhLaxlDXcso46ip52f3Ve07X+Q/UaIH0TrrlA98IJqsUFFizaofmHIGwObLCH/Wqq8yTFuWR97Ty0kc41frHot6Canz4xsUGcLC/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=RRFhH3YtUC10dec+XaD0VCrthSfDyi15ufo+Gw3+Pe4=; b=QaIO9GHApx7KnmP57kxWkCerCA+/vrCAcr3Y1NKkjXHrOBgwi4I1GaXY/EnAFhRXOpGIbhgYLq1S2GE1gVaGriK4zI43i+GZNHQvBxax2W8X6n/Z6jt0VyZ3bkC32/8BkrQZI4B5TmV13quNi2WePViKBTaajLlHXq3hs3H8MAOwbNnBRya83WX93SwdRbptm62ALXdrA80u+QuJy9dS9um0oHGbEhXVif/3RLDXr3uflkZiTfoSQYPCF3SV9IXWwLOReaiw/lvRE3s8Q6AT9Jika69w/7V4eQpz3bVmmQE+PvesNt48mVhyqk8UnPGKyMr5lBBxGX/GLd7riK49og== 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=RRFhH3YtUC10dec+XaD0VCrthSfDyi15ufo+Gw3+Pe4=; b=g3MpnhfFfVG0Crcgp9PA/hQBVRFnXkCfvRE3Ecdw36Ziw6dlum26In680WhGNDgyMDwbV8DhKt73kLCEVOp1s8NFGf6FBDoysvVQEJMqee0WkR/E9BGE0b/eAvk1D44As2Zk8nYTXuluCW/kSpZg5m+rXD1u3cnRRbZ3hnjyfVxXpKnChxOCb0lknrTG1ZRzpb3rYNBy7ZIHizTZo9J43CEjyS4uAlPXQXF71GHUDNrNczWR1kCPJrQI36MLjPXQhd/kEK/QEZ82z3wI8SWAFtxtgp15ZKG7ZdQQwCHikaIczzNXnWPWFgGHtLDrMUYZUrBMYi8svJbu/WWO3lzlsA== 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 v3 3/4] qemu: Add qemu CLI support for EGM Date: Tue, 25 Nov 2025 11:17:03 -0800 Message-ID: <20251125191704.644477-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251125191704.644477-1-nathanc@nvidia.com> References: <20251125191704.644477-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0065.namprd03.prod.outlook.com (2603:10b6:a03:331::10) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MW6PR12MB9000:EE_ X-MS-Office365-Filtering-Correlation-Id: 30632a13-7392-44ed-1a9f-08de2c573ace X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?jVAZ2+Mq/zNCU32ymqNoh4o/6ZqgUl/4PlpAxUKIhKA1kh1lhatGV4c4xtOD?= =?us-ascii?Q?AvyMi1HNLv9JWEZR8wx2//lFrbtiXUD4GirGWP1rqrTjp0nVJ4f9osHaf67U?= =?us-ascii?Q?8nQoMdUphG/KQP1tioM8CBFfopXrEw6S08lzbVCATazVpBjnEiv0msyTiq2M?= =?us-ascii?Q?49TcALpAu7w68FapM/r6ZCjwSy2TpwEOm3WYq4t55Hg7zG6pyDQwZ+Fmu55W?= =?us-ascii?Q?VEI+UnY27t3L6ebxUkcWRtQIe18qNMkuZ9lzVIPuWdg4CQW1dH/wQ1AhcsnK?= =?us-ascii?Q?bbkIxC7AoH6PeTQicUZxItBqC9KU/EVrgafOTKubz6jk3SFgiz2r4lRohJ/x?= =?us-ascii?Q?US/fLLMatVHNgLu0zGw21Y6/z37fRZjjP/1t+l6C6l3OJNpd6Rn976gD+QIS?= =?us-ascii?Q?yDnHn9w23GaSFTwM74ZUi2J20VD336vhU/xLZE/j4FUzli4yGJjF59pdMAWE?= =?us-ascii?Q?Lr7OVIrQopovqURG+h6DcYnVJZRJuEDgtWSIUMKDqGDBIqkWju9cRSk/zVCV?= =?us-ascii?Q?UEY2YRlgKQhGPOpiDKF4rr0cjah8hZPUSlL7tUUqNgXdw+WJIII0BThli2w2?= =?us-ascii?Q?PMuQRGiYaTFJdShKOmScrKSVdrTrgPE6zaEBqaVrL7Fj54VncqUolev7qEng?= =?us-ascii?Q?iuwoetNi9bE5GudgZwGVo/JioN34oFIJdfDOnzfpYjy7Ki+LPWUluHnzX/NK?= =?us-ascii?Q?puZ65ecQSybWBoUnOUi5DEmscuRCvgxL+MWWoofNqDcLTg9jrsrxJIK+BhCe?= =?us-ascii?Q?QW5NQJyntSQSiwX+dmJcQHYyF8uNO1dqjmvQinVboQ/BIsiOMxOIX4xKWX7l?= =?us-ascii?Q?9LBrg/jPR3nYaAUxq2J19dc+YQTFd+H6qQCwNegEtCPQYOyVqJvg6MfSg4yQ?= =?us-ascii?Q?MAgNjKPaN4xiHdW1C84VBV3lV/U1oXS465dEhLyiKL0fB0rz9uq90DPeh2rH?= =?us-ascii?Q?mf0V7svEEnsogHOk+wD0y5WoO2g7ZRBtYOH9I2b3FuuopY+kU0JkUliRj2PS?= =?us-ascii?Q?TQ8L13rVNyOxeEKkPyKMwWq+cdu/Meg8HV/V+t3bc+y1+yG3yMuWQmzgvOr+?= =?us-ascii?Q?R1YArkJ+dcmsozxRQO6UFKXqS9xOF4F7jzYJEgqfiFprdNo3zeTk7rHIQSvt?= =?us-ascii?Q?15pLjTglBECd7PUfaRZD5gc8y2xKm+regg8XZ1YDR5oLGDuLmdT8xfp5VS8C?= =?us-ascii?Q?5EVnbioY5qQeTWb5cod5lLKft66INqDCsy+940g4uSZX2QI+NvXFIIM8BJTM?= =?us-ascii?Q?L99Wz88xW4TSjiNOQVUk4ha1Tzlmw5iNDyq37FSJHM6jsN1K1Rge+qPe/yvL?= =?us-ascii?Q?BBWOkh2c3MLzv7RQc1QMP2UZhPowHChMH0ckP9d/gx9CSvDUh5nTXN5N2OFi?= =?us-ascii?Q?iZ/+R1uNrBhPXFcWSG67vr5zJUzI/mn3K0VBuP8gUHl4ie6cppxzGp4NOeio?= =?us-ascii?Q?Z6WD0CvaJ8Bl2sihsCQ/cgwfnQFp3j/n?= 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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5FnMJeL/rZc8sm3ociAkrLLH+27uMMH/PsoyUcAbws0ZFJ+3D/+0ZKnhop1d?= =?us-ascii?Q?pnX4CSQQqbRYwVFgHBEJt8ASXxKXbhxAcmwedPdiMav+Se/v8ChsyQkX79oN?= =?us-ascii?Q?KXOx04tjAxv9yoTnbPrq0J/IjX1nPJElui4AARtfxZE8xSZIuDp0Opg5Su8s?= =?us-ascii?Q?d5WhFhCCaxS81kTTtVCqKh/PMA17Bu5uZpAq60e8Zfb9eLhIQPai+fxsHXQF?= =?us-ascii?Q?KHFclbe3XJQmlofRsPTcYCeP72sbmrZQ6gBrf+Z4XJTjl539j4lE9PsqnSFs?= =?us-ascii?Q?vmPU1gV8WoWe8+VDHN/llSIYZ7I8jLsOfXlWBfS+VcXPT/IcsrtnFixvSTSD?= =?us-ascii?Q?OM85Ln8vZQLhxGyvEcBMznzIzwdnmVi1gX4059RfUXdAXjBoco6uVsRYw3o3?= =?us-ascii?Q?aE57KwzZCx9xF1rgmmczDBONpAKWFyp+ys+3a/3knbsrGRiGz4v75v7r1RSb?= =?us-ascii?Q?SEvUiRleOcBqOurfoQXf9wkx6MOosVILix3XHqChoERi5xX3vZ3a5Xnb2Ibs?= =?us-ascii?Q?VJN7gBOWKllblh5Coe4fN+8HadljLnRaBBrnWel0+HlMCX63WSFvKrUN9hrT?= =?us-ascii?Q?KNzmJrIJhYeWdf3MYx7WXsMxkHl4bncMOOvb90bskbOAlqoHwYeZFRplPJXq?= =?us-ascii?Q?uUz8CzATncPGOnErBqsdu3jlqyNPMTl0rwPP7WYnJkg87EWrrTV9uFD37+eN?= =?us-ascii?Q?h77nboBe05dO9y5rNpnas8bvj1WGJzq3Oh7ywutxsJkkIMxIHjNTbOQFcm2Q?= =?us-ascii?Q?dfDH4xdK9SIoWFm/wVbzzF09K1h1/clxijUCjErevCf6zLhMQ4VhVVp39EsU?= =?us-ascii?Q?arZLeMtpLpXXAYRFL9ESC9KguDHmQB3C1LJpx9VhD5ejwFIf6b27Y1JEpAfv?= =?us-ascii?Q?Yw5cWVFzu04FnClRL1ATIjMwzTm0P8RUQDkmRaepSOl4qyu08P3NRRschByY?= =?us-ascii?Q?VFbLJFubd+EFWmCCiEgg8Ol+KJJh/2bp5TrQ42EMDEGVpp2TY7HvUBTPsAvU?= =?us-ascii?Q?Uh/WHd8twZSO0gg562f4VOZBxyZi1buguZGLgnXp0iosuqXU+sQszmOFWiw9?= =?us-ascii?Q?NuXExPcthU4ByL5EE69HFzTFHtE+uCqEevWeKtniBRLaIt/2JGmPVZ92t4km?= =?us-ascii?Q?sM8diEnLA79wWv06Klfe0Wu/72rwI5J4bVFc8jEqJZN5jUtj48m6ZRzW7AjZ?= =?us-ascii?Q?1L6ECHuN5iCIn8sMgWicISa3D6Muzy/eGjPJXWCF5Zvcr0m3Q0xmUrY/W6LQ?= =?us-ascii?Q?AlAyCc8SCfeQ9n9+srn+p/P3eAw75sPsnHSY+9QcImuJaLH4FWIGIWJ+CEHj?= =?us-ascii?Q?10ByLXkUHELUa0ImGqzItQ5u6fCD5TVy2AHMatugEHiL3Qh89g6U0cvzoWQ6?= =?us-ascii?Q?ovF8zSZH7rnpvavBJFpOKng8R5LkoRTXANX3OVWMnAJoLYQU3JE1lNyJKF5q?= =?us-ascii?Q?qKoGkCNb0PqTLMFY14h2CJaour6lv4m+fJVxiavmF4V1D5dgjaNbHhSDfARc?= =?us-ascii?Q?1CoFtd+zdHoMCZuP4CMNmGq1GCtscrkhEuYpq4NjDT/DP98TQ+YXgXdP0k8w?= =?us-ascii?Q?xxkjWNufkNlRSefoHRW8I+caA2OVmo8dsL48a6DQ?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 30632a13-7392-44ed-1a9f-08de2c573ace X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 19:17:09.4849 (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: AC443Sn732P+LBJOyGyi7SjfhmceR+IQHjpu39cjoPIUN2ymuUr3Jsp2oXSvxu+qGaLqKLeW4oUisKQYzAMFyA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB9000 Message-ID-Hash: ZGBZAZJ47Q46J6LYBQFLETALDQ6NKEHC X-Message-ID-Hash: ZGBZAZJ47Q46J6LYBQFLETALDQ6NKEHC 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: 1764098642144019100 Content-Type: text/plain; charset="utf-8" Add qemu CLI support for EGM memory device model: - Specify EGM device path to memory-backend-file object - Support acpi-egm-memory object with id, pci-dev, and node attributes - Consolidate all acpi-egm-memory objects' memory into a single memory-backend-file per EGM chardev specified. Signed-off-by: Ian May Signed-off-by: Nathan Chen --- src/qemu/qemu_alias.c | 7 +- src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 158 ++++++++++++++++++++++++++++++--- src/qemu/qemu_domain.c | 13 ++- src/qemu/qemu_domain_address.c | 3 + src/qemu/qemu_driver.c | 1 + src/qemu/qemu_hotplug.c | 1 + src/qemu/qemu_monitor_json.c | 1 + src/qemu/qemu_postparse.c | 1 + src/qemu/qemu_process.c | 2 + src/qemu/qemu_validate.c | 6 ++ 12 files changed, 180 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 400ce73283..719224e1ba 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -504,7 +504,8 @@ qemuDeviceMemoryGetAliasID(virDomainDef *def, * valid */ if (mem->model !=3D VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM && mem->model !=3D VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM && - mem->model !=3D VIR_DOMAIN_MEMORY_MODEL_SGX_EPC) + mem->model !=3D VIR_DOMAIN_MEMORY_MODEL_SGX_EPC && + mem->model !=3D VIR_DOMAIN_MEMORY_MODEL_EGM) return mem->info.addr.dimm.slot; =20 for (i =3D 0; i < def->nmems; i++) { @@ -553,6 +554,10 @@ qemuAssignDeviceMemoryAlias(virDomainDef *def, case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: prefix =3D "epc"; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: { + prefix =3D "egm"; + break; + } case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: default: diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 92b863a826..3fc8fee4b3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -755,6 +755,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "disk-timed-stats", /* QEMU_CAPS_DISK_TIMED_STATS */ "query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */ "mshv", /* QEMU_CAPS_MSHV */ + "acpi-egm-memory", /* QEMU_CAPS_DEVICE_ACPI_EGM_MEMORY */ ); =20 =20 @@ -1462,6 +1463,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[= ] =3D { { "tpm-emulator", QEMU_CAPS_DEVICE_TPM_EMULATOR }, { "tpm-passthrough", QEMU_CAPS_DEVICE_TPM_PASSTHROUGH }, { "acpi-generic-initiator", QEMU_CAPS_ACPI_GENERIC_INITIATOR }, + { "acpi-egm-memory", QEMU_CAPS_DEVICE_ACPI_EGM_MEMORY }, }; =20 =20 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index f180844e66..3eb12235f4 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -730,6 +730,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_DISK_TIMED_STATS, /* timed stats support ('stats-intervals' = property of disk frontends) */ QEMU_CAPS_QUERY_ACCELERATORS, /* query-accelerators command */ QEMU_CAPS_MSHV, /* -accel mshv */ + QEMU_CAPS_DEVICE_ACPI_EGM_MEMORY, /* For using extended GPU memory */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b69fe23236..33848aa781 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -135,6 +135,21 @@ VIR_ENUM_IMPL(qemuACPITableSIG, "SLIC", "MSDM"); =20 +typedef struct _qemuEGMBackendInfo { + char *alias; + unsigned long long totalSize; + bool created; + virDomainMemoryDef *firstMem; /* Pointer to first device for this pat= h */ +} qemuEGMBackendInfo; + +static void +qemuEGMBackendInfoFree(qemuEGMBackendInfo *info) +{ + if (!info) + return; + g_free(info->alias); + g_free(info); +} =20 const char * qemuAudioDriverTypeToString(virDomainAudioType type) @@ -992,6 +1007,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDe= f *device, case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -3162,6 +3178,7 @@ qemuBuildMemoryGetPagesize(virQEMUDriverConfig *cfg, nvdimmPath =3D mem->source.virtio_pmem.path; break; case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -3362,6 +3379,9 @@ qemuBuildMemoryBackendProps(virJSONValue **backendPro= ps, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: nvdimmPath =3D mem->source.virtio_pmem.path; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: + nvdimmPath =3D mem->source.egm.path; + break; case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -3573,12 +3593,17 @@ qemuBuildMemoryDimmBackendStr(virCommand *cmd, virDomainMemoryDef *mem, virDomainDef *def, virQEMUDriverConfig *cfg, - qemuDomainObjPrivate *priv) + qemuDomainObjPrivate *priv, + GHashTable *egmBackends) { g_autoptr(virJSONValue) props =3D NULL; g_autoptr(virJSONValue) tcProps =3D NULL; virBitmap *nodemask =3D NULL; g_autofree char *alias =3D NULL; + unsigned long long originalSize =3D 0; + bool isEGM =3D (mem->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM); + bool shouldCreateBackend =3D true; + qemuEGMBackendInfo *egmInfo =3D NULL; =20 if (!mem->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -3588,19 +3613,65 @@ qemuBuildMemoryDimmBackendStr(virCommand *cmd, =20 alias =3D g_strdup_printf("mem%s", mem->info.alias); =20 - if (qemuBuildMemoryBackendProps(&props, alias, cfg, priv, - def, mem, true, false, &nodemask) < 0) - return -1; + /* Handle EGM shared backend logic */ + if (isEGM && egmBackends) { + const char *egmPath =3D mem->source.egm.path; + egmInfo =3D g_hash_table_lookup(egmBackends, egmPath); =20 - if (qemuBuildThreadContextProps(&tcProps, &props, def, priv, nodemask)= < 0) - return -1; + if (egmInfo) { + alias =3D g_strdup(egmInfo->alias); + if (egmInfo->created) { + /* Backend already created, skip backend creation */ + shouldCreateBackend =3D false; + } else { + /* First device for this path - temporarily use accumulate= d size */ + originalSize =3D mem->size; + mem->size =3D egmInfo->totalSize; + egmInfo->created =3D true; + } + } + } =20 - if (tcProps && - qemuBuildObjectCommandlineFromJSON(cmd, tcProps) < 0) - return -1; + if (shouldCreateBackend) { + /* Use existing function unchanged */ + if (qemuBuildMemoryBackendProps(&props, alias, cfg, priv, + def, mem, true, false, &nodemask) = < 0) { + if (originalSize > 0) + mem->size =3D originalSize; /* Restore on error */ + return -1; + } =20 - if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) - return -1; + /* Restore original size after backend props are built */ + if (originalSize > 0) + mem->size =3D originalSize; + + if (qemuBuildThreadContextProps(&tcProps, &props, def, priv, nodem= ask) < 0) + return -1; + + if (tcProps && + qemuBuildObjectCommandlineFromJSON(cmd, tcProps) < 0) + return -1; + + if (qemuBuildObjectCommandlineFromJSON(cmd, props) < 0) + return -1; + } + + if (isEGM) { + g_autofree char *egmObjStr =3D NULL; + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + + virBufferAsprintf(&buf, "acpi-egm-memory,id=3D%s", mem->info.alias= ); + + if (mem->target.egm.pciDev) + virBufferAsprintf(&buf, ",pci-dev=3D%s", mem->target.egm.pciDev= ); + + if (mem->targetNode >=3D 0) + virBufferAsprintf(&buf, ",node=3D%d", mem->targetNode); + + egmObjStr =3D virBufferContentAndReset(&buf); + + virCommandAddArgList(cmd, "-object", egmObjStr, NULL); + } =20 return 0; } @@ -3671,6 +3742,7 @@ qemuBuildMemoryDeviceProps(virQEMUDriverConfig *cfg, dynamicMemslots =3D mem->target.virtio_mem.dynamicMemslots; break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: @@ -7104,6 +7176,7 @@ qemuAppendDomainMemoryMachineParams(virBuffer *buf, case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -7821,6 +7894,8 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg, size_t ncells =3D virDomainNumaGetNodeCount(def->numa); ssize_t masterInitiator =3D -1; int rc; + g_autoptr(GHashTable) egmBackends =3D NULL; + size_t egmBackendCount =3D 0; =20 if (!virDomainNumatuneNodesetIsAvailable(def->numa, priv->autoNodeset)) goto cleanup; @@ -7835,6 +7910,37 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg, hmat =3D true; } =20 + /* Pre-scan EGM devices to group by path and calculate total sizes */ + egmBackends =3D g_hash_table_new_full(g_str_hash, g_str_equal, g_free, + (GDestroyNotify)qemuEGMBackendInfo= Free); + + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) { + const char *egmPath =3D def->mems[i]->source.egm.path; + qemuEGMBackendInfo *info =3D g_hash_table_lookup(egmBackends, = egmPath); + + if (!info) { + info =3D g_new0(qemuEGMBackendInfo, 1); + info->alias =3D g_strdup_printf("memegm%zu", egmBackendCou= nt); + egmBackendCount++; + info->totalSize =3D def->mems[i]->size; + info->created =3D false; + info->firstMem =3D def->mems[i]; + g_hash_table_insert(egmBackends, g_strdup(egmPath), info); + } else { + info->totalSize +=3D def->mems[i]->size; + } + } + } + + /* Build the actual backend and device objects */ + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) { + if (qemuBuildMemoryDimmBackendStr(cmd, def->mems[i], def, cfg,= priv, egmBackends) < 0) + goto cleanup; + } + } + nodeBackends =3D g_new0(virJSONValue *, ncells); nodemask =3D g_new0(virBitmap *, ncells); =20 @@ -7870,8 +7976,18 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg, for (i =3D 0; i < ncells; i++) { ssize_t initiator =3D virDomainNumaGetNodeInitiator(def->numa, i); unsigned long long memSize =3D virDomainNumaGetNodeMemorySize(def-= >numa, i); + bool egmBacked =3D false; + size_t k; + + for (k =3D 0; k < def->nmems; k++) { + if (def->mems[k]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM && + def->mems[k]->targetNode =3D=3D (int)i) { + egmBacked =3D true; + break; + } + } =20 - if (needBackend && memSize > 0) { + if (needBackend && memSize > 0 && !egmBacked) { g_autoptr(virJSONValue) tcProps =3D NULL; =20 if (qemuBuildThreadContextProps(&tcProps, &nodeBackends[i], @@ -7901,7 +8017,15 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg, =20 if (memSize > 0) { if (needBackend) { - virBufferAsprintf(&buf, ",memdev=3Dram-node%zu", i); + if (egmBacked) { + /* Look up the actual backend alias for EGM */ + const char *egmPath =3D def->mems[k]->source.egm.path; + qemuEGMBackendInfo *egmInfo =3D g_hash_table_lookup(eg= mBackends, egmPath); + const char *backendAlias =3D egmInfo ? egmInfo->alias = : def->mems[k]->info.alias; + virBufferAsprintf(&buf, ",memdev=3D%s", backendAlias); + } else { + virBufferAsprintf(&buf, ",memdev=3Dram-node%zu", i); + } } else { virBufferAsprintf(&buf, ",mem=3D%llu", memSize / 1024); } @@ -7965,7 +8089,10 @@ qemuBuildMemoryDeviceCommandLine(virCommand *cmd, for (i =3D 0; i < def->nmems; i++) { g_autoptr(virJSONValue) props =3D NULL; =20 - if (qemuBuildMemoryDimmBackendStr(cmd, def->mems[i], def, cfg, pri= v) < 0) + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; + + if (qemuBuildMemoryDimmBackendStr(cmd, def->mems[i], def, cfg, pri= v, NULL) < 0) return -1; =20 switch (def->mems[i]->model) { @@ -7985,6 +8112,9 @@ qemuBuildMemoryDeviceCommandLine(virCommand *cmd, case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: break; =20 + /* EGM memory backing is via memory-backend-file object */ + case VIR_DOMAIN_MEMORY_MODEL_EGM: + break; case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ac56fc7cb4..14f2b3ec5d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7219,6 +7219,7 @@ qemuDomainUpdateMemoryDeviceInfo(virDomainObj *vm, break; =20 case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -7453,7 +7454,8 @@ qemuDomainAlignMemorySizes(virDomainDef *def) def->mems[i]->size =3D VIR_ROUND_UP(def->mems[i]->size, align); } =20 - hotplugmem +=3D def->mems[i]->size; + if (def->mems[i]->model !=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + hotplugmem +=3D def->mems[i]->size; =20 if (def->mems[i]->size > maxmemkb) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -7941,6 +7943,12 @@ qemuDomainDefValidateMemoryHotplugDevice(const virDo= mainMemoryDef *mem, virDomainMemoryModelTypeToString(mem->model)); return -1; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hotplug is not supported for the %1$s device"), + virDomainMemoryModelTypeToString(mem->model)); + return -1; + case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: return -1; @@ -7999,6 +8007,7 @@ qemuDomainDefValidateMemoryHotplug(const virDomainDef= *def, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: case VIR_DOMAIN_MEMORY_MODEL_NONE: break; @@ -8046,6 +8055,8 @@ qemuDomainDefValidateMemoryHotplug(const virDomainDef= *def, =20 case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: /* sgx epc memory does not support hotplug, skip this check */ + case VIR_DOMAIN_MEMORY_MODEL_EGM: + /* egm memory does not support hotplug, skip this check */ case VIR_DOMAIN_MEMORY_MODEL_LAST: case VIR_DOMAIN_MEMORY_MODEL_NONE: break; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 7233df888c..97e533bf9a 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -3124,6 +3124,7 @@ qemuDomainAssignMemoryDeviceSlot(virDomainObj *vm, return qemuDomainEnsureVirtioAddress(&releaseaddr, vm, &dev); =20 case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -3151,6 +3152,7 @@ qemuDomainReleaseMemoryDeviceSlot(virDomainObj *vm, break; =20 case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; @@ -3185,6 +3187,7 @@ qemuDomainAssignMemorySlots(virDomainDef *def) /* handled in qemuDomainAssignPCIAddresses() */ break; case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f2e024dae3..e0ee056b92 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6712,6 +6712,7 @@ qemuDomainAttachMemoryConfig(virDomainDef *vmdef, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: break; case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index fb426deb1a..890bb052b6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -7348,6 +7348,7 @@ qemuDomainChangeMemoryLiveValidateChange(const virDom= ainMemoryDef *oldDef, case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("cannot modify memory of model '%1$s'"), diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 494d7ef515..081f0cedfd 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -7213,6 +7213,7 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitor *mon, switch ((virDomainMemoryModel) model) { case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: /* While 'id' attribute is marked as optional in QEMU's QAPI diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index dc5ade829a..3c2867edb3 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -1839,6 +1839,7 @@ qemuDomainDefNumaAutoAdd(virDomainDef *def, case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0e50cd1ccc..d451c12dd0 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4156,6 +4156,7 @@ qemuProcessDomainMemoryDefNeedHugepagesPath(const vir= DomainMemoryDef *mem, case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM: pagesize =3D mem->source.virtio_mem.pagesize; break; + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: @@ -4245,6 +4246,7 @@ qemuProcessNeedMemoryBackingPath(virDomainDef *def, case VIR_DOMAIN_MEMORY_MODEL_NVDIMM: case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM: case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC: + case VIR_DOMAIN_MEMORY_MODEL_EGM: case VIR_DOMAIN_MEMORY_MODEL_LAST: /* Backed by user provided path. Not stored in memory * backing dir anyway. */ diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index da08fd17cd..e026e2fdd0 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -5861,6 +5861,12 @@ qemuValidateDomainDeviceDefMemory(const virDomainMem= oryDef *mem, =20 break; =20 + case VIR_DOMAIN_MEMORY_MODEL_EGM: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ACPI_EGM_MEMORY)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("ACPI EGM memory device is not supported with = this QEMU binary")); + return -1; + } case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: break; --=20 2.43.0 From nobody Fri Dec 12 12:55:01 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 1764098862400946.8446116564198; Tue, 25 Nov 2025 11:27:42 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id A14FE43E9E; Tue, 25 Nov 2025 14:27:11 -0500 (EST) Received: from [172.19.199.68] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 8378944CA1; Tue, 25 Nov 2025 14:17:47 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 4775044BA1; Tue, 25 Nov 2025 14:17:31 -0500 (EST) Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010032.outbound.protection.outlook.com [52.101.85.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 4D70F44998 for ; Tue, 25 Nov 2025 14:17:20 -0500 (EST) Received: from PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) by MW6PR12MB9000.namprd12.prod.outlook.com (2603:10b6:303:24b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.17; Tue, 25 Nov 2025 19:17:11 +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.9343.016; Tue, 25 Nov 2025 19:17:11 +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=J3agV6ZyMCEGCUsaPGIgDyR4/twMjwsnYgdNp2ogUsYpoqEaEt5Eun6h2A5KkBAgGj4Z+o9YsDknePVU1+MZLelks98CXk/ubJCT16pLZ9pZqkdD4RzVbBrUjAuzVim35cVNzAMxIefaDKOBluUg20Jz+XL86nR2CL50b8bA9fK6VnyiPH4FxXv1OIiZKedvc+uyVxHCqn5hLxjMVvB0xPQ3OjDRs8qXWR7/u27N0xLLIOSr5pEl+baJWRSgJTuqKMQ3zE/aEYyh/Cz+Px3a9sw1HeVWpL/eUY/sf+vKazw/7xPsHoA2xMDMCdF2q+mv/ShZab6hwtgWwjpckbIIJg== 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=PYUBk3QxMYdQdoN9XR04z3cAHnc+ajFqeUvqVWTYl90=; b=lRsNuPW4ZF/VBDxo1qaN7DkEQl+BcgIGLEh3WUqzCJiteRBjD5yVC/BhfCxkQtgoGALtPgWjgyPg6l3g5+hlOxf0tnMP9aigpqfNNvsTEh2L3d55ojYlyptBG3osMXaCwxdlsGSWOndO34ta/21S5ggNjQJG1BDyJP0FSFkz4mJVvqme2DSY7/onJrfhr/chVwigXjNlx6a3fbW3SIeihIKCJ7VQhCaHmVAL/Y4UVhCRbO8q6IBLT+/2tNA4ySZAJYh6LbCyB9ezuEox3QZtD6gceovmVUgHuWSMcc5v99weAbEpVAA7JkPZ0EBLXc3ol32wvY7ZymMO6avP14zm2A== 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=PYUBk3QxMYdQdoN9XR04z3cAHnc+ajFqeUvqVWTYl90=; b=Lp4gNLAigg+gtFVSW0Yr+wiHvmmitDEUQzyPrPOaUp8CWMlidjhMibZ1l4KDVj8LNYZ4DC8usS1e4q8kMai1oX2tfsF6e9JTah1kpys+P47LXOZvEtb/XS1OSvL3Apgup7TgEbzMThAGALZ5byQphNKQKkem4Dkfwa6A9DYGACbop1g3TavIrPF1uLs5ZdvA8JjNZrmnXmSkPCZypeHjGvn77kE8QLYXL51N0jGDP/6M9GMQlOBc98ufZD7CN5JL08pkkqslCD181kBIKOYmqlXBk91bZqa2mWlO1JEgZL5JjjNDlZQqz+j1RjTQaE/HzkaRQ5y+dM/ZMSFijNfcFA== 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 v3 4/4] tests: Add qemuxmlconftest for ACPI EGM memory device Date: Tue, 25 Nov 2025 11:17:04 -0800 Message-ID: <20251125191704.644477-5-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251125191704.644477-1-nathanc@nvidia.com> References: <20251125191704.644477-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0371.namprd03.prod.outlook.com (2603:10b6:a03:3a1::16) To PH7PR12MB6834.namprd12.prod.outlook.com (2603:10b6:510:1b4::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH7PR12MB6834:EE_|MW6PR12MB9000:EE_ X-MS-Office365-Filtering-Correlation-Id: d3d02c21-bf0e-4d88-c2c5-08de2c573b96 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QAj6MJxkhvENgpJVJy4GOVc4V0/PRTX9tgTeP/Gjj1XEvtBus/2MaTdDkP+Q?= =?us-ascii?Q?usxfUVd+nk8N0P8IhIwSAz4/AUgR5gKudxu9IZ0Bg7Bce46gtJmiVHsrcbgp?= =?us-ascii?Q?xNjkg5itDR1x0tjnSTg950kjU2WAtKEqRZGoPSIUqryyhZkiP7o9QfEOicCq?= =?us-ascii?Q?p+wNA7V3f/BvglhY9ulcXtpYa3OWr5l7dRMca1FlXBs0eDK7tEyxf6J+kW9h?= =?us-ascii?Q?q6vaee7KbLBs/4v4D7u/mrccH9Vix0T5ItDpeBuWA+wAFEnObBVq0IYHKNTf?= =?us-ascii?Q?iLwyusgCMHPmcrruoQzb0kr1m9blFXUdDM12RjzBqn3IhUnc4CSvwOIIGyb6?= =?us-ascii?Q?51//bgfFiKq4JOK4PN1hNUyyFTC/Fe7Lx4UAU2A4SItAABEoDQrZu4XyuLMX?= =?us-ascii?Q?O128fNjkqLy4zQ5qGmh3TzAw6iwrWL1U5Ty4tq4OfDSHwvuNAkN91pX3Foq/?= =?us-ascii?Q?XMAznL0Vmcjir1BLVG82JPfg5S9IkeAnmDxPG3LPLUBcjD6+B49BxldQrEUZ?= =?us-ascii?Q?i8PS+RTdg2AIxWwbA0dje5ChpRZ51K8BCZfDhhQ4wQfXQXZktcAwhRv5TZ+j?= =?us-ascii?Q?SViE3+H/X00vjEDDZ5rf3UGfErle6CNAV5hSnmF7zCGjF4EAYm+NSPYwY2MZ?= =?us-ascii?Q?xIT/J3cehq/nwD6Idd6ZnLiBzPC4TBJqe8E2mBASO2a7eQkgGXIjqlwRNPR3?= =?us-ascii?Q?LbRh/sB6Q7yvr4ZQHM7p3fmllJTeAcIceGZV0AVN4Cz5fcPIi4KMh/17ETtx?= =?us-ascii?Q?DD8LByZbc2ZZ+OwzozJtFotFSMSsLZvAFKyAIrieoU6C0W98WuqQw1jdAGPC?= =?us-ascii?Q?3/+Gk36TbA6qk2B04LZsfwL8hCqWw4sW1dFzMRROCkBr+MmfnLsZ+D3rj3pn?= =?us-ascii?Q?e0yEZpCZYCKMfuBMGm8Ddp/riRcW9+vxerGxSo2dOLjiTpt7EzkKbb25hqCK?= =?us-ascii?Q?nNfnja1hcA/nQGyKTYtzrkfTCGkNdq8NeQqQ2+/1m+55CG98/nra1OJqM6VD?= =?us-ascii?Q?6Rsadu/4SzxRToBpmFDASuFwlznwnyrHZ5JNz/AnqXQGDZIPaAGINUtCrv2L?= =?us-ascii?Q?mMD6XsczlEiXb4NULx7MbxXD6s/UlXS2HO/2RUpvzgld6yj0uVMSxvP6/u/m?= =?us-ascii?Q?SJhrWBEDmVAgE1vrH7AWAMLbR74oQdgzcAv/tpA5eRH48gAUhdzO83qOXal/?= =?us-ascii?Q?H3hMdPmdKolGNQDRoeysNwRmjnBsRnUlQ4FhqJzafzSVLpfnWvk9BuzIgnZo?= =?us-ascii?Q?C5SmH5QasbnOCJOt+m8/lkHO14Gxw8AtmOdM3iBgPrY8mH54+DIqDrayuzP0?= =?us-ascii?Q?S9rzlT4VsZXVFcepD9l1k62vr9FYR0fIhIB8RRAHQu111MGgSTFSxl/t606o?= =?us-ascii?Q?Qw/NwbRpIqluYTSyKKKqR+Wpi5HWCNEPA2OM+5nDEjl/3bjK8PDEefvFAG5f?= =?us-ascii?Q?3zjZsZmlopi2IwwoZHkxiLlipQeXoaNG?= 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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?P/mk+xkKw7W7Z+EWBhbyAThFlv98SECRA8CqXLtYF8FfaAW5dJSrbZhwBFHl?= =?us-ascii?Q?J5UCpiomKb3UNyJFtPM/aPizOl/ALOYdMmysVz1Bk9cGEJD1xcJhbfxC98yL?= =?us-ascii?Q?8NJlBmWFZ7g6nHd9QQz34k6RpKs964Z2MJp7Nfs+RuF2qL7pTzzIImuRBdMo?= =?us-ascii?Q?LrTv0J456+YpdmeFijeuzviQ0Ks43F+h6VNcQSYSnUWxV+UGWRPLlz7Rci/A?= =?us-ascii?Q?qVy02AS4xR/m0sKgRy/aZTVijupP4rUzi30nuqcHbLHGEp2zBfPs885i2wLk?= =?us-ascii?Q?q6i4yjOzeTuNMJuENazifpG6KD/T/Bc97ef3zQXYNVUdRH1e8/GBJ7V3Sf0U?= =?us-ascii?Q?JSI0IuJpBDctbvwFO9/lSLB/ycO29mnS4PTIaSGAMsiRfkAQCSj/ul6up9Lt?= =?us-ascii?Q?MFqZxsfovpPGq2hiH8vXQy/n3x3kIzhognsTSvdiETsI6dhJW79nFviOshpE?= =?us-ascii?Q?+VLuM4V2CCXdFlgFiqmgoDHodciV7wSfhnCa5lFhfhkYrRDH1UcyCPwo46P+?= =?us-ascii?Q?nqsv9JQn4urLBwfnqY8BnGAuHaaMpLB5tKz3//C82useTcblGmPKIN7IQJ2Y?= =?us-ascii?Q?80SF30SJT6kSzz1AdQ3BbWeH6Xkwe0WOUjKrToEKlJUL0H7U473ZJfwvx6QY?= =?us-ascii?Q?uqy9+lCH8i4Ni/77/6ZPZBI15LmOhXQzhbpQjvYGP1hvQNM7Ad7K5vYXrMDZ?= =?us-ascii?Q?VbGZ8Isvh7AFX9VqXXTA48GBH7bDS7O7kMFc6YgdxEgmDMsmz76Cy/r9naM7?= =?us-ascii?Q?TV8YoAtZrc/ierRaN0/iK96uQzCzeLVyTUb7IAw8Otwt+APaB5Gqfdumnkpk?= =?us-ascii?Q?pqTjlKru1ZtwyIvHuyHiDxvugLzlA+BsjMnpJy0rSQiRMHd4XnzgudhpY6f6?= =?us-ascii?Q?XfJ7HFpinVp49OEjfTTnjykZfQthPbIa5/uvHDA1Jc82UzdpVvCnVW8sm0Ws?= =?us-ascii?Q?FrimNYvjOiytBI/+DHkQQWWjRiN/f/CsNMj55KzFhlIjjQ94wE3U8d+aqBdk?= =?us-ascii?Q?GO+hmCh2+Xk3CeSSn8traKd8CstMd17awGGkTwWjBd94EbvR28ggDP0sUkGm?= =?us-ascii?Q?J0fWcYLQ1XkdvU/B7IdemQWfTW04aGRg8S8YwPFJTeelokpYJhqfRqt3ewZt?= =?us-ascii?Q?CwB9mJtkhoEJMHYJmOp5lOlCRm9MQGkeups8vMtgVvnnlbadyIx6PepUZuJA?= =?us-ascii?Q?iDE4MczwF2N+XwvI8OdOjfE0ZSqPd6ALiOMjLRv57pNacXBZ7OVAmRuHOIwB?= =?us-ascii?Q?en5C81s1pxEcZ7u9aLN9zsR/44BpCONLwsU+cPsDXCgzRKzFbnlbLo3cbYf+?= =?us-ascii?Q?jBHUUL4GGxX2Bwy0pr7HJUHg0fVD4e1JZPgQNOO58/GBN4Js5yVJ9Msx5CFX?= =?us-ascii?Q?q72DcgivHOpQUsEHihH5a9czHAelnLInu1AC5rrCdZM1iTynsU7TBpFCL50m?= =?us-ascii?Q?23K472Gp8InE/+UBK48ZAiCNvr3uXbiB7aET219DOhKDnQofFWGScj0ALBkG?= =?us-ascii?Q?cA43K2odcGex7mwgbIlVBluJ2H/Jc1PxfiU6YP+DyMn3Yoz+Q2yCiQn+TmB2?= =?us-ascii?Q?cldyMyKJ39XD/jqX2bF04VQ08OHC7f6UNmq26QG/?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3d02c21-bf0e-4d88-c2c5-08de2c573b96 X-MS-Exchange-CrossTenant-AuthSource: PH7PR12MB6834.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Nov 2025 19:17:10.9140 (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: XGzYiy56k2eZcd5QSxiPpR+7Uni5H3UAQUxK2Z6O84sDD+TSv0NCpEmVaPvr+362SkWbXBw6kjuLPANF6aXZ/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW6PR12MB9000 Message-ID-Hash: 43APGWYSAN45OSXVIV4MVQIQLTMIQX2H X-Message-ID-Hash: 43APGWYSAN45OSXVIV4MVQIQLTMIQX2H 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: 1764098865409019200 Content-Type: text/plain; charset="utf-8" From: Ian May Add test coverage for the ACPI EGM memory device feature: - Add test case to qemuxmlconftest.c for aarch64 architecture - Add acpi-egm-memory capability to QEMU 10.0.0 aarch64 capabilities - Create test input XML with EGM device configuration - Generate expected output XML and QEMU command line args - Update validation to skip filesystem checks during tests The test validates XML parsing, formatting, device validation, and QEMU command line generation for the EGM device. Signed-off-by: Ian May Signed-off-by: Nathan Chen --- src/conf/domain_conf.c | 5 +- src/conf/domain_postparse.c | 5 +- src/qemu/qemu_domain.c | 2 + src/util/virfile.h | 2 +- tests/meson.build | 1 + tests/qemuegmmock.c | 67 ++++++++++ .../acpi-egm-memory.aarch64-latest.args | 47 +++++++ .../acpi-egm-memory.aarch64-latest.xml | 124 ++++++++++++++++++ tests/qemuxmlconfdata/acpi-egm-memory.xml | 124 ++++++++++++++++++ tests/qemuxmlconftest.c | 8 +- 10 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 tests/qemuegmmock.c create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.ar= gs create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/acpi-egm-memory.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2cda32fa6e..3fba40476f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8813,8 +8813,11 @@ virDomainDefGetMemoryInitial(const virDomainDef *def) size_t i; unsigned long long ret =3D def->mem.total_memory; =20 - for (i =3D 0; i < def->nmems; i++) + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; ret -=3D def->mems[i]->size; + } =20 return ret; } diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index 0181d21f0e..bb4a61b7d8 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -44,8 +44,11 @@ virDomainDefPostParseMemory(virDomainDef *def, numaMemory =3D virDomainNumaGetMemorySize(def->numa); =20 /* calculate the sizes of hotplug memory */ - for (i =3D 0; i < def->nmems; i++) + for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; hotplugMemory +=3D def->mems[i]->size; + } =20 if (numaMemory) { /* update the sizes in XML if nothing was set in the XML or ABI up= date diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 14f2b3ec5d..1b0b375a49 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8038,6 +8038,8 @@ qemuDomainDefValidateMemoryHotplug(const virDomainDef= *def, } =20 for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->model =3D=3D VIR_DOMAIN_MEMORY_MODEL_EGM) + continue; hotplugMemory +=3D def->mems[i]->size; =20 switch (def->mems[i]->model) { diff --git a/src/util/virfile.h b/src/util/virfile.h index ce2ffb8ed4..5203ef4425 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -167,7 +167,7 @@ int virFileReadHeaderQuiet(const char *path, int maxlen= , char **buf) int virFileReadLimFD(int fd, int maxlen, char **buf) G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(3); int virFileReadAll(const char *path, int maxlen, char **buf) - G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); + G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) AT= TRIBUTE_MOCKABLE; int virFileReadAllQuiet(const char *path, int maxlen, char **buf) G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); int virFileReadBufQuiet(const char *file, char *buf, int len) diff --git a/tests/meson.build b/tests/meson.build index bb6ee6b4ee..28ee8591a3 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -174,6 +174,7 @@ if conf.has('WITH_QEMU') { 'name': 'qemucaps2xmlmock' }, { 'name': 'qemucapsprobemock', 'link_with': [ test_qemu_driver_lib ] }, { 'name': 'qemucpumock' }, + { 'name': 'qemuegmmock' }, { 'name': 'qemuhotplugmock', 'link_with': [ test_qemu_driver_lib, test= _utils_qemu_lib, test_utils_lib ] }, { 'name': 'qemuxml2argvmock' }, { 'name': 'virhostidmock' }, diff --git a/tests/qemuegmmock.c b/tests/qemuegmmock.c new file mode 100644 index 0000000000..c915212f45 --- /dev/null +++ b/tests/qemuegmmock.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 Red Hat, Inc. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include +#include + +#include "internal.h" +#include "virfile.h" +#include "virmock.h" + +static bool (*real_virFileExists)(const char *path); +static int (*real_access)(const char *path, int mode); +static int (*real_virFileReadAll)(const char *path, int maxlen, char **buf= ); + +static void +init_syms(void) +{ + if (real_virFileExists && real_access && real_virFileReadAll) + return; + + VIR_MOCK_REAL_INIT(virFileExists); + VIR_MOCK_REAL_INIT(access); + VIR_MOCK_REAL_INIT(virFileReadAll); +} + +bool +virFileExists(const char *path) +{ + init_syms(); + + /* Mock EGM device paths for testing */ + if (g_str_has_prefix(path, "/dev/egm") || + g_str_has_prefix(path, "/sys/class/egm/")) + return true; + + return real_virFileExists(path); +} + +int +access(const char *path, int mode) +{ + init_syms(); + + /* Mock EGM device paths for testing */ + if (g_str_has_prefix(path, "/dev/egm") || + g_str_has_prefix(path, "/sys/class/egm/")) + return 0; /* success */ + + return real_access(path, mode); +} + +int +virFileReadAll(const char *path, int maxlen, char **buf) +{ + init_syms(); + + /* Mock EGM GPU device file for testing */ + if (g_str_has_prefix(path, "/sys/class/egm/") && + g_str_has_suffix(path, "/gpu_devices")) { + *buf =3D g_strdup("0000:01:00.0\n"); + return strlen(*buf); + } + + return real_virFileReadAll(path, maxlen, buf); +} diff --git a/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args b/te= sts/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args new file mode 100644 index 0000000000..41d1fcc026 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.args @@ -0,0 +1,47 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-egm \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-egm/.config \ +/usr/bin/qemu-system-aarch64 \ +-name guest=3Degm,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-egm/master-key.aes"}' \ +-machine virt,usb=3Doff,gic-version=3D3,dump-guest-core=3Doff,acpi=3Doff \ +-accel kvm \ +-cpu host \ +-m size=3D524288k,maxmem=3D524288k \ +-overcommit mem-lock=3Doff \ +-smp 4,sockets=3D2,dies=3D1,clusters=3D1,cores=3D2,threads=3D1 \ +-object '{"qom-type":"memory-backend-file","id":"memegm0","mem-path":"/dev= /egm4","share":true,"size":268435456}' \ +-object acpi-egm-memory,id=3Degm0,pci-dev=3Dua-hostdev0,node=3D0 \ +-object acpi-egm-memory,id=3Degm1,pci-dev=3Dua-hostdev1,node=3D0 \ +-object '{"qom-type":"memory-backend-file","id":"memegm1","mem-path":"/dev= /egm5","share":true,"size":268435456}' \ +-object acpi-egm-memory,id=3Degm2,pci-dev=3Dua-hostdev2,node=3D1 \ +-object acpi-egm-memory,id=3Degm3,pci-dev=3Dua-hostdev3,node=3D1 \ +-numa node,nodeid=3D0,cpus=3D0-1,memdev=3Dmemegm0 \ +-numa node,nodeid=3D1,cpus=3D2-3,memdev=3Dmemegm1 \ +-uuid 00010203-0405-4607-8809-0a0b0c0d0e0f \ +-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":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bu= s":"pcie.0","addr":"0x2"}' \ +-device '{"driver":"pcie-root-port","port":11,"chassis":4,"id":"pci.4","bu= s":"pcie.0","addr":"0x3"}' \ +-device '{"driver":"pcie-root-port","port":12,"chassis":5,"id":"pci.5","bu= s":"pcie.0","addr":"0x4"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"vfio-pci","host":"0000:01:00.0","id":"ua-hostdev0","bu= s":"pci.1","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:02:00.0","id":"ua-hostdev1","bu= s":"pci.3","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:03:00.0","id":"ua-hostdev2","bu= s":"pci.4","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:04:00.0","id":"ua-hostdev3","bu= s":"pci.5","addr":"0x0"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml b/tes= ts/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml new file mode 100644 index 0000000000..bd73d613e5 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-egm-memory.aarch64-latest.xml @@ -0,0 +1,124 @@ + + egm + 00010203-0405-4607-8809-0a0b0c0d0e0f + 524288 + 524288 + 524288 + 4 + + hvm + + + + + + + + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-aarch64 + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ +