[libvirt] [PATCH 2/2] vmx: write cpuid.coresPerSocket back from CPU topology

Pino Toscano ptoscano at redhat.com
Thu Apr 19 13:03:38 UTC 2018


When writing the VMX file from the domain XML, write
cpuid.coresPerSocket if there is a specified CPU topology in the guest.

Use the domain XML of esx-in-the-wild-9 in vmx2xml as testcase for
xml2vmxtest.

Signed-off-by: Pino Toscano <ptoscano at redhat.com>
---
 src/vmx/vmx.c                                   | 29 ++++++++++++++++++
 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.vmx | 39 +++++++++++++++++++++++++
 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.xml | 37 +++++++++++++++++++++++
 tests/xml2vmxtest.c                             |  1 +
 4 files changed, 106 insertions(+)
 create mode 100644 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.vmx
 create mode 100644 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.xml

diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 939fa840ab..8027a7bba6 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -3246,6 +3246,35 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
 
     virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", maxvcpus);
 
+    if (def->cpu) {
+        unsigned int calculated_vcpus;
+
+        if (def->cpu->mode != VIR_CPU_MODE_CUSTOM) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Expecting domain XML CPU mode 'custom' but "
+                             "found '%s'"),
+                           virCPUModeTypeToString(def->cpu->mode));
+            goto cleanup;
+        }
+
+        if (def->cpu->threads != 1) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("Only 1 thread per core is supported"));
+            goto cleanup;
+        }
+
+        calculated_vcpus = def->cpu->sockets * def->cpu->cores;
+        if (calculated_vcpus != maxvcpus) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Expecting domain XML CPU sockets per core as %d "
+                             "but found %d"),
+                           maxvcpus, calculated_vcpus);
+            goto cleanup;
+        }
+
+        virBufferAsprintf(&buffer, "cpuid.coresPerSocket = \"%d\"\n", def->cpu->cores);
+    }
+
     /* def:cpumask -> vmx:sched.cpu.affinity */
     if (def->cpumask && virBitmapSize(def->cpumask) > 0) {
         int bit;
diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.vmx b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.vmx
new file mode 100644
index 0000000000..f92650f7ea
--- /dev/null
+++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.vmx
@@ -0,0 +1,39 @@
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "10"
+guestOS = "other-64"
+uuid.bios = "42 00 93 72 17 da be 73-77 9d 00 7c cf 1b d2 28"
+displayName = "v2v-windows-kkulkarn"
+annotation = "MIQ GUID=b55c806d-99b9-4fa5-bbcc-a4de04f822e5"
+memsize = "16384"
+numvcpus = "16"
+cpuid.coresPerSocket = "4"
+sched.cpu.shares = "normal"
+scsi0.present = "true"
+scsi0.virtualDev = "lsisas1068"
+scsi0:0.present = "true"
+scsi0:0.deviceType = "scsi-hardDisk"
+scsi0:0.fileName = "/vmfs/volumes/datastore/directory/v2v-windows-kkulkarn.vmdk"
+floppy0.present = "false"
+floppy1.present = "false"
+ethernet0.present = "true"
+ethernet0.virtualDev = "vmxnet3"
+ethernet0.networkName = "VM Network"
+ethernet0.connectionType = "bridged"
+ethernet0.addressType = "vpx"
+ethernet0.generatedAddress = "00:50:56:80:b3:81"
+svga.vramSize = "8388608"
+pciBridge0.present = "true"
+pciBridge4.present = "true"
+pciBridge4.virtualDev = "pcieRootPort"
+pciBridge4.functions = "8"
+pciBridge5.present = "true"
+pciBridge5.virtualDev = "pcieRootPort"
+pciBridge5.functions = "8"
+pciBridge6.present = "true"
+pciBridge6.virtualDev = "pcieRootPort"
+pciBridge6.functions = "8"
+pciBridge7.present = "true"
+pciBridge7.virtualDev = "pcieRootPort"
+pciBridge7.functions = "8"
+vmci0.present = "true"
diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.xml b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.xml
new file mode 100644
index 0000000000..f1fe6dd4c9
--- /dev/null
+++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-9.xml
@@ -0,0 +1,37 @@
+<domain type='vmware'>
+  <name>v2v-windows-kkulkarn</name>
+  <uuid>42009372-17da-be73-779d-007ccf1bd228</uuid>
+  <description>MIQ GUID=b55c806d-99b9-4fa5-bbcc-a4de04f822e5</description>
+  <memory unit='KiB'>16777216</memory>
+  <currentMemory unit='KiB'>16777216</currentMemory>
+  <vcpu placement='static'>16</vcpu>
+  <cputune>
+    <shares>16000</shares>
+  </cputune>
+  <os>
+    <type arch='x86_64'>hvm</type>
+  </os>
+  <cpu>
+    <topology sockets='4' cores='4' threads='1'/>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <source file='[datastore] directory/v2v-windows-kkulkarn.vmdk'/>
+      <target dev='sda' bus='scsi'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='scsi' index='0' model='lsisas1068'/>
+    <interface type='bridge'>
+      <mac address='00:50:56:80:b3:81'/>
+      <source bridge='VM Network'/>
+      <model type='vmxnet3'/>
+    </interface>
+    <video>
+      <model type='vmvga' vram='8192' primary='yes'/>
+    </video>
+  </devices>
+</domain>
diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c
index 7b01151974..f6bcd7b012 100644
--- a/tests/xml2vmxtest.c
+++ b/tests/xml2vmxtest.c
@@ -279,6 +279,7 @@ mymain(void)
     DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5", 4);
     DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6", 4);
     DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7", 4);
+    DO_TEST("esx-in-the-wild-9", "esx-in-the-wild-9", 10);
 
     DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1", 4);
     DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2", 4);
-- 
2.14.3




More information about the libvir-list mailing list