From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass(p=none dis=none) header.from=cyberus-technology.de ARC-Seal: i=2; a=rsa-sha256; t=1788270337; cv=pass; d=zohomail.com; s=zohoarc; b=YX4j797ZQRvA1FlPOhlsNNxF5/QOPRmG9TsSNzhz6u8fZYOlOrlJH1TrscWHQBOjBeB+ccgZgbHR2nilEKND1wmR4RtyFUN899ijqiWehwY3f3jemW/ygWe4QnlhS9bFUUIdmrkJb0oHdUHLADeqaPkHDFJbtUdtr3YpXNyRavM= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788270337; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=LO2/KNlXHMLGJAk77JQYAo18dIW6Kex47Eg6DW1x6Fo=; b=SXUP48R/UNidA1Kd9erIQie3OfSxs8TruePB1GXmipvPEPQfopA5ORNhmd4DPWUC94IbHAA6rQjfcRmEszYfN8Cyi3VZFM5xkv895TUpN6oyUJNswTlsQ3MMdM0wpbbdXOSAfqN2xdxIZrIW7kq2Tw9EKJCZDs4jSuoxwy8ALw0= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788270337245839.0315598490992; Tue, 1 Sep 2026 06:45:37 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D50BE3F863; Tue, 1 Sep 2026 09:45:35 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 99E6341987 for ; Tue, 1 Sep 2026 09:42:24 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id C30B73F320; Tue, 1 Sep 2026 09:42:03 -0400 (EDT) Received: from FR5P281CU006.outbound.protection.outlook.com (mail-germanywestcentralazon11022128.outbound.protection.outlook.com [40.107.149.128]) (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 073F33F809 for ; Tue, 1 Sep 2026 09:42:01 -0400 (EDT) Received: from FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:2b::10) by FRSP281MB6274.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1e1::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 13:41:57 +0000 Received: from FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM ([fe80::40a7:6ae5:7983:f1ab]) by FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM ([fe80::40a7:6ae5:7983:f1ab%5]) with mapi id 15.21.0360.008; Tue, 1 Sep 2026 13:41:57 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=j2h+mH5t6hWbuLNWXpytdmHy+b2UxjQdfbJkELvEMxCvdohKrRpQl0cZURuRd0Yum94kvLI58lCw1ujCj6oF3J5ux6Gyrzq06xa6iiXtNz+taZqbVF8QyR3xEdIlBsecNn6fhqxU5UxUUEoas3Yl9ae3NxWILzsm/tMQuXseYszb5/HFjKM4VkhG0RrbQLIsCg7Q55deghD3nQ+NVHhK6TswVaCKmHLUCplFHcMqUAvMfraAHE0nBd3DB2Tn39q1T1hjd08KJfSmwAMWDn8q0DqU3JlA9FetGwMneHD9YVttpplynGHTpT1bv67VX6OtVI3olN9FAMRw6NPNLMaGXg== 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=LO2/KNlXHMLGJAk77JQYAo18dIW6Kex47Eg6DW1x6Fo=; b=MMnuMKpZWdmfY3Q0X6AJpdvtWT09pP1NFoj9u0Gw78PrKpbSslNVAPagKQso0cU2bUmWajuyVzLfJlkxgIF1Ft2b75Y0LzGpIOUgD3Yx7LincfFGfNc22O6i640GWbGzjqvIxmmNfVCX+yU6HGjgGXDjPd6G6nktdsxCZ3+tzj9Mp6VH+d9OWyCgLRJ8SRBsO7O+EyDrTlcPwZVfa6LEN51L7uCzljMHVMYvdOGDM1y6WV16Qvx33v+r3UG/WuzdsDjPxakvTKb5jn+tuXrfFWWO26jmH9bf4rmLxYumV63aMAqfyqveInPdXumBkH8yreZqKN4yTOkQADxI0bsYZQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cyberus-technology.de; dmarc=pass action=none header.from=cyberus-technology.de; dkim=pass header.d=cyberus-technology.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cyberus-technology.de; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LO2/KNlXHMLGJAk77JQYAo18dIW6Kex47Eg6DW1x6Fo=; b=ibkygisI8IFtZTpUQBodN2tXI6RTvryXLWw3RDTnz1VcnUuSGEb0ARnEA5zLy9EbIMvFubtxFpqL6KdbOy0Vc6lNylfwHT5t3qK1LVwAA1n4iu+3F6WAwQEAFkb5WFu+UpFiO+x/5Jw85E6V5iIdH6Qm+s8r7MHSC0kN5an7CiYGEvUZLiDV3d153z9JcxZZ/JGtiQVPeAjJpErwEs1a5RUILQsQlFFXkEJeraUilIr3sYJ9j1bYf7aroHyLvHRf/T4Z7+R7NcHpbWYIpedkZzGebUXjP/xxt+t3OPrJgpTZDmJzQ6Wadid8nMSetkDAp3eKQgDiBmJk4zSHXrwTBA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=cyberus-technology.de; From: Thomas Prescher To: devel@lists.libvirt.org Subject: [PATCH v2 1/2] ch: support for numa awareness Date: Tue, 1 Sep 2026 15:41:46 +0200 Message-ID: <20260901134147.36429-2-thomas.prescher@cyberus-technology.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260901134147.36429-1-thomas.prescher@cyberus-technology.de> References: <20260901134147.36429-1-thomas.prescher@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0130.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b9::18) To FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:2b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: FR3P281MB2160:EE_|FRSP281MB6274:EE_ X-MS-Office365-Filtering-Correlation-Id: b7d4a355-2308-4e93-8906-08df082ec9ad X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|23010399003|376014|6133799003|22082099003|18002099003|56012099006|10067099003; X-Microsoft-Antispam-Message-Info: XLVfjPdT9Xx6PDILeVy02fWI4pthRhcKLdnu8EiNc1z/nM1XxjRauhQN+bd7pRTY4xoYNgQuYzwphg6cB2U8Pn1ARkiv6C3vPJVkqnk23ZK6GzVU+VmSUmMaweThzoxKQi64Rh26iD2X/4DKaXT4TFqHtDzjFcVCJfHDGfAu9TESBeBx9+tHqk8btKcIyq1t3VXzg1E56uerL2sPz+8tD6Nf0VgIfs6RRxbnp/1lyJTZrNtkpWgMyZkArXv6NJ5KGA7mMicCSSoyVD68nYy4eXPUovQjmCYY1nUgsC9IWkasElsNAG2KJXZsV6s1+K2DF1zFzLUrOEFHz0NlzVSzeW5cz7NleI2uPWCShNZHatsSPhCOjuZZK58DKjPWrL6B9A5ZR5zPT4Vg1ukQa1uyd5sKINXpdcO+LnxBJkRNJdwit5/ZrtE8HrdqRaOYjOZONprbL6nPwbwDxdhAt2AY9mJ7u/N4BqdziHlDp7mzj8OUTTwe/JJdwitylhzmH+XoKzfxUrfm5kjgiO+fzGG8gi8rVyF3DA2zJtp8TWUJ5OiikwCuEDO5q3LjR1NUksML9ynQBQ/ARlQcM287r4n7o5nx3g/ldhmxen5pfA1DLt0408AAGv5XOb/dnDdHjA3SlWY8r7+XnOgGDUBv9HdwZ5JK78to8/+Ui1qvNFt00oM= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(23010399003)(376014)(6133799003)(22082099003)(18002099003)(56012099006)(10067099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vv7MKE3efrGlZr4djwPnKexSDhlycAPYdGyWgLzswLhkWSOFOzkN2qCuq39J?= =?us-ascii?Q?ogJRynJ4xWRf9+rpoiMUm5Og8s4vQ5tkPY739/JiXDYXJw+XzSj4rurRGzdn?= =?us-ascii?Q?ni+0UuI8DqehMRgtkoWJuwbh1iuN4o+xCfHvvS4OunBo48Gc8A0gB/M3RSb2?= =?us-ascii?Q?6Jk+rNUYXNYr0xH/h0860OeLACx3mpPKJNJ9e6nGz0hbJ1Qo3UwpcAn+o0MI?= =?us-ascii?Q?e79EPSQMNmY2O339/K5EoBQifk0NR7rmMFSXBVyX8uaBzrLDP63HZqCxeOp/?= =?us-ascii?Q?/9AnhFSC4tUTDTHuOerO+F4YepUPtxTNuEgR4bSTX9Z0ecYQQdUm0smzFtVi?= =?us-ascii?Q?z0vc+3FK0rXAZuAuFDNARUanJL5YbjcgPBDYfTAUIMrz4ulBjvd1ryKlwR+4?= =?us-ascii?Q?stlKt4gDjudaaYe8D+R7Tj3M0MaJw0XLPihs8cQCy5SWdYMSn3QWDrSmsmCW?= =?us-ascii?Q?xRCnWyZo/zrTBe3+n34+MtvkrnA+LKLh/TSs3YflVaIGmFcU+f+qJgcAz6r3?= =?us-ascii?Q?nE6CU4h86tFI4ltNwXavuPBiNNQ8qhxPVARCyOPTLcUBotXsztM1LfKf7cQB?= =?us-ascii?Q?+w4Itp71gOEDPO66/YHwmvnWzmavBw4XpR+1hdoifSErras/xNISe51Btji0?= =?us-ascii?Q?K3ONMvmnuDAxoVkzamiALD0h04vyiFWmmpsYzJ+RqgpZyrqFqPy0sODGOR3x?= =?us-ascii?Q?cQZ2itarisV4vAkV6EmSXba9Op/pzbRymqI8nmrzjxKJq4lqUp4/XT3yFdEL?= =?us-ascii?Q?i5kMkJmNeGDcIGd1w/cF7FQwZuZcfbFdex8LdV9m5Isnie8OJiiKWfaLXLuj?= =?us-ascii?Q?XwsEdkItT3phyM7zHVvj5GwXwlNO80NODLxK6Sjc8v2sUEdrxmUITIOh4idO?= =?us-ascii?Q?l76EYoq72AzU38rjUpk1Pt6aHBg1MNsUd/Xbz5l5iRgrkjPlvDPm9Glp740a?= =?us-ascii?Q?pnGel0b9VnkQrKzqVn7e5/kzMRneH9irXPWk7yajZGGHllMzkZptETOUBG8Z?= =?us-ascii?Q?RzzbFqGwX3nVapG0VvPV2100sU90183/avtxe0lKz29RhYumq/6C53HOxnHw?= =?us-ascii?Q?6sXOjRY+hKwvt3Fiz/LK1y1aHnnE5mCXA5HxeUbizVaGIhDQ/HX0iAizugy0?= =?us-ascii?Q?8bWn1Vkyp7tFXlRmhud+nqCKFyHsCpDt7dZDfkfoJ+li4jWgN6WWnRVAdktp?= =?us-ascii?Q?frJMGkyczQE5BBLo484aivRn0jShuosGZfiJyDjqgnfQM1OWjJhRarBnrOzk?= =?us-ascii?Q?biNbAvvj9zx13boZT/RiFs41HKTqelilBowJ6B+uPWJkX1pSwlUoCSF5OlUk?= =?us-ascii?Q?lcnR/GuLtjchxdnaBFrd4HVDLEzpR9nY62OkYBgXyF//cir51PLAhUK48W8K?= =?us-ascii?Q?bqV1GtS/G31obhgSQ6qRTighKfmJ0CDgAUGIkm56YtEBegLMJFLnswlPuS1L?= =?us-ascii?Q?H4fIrP7/CRz/r8jXpx4AzTlX9MBMAQTpUyVcDWvd9XxkOJBlAE6FOu2EwL+z?= =?us-ascii?Q?KS9apHzSkgux7NPvToySOU1oYPL8z4LAfy2WvfD7vKeATIvfrW2deB12ODIR?= =?us-ascii?Q?mwhke+1UJhkKT2HvZ/hA6TODXqXJhIuL0eP9RxS9SRtXjGLA/O+MmOSTW2iA?= =?us-ascii?Q?CnYjF78RIU49zedQN+vW85VqxyfxzL6DLewBblVqz86ds8ebA+iMfDhuzHVn?= =?us-ascii?Q?xbfRHxoCSQIws8LR3j09LBWYC0ttq8uzCFstisMTIWFmDOd83Ov0YyLskcua?= =?us-ascii?Q?LyZDLFlaDtZ/4Iv/VCf9P7paFY7SpViu+E5dIpH3xRb/PMVyQQPk?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: b7d4a355-2308-4e93-8906-08df082ec9ad X-MS-Exchange-CrossTenant-AuthSource: FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 13:41:56.3143 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f4e0f4e0-9d68-4bd6-a95b-0cba36dbac2e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: c8nlcx/t9UpPqRHv7oLU426BuuQxVrqHLiEy18u3fHZBu1bdtXE7ClarHqpDOQyhkk+B/xQLmF9VgZe8jgShBDGw2dnMrhYRuOskiW6OV9mr9ub99D8CR6c+5nd+42KO X-MS-Exchange-Transport-CrossTenantHeadersStamped: FRSP281MB6274 Message-ID-Hash: 4YI6KJASOFS4QFJGLJFBBLPOPPHJSWMH X-Message-ID-Hash: 4YI6KJASOFS4QFJGLJFBBLPOPPHJSWMH X-MailFrom: thomas.prescher@cyberus-technology.de 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: Stefan Kober , Thomas Prescher 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: X-ZohoMail-DKIM: pass (identity @cyberus-technology.de) X-ZM-MESSAGEID: 1788270339038158501 Content-Type: text/plain; charset="utf-8" From: Stefan Kober Make use of the numa configuration the user has configured via libvirt and transform it into the right cloud hypervisor API calls. On-behalf-of: SAP stefan.kober@sap.com On-behalf-of: SAP thomas.prescher@sap.com Signed-off-by: Stefan Kober Signed-off-by: Thomas Prescher Reviewed-by: Michal Privoznik --- src/ch/ch_monitor.c | 140 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 2 deletions(-) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 52f281cf73..bcfff58995 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -99,6 +99,73 @@ virCHMonitorBuildCPUJson(virJSONValue *content, virDomai= nDef *vmdef) return 0; } =20 +/** + * CHV example NUMA cmdline: + *--numa guest_numa_id=3D0,cpus=3D[0,1],memory_zones=3D[fast_mem] \ + *--numa guest_numa_id=3D1,cpus=3D[2,3],memory_zones=3D[bulk_mem] \ + *--memory-zone id=3Dfast_mem,size=3D2G,host_numa_node=3D0,hugepages=3Don,= hugepage_size=3D1G,prefault=3Don \ + *--memory-zone id=3Dbulk_mem,size=3D6G,host_numa_node=3D1,hugepages=3Don,= hugepage_size=3D2M \ + */ +static int +virCHMonitorBuildNumaJSON(virJSONValue *content, + virDomainDef *def) +{ + size_t ncells =3D virDomainNumaGetNodeCount(def->numa); + size_t i =3D 0; + size_t j =3D 0; + virBitmap *cpus =3D NULL; + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + g_autoptr(virJSONValue) numas =3D virJSONValueNewArray(); + + if (ncells =3D=3D 0) { + return 0; + } + + for (i =3D 0; i < ncells; i++) { + ssize_t lastcpu =3D 0; + g_autoptr(virJSONValue) numa =3D virJSONValueNewObject(); + g_autoptr(virJSONValue) mem_zones =3D virJSONValueNewArray(); + char *mem_zone_str =3D g_strdup_printf("zone%lu", i); + g_autoptr(virJSONValue) mem_zone_id =3D virJSONValueNewString(mem_= zone_str); + g_autoptr(virJSONValue) cpu_arr =3D virJSONValueNewArray(); + + cpus =3D virDomainNumaGetNodeCpumask(def->numa, i); + lastcpu =3D virBitmapLastSetBit(cpus); + + /* + * Go through bitmap and check set bits which correspond to CPUs + * We create an array of vCPU IDs: [1,2,3] of CPUs belonging to the + * respective NUMA node. + */ + for (j =3D 0; j < lastcpu + 1; j++) { + if (virBitmapIsBitSet(cpus, j)) { + g_autoptr(virJSONValue) cpu_id =3D virJSONValueNewNumberUi= nt(j); + if (virJSONValueArrayAppend(cpu_arr, &cpu_id) < 0) + return -1; + } + + } + + if (virJSONValueArrayAppend(mem_zones, &mem_zone_id) < 0) + return -1; + + if (virJSONValueObjectAdd(&numa, + "U:guest_numa_id", i, + "a:memory_zones", &mem_zones, + "a:cpus", &cpu_arr, + NULL) < 0) + return -1; + + if (virJSONValueArrayAppend(numas, &numa) < 0) + return -1; + } + + if (virJSONValueObjectAppend(content, "numa", &numas) < 0) + return -1; + + return 0; +} + static int virCHMonitorBuildConsoleJson(virJSONValue *content, virDomainDef *vmdef) @@ -222,16 +289,82 @@ virCHMonitorBuildKernelRelatedJson(virJSONValue *cont= ent, virDomainDef *vmdef) return 0; } =20 +static int +virCHMonitorBuildMemoryZonesJSON(virJSONValue *content, + virDomainDef *def) +{ + size_t ncells =3D virDomainNumaGetNodeCount(def->numa); + size_t i =3D 0; + g_autoptr(virJSONValue) zones =3D virJSONValueNewArray(); + + VIR_DEBUG("Creating %zu NUMA nodes for guest VM", ncells); + + for (i =3D 0; i < ncells; i++) { + g_autofree char *id =3D g_strdup_printf("zone%zu", i); + /* Memory returned is in KiB, so we multiply by 1024 */ + unsigned long long memsize =3D virDomainNumaGetNodeMemorySize(def-= >numa, i) * 1024; + g_autoptr(virJSONValue) zone =3D virJSONValueNewObject(); + virBitmap *nodes =3D virDomainNumatuneGetNodeset(def->numa, NULL, = i); + g_autofree char *nodeset =3D virBitmapFormat(nodes); + size_t hostNodeCount =3D virBitmapCountBits(nodes); + size_t hostNode =3D virBitmapLastSetBit(nodes); + + if (hostNodeCount > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%ld host nodes specified but " + "Cloud Hypervisor only supports 1"), + hostNodeCount); + return -1; + } + + if (virJSONValueObjectAdd(&zone, + "s:id", id, + "U:size", memsize, + NULL) < 0) + return -1; + + if (hostNodeCount =3D=3D 1) { + VIR_DEBUG("Associating guest node %lu with host node %s", i , = nodeset); + + if (virJSONValueObjectAdd(&zone, + "U:host_numa_node", hostNode, + NULL) < 0) + return -1; + } + + if (virJSONValueArrayAppend(zones, &zone) < 0) + return -1; + } + + if (virJSONValueObjectAppend(content, "zones", &zones) < 0) + return -1; + + return 0; +} + static int virCHMonitorBuildMemoryJson(virJSONValue *content, virDomainDef *vmdef) { unsigned long long total_memory =3D virDomainDefGetMemoryInitial(vmdef= ) * 1024; + size_t ncells =3D virDomainNumaGetNodeCount(vmdef->numa); =20 if (total_memory !=3D 0) { g_autoptr(virJSONValue) memory =3D virJSONValueNewObject(); =20 - if (virJSONValueObjectAppendNumberUlong(memory, "size", total_memo= ry) < 0) - return -1; + /* If we have multiple NUMA nodes, then we define memory zones. Wh= en + * memory zones are defined, the "size" field in the CHV memory co= nfig + * must be 0 */ + if (ncells >=3D 1) { + if (virCHMonitorBuildMemoryZonesJSON(memory, vmdef) < 0) { + return -1; + } + if (virJSONValueObjectAppendNumberUlong(memory, "size", 0) < 0= ) { + return -1; + } + } else { + if (virJSONValueObjectAppendNumberUlong(memory, "size", total_= memory) < 0) + return -1; + } =20 if (virJSONValueObjectAppend(content, "memory", &memory) < 0) return -1; @@ -560,6 +693,9 @@ virCHMonitorBuildVMJson(virCHDriver *driver, virDomainD= ef *vmdef, if (virCHMonitorBuildMemoryJson(content, vmdef) < 0) return -1; =20 + if (virCHMonitorBuildNumaJSON(content, vmdef) < 0) + return -1; + if (virBitmapIsBitSet(driver->chCaps, CH_KERNEL_API_DEPRCATED)) { if (virCHMonitorBuildPayloadJson(content, vmdef) < 0) return -1; --=20 2.53.0 From nobody Mon Sep 14 04:49:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass(p=none dis=none) header.from=cyberus-technology.de ARC-Seal: i=2; a=rsa-sha256; t=1788270258; cv=pass; d=zohomail.com; s=zohoarc; b=Jxp+C17WF/xZNDutBtr0fUJw6pK9ycwfkM92G15eq6GOcR0lZLVU7yTLhYrZnyhm5UPvFoEBNxACyKeczOJhvPCbSXTqiuc/OeHgHcEP4zefwJ+js7Uwt6a/XlGH/Z++SVKw2jfSIOrQts2dyWyP2b82ty6Wcf80NJh52LGbCZw= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788270258; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Z35qyADMrkFL5qLf7kTqaByeZTw5qwIFkZUv1lyrvZQ=; b=LfdqKIONh6d4YQnlTfvFZgi6ni+4A2thwvAzbtYehu/5JW/Tk0oFi7QrfTQ2ykGXsM9Pho/FmavNbyoCURUzxFCIFgkodDhI/xnLyXmS1UpLngm/QNbvQnZ4kitUIsBSP6SQAzbupPc9WA4CqBtX/Xr7e4luLglen+k0mUlyDNo= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1788270258618653.7718033863398; Tue, 1 Sep 2026 06:44:18 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 917F441855; Tue, 1 Sep 2026 09:44:17 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 2A0B94193C for ; Tue, 1 Sep 2026 09:42:20 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 23F5D3F320; Tue, 1 Sep 2026 09:42:03 -0400 (EDT) Received: from FR5P281CU006.outbound.protection.outlook.com (mail-germanywestcentralazon11022128.outbound.protection.outlook.com [40.107.149.128]) (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 5A3943F324 for ; Tue, 1 Sep 2026 09:42:02 -0400 (EDT) Received: from FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:2b::10) by FRSP281MB6274.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1e1::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 13:41:58 +0000 Received: from FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM ([fe80::40a7:6ae5:7983:f1ab]) by FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM ([fe80::40a7:6ae5:7983:f1ab%5]) with mapi id 15.21.0360.008; Tue, 1 Sep 2026 13:41:57 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MNxT9ZV33+2Ipem/kHXfgcdKprlaW9+zP6sMxRN8o0V1QcarYcxWP8CsDW3y7jX6/hgUjOMdpkzF2qxY4+mZGTfkKtruRuQ8kQf/QgAsZ8w09E+o0nC8ulTApaljucKZ+6z9PhalpCvUV85tyOB7aQOhoaZ5gPzf1SajMooFCWv2QxpVjsPm63+K5xtt3NETOxNMV3Fzy0obqt9jYnYZ7eolJ5hCD3b5eJis0KfwpPoqOySWQdQvHovAvkyiUxce8n2klpNSQS7WzwwMvsL+hHjh7tzHoZQ3mv0uNFQTfcBC6FF4O/2VXHmMzMDki4JAyRK8HnLaVVG4FrKwR7zc2w== 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=Z35qyADMrkFL5qLf7kTqaByeZTw5qwIFkZUv1lyrvZQ=; b=VWivLa9RTJs6Ii13YUujxDW+V95uJBNbf7TjRM5Nk733mO0ArA3Lp90bxtJP/LfOaQ8fXSKPNxox79PlEiZcVysZ0bIJhsHVr/9WTA83+KMNMc5Gy7BNdXHgnMlo5gm+ok80FTwvMwG+ytlNXcds0URotV3GTobagrCzyAb/ywPnatTS0zDui7IyzM+PLO7DYVkhWMYORggLKjV84Q8zYqOrAG3l964HeO9uu+vTWy9m8cZ1u0BAnUd10fpueNvLUXjp3Mf327tPHUp0NQm7LJXeRRs6OR5nx67K7Rjcs9+VN8cOy9gQzwJ5YLeAtTD5sNqvizb2WXWZ1EO/p+AeyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cyberus-technology.de; dmarc=pass action=none header.from=cyberus-technology.de; dkim=pass header.d=cyberus-technology.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cyberus-technology.de; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Z35qyADMrkFL5qLf7kTqaByeZTw5qwIFkZUv1lyrvZQ=; b=OZcojC1A3OX85gc4gYYm7xdF2FnXYGQboIi2qLwEvT+BL8vxGN6CYbkLgHLeugW/VgMW2M7MApuUec+tM/tfHape582vj9JOJWvMELOPM7YHYLY+sSHZWo5mqLBlSty38eVcQaEak6zoaPX0Y9LkibwBsazw8990r4MwtKUVP9kALpE31kSLKeWWJ3QeYdOth9Lvcm9ZPJB8R0EWN716Xp5UKPqY29q6LxNibA6E+cXmO2r8u5+NLASwjHppGqWUbF6r1nfkQ+ji0JB5qJngYsWEZMktTR7FDoRn21xbksCptTR4ObNzbe8lqfglkzWRbft+CIJO7RCih/bksPzEOg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=cyberus-technology.de; From: Thomas Prescher To: devel@lists.libvirt.org Subject: [PATCH v2 2/2] ch: support CPU topology configuration Date: Tue, 1 Sep 2026 15:41:47 +0200 Message-ID: <20260901134147.36429-3-thomas.prescher@cyberus-technology.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260901134147.36429-1-thomas.prescher@cyberus-technology.de> References: <20260901134147.36429-1-thomas.prescher@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0130.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b9::18) To FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:2b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: FR3P281MB2160:EE_|FRSP281MB6274:EE_ X-MS-Office365-Filtering-Correlation-Id: 5e38a1a1-7499-4e8a-16e0-08df082ecac7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|23010399003|376014|22082099003|18002099003|56012099006|10067099003; X-Microsoft-Antispam-Message-Info: /HRjNZtnrdxqgY+fBY4jVn/HqXZ7iDe8TFNPISm8roK0vq8DtBztklzKLAUj5qIqFs116TK3kMVUVybpa/G8HELmv8P7Cb+B4PYmzC057Gd31S1bhMtjsj4pvTV8c9G4htk5uVYtBMJxhIQbhtbh1ni4JwXKw8xrLrXRT2H6DgX0n3uohSMGDDybNO6qzZFknDCx5z5Njg2uwIzNbubBxwPPBAkbWeNlQySxfDJUkQG7E1g0G0QgBx6HmS9PjnVGkRHy4vzAvlP+YnEKrmsf8ae90NX/pJt8daijqR8rC9m1u+e+V9uxd+z8KRu3lskYlqHN2dh1R86jLQB2ZUyXbIw93bTWm7A+zfchfM9vha2ILowUyJ0HqxBCQPzOz9l+Pf9A0I/fus8YVuJwOjPXM9aQr3yQ2niKDA7DI4J1oC/0RBb1xFBAmPkW2iVR7E21IZ28p6iiQQMBEXc1rQ62HmXXDqnyLdVLY+ZXluErQXybcvIMYPjer+F+06gQlvJL+KjlIeVkloH+P4mvqVvMl/qBf1KLncb/motKnOJUMZLS2AH985EQMNz3nSfLR5HcO8dH8BEgdgJXoI5GrGW9U6Q97ePa4FtvqWuSN/MCGxGJr0hECemN6Sad6Z8qrWk9FDtgbCrP01nHz17NsmKHfMSbSvKvWTDtpFMPsHwEVzg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(23010399003)(376014)(22082099003)(18002099003)(56012099006)(10067099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Sck1blxti2/D4ert5tCtkfYonsBMsGsJWO9gN/hrlzU3ApvtxXUfxmhqRawe?= =?us-ascii?Q?Sz4xL09ydBGg1Ch2D2aY63O45xf59hk1zKyYQdY2xLKECdomA4uZKRWXfqT5?= =?us-ascii?Q?g36GujNi8w7vyWKDv/AjPaSNnpD2NHdmUS+OtsS48iRqAO3hRWxffQ2kR5sn?= =?us-ascii?Q?/vZfLJqFroeGzYPrIDMxXJoHscl6haGcWxgQZx8a1BM2RmmMK8ksK9bCyGTV?= =?us-ascii?Q?+XQvbesFIAnb2UoPt0mOzZK/aCEULtfDOLP5pC/AOnG+32zZ2AfJkW0Y0ASV?= =?us-ascii?Q?oWkFsY3RMPrHVAgA107kcXkw8c5p9MSKh+0brnyVxYkxRRe0frWECdyLEekG?= =?us-ascii?Q?WSgM85/0oV2qLyFMfff0YLj02tpJGdGqprxLP+LPrk4AZkF/pwVzH7JJmsIE?= =?us-ascii?Q?h1aYWhhrm5SfKQLboE+mdH+XQ7LHlkIX7DARm5zQUfiwmqRjk3OcTSE0AAyN?= =?us-ascii?Q?X/Z7jrtqdJKprTAOrzDB7/FVQ1eYwP/bGKbnEfFdZAOf7/X0qhdQWreVJnnq?= =?us-ascii?Q?+ixEf4DGvcLui+/sqwQY/5Z/4QoZmgxuwWX6OyRuSp0HWCGXklwu4h/suSBC?= =?us-ascii?Q?WMy2PvGTTPUgyFDgJcb39mzjhcfxtomCrAp3tw8HQY+eT7ht7GoGm/lLKQbj?= =?us-ascii?Q?qy0IXQdme5Jfd7EALPwoPjlA04nTCFhi1SbqKQZiDDeG3zlNnhCT/EoS+a41?= =?us-ascii?Q?zHgatQXl8X6aHe2bQO990cKPF/2jbi0Tm0MK4dZWhiJ8hXQAnTeN3InLxNGZ?= =?us-ascii?Q?mOMzoJehH8qTKI8Xv2SHjM2E5+TBiIb/M4F9bhHZAG+pxsKtSMGlb1WgBSlv?= =?us-ascii?Q?mZ36D9DXYdviDYSABGmgaAIgkDiF1fYMmZN3L6mq4D5Q1xqnk41XSW3HoMWx?= =?us-ascii?Q?iV6hdTMtQCIpNP6ltHfmUrRKUaB2iypBG6M/hJKOX7jj0IJMqpPe/UJf/vkP?= =?us-ascii?Q?Fa0AvTUK4RRrRBDkZDEljq2J4/Tjw4OqrvkDpoo4EQBTC6IqheD3hRq8OHM4?= =?us-ascii?Q?TnDWgJkF/O1LSiggOgLGUQBpqwFCp6Yiv49g87RKAN5QQdfBNuqwt1k6k2BZ?= =?us-ascii?Q?LxXhcyzdw1Fv+VMf6Wyx/DC5AzHHM9tSy/PEedyLc0KQfZWEgSY2IFa10kiD?= =?us-ascii?Q?WEvG3+gy24nhZB6muK1SEVgnvrl862ug37BX46qmOfaad1tnJDwDeQJrokPX?= =?us-ascii?Q?d16d4FljitNid9qsjzFLewGA86Qt2fcXz1EtinX2fmvzziEXU4dAf7GMb8W0?= =?us-ascii?Q?iQ8OXjLiemMplf97RJ2mVJy9zS/ln3b6pnVJAu3DFMqCMONINezoT+l8Oo/y?= =?us-ascii?Q?oDiUnL4+WLuUVhh2RcYCSd0Euug4xfEyUtHLRncs8fltE+ewqaMP4oTjxBMU?= =?us-ascii?Q?Q0pA4hC5Hn+RUxxnT0waxTH9nh0AqWDbjcqyxP3phuU7DDmFFPu2q3kQdmiY?= =?us-ascii?Q?R/2aros2XX1kdbnFud/I+4wP0Jf1ijiuabUL2h3IQyPq8M75gR6EI09o9uWe?= =?us-ascii?Q?PJBbBtkjCCTX1xR5caLXhcQk7lUSMuJNGTQZoIwevFsBus51z43O3UIDEuyP?= =?us-ascii?Q?WxGUzmeQPptllLYffE0EmqCjIYPmPCQOHt3dNbNTMq/0lqYgrWU9vP694V/v?= =?us-ascii?Q?pO9lwkTEWIHK5UtY8umNE3qOys0/jIarxJz1Ziy6N/tGUopaKyVIDcZywY0n?= =?us-ascii?Q?8rXMhGRJTvN0zLQMaaUMK2PzWzuejJ3GtCcsJefYjz4GFfhWTxLi0kSY48mk?= =?us-ascii?Q?9bzHTUiPqna6EygWnWm62UgzXRY1rotc64O3dROyFshQuNUt+rvr?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: 5e38a1a1-7499-4e8a-16e0-08df082ecac7 X-MS-Exchange-CrossTenant-AuthSource: FR3P281MB2160.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 13:41:57.7109 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f4e0f4e0-9d68-4bd6-a95b-0cba36dbac2e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: S7N4AsxhSIpd5/1Y4xNgg6vsU4WTcUGRqFZQpx/9abSdUhavUYKhRHqNH9Y5rvtxDH6aZyG8pNAHPi0T/3Vpb13Ej2m7RUofY29CzaMtgj21x/zJDLC47iiPlKshGv4h X-MS-Exchange-Transport-CrossTenantHeadersStamped: FRSP281MB6274 Message-ID-Hash: P73LBVXLI6XGUEZL4YDXLS3OEU3NNQK3 X-Message-ID-Hash: P73LBVXLI6XGUEZL4YDXLS3OEU3NNQK3 X-MailFrom: thomas.prescher@cyberus-technology.de 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: Stefan Kober , Thomas Prescher 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: X-ZohoMail-DKIM: pass (identity @cyberus-technology.de) X-ZM-MESSAGEID: 1788270260627154100 Content-Type: text/plain; charset="utf-8" From: Stefan Kober Parse the user provided cpu topology information and transform it into correct cloud-hypervisor API calls. On-behalf-of: SAP stefan.kober@sap.com On-behalf-of: SAP thomas.prescher@sap.com Signed-off-by: Stefan Kober Signed-off-by: Thomas Prescher Reviewed-by: Michal Privoznik --- src/ch/ch_monitor.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index bcfff58995..15fded2274 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -69,13 +69,35 @@ virCHMonitorPut(virCHMonitor *mon, domainLogContext *logCtxt, virJSONValue **answer); =20 +static int +virCHMonitorBuildCPUTopologyJSON(virJSONValue *content, + virDomainDef *vmdef) +{ + int rc; + + if ((rc =3D virDomainDefGetVcpusTopology(vmdef, NULL)) !=3D 0) + return rc; + + if (virJSONValueObjectAdd(&content, + "u:threads_per_core", vmdef->cpu->threads, + "u:cores_per_die", vmdef->cpu->cores, + "u:dies_per_package", vmdef->cpu->dies, + "u:packages", vmdef->cpu->sockets, + NULL) < 0) + return -1; + + return 0; +} + static int virCHMonitorBuildCPUJson(virJSONValue *content, virDomainDef *vmdef) { g_autoptr(virJSONValue) cpus =3D NULL; + g_autoptr(virJSONValue) topology =3D virJSONValueNewObject(); unsigned int maxvcpus =3D 0; unsigned int nvcpus =3D 0; virDomainVcpuDef *vcpu; + int rc; size_t i; =20 /* count maximum allowed number vcpus and enabled vcpus when boot.*/ @@ -92,6 +114,17 @@ virCHMonitorBuildCPUJson(virJSONValue *content, virDoma= inDef *vmdef) return -1; if (virJSONValueObjectAppendNumberInt(cpus, "max_vcpus", vmdef->ma= xvcpus) < 0) return -1; + if ((rc =3D virCHMonitorBuildCPUTopologyJSON(topology, vmdef)) < 0) + return -1; + + if (rc =3D=3D 0) { + VIR_DEBUG("Using CPU topology: %u:%u:%u:%u", + vmdef->cpu->sockets, vmdef->cpu->dies, + vmdef->cpu->cores, vmdef->cpu->threads); + if (virJSONValueObjectAppend(cpus, "topology", &topology) < 0) + return -1; + } + if (virJSONValueObjectAppend(content, "cpus", &cpus) < 0) return -1; } --=20 2.53.0