From nobody Sun Sep 7 06:45:56 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 1754986753870885.0443544106689; Tue, 12 Aug 2025 01:19:13 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id B761D116; Tue, 12 Aug 2025 04:19:12 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id BB94912BB; Tue, 12 Aug 2025 04:06:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3EE871F47; Wed, 6 Aug 2025 08:44:51 -0400 (EDT) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2047.outbound.protection.outlook.com [40.107.236.47]) (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 8594A1F42 for ; Wed, 6 Aug 2025 08:44:49 -0400 (EDT) Received: from LV8PR12MB9620.namprd12.prod.outlook.com (2603:10b6:408:2a1::19) by LV8PR12MB9666.namprd12.prod.outlook.com (2603:10b6:408:296::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9009.13; Wed, 6 Aug 2025 12:44:41 +0000 Received: from LV8PR12MB9620.namprd12.prod.outlook.com ([fe80::1b59:c8a2:4c00:8a2c]) by LV8PR12MB9620.namprd12.prod.outlook.com ([fe80::1b59:c8a2:4c00:8a2c%5]) with mapi id 15.20.8989.018; Wed, 6 Aug 2025 12:44:41 +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=bUs+JCj2uZdbqK5Ymk8Y37ue0MlsbDd2a5xfqZ7aOhPl/6krKhdha6GeOMPPhBj8WIU6FoJsRHPi0eFjCN9FB/AW+477M6PoLzvAXfo6hk9Ru0MVVg+BxeBkf6nmHST0D1ocXVHNgPhuv8oYJNv+gL5sgb9CKLho7QjnnbbIyk9+UbOToYFIaLinl5Eb5fVEB94ZFIbtkVrskErEDWdzWEJpN5OpKuclofIosHWWoZ9ASXsOTXqGZVzZxQLCddgBBvr6wkgPNN7xfaUdp1bu+IlwVv7SKUYNcxiGa1F3L1poyqK7hUB7R9h5nSXUp2KLELS37vYj6ImKDSp1MO5EOA== 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=zUbWA6utioqYf1eGZ0v3c2CxU/V6O2RW5UuYf0EsPDA=; b=s7kLKHHMQFPwviT618JrGznHNWnuIWiMjqKU4m8F5/eNaFygwGlPOjYrR3nrDxzWfoiBx2rTBe1TD7enzSQ1tojgCrMg5lMSIlPdr1f3T5cYrAzaKD60T7MXtJivQEzGvfC3l8END0+NxheGRv0j8t3rhlSwsFAWFEG1Usm6n14Jyw1WQo41r9R1tSgW/y/X91ZZoDePB3BpE2lydW0JsFllaINaQugqXM4wmdD+LSKwdlfGaqiJlq4iHQZTgzav4RHoSr3Cdhb+IDDt8wQAoQaorlYn/dXqw2JiGPU8IZyxNMogB3NA+koeY5sI1C0l9YwQxroF7r7/8aSwOF1Plw== 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=zUbWA6utioqYf1eGZ0v3c2CxU/V6O2RW5UuYf0EsPDA=; b=ERuo1bFjafPzZq/QCVOfI7JAHtclVzKq9yXZLroFHHe3lFDgg98BNwmGfIeoCrFzISI+rY+EIQQb1YXpS6zcm0cuRgODBkUeYykYD+GUv9vdbafdvq9xJDXLYLOxbK4To0bo+h4hUZ9zK+PtjcwFZNH+ZSuldQ5yEeN8+h2BWBv7mQE3OyZM72pgg7SgdWBcNDZb5ymOW3tlyXsfKN25Qq7JdegEjNVNyq607Lb3ugeKOK9PPfumJVkKE8WNfUxD+N2TogppgLCfXciYS2lnHb8W1FufCFp/0XOkLvMQ6nUQmSVBllhpHbZD0qngutuQVCKsn2fbCWTYvmyGqB6PaQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH 1/6] conf: Introduce acpi-generic-initiator device Date: Wed, 6 Aug 2025 14:42:11 +0200 Message-ID: <20250806124415.107369-2-arighi@nvidia.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250806124415.107369-1-arighi@nvidia.com> References: <20250806124415.107369-1-arighi@nvidia.com> X-ClientProxiedBy: ZR0P278CA0221.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:6a::29) To LV8PR12MB9620.namprd12.prod.outlook.com (2603:10b6:408:2a1::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV8PR12MB9620:EE_|LV8PR12MB9666:EE_ X-MS-Office365-Filtering-Correlation-Id: 9eb82482-c0c2-4485-63c2-08ddd4e702af X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?s8ggfOYaZce+q9Rps7ZQu8hxh5Ftu8yik0GWxVElqcH8Pw8HDo7fP6KPkHPT?= =?us-ascii?Q?dSPptXP7nPDa6YWdZPz04CI0AtzskC8Vn6FRNeYjdYIQo8aShNzGmw0YeVki?= =?us-ascii?Q?GV2loLG4mPnRQpeuwvxkBfIFNIoC2l9qWyh+Igg6mZZr2AzDD+2BWS3LTvn7?= =?us-ascii?Q?L5N/QZqF5LUtejYErNavbNlUi7LPCZI3o4s5lCfbwD6YiwP/OQfveiUyS6ZJ?= =?us-ascii?Q?Fhj8wb9FvV6IVUz51CLAzOT2bNDx/SZfrGZj10Svyv+4AkhN0btsRQ9ilYql?= =?us-ascii?Q?RM0ecU7HgSFU35qc5hcUjzFQfs8+WhNNOZAB42ySBkYDRE7KDJBDoYhWOGl1?= =?us-ascii?Q?voCy+BFLl4nd/DsYQtR057kny+XnNoyQEIFxq9sh3X2ibGjjlJKoT2Lu3ruM?= =?us-ascii?Q?NwScxR9GOzA4CL/i0czpGhQrryE/T9jF8bwfhUq2DqMa1IGFd1sDcJ8nwFCo?= =?us-ascii?Q?VRExPUUx1y8vwtGZE7LwfZibHkunCP1umQ44jGhtBS+yiXNXpGR+ueq+gmJX?= =?us-ascii?Q?gdeXrBozEE7QIU3XyLyoreGrBQ0KRNo9lzC7cMHkGNj5wkU6jjC34He+w3+F?= =?us-ascii?Q?PL13bnL6cba5RI8U+MTVIxsiS8PRFWLpadLfkzlrqkPK7m2lDleFy5Q7jdo7?= =?us-ascii?Q?xWGxX0QbjFXEsICT0UHPAyhTC2eg6wPKs6A79ldLiwFa9i2lZbyr+tCKesix?= =?us-ascii?Q?gM+CnGR3X5z6BiVvnx96IVkbnQ7fwBzhUdqw4Az+a7ZoWEyx9ArnZOofCAD3?= =?us-ascii?Q?9kQay4RRJWOLol8x8slEtx+/6BKda48Uya5abb2pOwoGM5GsgcbY0TlsxApK?= =?us-ascii?Q?0RO9mPvo+YYtkprUqFqeWmIMfzCx9wk6IJrRlIyG5tydQ3A4QaFXZal1VWi0?= =?us-ascii?Q?aORAKTRc+/bJ1Qtvhq3yqxs3dE63gGPpNGwx2wa1uukSgGkJJycS+xuX0hqA?= =?us-ascii?Q?Q700adF73qPPw+rdeQozeRnBH6U1MganGB7bj4hhYlu4wBzLHQWYVGC3dkdI?= =?us-ascii?Q?4fGNa0JB8VV90TG4R2LbWNYZvY/h8fjjXs/B5Vs+BhQ0MycrEwTaU67Gi1K2?= =?us-ascii?Q?cB1YkQOg1lOOY6cF756yCwq8PfqQtRhFJSppx/ZjL7UyLgT4jWVPptlkkx1j?= =?us-ascii?Q?JAcyt5Mh6qEYNEHM3GIef/HyOI9vSoBvvu8kPDzDwDdmRJp/0D/ecwof3SBl?= =?us-ascii?Q?0ztxPYxzNCxEmT6nOF4PvJUYrpEE0+GOBot15hLqWR9KoVlp7IsKbBRAm+jj?= =?us-ascii?Q?+eUiC1wiMWb9ac4sLvxUdYt8uR23gGTM8WRPLexqHZpGn4fLf+1YizPX57hY?= =?us-ascii?Q?yzAabRMhdHnXesFh1DsA7ZyD5aPab2nMJfVRJkdx9vX094n4ziQEUQdi24P3?= =?us-ascii?Q?1ahCoen0uRGxWyEUIyLLSeV10Y5unKt5jVovX1AOagEVFb6zWorxLvEK9bRe?= =?us-ascii?Q?ekOT7+PW9Cc=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV8PR12MB9620.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Hs6S1kU6/lx58gOAxAABG2BvO6ctpcMgkUhs03mmQkZjHD5FSCgSX1aUufX0?= =?us-ascii?Q?dMg725Bc0cNm8oWdaKQyVHV7KgdUulQb/hqsqiFCllQpkhX/eW6DlFz6ALfg?= =?us-ascii?Q?G0q2SzfQBQxI0y623S+kHunWyGV53GH0pttAnopX6ZAudbk30B0/PlLzp25l?= =?us-ascii?Q?3IVzOfDO0DLqy7I/IFYCjShjc8IhxNza+nSEB1rQvIyZTgENgy/FyVH3lkCq?= =?us-ascii?Q?Svy+WoD0awnQPqFkWlcBmE6zsbv3C8qb+HER8W9poI/ou7wfyxfPS6ZTMGUO?= =?us-ascii?Q?WfXIjNglB7Iv5yPYrYibQA6jaIYNNj89FzHKjr4ohlHRunB0YCCBBbaVhIF0?= =?us-ascii?Q?VEdK2bXFJPfxIkFSTJApafpsrd68g71+cXHH3Wod+tBHO+mxf/XOZdpa+mD+?= =?us-ascii?Q?7mRqmOv/Tq7MkunV5kClQV2FVxuHjUdrH5FOuz0cE1mCov7pCkmb30ylmgtg?= =?us-ascii?Q?T/bt9JNxislq0HuvZ6Y4Dc85TY/oD00SMSZg+zpyHwYiVEzziKycuDz3tTGO?= =?us-ascii?Q?oA1q2k+KpDgv3DNTxmTRFGttO+Lw0Uw4O+NYX8UhlSuZO5Etmo9xFYtZ85iE?= =?us-ascii?Q?L5TaWz1SRy4f7f1RhIRhhRfZLelmGDrS2JbXHYxHtRVB5hMVq4duyX+dYv0e?= =?us-ascii?Q?SvLAk336pAU/f/jS9Q0W4OGYweg4SK9zS4bsoRMkRUhtg6zAVww7Jffa5wwK?= =?us-ascii?Q?jepXvnGt236qKIpNhIlnlmKqYgqJj4xNZTEjyCh96qUn3Pe9lPARS2FD7JNq?= =?us-ascii?Q?xVzsySjQV3j+i+l/B2sDP1Hl5CHy0B98sB7zeS6KfMAif3i9oy6IyXMBHK//?= =?us-ascii?Q?cUHpXwTLuX7JYMvVDwHkKpsNz5oqMpTpVQqCor+aDURgCqoq4ynFp7s963Mg?= =?us-ascii?Q?2KH3qbo43JokNcPNy/n1df6+6GAV+VGFkwZKH29MlGoUcEZaKowXiSj0wcpL?= =?us-ascii?Q?HXGH3+9eTj9lGToB8wsnn5B4RMTBvSOAYBZkZpwPhd0d1g3dZjdebEmIdDWr?= =?us-ascii?Q?VKakYxmjtZgV4Bo/nUqDQXRnaGGCrgepb6NjUbcWuau+kVSgLdtuhBS98kiK?= =?us-ascii?Q?M78oC893M8k7jsTkwdYBug10Uz7h874XNd/c2nhGI1E6pMw8u+CFm47f4CHf?= =?us-ascii?Q?VFI5SZg2HcfwZTp3fJbYTby5T9r98IIteY871GF44YT5kYjx19ddFKDJJu+H?= =?us-ascii?Q?gjS4eiBBirruxvjLIShm6YIijp99kAHTOuHyOx6xxDw5vcDrtM4l6HrADfaM?= =?us-ascii?Q?yXHKMMNxQofX38ml1PZrM2pnRMY80EBTyT8OmVZVveRWRDAAT8+mRSTD8cNs?= =?us-ascii?Q?BUcMFaEI6zlzSWrKTi7N5UOG+COXrszUiIztxgK5GF7CgqyPyV6DUeQr+655?= =?us-ascii?Q?R0YI3qkQOYVw6waXVCuYnI8uZqqSumo6f6pbTJuR8ZDMHneLw+wdwuT0DkuR?= =?us-ascii?Q?0O8lPThMe8lXTWMQhwQeuPAi6tT5DQGkJsfXjrf5JOh/BunCoXCeJ27CFsTJ?= =?us-ascii?Q?iEaUValvLZePG7sQ5FqQ0Wo/epUn/Gv29dddHn8tuZumRv7PpEyPTU9n8E1E?= =?us-ascii?Q?oqQ4pgRKDo05HSiV6v3JUNp7XCPSpmS7WxUx565E?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9eb82482-c0c2-4485-63c2-08ddd4e702af X-MS-Exchange-CrossTenant-AuthSource: LV8PR12MB9620.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Aug 2025 12:44:41.3668 (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: QqHerV0NutlOF2FaZN1Tdc6C9cLM6JhbEb/sb6nSboOsLvkGAkms0TC/9+3j484JtjCBDV7gOyuksZPKACcaaw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9666 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: P6LWCGWZG4R2CH2EB4EVNU6EX55ZX5WZ X-Message-ID-Hash: P6LWCGWZG4R2CH2EB4EVNU6EX55ZX5WZ X-MailFrom: arighi@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Michal Privoznik 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: Andrea Righi via Devel Reply-To: Andrea Righi X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1754986754234116600 Content-Type: text/plain; charset="utf-8" Introduce apci-generic-initiator device to the domain XML. Example definition: dev0 1 This enables partitioning of PCI resources into multiple isolated instances, each requiring a dedicated NUMA node definition, that can be represented by the acpi-generic-initiator object. Link: https://mail.gnu.org/archive/html/qemu-arm/2024-03/msg00358.html Signed-off-by: Andrea Righi --- docs/formatdomain.rst | 36 +++++ src/ch/ch_domain.c | 1 + src/conf/domain_conf.c | 138 ++++++++++++++++++ src/conf/domain_conf.h | 14 ++ src/conf/domain_postparse.c | 1 + src/conf/domain_validate.c | 37 +++++ src/conf/schemas/domaincommon.rng | 14 ++ src/conf/virconftypes.h | 2 + src/hyperv/hyperv_driver.c | 1 + src/libxl/libxl_driver.c | 6 + src/lxc/lxc_driver.c | 6 + src/qemu/qemu_alias.c | 11 ++ src/qemu/qemu_command.c | 1 + src/qemu/qemu_domain.c | 2 + src/qemu/qemu_domain_address.c | 4 + src/qemu/qemu_driver.c | 3 + src/qemu/qemu_hotplug.c | 5 + src/qemu/qemu_postparse.c | 1 + src/qemu/qemu_validate.c | 1 + src/test/test_driver.c | 4 + .../acpi-generic-initiator.x86_64-latest.args | 55 +++++++ .../acpi-generic-initiator.x86_64-latest.xml | 1 + .../acpi-generic-initiator.xml | 94 ++++++++++++ tests/qemuxmlconftest.c | 1 + 24 files changed, 439 insertions(+) create mode 100644 tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-lat= est.args create mode 120000 tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-lat= est.xml create mode 100644 tests/qemuxmlconfdata/acpi-generic-initiator.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index d3c04d8b2a..3eeafade67 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9152,6 +9152,42 @@ The ``virtio`` IOMMU devices can further have ``addr= ess`` element as described in `Device addresses`_ (address has to by type of ``pci``). =20 =20 +ACPI generic initiator +~~~~~~~~~~~~~~~~~~~~~~ + +The ACPI Generic Initiator device (GI) allows associating a PCI device with +a specific NUMA node in the guest through the ACPI Generic Initiator +namespace. + +This is required for certain accelerator configurations, such as NVIDIA +Multi-Instance GPU (MIG), where each virtual instance must be exposed to +the guest as a separate NUMA node. + +:since:`Since v11.5.0` + +:: + + ... + + dev0 + 1 + + ... + +The ``acpi-generic-initiator`` element has the following child elements: + +``pci-dev`` + Mandatory. Refers to the alias of a PCI device defined in the domain + configuration. + +``numa-node`` + Mandatory. Specifies the guest NUMA node that the PCI device should be + associated with through the GI mechanism. + +Multiple ``acpi-generic-initiator`` elements can be defined to map differe= nt PCI +devices to different guest NUMA nodes. + + Vsock ~~~~~ =20 diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c index 7231fdc49f..95d835f07f 100644 --- a/src/ch/ch_domain.c +++ b/src/ch/ch_domain.c @@ -164,6 +164,7 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_CHR: case VIR_DOMAIN_DEVICE_HOSTDEV: case VIR_DOMAIN_DEVICE_RNG: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; =20 case VIR_DOMAIN_DEVICE_LEASE: diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cb096f2e1e..dcc0c82f70 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -342,6 +342,7 @@ VIR_ENUM_IMPL(virDomainDevice, "audio", "crypto", "pstore", + "acpiinitiator", ); =20 VIR_ENUM_IMPL(virDomainDiskDevice, @@ -3489,6 +3490,17 @@ virDomainHostdevDefNew(void) } =20 =20 +virDomainAcpiInitiatorDef * +virDomainAcpiInitiatorDefNew(void) +{ + virDomainAcpiInitiatorDef *def; + + def =3D g_new0(virDomainAcpiInitiatorDef, 1); + + return def; +} + + static virDomainTPMDef * virDomainTPMDefNew(virDomainXMLOption *xmlopt) { @@ -3549,6 +3561,16 @@ void virDomainHostdevDefFree(virDomainHostdevDef *de= f) g_free(def); } =20 +void +virDomainAcpiInitiatorDefFree(virDomainAcpiInitiatorDef *def) +{ + if (!def) + return; + + g_free(def->pciDev); + g_free(def); +} + void virDomainHubDefFree(virDomainHubDef *def) { if (!def) @@ -3711,6 +3733,9 @@ void virDomainDeviceDefFree(virDomainDeviceDef *def) case VIR_DOMAIN_DEVICE_PSTORE: virDomainPstoreDefFree(def->data.pstore); break; + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + virDomainAcpiInitiatorDefFree(def->data.acpiinitiator); + break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -4695,6 +4720,8 @@ virDomainDeviceGetInfo(const virDomainDeviceDef *devi= ce) return &device->data.crypto->info; case VIR_DOMAIN_DEVICE_PSTORE: return &device->data.pstore->info; + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + return &device->data.acpiinitiator->info; =20 /* The following devices do not contain virDomainDeviceInfo */ case VIR_DOMAIN_DEVICE_LEASE: @@ -4803,6 +4830,9 @@ virDomainDeviceSetData(virDomainDeviceDef *device, case VIR_DOMAIN_DEVICE_PSTORE: device->data.pstore =3D devicedata; break; + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + device->data.acpiinitiator =3D devicedata; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -5028,6 +5058,13 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, return rc; } =20 + device.type =3D VIR_DOMAIN_DEVICE_ACPI_INITIATOR; + for (i =3D 0; i < def->nacpiinitiator; i++) { + device.data.acpiinitiator =3D def->acpiinitiator[i]; + if ((rc =3D cb(def, &device, &def->acpiinitiator[i]->info, opaque)= ) !=3D 0) + return rc; + } + /* If the flag below is set, make sure @cb can handle @info being NULL= */ if (iteratorFlags & DOMAIN_DEVICE_ITERATE_MISSING_INFO) { device.type =3D VIR_DOMAIN_DEVICE_GRAPHICS; @@ -5088,6 +5125,7 @@ virDomainDeviceInfoIterateFlags(virDomainDef *def, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; } #endif @@ -13671,6 +13709,49 @@ virDomainHostdevDefParseXML(virDomainXMLOption *xm= lopt, } =20 =20 +static virDomainAcpiInitiatorDef * +virDomainAcpiInitiatorDefParseXML(virDomainXMLOption *xmlopt, + xmlNodePtr node, + xmlXPathContextPtr ctxt, + unsigned int flags) +{ + g_autoptr(virDomainAcpiInitiatorDef) def =3D virDomainAcpiInitiatorDef= New(); + g_autofree char *tmp =3D NULL; + + VIR_XPATH_NODE_AUTORESTORE(ctxt) + + ctxt->node =3D node; + + if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags)= < 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("failed to parse device information")); + return NULL; + } + + def->pciDev =3D virXPathString("string(./pci-dev)", ctxt); + if (!def->pciDev) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing initiator pci-dev")); + return NULL; + } + + tmp =3D virXPathString("string(./numa-node)", ctxt); + if (tmp) { + if (virStrToLong_i(tmp, NULL, 10, &def->numaNode) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid value for numa-node: '%1$s'"), tmp); + return NULL; + } + } else { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing initiator numa-node")); + return NULL; + } + + return g_steal_pointer(&def); +} + + static virDomainRedirdevDef * virDomainRedirdevDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr node, @@ -14734,6 +14815,12 @@ virDomainDeviceDefParse(const char *xmlStr, return NULL; } break; + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + if (!(dev->data.acpiinitiator =3D virDomainAcpiInitiatorDefParseXM= L(xmlopt, node, + = ctxt, flags))) { + return NULL; + } + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -20162,6 +20249,24 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, } VIR_FREE(nodes); =20 + /* analysis of the acpi generic initiator */ + if ((n =3D virXPathNodeSet("./devices/acpi-generic-initiator", ctxt, &= nodes)) < 0) + return NULL; + + if (n) + def->acpiinitiator =3D g_new0(virDomainAcpiInitiatorDef *, n); + + for (i =3D 0; i < n; i++) { + virDomainAcpiInitiatorDef *acpiinitiator; + + acpiinitiator =3D virDomainAcpiInitiatorDefParseXML(xmlopt, nodes[= i], ctxt, flags); + if (!acpiinitiator) + return NULL; + + def->acpiinitiator[def->nacpiinitiator++] =3D acpiinitiator; + } + VIR_FREE(nodes); + /* analysis of the user namespace mapping */ if ((n =3D virXPathNodeSet("./idmap/uid", ctxt, &nodes)) < 0) return NULL; @@ -21103,6 +21208,17 @@ virDomainHostdevDefCheckABIStability(virDomainHost= devDef *src, } =20 =20 +static bool +virDomainAcpiInitiatorDefCheckABIStability(virDomainAcpiInitiatorDef *src, + virDomainAcpiInitiatorDef *dst) +{ + if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info)) + return false; + + return true; +} + + static bool virDomainSmartcardDefCheckABIStability(virDomainSmartcardDef *src, virDomainSmartcardDef *dst) @@ -22465,6 +22581,12 @@ virDomainDefCheckABIStabilityFlags(virDomainDef *s= rc, goto error; } =20 + for (i =3D 0; i < src->nacpiinitiator; i++) { + if (!virDomainAcpiInitiatorDefCheckABIStability(src->acpiinitiator= [i], + dst->acpiinitiator= [i])) + goto error; + } + if ((!src->redirfilter && dst->redirfilter) || (src->redirfilter && !dst->redirfilter)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -22635,6 +22757,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDef *sr= c, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; } #endif @@ -28920,6 +29043,17 @@ virDomainPstoreDefFormat(virBuffer *buf, return 0; } =20 +static void +virDomainAcpiInitiatorDefFormat(virBuffer *buf, + virDomainAcpiInitiatorDef *acpiinitiator) +{ + g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); + + virBufferEscapeString(&childBuf, "%s\n", acpiinitia= tor->pciDev); + virBufferAsprintf(&childBuf, "%d\n", acpiinitia= tor->numaNode); + + virXMLFormatElement(buf, "acpi-generic-initiator", NULL, &childBuf); +} =20 int virDomainDefFormatInternal(virDomainDef *def, @@ -29409,6 +29543,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, if (def->pstore) virDomainPstoreDefFormat(buf, def->pstore, flags); =20 + for (n =3D 0; n < def->nacpiinitiator; n++) + virDomainAcpiInitiatorDefFormat(buf, def->acpiinitiator[n]); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); =20 @@ -29569,6 +29706,7 @@ virDomainDeviceIsUSB(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; } =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 984e5bfc76..6105ab956b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -88,6 +88,7 @@ typedef enum { VIR_DOMAIN_DEVICE_AUDIO, VIR_DOMAIN_DEVICE_CRYPTO, VIR_DOMAIN_DEVICE_PSTORE, + VIR_DOMAIN_DEVICE_ACPI_INITIATOR, =20 VIR_DOMAIN_DEVICE_LAST } virDomainDeviceType; @@ -122,6 +123,7 @@ struct _virDomainDeviceDef { virDomainAudioDef *audio; virDomainCryptoDef *crypto; virDomainPstoreDef *pstore; + virDomainAcpiInitiatorDef *acpiinitiator; } data; }; =20 @@ -353,6 +355,12 @@ typedef enum { VIR_DOMAIN_STARTUP_POLICY_LAST } virDomainStartupPolicy; =20 +struct _virDomainAcpiInitiatorDef { + char *pciDev; + int numaNode; + virDomainDeviceInfo info; +}; + /* basic device for direct passthrough */ struct _virDomainHostdevDef { /* If 'parentnet' is non-NULL it means this host dev was @@ -3296,6 +3304,9 @@ struct _virDomainDef { size_t ntpms; virDomainTPMDef **tpms; =20 + size_t nacpiinitiator; + virDomainAcpiInitiatorDef **acpiinitiator; + /* Only 1 */ virDomainMemballoonDef *memballoon; virDomainNVRAMDef *nvram; @@ -3781,6 +3792,9 @@ virDomainVideoDef *virDomainVideoDefNew(virDomainXMLO= ption *xmlopt); void virDomainVideoDefFree(virDomainVideoDef *def); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainVideoDef, virDomainVideoDefFree); void virDomainVideoDefClear(virDomainVideoDef *def); +virDomainAcpiInitiatorDef *virDomainAcpiInitiatorDefNew(void); +void virDomainAcpiInitiatorDefFree(virDomainAcpiInitiatorDef *def); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainAcpiInitiatorDef, virDomainAcpiInit= iatorDefFree); virDomainHostdevDef *virDomainHostdevDefNew(void); void virDomainHostdevDefFree(virDomainHostdevDef *def); void virDomainHubDefFree(virDomainHubDef *def); diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index a07ec8d94e..b297755477 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -760,6 +760,7 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDef *d= ev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: ret =3D 0; break; =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 40edecef83..675fc9f768 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -2388,6 +2388,40 @@ virDomainHostdevDefValidate(const virDomainHostdevDe= f *hostdev) } =20 =20 +static int +virDomainAcpiInitiatorDefValidate(const virDomainDef *def, + const virDomainAcpiInitiatorDef *acpiini= tiator) +{ + const size_t nodeCount =3D virDomainNumaGetNodeCount(def->numa); + + if (!nodeCount) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("No NUMA node defined")); + return -1; + } + + if (acpiinitiator->numaNode >=3D nodeCount) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid acpi-generic-initiator NUMA node %1$u"), + acpiinitiator->numaNode); + return -1; + } + + if (acpiinitiator->pciDev[0] =3D=3D '\0') { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("acpi-generic-initiator must have a PCI device as= signed")); + return -1; + } + + if (acpiinitiator->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)= { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("acpi-generic-initiator must have a device addres= s type None")); + return -1; + } + + return 0; +} + /** * virDomainMemoryGetMappedSize: * @mem: memory device definition @@ -3328,6 +3362,9 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_PSTORE: return virDomainPstoreDefValidate(dev->data.pstore); =20 + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + return virDomainAcpiInitiatorDefValidate(def, dev->data.acpiinitia= tor); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_HUB: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincom= mon.rng index 9782dca147..cb8441aa83 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6924,6 +6924,7 @@ + @@ -7666,6 +7667,19 @@ =20 + + + + + + + + + + + + + diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 93fc9c9217..ea37593980 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -122,6 +122,8 @@ typedef struct _virDomainHostdevCaps virDomainHostdevCa= ps; =20 typedef struct _virDomainHostdevDef virDomainHostdevDef; =20 +typedef struct _virDomainAcpiInitiatorDef virDomainAcpiInitiatorDef; + typedef struct _virDomainHostdevSubsys virDomainHostdevSubsys; =20 typedef struct _virDomainHostdevSubsysMediatedDev virDomainHostdevSubsysMe= diatedDev; diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 0c17ef16ec..7361b2fbb7 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -3124,6 +3124,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, co= nst char *xml, unsigned int case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_INTERNAL_ERROR, _("Attaching devices of type %1$d is not implemente= d"), dev->type); return -1; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 308c0372aa..1f698dc570 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3492,6 +3492,7 @@ libxlDomainAttachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -3596,6 +3597,7 @@ libxlDomainAttachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported= ")); return -1; @@ -3965,6 +3967,7 @@ libxlDomainDetachDeviceLive(libxlDriverPrivate *drive= r, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); @@ -4056,6 +4059,7 @@ libxlDomainDetachDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported= ")); return -1; @@ -4119,6 +4123,7 @@ libxlDomainUpdateDeviceLive(virDomainObj *vm, virDoma= inDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be updated"), virDomainDeviceTypeToString(dev->type)); @@ -4182,6 +4187,7 @@ libxlDomainUpdateDeviceConfig(virDomainDef *vmdef, vi= rDomainDeviceDef *dev) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported= ")); return -1; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 80cf07d2e5..51071958e8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3020,6 +3020,7 @@ lxcDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent attach of device is not supported")); break; @@ -3086,6 +3087,7 @@ lxcDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent update of device is not supported")); break; @@ -3168,6 +3170,7 @@ lxcDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("persistent detach of device is not supported")); break; @@ -3270,6 +3273,7 @@ lxcDomainAttachDeviceMknodHelper(pid_t pid G_GNUC_UNU= SED, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected device type %1$d"), data->def->type); @@ -3946,6 +3950,7 @@ lxcDomainAttachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be attached"), virDomainDeviceTypeToString(dev->type)); @@ -4364,6 +4369,7 @@ lxcDomainDetachDeviceLive(virLXCDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("device type '%1$s' cannot be detached"), virDomainDeviceTypeToString(dev->type)); diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index a27c688d79..a1e9e70492 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -681,6 +681,14 @@ qemuAssignDevicePstoreAlias(virDomainPstoreDef *pstore) pstore->info.alias =3D g_strdup("pstore0"); } =20 +static void +qemuAssignDeviceAcpiInitiatorAlias(virDomainAcpiInitiatorDef *acpiinitiato= r, + int idx) +{ + if (!acpiinitiator->info.alias) + acpiinitiator->info.alias =3D g_strdup_printf("gi%d", idx); +} + =20 int qemuAssignDeviceAliases(virDomainDef *def) @@ -773,6 +781,9 @@ qemuAssignDeviceAliases(virDomainDef *def) } if (def->pstore) qemuAssignDevicePstoreAlias(def->pstore); + for (i =3D 0; i < def->nacpiinitiator; i++) { + qemuAssignDeviceAcpiInitiatorAlias(def->acpiinitiator[i], i); + } =20 return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4e4f1e87eb..cf9529dafc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1011,6 +1011,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceD= ef *device, case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: default: break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a2c7c88a7e..6c0c41c3f4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8820,6 +8820,7 @@ qemuDomainPrepareChardevSourceOne(virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; } =20 @@ -10710,6 +10711,7 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainD= eviceDef *dev, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: /* no chardev backend */ break; } diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 96a9ca9b14..5037e4a9ea 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -471,6 +471,7 @@ qemuDomainDeviceSupportZPCI(virDomainDeviceDef *device) case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: break; =20 case VIR_DOMAIN_DEVICE_NONE: @@ -825,6 +826,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, return pciFlags; } =20 + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: + return 0; + case VIR_DOMAIN_DEVICE_MEMBALLOON: switch (dev->data.memballoon->model) { case VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO_TRANSITIONAL: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ac72ea5cb0..36acedc1f6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6914,6 +6914,7 @@ qemuDomainAttachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%1$s' is not suppo= rted"), @@ -7133,6 +7134,7 @@ qemuDomainDetachDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%1$s' is not suppor= ted"), @@ -7259,6 +7261,7 @@ qemuDomainUpdateDeviceConfig(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%1$s' is not suppor= ted"), diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index e9568af125..3376d4d2b5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3563,6 +3563,7 @@ qemuDomainAttachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%1$s' is not supported"), @@ -5533,6 +5534,7 @@ qemuDomainRemoveAuditDevice(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: /* libvirt doesn't yet support detaching these devices */ break; @@ -5638,6 +5640,7 @@ qemuDomainRemoveDevice(virQEMUDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %1$s device"), @@ -6540,6 +6543,7 @@ qemuDomainDetachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), @@ -7531,6 +7535,7 @@ qemuDomainUpdateDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%1$s' is not supported"), diff --git a/src/qemu/qemu_postparse.c b/src/qemu/qemu_postparse.c index 9c2427970d..9611f46831 100644 --- a/src/qemu/qemu_postparse.c +++ b/src/qemu/qemu_postparse.c @@ -959,6 +959,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: ret =3D 0; break; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index adba3e4a89..5ead231dd0 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -5793,6 +5793,7 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_PSTORE: return qemuValidateDomainDeviceDefPstore(dev->data.pstore, def, qe= muCaps); =20 + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_NONE: diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 25335d9002..1a086f5f47 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -10460,6 +10460,7 @@ testDomainAttachDeviceLive(virDomainObj *vm, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%1$s' is not supported"), @@ -10603,6 +10604,7 @@ testDomainUpdateDevice(virDomainDef *vmdef, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%1$s' is not suppor= ted"), @@ -10975,6 +10977,7 @@ testDomainRemoveDevice(testDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), @@ -11046,6 +11049,7 @@ testDomainDetachDeviceLive(testDriver *driver, case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_CRYPTO: case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_ACPI_INITIATOR: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%1$s' is not supported"), diff --git a/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.arg= s b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args new file mode 100644 index 0000000000..1a8ac0dfc7 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.args @@ -0,0 +1,55 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=3DQEMUGuest2,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-QEMUGuest2/master-key.aes"}' \ +-machine q35,usb=3Doff,dump-guest-core=3Doff,acpi=3Doff \ +-accel tcg \ +-cpu qemu64 \ +-m size=3D8388608k \ +-overcommit mem-lock=3Doff \ +-smp 16,sockets=3D16,cores=3D1,threads=3D1 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node0","size":85899345= 92}' \ +-numa node,nodeid=3D0,cpus=3D0-15,memdev=3Dram-node0 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node1","size":0}' \ +-numa node,nodeid=3D1,memdev=3Dram-node1 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node2","size":0}' \ +-numa node,nodeid=3D2,memdev=3Dram-node2 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node3","size":0}' \ +-numa node,nodeid=3D3,memdev=3Dram-node3 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node4","size":0}' \ +-numa node,nodeid=3D4,memdev=3Dram-node4 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node5","size":0}' \ +-numa node,nodeid=3D5,memdev=3Dram-node5 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node6","size":0}' \ +-numa node,nodeid=3D6,memdev=3Dram-node6 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node7","size":0}' \ +-numa node,nodeid=3D7,memdev=3Dram-node7 \ +-object '{"qom-type":"memory-backend-ram","id":"ram-node8","size":0}' \ +-numa node,nodeid=3D8,memdev=3Dram-node8 \ +-uuid c7a5fdbd-edaf-9466-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus= ":"pcie.0","multifunction":true,"addr":"0x1"}' \ +-device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus= ":"pcie.0","addr":"0x1.0x1"}' \ +-device '{"driver":"qemu-xhci","id":"usb","bus":"pci.1","addr":"0x0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-global ICH9-LPC.noreboot=3Doff \ +-watchdog-action reset \ +-device '{"driver":"vfio-pci","host":"0000:06:12.1","id":"hostdev0","bus":= "pcie.0","addr":"0x2"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pcie.0","ad= dr":"0x6"}' \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.xml= b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.xml new file mode 120000 index 0000000000..0e61738945 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-generic-initiator.x86_64-latest.xml @@ -0,0 +1 @@ +acpi-generic-initiator.xml \ No newline at end of file diff --git a/tests/qemuxmlconfdata/acpi-generic-initiator.xml b/tests/qemux= mlconfdata/acpi-generic-initiator.xml new file mode 100644 index 0000000000..6a5485f191 --- /dev/null +++ b/tests/qemuxmlconfdata/acpi-generic-initiator.xml @@ -0,0 +1,94 @@ + + QEMUGuest2 + c7a5fdbd-edaf-9466-926a-d65c16db1809 + 219100 + 219100 + 16 + + hvm + + + + qemu64 + + + + + + + + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + + + + +
+ + + + +
+ + +
+ + +
+ + + +