]> xenbits.xensource.com Git - libvirt.git/commitdiff
cgroup: Prepare for sparse vCPU topologies in virCgroupGetPercpuStats
authorPeter Krempa <pkrempa@redhat.com>
Mon, 14 Dec 2015 14:10:22 +0000 (15:10 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 8 Feb 2016 08:51:34 +0000 (09:51 +0100)
Pass a bitmap of enabled guest vCPUs to virCgroupGetPercpuStats so that
non-continuous vCPU topologies can be used.

src/lxc/lxc_driver.c
src/qemu/qemu_driver.c
src/util/vircgroup.c
src/util/vircgroup.h
tests/vircgrouptest.c

index b3399d92b7317b8227ab77c2432df7f2060bb048..41639acd52629bf9136f9ec73d24fb5e2fc95b82 100644 (file)
@@ -5706,7 +5706,7 @@ lxcDomainGetCPUStats(virDomainPtr dom,
                                               params, nparams);
     else
         ret = virCgroupGetPercpuStats(priv->cgroup, params,
-                                      nparams, start_cpu, ncpus, 0);
+                                      nparams, start_cpu, ncpus, NULL);
  cleanup:
     virObjectUnlock(vm);
     return ret;
index d10808b56a49b2228f4b0d33d271a18118020cf3..fd91bbe039e58efab4df8f445513772cfbb7b78f 100644 (file)
@@ -18207,6 +18207,7 @@ qemuDomainGetCPUStats(virDomainPtr domain,
     virDomainObjPtr vm = NULL;
     int ret = -1;
     qemuDomainObjPrivatePtr priv;
+    virBitmapPtr guestvcpus = NULL;
 
     virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1);
 
@@ -18230,13 +18231,18 @@ qemuDomainGetCPUStats(virDomainPtr domain,
         goto cleanup;
     }
 
+    if (qemuDomainHasVcpuPids(vm) &&
+        !(guestvcpus = virDomainDefGetOnlineVcpumap(vm->def)))
+        goto cleanup;
+
     if (start_cpu == -1)
         ret = virCgroupGetDomainTotalCpuStats(priv->cgroup,
                                               params, nparams);
     else
         ret = virCgroupGetPercpuStats(priv->cgroup, params, nparams,
-                                      start_cpu, ncpus, priv->nvcpupids);
+                                      start_cpu, ncpus, guestvcpus);
  cleanup:
+    virBitmapFree(guestvcpus);
     virDomainObjEndAPI(&vm);
     return ret;
 }
index 2f54cf29943fca55120bb2681c0d8f35942089af..f625cbcd887581efe03acc1c0eaeb1ed084dd984 100644 (file)
@@ -3161,17 +3161,17 @@ virCgroupDenyDevicePath(virCgroupPtr group, const char *path, int perms)
  */
 static int
 virCgroupGetPercpuVcpuSum(virCgroupPtr group,
-                          unsigned int nvcpupids,
+                          virBitmapPtr guestvcpus,
                           unsigned long long *sum_cpu_time,
                           size_t nsum,
                           virBitmapPtr cpumap)
 {
     int ret = -1;
-    size_t i;
+    ssize_t i = -1;
     char *buf = NULL;
     virCgroupPtr group_vcpu = NULL;
 
-    for (i = 0; i < nvcpupids; i++) {
+    while ((i = virBitmapNextSetBit(guestvcpus, i)) >= 0) {
         char *pos;
         unsigned long long tmp;
         ssize_t j;
@@ -3233,7 +3233,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
                         unsigned int nparams,
                         int start_cpu,
                         unsigned int ncpus,
-                        unsigned int nvcpupids)
+                        virBitmapPtr guestvcpus)
 {
     int ret = -1;
     size_t i;
@@ -3248,7 +3248,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
 
     /* return the number of supported params */
     if (nparams == 0 && ncpus != 0) {
-        if (nvcpupids == 0)
+        if (!guestvcpus)
             return CGROUP_NB_PER_CPU_STAT_PARAM;
         else
             return CGROUP_NB_PER_CPU_STAT_PARAM + 1;
@@ -3303,11 +3303,11 @@ virCgroupGetPercpuStats(virCgroupPtr group,
     /* return percpu vcputime in index 1 */
     param_idx = 1;
 
-    if (nvcpupids > 0 && param_idx < nparams) {
+    if (guestvcpus && param_idx < nparams) {
         if (VIR_ALLOC_N(sum_cpu_time, need_cpus) < 0)
             goto cleanup;
-        if (virCgroupGetPercpuVcpuSum(group, nvcpupids, sum_cpu_time, need_cpus,
-                                      cpumap) < 0)
+        if (virCgroupGetPercpuVcpuSum(group, guestvcpus, sum_cpu_time,
+                                      need_cpus, cpumap) < 0)
             goto cleanup;
 
         for (i = start_cpu; i < need_cpus; i++) {
index 46d3acee09c0be39e9ba6bab2c8f46f49d73c17c..aeb641c18a51b49bac27bbbfec5e45ab61606ad9 100644 (file)
@@ -26,6 +26,7 @@
 # define __VIR_CGROUP_H__
 
 # include "virutil.h"
+# include "virbitmap.h"
 
 struct virCgroup;
 typedef struct virCgroup *virCgroupPtr;
@@ -246,7 +247,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
                         unsigned int nparams,
                         int start_cpu,
                         unsigned int ncpus,
-                        unsigned int nvcpupids);
+                        virBitmapPtr guestvcpus);
 
 int
 virCgroupGetDomainTotalCpuStats(virCgroupPtr group,
index 7ea6e13657eed391e162ed9bbaf68ec2ebc974b5..322f6cbbc5d44b066ca8fc9225c042ed8bd5bded 100644 (file)
@@ -656,7 +656,7 @@ static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED)
 
     if ((rv = virCgroupGetPercpuStats(cgroup,
                                       params,
-                                      1, 0, EXPECTED_NCPUS, 0)) < 0) {
+                                      1, 0, EXPECTED_NCPUS, NULL)) < 0) {
         fprintf(stderr, "Failed call to virCgroupGetPercpuStats for /virtualmachines cgroup: %d\n", -rv);
         goto cleanup;
     }