From: Stefan Kober <[email protected]>

Parse the user provided cpu topology information and
transform it into correct cloud-hypervisor API calls.

On-behalf-of: SAP [email protected]
On-behalf-of: SAP [email protected]

Signed-off-by: Stefan Kober <[email protected]>
Signed-off-by: Thomas Prescher <[email protected]>
---
 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)
+{
+    if (virDomainDefGetVcpusTopology(vmdef, NULL) != 0) {
+        return -1;
+    }
+    if (virJSONValueObjectAppendNumberInt(content, "threads_per_core", 
vmdef->cpu->threads) < 0)
+        return -1;
+    if (virJSONValueObjectAppendNumberInt(content, "cores_per_die", 
vmdef->cpu->cores) < 0)
+        return -1;
+    if (virJSONValueObjectAppendNumberInt(content, "dies_per_package", 
vmdef->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 = 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);
+            if (virJSONValueObjectAppend(cpus, "topology", &topology) < 0)
+                return -1;
+        }
         if (virJSONValueObjectAppend(content, "cpus", &cpus) < 0)
             return -1;
     }
-- 
2.53.0

Reply via email to