From nobody Tue Sep 9 19:11:26 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (BodyHash is different from the expected one); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1753255546669189.57237869741914; Wed, 23 Jul 2025 00:25:46 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 89F90B2B; Wed, 23 Jul 2025 03:25:45 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id B361B1357; Wed, 23 Jul 2025 03:22:43 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6E04611BB; Tue, 22 Jul 2025 16:26:23 -0400 (EDT) Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2086.outbound.protection.outlook.com [40.107.243.86]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id B2D5C11C6 for ; Tue, 22 Jul 2025 16:26:22 -0400 (EDT) Received: from CH0PR12MB5092.namprd12.prod.outlook.com (2603:10b6:610:bf::16) by SA3PR12MB8802.namprd12.prod.outlook.com (2603:10b6:806:314::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8943.30; Tue, 22 Jul 2025 20:26:20 +0000 Received: from CH0PR12MB5092.namprd12.prod.outlook.com ([fe80::969b:49e4:6d48:b058]) by CH0PR12MB5092.namprd12.prod.outlook.com ([fe80::969b:49e4:6d48:b058%5]) with mapi id 15.20.8943.029; Tue, 22 Jul 2025 20:26:20 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, FORGED_SPF_HELO,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.4 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FkLFo262FmCgXtBqOLgz/kq8dPllldkgfXfY3kuWrc3hPvFDwpJSVGM/F1BxQX4Rz4leIcyk3t2pyHowKpRkTivYlx2/ACMHYvZW4WCuf7I8zTF62GQcIXloy2ETLu2+Ez+to2KsVFbSkUvVNBhWTzVL3ED7oUXz6AaJ2qYLIHcmQhMKCsib9kE6hwe9kA9e95t6mVmpQ6ZULEw+ACgWilRD17xucDexQuMRVW0WW5iS1viW+x8QOL0lNIc3RGD+O4r4KpsAux4vKSVDWt181z+H+LGIZdknJ/s0e4mtlLpG1Fnr13xThn/RZCdIL3Yccb6uPkqolU/hd6aKxbzLmA== 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=FQm6FGcKoKpcO94BZlME5a0MfCZrEKNdLNWHb+vrsgA=; b=PTWWXnpVxpTI7W4XeyNRwfUVBrfIvTp8ONXiuHvzfS3vc3Vaumot9YKADcB8FBadc3aNEccHFu0QStG76H7QjZZzKxSy15fyLwpS1dFr3vGt7QpnGLXO8i+4Esnnsk4s8Sm3d4Wwpfl6Ujv86ddrQUyWViE1X4ezDFpCbYdsTSjGHe7wxsnynyLimjr6ttZa90qNgnvGNh0v3k9rO+190GJ/JhM/nyE8RtMN97apz6dexuJJRqflIE++LQzk77w/7AywNGYGUB+xoANHSnfIVodhFTp3Mj9DEnPJPtyVdJuwnsqEv93CqnrY1YxRRLe6KbPD/qUZjiZkWmZRUDkR2w== 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=FQm6FGcKoKpcO94BZlME5a0MfCZrEKNdLNWHb+vrsgA=; b=mmFjgq0wuYJ98xjvQjO7xEa//wixQEdgHxoSjCjFoOvfI6EJ1Lg9os2NNTPINYXnXHEFngrtzWFUj6iFmP+gNFBQ4sYivf410SG+m7vq0sHPm7YFjHFMxfAYUke9CPxQcPc7q69nzVjOhUkRC8jtv1jqGxmX74+k1/IEJDg5lLRWroyT6VlVEE9bR7PMGZNdmFQUkvC1GHmvkFDQiZVkdlXts0D/++JBNUwCMHidemeWJ+aoG5Q4vWPoCkz6h/ZhiR07iBSJ1l+suW60TOKmPbzP3HEKvrVbgOOjMnzdaWfwInnW0DII6/D1t81Xm/sbN/REEM3ZYKvmj0FxcckNbw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [RFC PATCH 4/8] qemu: Add validation for ACPI EGM memory device configuration Date: Tue, 22 Jul 2025 15:26:04 -0500 Message-ID: <20250722202609.1823658-5-ianm@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250722202609.1823658-1-ianm@nvidia.com> References: <20250722202609.1823658-1-ianm@nvidia.com> X-ClientProxiedBy: SA0PR11CA0074.namprd11.prod.outlook.com (2603:10b6:806:d2::19) To CH0PR12MB5092.namprd12.prod.outlook.com (2603:10b6:610:bf::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH0PR12MB5092:EE_|SA3PR12MB8802:EE_ X-MS-Office365-Filtering-Correlation-Id: 1b753fc4-f9ae-4eaf-c986-08ddc95e04dd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?hcJV0124ziVjfori5aCJeEjh1Z0xPW5usnCpUmUImUtqWXl4Y9zBOKy2bkGR?= =?us-ascii?Q?zt0W6Bb6kPNhjmVdutdMcptNeMjZeK+ro/zPHB76I6dlud/kVvtTPucFeFak?= =?us-ascii?Q?Qnt10flYEBqLFy2585lg8kFcmfGaYgvYb4nh0G2Qov3pqFIL/cgcPQGD6PrB?= =?us-ascii?Q?KxpqCJlya4SaADudP2XErkRLwS7qOEjVYvrVJaNnjFzeprJR06yghaTmgtGc?= =?us-ascii?Q?K9MZIz1JJu74ReSqGoaNEFo5Btj/HgPA4uWPBGwv7ITZMKPN47pg5LFntqEf?= =?us-ascii?Q?94uJvDtZ2Gq1R5jl66fMcWs4Zja11UyC5lSQB1CAqvGIRNiSVabNWUjzcgR4?= =?us-ascii?Q?fzo1seHeqQ53yOxXIxxOse+XRn9DTFCaANHuNhvsiqYTkp2MEN9cBjT84GIp?= =?us-ascii?Q?NA2xftigZ0oDeWtQhdjPdkQ23T40Np7UZcfcFhH26FcwVRD17Z2EOnKD+xFJ?= =?us-ascii?Q?94Dtnqdy5YHtlGLPN6ilhfofa8DP5HNU5OtlejnIXMz3bSFY4GdElhRtSDuM?= =?us-ascii?Q?nHj4efRmzFwCOP6mP8pRfC/5xuOvpOruFwtWRvCoShR3FoWmzKmzBwlqpReT?= =?us-ascii?Q?VZIeDZh96OdV91kDi4NAxDJgcLbwXfaUTDZTWolPevRO1Inocg+9uZP8L7FI?= =?us-ascii?Q?+B4pMai+XDjQkni6iRtSZgSls/hiRC4cYv+t9cBGJgzhTBj0xEE/pbcy2PkB?= =?us-ascii?Q?NGFXk1kJuyFcoYYGIIzsZePAQqjc3gXODT5X/mHK/Kw2Lg21v6tXEZFJe5pD?= =?us-ascii?Q?kHAI5RAywNTOorS3aRQfeLs3cnWQoO9Lp+KrPtIByYwtPrzzLNRpmNtI2cX1?= =?us-ascii?Q?XNdteEwsjz3Vz/w4rq5C+tSdSnsbmbisot0V12g+0O71ZOmvtE+gz3n9/Vv4?= =?us-ascii?Q?Y0qtO6I+z9c8E00hlXeXD7ssFsk5l8dVHqhXRQ95nPp91xG/CYauvA99Oqql?= =?us-ascii?Q?R9FOERuC+lYWSAupkNl0VhMl5otcOJkfsiw/a8BsR1xJDSRW74s4+oU03EVk?= =?us-ascii?Q?vLgEtnHqJ9AZYiZtjz0rAHHtpg8Ay/cGB5e+aaKYqyhDUYKLeiDU3grFntAO?= =?us-ascii?Q?g7+lU/pV07PwsqQfvfUOenowm6f/vvDSaZ2xq73icgdozVljAbgLyBO/tSZR?= =?us-ascii?Q?ge67+K/inOvkCbW135PDP+BGnx/mi9SjKQ50gpQZxNgSX5ZcvkaF6aRZABHH?= =?us-ascii?Q?DQXRHsSfPbvNqIsAGxQDZxuQT3ZYwwweWNrINXDz9E1mu3J3UDRcgdcGex6h?= =?us-ascii?Q?AE2Kn7rgBjuXpbhHxP2jx1DAcJJZc9TOX+ujqq7O69xSCuKCOxfwc6PJbahA?= =?us-ascii?Q?euo41rRDmSc7AkCJ0GHExdswANc9PZgnkYAUtnDYPOXQDiLpsLiT98/nwIRH?= =?us-ascii?Q?tXYFkdnndn0KXj4zzbgn8F0oa5wzNHRWT30OMAJiKaPGvwjKoQ4cDyqbX2Sr?= =?us-ascii?Q?Xrn8FjEmPWI=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH0PR12MB5092.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?cGprZ9a+kDW99tNjhTU+0oN8+ukNiMkk/ypiLPu1vHz2v2aCODqaxO27lJNJ?= =?us-ascii?Q?8V6k1E6FdBHEjJZu8RifiXhB4gMn5YtwWXGgpRjZNV17EspWQsk+qSsEkrWv?= =?us-ascii?Q?bjM4aQlqRx914d6dgrUPntm3YTvwRYN/NCHXKJ+/8NKAd9PpNyV0XqUkmw/3?= =?us-ascii?Q?kKi/6Q1hQvWtS3bgNVQwhFOCB3xxZeOBgo1gtOSe1HScVny8Rd56TOcH58xD?= =?us-ascii?Q?8Nx+79idCtCcdVyyvXWyPWFE8uEu7jGwGQWO6FU5w6J/e7rzt7Hj6lXbevv5?= =?us-ascii?Q?0MqX5nu1Xcr5oJFIqH847NMWFo+WKKCcdtBR9FFdtaRyWkQTq8Ujn8EGGb6n?= =?us-ascii?Q?BLxKTOLudOPa2LO8lpuA4gjgZUDPkQicW0QpJg80k8t20ijFuPfhdELn+6fQ?= =?us-ascii?Q?LmS3jxUPfiXXeVuI2agKK3P3/mw6o6prvh4hlQ1i+Ejb6RW9BwvsYrTf833h?= =?us-ascii?Q?Pq7la15hQGkAylxrICFhbtAAflZ0U+1PQ91hiIBmXLusQFn3A8F1ibyQdl5M?= =?us-ascii?Q?6jK5y0HMiuSE+CX946aB2uEJCsciCWmdhVNZl2d2qq5W/cVd7EMS1S6WhavX?= =?us-ascii?Q?LfVl8gEvmCuUV5C4fdfBPGuSPnjEJMEcHYKIF2+dHhcN8bYRZkhuh+a/r8I4?= =?us-ascii?Q?HSsZBDjZg8r0yZb2SJHmXh+mpGLIatxm81ZOaCxuI4218lPc3oAp7IdMZUHj?= =?us-ascii?Q?1WRAUW+gx8e46WQs47yESReM5vPu2OQZLCW9OWoPY2I1BRbGN8cSrp1yBuN6?= =?us-ascii?Q?EbJR4vDJ5HRwU19gY0/98KjGA29Ba9sJK6R7m9FANw+837/L8pkIJYXESDqQ?= =?us-ascii?Q?QbhCN7wI5V3wA2llMlZzYHLVIA9wYXoFYvL9wrVu1RJUP7mUxOIdIc7oV3yX?= =?us-ascii?Q?fWh2AnodS0rRceVeMcHleLvpQfRJ5biL0iKVf9zuJx5y0C849aHlulyO7LaE?= =?us-ascii?Q?CwjXY5En50dkKhFOgashil5yFD1w9r3IQjwOseFn6CH8QszhX0t1WGWEyAha?= =?us-ascii?Q?uU2JLmSe0DFRbQRGFZkmkQPQs1M5H+LJ/PLWk20YaF6qeNQXgULa79PeYigM?= =?us-ascii?Q?P6EAFWXwl5B2d0r7St/QITtHhFqUjJfN1/XVdYR8Qncg/xETsgnQ7+BcuXz7?= =?us-ascii?Q?tiJEPzUZyRavvqUwXuPyUM5jH3w5hFu3wpsymAp7itwkNSZB/r5ctHziezYI?= =?us-ascii?Q?LFUR0PvhLvVCoJoWtEtMxQIR7L1y1wxW4ZPF5+sTpUxxu2Pkb3m41/+jPZf/?= =?us-ascii?Q?PJuaLSRGmvplnDMICY7L1ulxlf8haXbIrlzv0kTkAVx+s0OKodn9gNBBmLOA?= =?us-ascii?Q?4DmDlGq5ZP71LiUR/kGfbBbDi2PUenhLd0vFGQjfYvYvGvVPqNMyNjIDzyS+?= =?us-ascii?Q?Amgjh60+qw1WSSu8whN7iBC9dpOSdrRKPWNYwYdExuWbjjHaLlqq69akjUD2?= =?us-ascii?Q?OacC8ABn/5khOAJyd8dtqQc0nM4Tr2lqcpR4etsj8OSm8Xb4+rKjYvFZglRG?= =?us-ascii?Q?dCQcbNHat2C6Slv8z2nF2vqRjx0oVx+A/0azlij5TaIz6U8k7lbvsyvQuK8b?= =?us-ascii?Q?Z2aa/LHfH3bj3qdYUkRHxsTd7HhYVbJ089biIMMC?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1b753fc4-f9ae-4eaf-c986-08ddc95e04dd X-MS-Exchange-CrossTenant-AuthSource: CH0PR12MB5092.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2025 20:26:20.3672 (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: yaeBDOeepHXLChQI3CEjMmqXebXMWHxiufUX1OxW+BADYi4rSLVQeuW/W0WXdjcO X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB8802 Content-Transfer-Encoding: quoted-printable X-MailFrom: ianm@nvidia.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 Message-ID-Hash: A77EGQPONTL5O7GZ5CET3PJ5XWEA4G2Z X-Message-ID-Hash: A77EGQPONTL5O7GZ5CET3PJ5XWEA4G2Z X-Mailman-Approved-At: Wed, 23 Jul 2025 07:22:29 -0400 CC: ianm@nvidia.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Ian May via Devel Reply-To: Ian May X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1753255547229116600 Content-Type: text/plain; charset="utf-8" Implement validation logic for ACPI EGM memory device configuration: - Validate PCI device reference exists and is properly configured - Check NUMA node assignment is valid - Verify device paths exist and are accessible - Ensure proper permissions on device files Signed-off-by: Ian May --- src/conf/domain_validate.c | 22 +++++++++ src/qemu/qemu_validate.c | 99 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 88e61fb878..3cbfe867dc 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3203,6 +3203,26 @@ virDomainPstoreDefValidate(const virDomainPstoreDef = *pstore) return 0; } =20 +static int +virDomainAcpiEgmDefValidate(const virDomainAcpiEgmDef *egm) +{ + if (egm->pciDev =3D=3D NULL || egm->pciDev[0] =3D=3D '\0') { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing pciDev for ACPI EGM device")); + return -1; + } + + if (egm->numaNode < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("NUMA node must be specified for ACPI EGM device"= )); + return -1; + } + + VIR_DEBUG("Validating EGM device: alias=3D%s pciDev=3D%s numaNode=3D%d= ", + egm->alias, egm->pciDev, egm->numaNode); + + return 0; +} =20 static int virDomainDeviceInfoValidate(const virDomainDeviceDef *dev) @@ -3318,6 +3338,8 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, return virDomainPstoreDefValidate(dev->data.pstore); =20 case VIR_DOMAIN_DEVICE_EGM: + return virDomainAcpiEgmDefValidate(dev->data.egm); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_HUB: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 57dc4171fe..b7cb0c632b 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4977,6 +4977,102 @@ qemuValidateDomainDeviceDefPstore(virDomainPstoreDe= f *pstore, return 0; } =20 +static int +qemuValidateDomainDeviceDefAcpiEgm(virDomainAcpiEgmDef *egm, + const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + g_autofree char *egm_path =3D NULL; + g_autofree char *egm_pci_path =3D NULL; + g_autofree char *expected_pci =3D NULL; + g_autofree char *gpu_devices_content =3D NULL; + virDomainHostdevDef *hostdev =3D NULL; + size_t i; + + 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; + } + + /* Find the referenced PCI hostdev */ + for (i =3D 0; i < def->nhostdevs; i++) { + virDomainHostdevDef *dev =3D def->hostdevs[i]; + + if (dev->mode !=3D VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || + dev->source.subsys.type !=3D VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PC= I) + continue; + + if (dev->info && dev->info->alias && STREQ(dev->info->alias, egm->= pciDev)) { + hostdev =3D dev; + break; + } + } + + if (!hostdev) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Cannot find PCI device '%1$s' referenced by EGM d= evice"), + egm->pciDev); + return -1; + } + + /* Validate NUMA node if configured */ + if (egm->numaNode > virDomainNumaGetNodeCount(def->numa)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NUMA node %1$d for EGM device does not exist"= ), + egm->numaNode); + return -1; + } + + /* Validate EGM device path exists and is accessible */ + egm_path =3D g_strdup_printf("/dev/%s", egm->alias); + if (!virFileExists(egm_path)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("EGM device path '%1$s' does not exist"), + egm_path); + return -1; + } + + /* Check if we have proper permissions */ + if (access(egm_path, R_OK | W_OK) < 0) { + virReportSystemError(errno, + _("Cannot access EGM device '%1$s'"), + egm_path); + return -1; + } + + /* Validate EGM pci device path */ + egm_pci_path =3D g_strdup_printf("/sys/class/egm/%s/gpu_devices", egm-= >alias); + if (!virFileExists(egm_pci_path)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Cannot find GPU device information for EGM devic= e '%1$s'"), + egm->alias); + return -1; + } + + /* Read and validate PCI address from gpu_devices file */ + expected_pci =3D g_strdup_printf("%04x:%02x:%02x.%x", + hostdev->source.subsys.u.pci.addr.doma= in, + hostdev->source.subsys.u.pci.addr.bus, + hostdev->source.subsys.u.pci.addr.slot, + hostdev->source.subsys.u.pci.addr.func= tion); + + if (virFileReadAll(egm_pci_path, 1024, &gpu_devices_content) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Cannot read GPU device information for EGM devic= e '%1$s'"), + egm->alias); + return -1; + } + + if (!strstr(gpu_devices_content, expected_pci)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("PCI device '%2$s' is not associated with EGM dev= ice '%1$s'"), + egm->alias, expected_pci); + return -1; + } + + return 0; +} =20 static int qemuSoundCodecTypeToCaps(int type) @@ -5748,6 +5844,9 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_PSTORE: return qemuValidateDomainDeviceDefPstore(dev->data.pstore, def, qe= muCaps); =20 + case VIR_DOMAIN_DEVICE_EGM: + return qemuValidateDomainDeviceDefAcpiEgm(dev->data.egm, def, qemu= Caps); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_NONE: --=20 2.43.0