From nobody Mon Sep 14 04:56:28 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=1788181158; cv=pass; d=zohomail.com; s=zohoarc; b=R/cshXwfxHwqib3e5re7bKGJ6/cTtGEV6jDyUVyibvV8gM6+v1s6Lk1sDqgRWI0AN1312xffzthGo0uRtLs69BhrEckBsMO93J26Ju6UfUAtk5ElLv6CQjY5r6Ajoc12XrUEsFjRGJuOWH3OA4MjtYANZVsyYluif6/Xh0YuJ14= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788181158; 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=rdf4H3w6OJtijHQX7xZ29qjf6r3gZQQhZ1scBWFh0iA=; b=AZ08Mph0MO6xOZIUes3uDB1F4QC8HKhFEEIxVIMr7JjIzYCfobmG++8EMWCfirG1jitXI078QsFlF6fMTp4cZtDUaa2tzn3t2Zn9OgCPiZxQT+DOP+4Bx8CKJ/rCEJsYizycLWAquTV5SydOBV7nDe9koIhtkJx1pZB2Osm1vm8= 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 1788181157645976.205227015401; Mon, 31 Aug 2026 05:59:17 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 1D3723F835; Mon, 31 Aug 2026 08:59:16 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 36E913F8C6 for ; Mon, 31 Aug 2026 08:56:50 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D33613F37B; Mon, 31 Aug 2026 08:56:35 -0400 (EDT) Received: from FR5P281CU006.outbound.protection.outlook.com (mail-germanywestcentralazlp170120004.outbound.protection.outlook.com [IPv6:2a01:111:f403:c20c::4]) (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 AE3C83F377 for ; Mon, 31 Aug 2026 08:56:34 -0400 (EDT) Received: from BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:52::6) by FR4P281MB3737.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:d6::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 12:56:22 +0000 Received: from BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM ([fe80::31a2:949d:fb59:ef58]) by BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM ([fe80::31a2:949d:fb59:ef58%4]) with mapi id 15.21.0360.008; Mon, 31 Aug 2026 12:56:22 +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,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=Lt6eXgV4SyZarQmTupOv8CwqRhrBUVWqQSrSm32j5NNmw27RPwtvkrs/XXYgNmq5FYX/3EG3LAgVALwvigrwpuaIwkM1q8sx5dEHiYFTTX05C1cKB9222rIdBYigPklhxFrjnvr+97hiCEkj4VClWUvF/nVnZ2BztRgJ7RSICK86oTrdFwEdJClVbyCNYHxuKyagYULWLsWzor4K0aAIF4G7/4GZAtQyswg2xUuT3zBrK05Iq93Dua6Svq7DzmUdTWACYg1QomBDrGx+bg+BiQkB2Wr+GGTGQVBO2vqXfkAKrUNPppyrkBAEpXiqbSKJ6bpW3k0TTFfvKbmUYOXSUw== 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=rdf4H3w6OJtijHQX7xZ29qjf6r3gZQQhZ1scBWFh0iA=; b=xnEul+ZQEnzj0TWkPgfrGU/rLu4sfpJFiSWt9CNMtDbCpmXSledHfncP3sMU5Xg7PLJTZvsvZ0bmyLYjbQ+9551GlCq4/v0guCrlxKg/fGVFpPBIxzr/cl9uDnOqRJwNqg5neat1WIVS0ilFAmtZ7JaC5H1sU1Nh/ERgFPFabZzOcPp3Iz4mUGof7RTj6KF51YY/7Var965Iy06QhbFLSuh5xgYfoUxOzgKGqZT8lcXUyXK8hoQE8WH9FP85ZlJx5cDN3D1medGKgvRxVbM7cI1Gc4cyhkpPzFCfqvGlFYemqI4KIvAiVmhvng/6mZICDWOZIvkgNq2XTSwqpcS6WA== 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=rdf4H3w6OJtijHQX7xZ29qjf6r3gZQQhZ1scBWFh0iA=; b=Jyl6LIT81KDvdkR4zS28hiHjy2J1vEjwBoiLcGbCPdwgt0whPfzGT56rUyJ94EJG8vmVW5C7efhP6Qi/GGpwISJstYOfiJdY0mRZR9h9P2V8yHQOgK752+ZkKsKTta5CCn9gdKudVIhQ3m2nTz8CZhvPG8Ysz7cfVHUSPcYcz/Ss+84iAuKg96QGsWefe9CEYMsEgJxEHSgGWi9WWigko5pPt8zSZ56NQ2zDQTh4a3iUbLYET5OxbDm7lTsaqWPiCQeR29m6wLwMeA7llXEIztVOqMbSgU7EUl91RCu0C7PnaZRY/A6dZ5IUjqvXj0SrKhFxPsHcb2sOr5c/jtK5WQ== 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 1/2] ch: support for numa awareness Date: Mon, 31 Aug 2026 14:56:14 +0200 Message-ID: <20260831125615.27704-2-thomas.prescher@cyberus-technology.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831125615.27704-1-thomas.prescher@cyberus-technology.de> References: <20260831125615.27704-1-thomas.prescher@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0238.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e9::17) To BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:52::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BEZP281MB2149:EE_|FR4P281MB3737:EE_ X-MS-Office365-Filtering-Correlation-Id: ab322cf0-d009-4a20-fb31-08df075f424f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016|23010399003|56012099006|10067099003|6133799003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: gvjL20vs4xpEIPIWx56zwOoC54Psl82BHdp8KMxmY7E/laCz00BsHYwcOY25g21y5desRceP+RhXS/d4ja9utLqrQ9nBaIRj4HJjUwZduZUs7UyvNPh/aYwevIsPgkRgGPH0VZm6JOXdUYVLwwx3yxXUFRu5OGopK2BONYNG3EHUDU+52ANqsmJZOQ454w39F2f7vY1DKYwE+zr34zoTekERpx01zzjtLaRWQRuYkHY1+t/jXfMMBcLL1NIaz0vxZJSQTAmlbR/Egqp8nf2JEmC3YmFnr6g7uYtivjpGVCw6CoPSkpS7GH52ARUF6oIa4yEkyRGiqS0yoVldU/P58CLnHt5T6FNyA6Q/dcyPvkx18d21mOi3dp7vWZoYL2JmTvogf1pu6I8IIgk5tQDGE5T38VMgSGSNmeaOJ5lsBLN6UXh7G4oKeXdW3PCBM8EfpEXWSAektRO7QaZFMGTFwCpoaa3tI0GMqXxv+1uO8Q1KvxxDZ/zWZeuxPN3mF1pCewkbgLTbFRW8SOEhSh1oUzAcFFB00JABYMNZnRvppexntfBJkMkESbk3tNCDT8FUEI3dtoqMAvm7ny5Avj5baZ5FcL7FSiNh9IpZdvgQMFvzsxPj87g/srHUAM8VKNFcGR+z+5BYv84lSPwvB3hpVtOxRqj3TgbxVqTTmpTBVc4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(23010399003)(56012099006)(10067099003)(6133799003)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?a8IpUcBTdMQQbZaqt5sn2BR1CA1YwuNpaIlqv3Q3SnEcQEtHMxpjz1odAev0?= =?us-ascii?Q?01hot7O/fmWsFbhIGWqA9tQUu5eKSkgq7IFFmJbGpiw7QO8fS84KRiVJvgXw?= =?us-ascii?Q?TnKxjJm8FqexkxCNCtaUambKcqk/Uf+PubO3g1+yGIDzG5a/hi3cpfv+ajof?= =?us-ascii?Q?6pSill+6d/4THdb9KGVkHlvD1fXuqxBGa1a5p0NfkglFtGUR2N/ImM+bUCcs?= =?us-ascii?Q?TjF/Q1lWt0JKvi2loUVGRmpOLY9Tj91YGGVk7btxr9NhKqW/wGke/xE7npbV?= =?us-ascii?Q?3hA2S14AHroa9I8ce8JB96ISzt0HBg9dVy92q+RREY5qBXlFUOSj5lxRup2t?= =?us-ascii?Q?tiDeP3f0L2Hpq87P2bDHVAU5unejGuh35XXafKPWd/98K6rcTv1Yh7q6w31x?= =?us-ascii?Q?u1HCiAXRT5SqAeLj9T3vL1l0srMBrxNPufB/yDUjmwT/qWKTJCeqETb7re1P?= =?us-ascii?Q?iXYhdJBoW0+UegiBkMoCZX/jpnI/qR5mduJl7pvKfUZ3Jh0syHHKK6WfqjIE?= =?us-ascii?Q?HE2ZWbbdXugspypUnAbXxEQGzAFF3Klu/g8TVwFP1FbGnWDG5k17fnqlfUG+?= =?us-ascii?Q?giPYh8HlD9lKyEIR3/2lvQQyO+p/vdqBOuZbDWMUaa7Dyv9w+hMbuFLPUIsB?= =?us-ascii?Q?PwACM1xm7mAfBL8SlCGtBTuPIsXRaNb6gGlKJ1nNCIv1Po1RQP7pJMfy6jgz?= =?us-ascii?Q?xuuXHCNQeOr+FYX5G6zI6JC4cJ5AlpHdhFuY7JfwJgI8gcSWam/q2Lu0yADc?= =?us-ascii?Q?zNeY0mfool4YM1njaDCyDZRg677JiAbRCFP7XD7EfAfm8G2HKvJIw+/wkqjG?= =?us-ascii?Q?5XSiZ90tffmwGTbFtryYjLS5OkVpW0b4/VSOACXmC4oqVO9zFwjqFbnE1BYn?= =?us-ascii?Q?H0w9ivjtOTs6UrqsCanKu9pYkHmZfqprCSo7ZGuqw92b/+0RthVaos1zHWsp?= =?us-ascii?Q?Xg4iA3Xu7cKQyUSUC9KTgmkhsHKUPOHWglglc0JQNFwcGbB2dfT4lv8rPaQK?= =?us-ascii?Q?hb+iMkDslRuveOtNhaRjkMAtRJnSFQTFbU8qJfPgY3H7K971Yow9rq6+gQkg?= =?us-ascii?Q?s4m5jVsh+ThvtGW7/p7k9nJIbHdmFbbakOsSAVywAUXu10tEuf0US+mlqSp7?= =?us-ascii?Q?sV8WoCvy97ag84jOl2ml+wggy8K5RcQY3JV9qb3WqIgBIK84kvAalR0icFF9?= =?us-ascii?Q?nmZ1p3QPVDTmdABQse5QaPuR3ptD8HXFXXb9xKtCDr9rIpectubMcI82gGv7?= =?us-ascii?Q?/eTK08UPseCeRcD7lhAmLvWybuSmDl2CGdYgrFlKkEKozEHsU2s9k7fTBEif?= =?us-ascii?Q?lRvCco+vClzVa4wslStb/2UrF1XFkrnXdKViym1kI6bNCrtT9ZGro5E3+Uxz?= =?us-ascii?Q?/XhcqDVrzrjR+yNWevUA0G7DPfMP6hyMxPgu9RMfrd/ojZZCO1MGJRNjAlyw?= =?us-ascii?Q?Yh5b8Dpsaj0dQy6TeDtz7s31eEY9yO6qJSSTuPzYCQEtqkgwPFP8tY3oeV6w?= =?us-ascii?Q?6wCIXIoDshaBiYgctpJoS4spwHy4lqmbS0FCgLFAxoYuXbHrDYZF7nSAXwj3?= =?us-ascii?Q?AyYbwCJI7HJEJ+r5ChJioJCLW8NrVrakTiSnkNDUixqWqS+03SPPi6z/UWSE?= =?us-ascii?Q?zHKXYKXTJF70YiWg2fgBnT5n4Q1mWkSJ+MJxaCx6srpLLaITJDCTD2H/6ntj?= =?us-ascii?Q?N+rYP7vd10depYNiDi30XrkGvYR0dNNbaDoAG/RG6CDuipyCupdQkSHysFD6?= =?us-ascii?Q?7rLSt7R/+FCYMpuRiKlAmgBJaQ4jpMS50Uu2eCPYnsBDm8cjqx+t?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: ab322cf0-d009-4a20-fb31-08df075f424f X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 12:56:22.8579 (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: XN/4T3PjlNA7Se18YfXonmHUQdgB3dZmlLRHgHJyw+1TEWtor9tU5l2KhmPpZdKlQ/wNVi30CEfmStV5ylA/6ocUtzrpB0ny2bksOoTSFR9LIUnFnrc8Skcsk29sE0Tl X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR4P281MB3737 Message-ID-Hash: YKST4IQPFTYG7V5IULQDLY7ACEHSDQ4A X-Message-ID-Hash: YKST4IQPFTYG7V5IULQDLY7ACEHSDQ4A 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: 1788181160901154100 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 --- 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..9bd5eb0114 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -99,6 +99,71 @@ 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 (virJSONValueObjectAppendNumberUlong(numa, "guest_numa_id", i) = < 0) + return -1; + + if (virJSONValueArrayAppend(mem_zones, &mem_zone_id) < 0) + return -1; + + if (virJSONValueObjectAppend(numa, "memory_zones", &mem_zones) < 0) + return -1; + + if (virJSONValueObjectAppend(numa, "cpus", &cpu_arr) < 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 +287,84 @@ virCHMonitorBuildKernelRelatedJson(virJSONValue *cont= ent, virDomainDef *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 \ + + In this function we only define the memory zones + */ +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_INFO("Found NUMA cell configuration. Creating %ld NUMA nodes for g= uest 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) { + VIR_ERROR(_("There are %ld host nodes specified but Cloud Hype= rvisor only supports 1"), hostNodeCount); + return -1; + } + + if (virJSONValueObjectAppendString(zone, "id", id) < 0) + return -1; + + if (virJSONValueObjectAppendNumberUlong(zone, "size", memsize) < 0) + return -1; + + if (hostNodeCount =3D=3D 1) { + VIR_DEBUG("Associating guest node %lu with host node %s", i , = nodeset); + + if (virJSONValueObjectAppendNumberUlong(zone, "host_numa_node"= , hostNode) < 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:56:28 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=1788181216; cv=pass; d=zohomail.com; s=zohoarc; b=kSO98xf1CMuen2bT7SnyD5mm5q4UyTnCFu9EXQ402dHmyEGUBvl/pXyQ6e9apFW+VT1Jxv1KUmEquk7s4VX7j3cKEBskugwLPZPMhAow12mHRjbvlwt2dFQqb8NvVpqWR9jCn/Z9cUTjyUpapqz1QdjGK2J/YPQi/HmjIxy7eHE= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1788181216; 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=Zlh1Xin4Xfkmg19we0rKs69hmeODNtQk8CNezglCMOQ=; b=Gaw3JjsDxXSKpbQbDmp8+pw+3+okDhPKVnyx201oGkTY2gCRi+qGxgYoijq/JwfU1nn7KH5y2A1Hq/E5l5YYXVe/SN06oIUhMp9BIfkvSWqgsCV5fEx6WH3bI7wHlZ6KQPqupBOg5A6MXDzVC0LWQcpvAPSM+1T7gNyoIX4HqhM= 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 1788181215843239.56134310906964; Mon, 31 Aug 2026 06:00:15 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 30C6A3F8C6; Mon, 31 Aug 2026 09:00:15 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 79DF5419EF for ; Mon, 31 Aug 2026 08:56:56 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 52DEF3F37B; Mon, 31 Aug 2026 08:56:36 -0400 (EDT) Received: from FR5P281CU006.outbound.protection.outlook.com (mail-germanywestcentralazlp170120004.outbound.protection.outlook.com [IPv6:2a01:111:f403:c20c::4]) (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 F1EE33F37E for ; Mon, 31 Aug 2026 08:56:34 -0400 (EDT) Received: from BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:52::6) by FR4P281MB3737.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:d6::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Mon, 31 Aug 2026 12:56:23 +0000 Received: from BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM ([fe80::31a2:949d:fb59:ef58]) by BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM ([fe80::31a2:949d:fb59:ef58%4]) with mapi id 15.21.0360.008; Mon, 31 Aug 2026 12:56:23 +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,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=Z0Z4rx1wAeddyCW3gl8B9tnx0krRDzaGPJveng9yBkABTXfv7gecjpWCTsQoSOgbg1rhDycNWQZsoVocZfVjwXbpCbVij3u+1SHNEfEOvVse/q7RYG4pNpTABhzd8AXE94zOIKc5qZ5XwmKPhVq+bHT3VUeCsUe2rwuqNfBVYwDvp8+99ySfh+waeExrHnSwbwMI3LrvIZ0olQtba9DtR0pVKlSlL3QWdMVuPkxRbfRBf3fHFP3/FQ1Nj/3EAQS8cCEEDIXS2AyYF478wNo9aHcodyF+ofhTpo8bWLIBFsKA6tTKHY7GM0BTK+GFNO8mMqb4xdfRpg6iTrrsxap7EQ== 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=Zlh1Xin4Xfkmg19we0rKs69hmeODNtQk8CNezglCMOQ=; b=igBGuc327YKzHNGmv4L13nLFrOEfXl4tMzbP1a/RJrNCE7e1kP/8Yhf6SCDXn7SafwkfML41clXczeI7qKdj8umA5ZjCXwzKIgLpIzIAi4BOsGeGofKWhs7sJ5KfKhJeeAqE64yS19Wvw4IigAzfqudHs1AGE97FUM8ssCOGSd2iDpj/5ilLzQpH5ItwUkF6S7lhaUfP2Gjozj5v3q+gzX3cuI+QIMx286yjP5Zf75aCEn4d5o6YKmCkc2HuUkcC3qRyCmJqgNxLhbORnnqQiilyExkmM3GLeKwiRaWs5BCZNDLhhHFHJELPUmPoWdkcKkJqhO9lFD55PnYWTaAz1g== 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=Zlh1Xin4Xfkmg19we0rKs69hmeODNtQk8CNezglCMOQ=; b=n15pg0b2Q6yK4/6K5KJjPO5nuasQhsVaN/nhHqjaW/TX6+8r4iwJOqbmOiaEeG/l7sVPNv8j5U21bQe8AhXtaRLOC+aID9etZ+XZV+7ir3bwgRMUhufw2/F6ToU/6TO3RbE5Q1aNT4j8CcP7jkbzQixh0nlLl+lV8hgStt4x5pgdXEjaH4xMoVX6P7prV5VWAPUbfbCMt+eXNHXpe0CpbXs6Ljy6VmSsqFKRQ+fWd2s2+BCudzPoseXBLFg8rrfeYvpo9mTKpGXcH6111lALd0iSOw0dY5EzmZOAI9InjKpImFVMMb95QKG2lqeG1SS0Vccr0ocRK24MRAf4G5pujQ== 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 2/2] ch: support CPU topology configuration Date: Mon, 31 Aug 2026 14:56:15 +0200 Message-ID: <20260831125615.27704-3-thomas.prescher@cyberus-technology.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831125615.27704-1-thomas.prescher@cyberus-technology.de> References: <20260831125615.27704-1-thomas.prescher@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0238.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e9::17) To BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:52::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BEZP281MB2149:EE_|FR4P281MB3737:EE_ X-MS-Office365-Filtering-Correlation-Id: e8ffec73-f392-4987-c199-08df075f42bd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016|23010399003|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 8QZ41s3j7ZW1HhCr7ydYLIB6/Kop2KEp+TVsiSl+ZDb/zt6tHzgBOrwTk1zj9Wq8sIBLhX2yoy1omcVUs0zPuTvDuMXjXVOlWZiXHG9NdJFpCIxozyBDi7hbQkxEVhh2jICJ4M6Uf2NJog+RUhiN9nL0Pkba6WseDyDSzoNfVnTiXnu3NEfzovcsaVK1iNA080kVVfzEPZ4JdhMTcWzv6T1q3nBUroQ35sPNNUsoarnSrT2jdBy+z7nuvnjwcYALb6Ah3lcPP2FmY1XfP5OWsJqmTUuJlGY2CKUs9bVxByvJ26rdz0yoIlaSFtyttnzvQt+uZA91/D8k/auHCxcPK9r9SO01u0HGmU3npRTGqQXzXLvOBEKzRF7U3yrCBh0yV4+ClBG/2Wk0Ygm5LnGdL0gBHJVLbCqJ3dyX9feJmWTp1EK7hxte0TcHtZs4JbrRJRcmEwZidFc8a68YhdSKzsGDuPwUSOfGrS2Uq68zK0Dt5cjxJdoFhFn9/f5niEZcRlWdlAzswLh8cH1o7woWNpbwyHxzxVyYM45C5CjsHnk+vg0tvPmELX8cpRHDDJv747XXLurZdTsP+NmRpcBtVtZ6kjs5jFmJzb5+vQXOiAEO+bGDPfs1bD5VUNBKpDcnrf+UOyCoxE+KXen3wo05YX7E5l4topKbZ6yVvQq9Pmc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(23010399003)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Q0etUrjTdGKG+gydOjd5VpWNBNxNB517qse2PdqJDi5U9WBtWqqJHjfWU0mf?= =?us-ascii?Q?kK2r4H+eMTBvJkDoS8y9KuD3GoNaxiQHoXHX6shUQwVuvEhFubqJJtFieZXZ?= =?us-ascii?Q?HuZzs42dlsGlpTJ/8213pUcHBKjY5bYZ5qkuw0FRZcIw4jGmvPU/KCebFsRQ?= =?us-ascii?Q?JcEQMHSiUoHbWt7XObL/fZuKs0aaBiHeCJ50Mq2wgHfKED5rYTi5LfN9ZfVb?= =?us-ascii?Q?fGZNLOz68H5CIhL3czkofCx7ELGHGctq/d20lIT3CK0axBBosFqQYCH7YS/G?= =?us-ascii?Q?2c98bNHurbyPMpS+jAy/fFKDVffWWFNlX8+K8gyUdFo6wB6Ndf6gZj9fSC6r?= =?us-ascii?Q?r4pIu03ZqUzkUOTK2nhXC+BQxGxsf0W4RWu0G8g+8JRBZaS+oLjHrSm/FznL?= =?us-ascii?Q?h/sr+oDTppKVebxw7A3OHwQKHtrHu06vdB01eDq8QcoRcZaXJpYoZdPQdW6f?= =?us-ascii?Q?s/hMNK+G/wkKoVE4QbaPfLsDKLpqNItAnaA/tLYwZua1ZDNEsrkakpx/EPfR?= =?us-ascii?Q?EP46/ZTwaOoch2m4ee0+2enJofBngcv6nSKYgtfhSpNiYqaV158cQaxZ4Jwi?= =?us-ascii?Q?tzq4S6v5fLlGYtQBdeNUD0Mf5Ldg1uJzMOCvAVWbBDB03z8rT9CA48PY4uXI?= =?us-ascii?Q?W0zIDXZgtB0kYZM3loxRuJgxmJkGAqU/vF8ZjzoxR08WmHZhc2qV4wie+0PG?= =?us-ascii?Q?5TMVaMECUcL4UcUPh2hw/ejyDE5A+OMscCFtMTV1s2ojX9UYszADmN10WMU9?= =?us-ascii?Q?ap4G24x3KVfU3rw4c0drj2sSHpmH8zzJdFRstuiSDYBT0sXXwpdy1RNiilSs?= =?us-ascii?Q?R6LclL64FJOjCic/esRn2fq/FVZ0mDQA9BTgJMtD1udetSndVTEa6YIEenWG?= =?us-ascii?Q?F5Ox7j1PQdDOJp1phwT6QiUqf51ii5Ij+Y5Fa2qfweluZ2vPyxcqD+nYFSU8?= =?us-ascii?Q?0QyOuWXndPc9QmJ42fcs1lbWdhPHvpLJjIPu74FT978sxuwznFCIZsRgAcen?= =?us-ascii?Q?LJMFjL+KeS/hgIIzdbjrLvOrr5WR0rJIcCRpKLiCYF0KWH7LvQ31grF80/kc?= =?us-ascii?Q?EmmW068IPuDagG2WOeny9JA6EGozH/P7nyzjX+mxWUEkQaSey6wat2zoO59e?= =?us-ascii?Q?u5YK7jzlC91HCqeHWYqa1IIv9sn/Mniq5CGAIEZ9aZLR0uld+f1fXkZm/ehx?= =?us-ascii?Q?YeFsezDk3yFyyw6WKsBkUGHxtdW1n7ChqbtS02p1Am5EdCznkv/OMfpdTL2c?= =?us-ascii?Q?rF8Jncj6mzrx9qz+WC5b4ZHq64v7W9E/yoYq4FxHhHYa2q4OZks4wqIWFPmd?= =?us-ascii?Q?MVsjyzktcfupQE+lMzxlCcs5vLfEkAU9Cv1jGo3EgeQgKiChNk31Zj4lMxWv?= =?us-ascii?Q?mKP8tyVyM7cyw/KHtnB+v4GELUAUuoLn1wj1ETZ7X5l7sDugGvkaK/a+o3ll?= =?us-ascii?Q?VbTHymX6ZNPd7qnmbgCRzOE0HmQkFBrfG2o5Lx3P7L5KFRibnGRCsXsCKdjP?= =?us-ascii?Q?VO6vTUpCaFfjEpd4qp53f824e+GAQHSnzmUsmRbAFtomcL+zM/3BSwQmTcm0?= =?us-ascii?Q?jK8HoA0ayRGCCBn0qWCVPoODUkTiseIFYn/pw7E8W55i4SBG9e5UTerhf7aR?= =?us-ascii?Q?Tusn035Ck+K3M77ErYB/LQ36hGQE4oOrVV+qDJRH62StClnFJ66NjqWTtFpf?= =?us-ascii?Q?lPvO8ITjuxuQ4/l0PtVyuWubOOl13rtEPzK46TUzzM541JNExPiXE/KDjEY/?= =?us-ascii?Q?dcVT162iZWpPKiEZwEOO1qy0xdJJRXkno66iI4lBH5ZSYvCTHbcR?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: e8ffec73-f392-4987-c199-08df075f42bd X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB2149.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 12:56:23.4527 (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: BasKKziBeGFnVKkzYfjpYb+Tx7df6dXz45t3j2/Pivh/ABji5nPOXjwxRK+hG87LcvdBwwDkI8HDxQ4w7zrQpSsVF8s5MY7MaBWNWr8KhOFO1LbcYIxgkExJhtv/H0O0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR4P281MB3737 Message-ID-Hash: SDEWNXXONEHZW2DRMWIEHGLYCPGGXRVJ X-Message-ID-Hash: SDEWNXXONEHZW2DRMWIEHGLYCPGGXRVJ 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: 1788181218091154100 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 --- src/ch/ch_monitor.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 9bd5eb0114..e0fae8206c 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -69,10 +69,28 @@ virCHMonitorPut(virCHMonitor *mon, domainLogContext *logCtxt, virJSONValue **answer); =20 +static int +virCHMonitorBuildCPUTopologyJson(virJSONValue *content, virDomainDef *vmde= f) +{ + if (virDomainDefGetVcpusTopology(vmdef, NULL) !=3D 0) { + return -1; + } + if (virJSONValueObjectAppendNumberInt(content, "threads_per_core", vmd= ef->cpu->threads) < 0) + return -1; + if (virJSONValueObjectAppendNumberInt(content, "cores_per_die", vmdef-= >cpu->cores) < 0) + return -1; + if (virJSONValueObjectAppendNumberInt(content, "dies_per_package", vmd= ef->cpu->dies) < 0) + return -1; + if (virJSONValueObjectAppendNumberInt(content, "packages", vmdef->cpu-= >sockets) < 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; @@ -92,6 +110,11 @@ virCHMonitorBuildCPUJson(virJSONValue *content, virDoma= inDef *vmdef) return -1; if (virJSONValueObjectAppendNumberInt(cpus, "max_vcpus", vmdef->ma= xvcpus) < 0) return -1; + if (virCHMonitorBuildCPUTopologyJson(topology, vmdef) =3D=3D 0) { + VIR_INFO("Using CPU topology: %d:%d:%d:%d", vmdef->cpu->socket= s, 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