]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: cgroup: Store auto cpuset instead of re-creating it on demand
authorPeter Krempa <pkrempa@redhat.com>
Fri, 27 Mar 2015 09:11:00 +0000 (10:11 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 2 Apr 2015 08:12:08 +0000 (10:12 +0200)
The automatic cpuset can be stored along with automatic nodeset and it
does not have to be recreated when used.

src/qemu/qemu_cgroup.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index a422fbc97c2fcf84ad40809f8f377722cf5dc887..bc7632ffe92fb0f321eafe427e5e06bb31cd94d9 100644 (file)
@@ -642,8 +642,7 @@ qemuSetupCpusetMems(virDomainObjPtr vm)
 
 
 static int
-qemuSetupCpusetCgroup(virDomainObjPtr vm,
-                      virCapsPtr caps)
+qemuSetupCpusetCgroup(virDomainObjPtr vm)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     char *cpu_mask = NULL;
@@ -658,15 +657,10 @@ qemuSetupCpusetCgroup(virDomainObjPtr vm,
     if (vm->def->cpumask ||
         (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)) {
 
-        if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
-            virBitmapPtr cpumap;
-            if (!(cpumap = virCapabilitiesGetCpusForNodemask(caps, priv->autoNodeset)))
-                goto cleanup;
-            cpu_mask = virBitmapFormat(cpumap);
-            virBitmapFree(cpumap);
-        } else {
+        if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
+            cpu_mask = virBitmapFormat(priv->autoCpuset);
+        else
             cpu_mask = virBitmapFormat(vm->def->cpumask);
-        }
 
         if (!cpu_mask)
             goto cleanup;
@@ -896,7 +890,6 @@ qemuSetupCgroup(virQEMUDriverPtr driver,
                 int *nicindexes)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
-    virCapsPtr caps = NULL;
     int ret = -1;
 
     if (!vm->pid) {
@@ -911,9 +904,6 @@ qemuSetupCgroup(virQEMUDriverPtr driver,
     if (!priv->cgroup)
         return 0;
 
-    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
-        goto cleanup;
-
     if (qemuSetupDevicesCgroup(driver, vm) < 0)
         goto cleanup;
 
@@ -926,12 +916,11 @@ qemuSetupCgroup(virQEMUDriverPtr driver,
     if (qemuSetupCpuCgroup(driver, vm) < 0)
         goto cleanup;
 
-    if (qemuSetupCpusetCgroup(vm, caps) < 0)
+    if (qemuSetupCpusetCgroup(vm) < 0)
         goto cleanup;
 
     ret = 0;
  cleanup:
-    virObjectUnref(caps);
     return ret;
 }
 
index 758fcd9d27d66d230eec22b784b2a3c66e97243d..d1be66e54818d5e77f578da112b00acdbc9c6500 100644 (file)
@@ -458,6 +458,7 @@ qemuDomainObjPrivateFree(void *data)
     }
     VIR_FREE(priv->cleanupCallbacks);
     virBitmapFree(priv->autoNodeset);
+    virBitmapFree(priv->autoCpuset);
     VIR_FREE(priv);
 }
 
index b854b54c4903a59c2a9bade15fa3c33a29ba4c24..e4140d8c58a137e8f2ca497dac2bf91855223e55 100644 (file)
@@ -191,7 +191,10 @@ struct _qemuDomainObjPrivate {
     char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
 
     bool hookRun;  /* true if there was a hook run over this domain */
+
+    /* Bitmaps below hold data from the auto NUMA feature */
     virBitmapPtr autoNodeset;
+    virBitmapPtr autoCpuset;
 };
 
 typedef enum {
index 2d86eb841113b38428baca5f132cd517cff9b8a5..563f6580ad8f2b097d1ac698a23dbca9b0e4cb4d 100644 (file)
@@ -4333,7 +4333,6 @@ int qemuProcessStart(virConnectPtr conn,
     size_t i;
     bool rawio_set = false;
     char *nodeset = NULL;
-    virBitmapPtr nodemask = NULL;
     unsigned int stop_flags;
     virQEMUDriverConfigPtr cfg;
     virCapsPtr caps = NULL;
@@ -4594,10 +4593,14 @@ int qemuProcessStart(virConnectPtr conn,
 
         VIR_DEBUG("Nodeset returned from numad: %s", nodeset);
 
-        if (virBitmapParse(nodeset, 0, &nodemask, VIR_DOMAIN_CPUMASK_LEN) < 0)
+        if (virBitmapParse(nodeset, 0, &priv->autoNodeset,
+                           VIR_DOMAIN_CPUMASK_LEN) < 0)
+            goto cleanup;
+
+        if (!(priv->autoCpuset = virCapabilitiesGetCpusForNodemask(caps,
+                                                                   priv->autoNodeset)))
             goto cleanup;
     }
-    priv->autoNodeset = nodemask;
 
     /* "volume" type disk's source must be translated before
      * cgroup and security setting.
@@ -4664,7 +4667,7 @@ int qemuProcessStart(virConnectPtr conn,
                                      migrateFrom, stdin_fd, snapshot, vmop,
                                      &buildCommandLineCallbacks, false,
                                      qemuCheckFips(),
-                                     nodemask,
+                                     priv->autoNodeset,
                                      &nnicindexes, &nicindexes)))
         goto cleanup;