On Mon, Aug 31, 2026 at 14:56:15 +0200, Thomas Prescher wrote:
From: Stefan Kober <stefan.kober@cyberus-technology.de>
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 <stefan.kober@cyberus-technology.de> Signed-off-by: Thomas Prescher <thomas.prescher@cyberus-technology.de> --- 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);
+static int +virCHMonitorBuildCPUTopologyJson(virJSONValue *content, virDomainDef *vmdef)
For functions which have 'JSON' in name we prefer the uppercase spelling. Also one argument per line please.
+{ + if (virDomainDefGetVcpusTopology(vmdef, NULL) != 0) { + return -1; + }
This returns '1' when topology is not configured. Here you convert it to -1 which is 'error' in our usual call convention ...
+ if (virJSONValueObjectAppendNumberInt(content, "threads_per_core", vmdef->cpu->threads) < 0) + return -1;
... as used here. The problem is that when 1 is returned from virDomainDefGetVcpusTopology no libvirt error is reported, but here ther e is one which we don't allow because the caller then can return an error without an message.
+ if (virJSONValueObjectAppendNumberInt(content, "cores_per_die", vmdef->cpu->cores) < 0) + return -1; + if (virJSONValueObjectAppendNumberInt(content, "dies_per_package", vmdef->cpu->dies) < 0) + return -1;
Consider using qvirJSONValueObjectAdd instead of the 4 calls to virJSONValueObjectAppendNumberInt
+ if (virJSONValueObjectAppendNumberInt(content, "packages", vmdef->cpu->sockets) < 0) + return -1; + return 0; +} + static int virCHMonitorBuildCPUJson(virJSONValue *content, virDomainDef *vmdef) { g_autoptr(virJSONValue) cpus = NULL; + g_autoptr(virJSONValue) topology = virJSONValueNewObject(); unsigned int maxvcpus = 0; unsigned int nvcpus = 0; virDomainVcpuDef *vcpu; @@ -92,6 +110,11 @@ virCHMonitorBuildCPUJson(virJSONValue *content, virDomainDef *vmdef) return -1; if (virJSONValueObjectAppendNumberInt(cpus, "max_vcpus", vmdef->maxvcpus) < 0) return -1; + if (virCHMonitorBuildCPUTopologyJson(topology, vmdef) == 0) { + VIR_INFO("Using CPU topology: %d:%d:%d:%d", vmdef->cpu->sockets, vmdef->cpu->dies, vmdef->cpu->cores, vmdef->cpu->threads);
Do not use VIR_INFO. Either it's a debug statement and VIR_DEBUG should be used or it doesn't belong into logs.
+ if (virJSONValueObjectAppend(cpus, "topology", &topology) < 0) + return -1; + } if (virJSONValueObjectAppend(content, "cpus", &cpus) < 0) return -1; } -- 2.53.0