]> xenbits.xensource.com Git - libvirt.git/commitdiff
cgroup: Move [qemu|lxc]GetCpuBWStatus to vicgroup.c and refactor it
authorPeter Krempa <pkrempa@redhat.com>
Fri, 13 Sep 2013 14:03:14 +0000 (16:03 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 Sep 2013 09:32:49 +0000 (11:32 +0200)
The function existed in two identical instances in lxc and qemu. Move it
to vircgroup.c and simplify it. Refactor the callers too.

src/libvirt_private.syms
src/lxc/lxc_driver.c
src/qemu/qemu_driver.c
src/util/vircgroup.c
src/util/vircgroup.h

index 35f0f1bb83e9f07b590c9b5f78d786f0e9135916..82e3d6fc55c17c0fa652466dddd80c4d3fe14c7b 100644 (file)
@@ -1217,6 +1217,7 @@ virCgroupSetMemory;
 virCgroupSetMemoryHardLimit;
 virCgroupSetMemorySoftLimit;
 virCgroupSetMemSwapHardLimit;
+virCgroupSupportsCpuBW;
 
 
 # util/virclosecallbacks.h
index b587c222d789b13721db86887994031c53d3b716..87ced9599ee31e4a2c9bd4a648eebab57ce426d7 100644 (file)
@@ -1574,45 +1574,10 @@ static char *lxcConnectGetHostname(virConnectPtr conn)
 }
 
 
-
-/*
- * check whether the host supports CFS bandwidth
- *
- * Return 1 when CFS bandwidth is supported, 0 when CFS bandwidth is not
- * supported, -1 on error.
- */
-static int lxcGetCpuBWStatus(virCgroupPtr cgroup)
-{
-    char *cfs_period_path = NULL;
-    int ret = -1;
-
-    if (!cgroup)
-        return 0;
-
-    if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU,
-                                  "cpu.cfs_period_us", &cfs_period_path) < 0) {
-        VIR_INFO("cannot get the path of cgroup CPU controller");
-        ret = 0;
-        goto cleanup;
-    }
-
-    if (access(cfs_period_path, F_OK) < 0) {
-        ret = 0;
-    } else {
-        ret = 1;
-    }
-
-cleanup:
-    VIR_FREE(cfs_period_path);
-    return ret;
-}
-
-
 static char *lxcDomainGetSchedulerType(virDomainPtr dom,
                                        int *nparams)
 {
     char *ret = NULL;
-    int rc;
     virDomainObjPtr vm;
     virLXCDomainObjPrivatePtr priv;
 
@@ -1639,13 +1604,10 @@ static char *lxcDomainGetSchedulerType(virDomainPtr dom,
     }
 
     if (nparams) {
-        rc = lxcGetCpuBWStatus(priv->cgroup);
-        if (rc < 0)
-            goto cleanup;
-        else if (rc == 0)
-            *nparams = 1;
-        else
+        if (virCgroupSupportsCpuBW(priv->cgroup))
             *nparams = 3;
+        else
+            *nparams = 1;
     }
 
     ignore_value(VIR_STRDUP(ret, "posix"));
@@ -1872,12 +1834,8 @@ lxcDomainGetSchedulerParametersFlags(virDomainPtr dom,
     if (virDomainGetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def) < 0)
         goto cleanup;
 
-    if (*nparams > 1) {
-        rc = lxcGetCpuBWStatus(priv->cgroup);
-        if (rc < 0)
-            goto cleanup;
-        cpu_bw_status = !!rc;
-    }
+    if (*nparams > 1)
+        cpu_bw_status = virCgroupSupportsCpuBW(priv->cgroup);
 
     if (!(caps = virLXCDriverGetCapabilities(driver, false)))
         goto cleanup;
index ae1948f15a837e5bcdc398394487f16ce23ff40f..0caeb0899b1651121a98ce2f8d90b5a92f7f3579 100644 (file)
@@ -7325,44 +7325,10 @@ cleanup:
 }
 
 
-/*
- * check whether the host supports CFS bandwidth
- *
- * Return 1 when CFS bandwidth is supported, 0 when CFS bandwidth is not
- * supported, -1 on error.
- */
-static int qemuGetCpuBWStatus(virCgroupPtr cgroup)
-{
-    char *cfs_period_path = NULL;
-    int ret = -1;
-
-    if (!cgroup)
-        return 0;
-
-    if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU,
-                                  "cpu.cfs_period_us", &cfs_period_path) < 0) {
-        VIR_INFO("cannot get the path of cgroup CPU controller");
-        ret = 0;
-        goto cleanup;
-    }
-
-    if (access(cfs_period_path, F_OK) < 0) {
-        ret = 0;
-    } else {
-        ret = 1;
-    }
-
-cleanup:
-    VIR_FREE(cfs_period_path);
-    return ret;
-}
-
-
 static char *qemuDomainGetSchedulerType(virDomainPtr dom,
                                         int *nparams)
 {
     char *ret = NULL;
-    int rc;
     virDomainObjPtr vm = NULL;
     qemuDomainObjPrivatePtr priv;
 
@@ -7389,13 +7355,10 @@ static char *qemuDomainGetSchedulerType(virDomainPtr dom,
     }
 
     if (nparams) {
-        rc = qemuGetCpuBWStatus(priv->cgroup);
-        if (rc < 0)
-            goto cleanup;
-        else if (rc == 0)
-            *nparams = 1;
-        else
+        if (virCgroupSupportsCpuBW(priv->cgroup))
             *nparams = 5;
+        else
+            *nparams = 1;
     }
 
     ignore_value(VIR_STRDUP(ret, "posix"));
@@ -8728,12 +8691,8 @@ qemuDomainGetSchedulerParametersFlags(virDomainPtr dom,
     if (virDomainGetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def) < 0)
         goto cleanup;
 
-    if (*nparams > 1) {
-        rc = qemuGetCpuBWStatus(priv->cgroup);
-        if (rc < 0)
-            goto cleanup;
-        cpu_bw_status = !!rc;
-    }
+    if (*nparams > 1)
+        cpu_bw_status = virCgroupSupportsCpuBW(priv->cgroup);
 
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;
index a615f28fe846cf632085e7920d2cb4f60e5fd5ee..e99caf5c54fe51a554fc2b2b3b40afa73cce62b9 100644 (file)
@@ -3061,6 +3061,36 @@ cleanup:
 }
 
 
+/**
+ * virCgroupSupportsCpuBW():
+ * Check whether the host supports CFS bandwidth.
+ *
+ * Return true when CFS bandwidth is supported,
+ * false when CFS bandwidth is not supported.
+ */
+bool
+virCgroupSupportsCpuBW(virCgroupPtr cgroup)
+{
+    char *path = NULL;
+    int ret = false;
+
+    if (!cgroup)
+        return false;
+
+    if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU,
+                                  "cpu.cfs_period_us", &path) < 0) {
+        virResetLastError();
+        goto cleanup;
+    }
+
+    ret = virFileExists(path);
+
+cleanup:
+    VIR_FREE(path);
+    return ret;
+}
+
+
 #else /* !VIR_CGROUP_SUPPORTED */
 
 bool
@@ -3646,4 +3676,12 @@ virCgroupIsolateMount(virCgroupPtr group ATTRIBUTE_UNUSED,
     return -1;
 }
 
+
+bool
+virCgroupSupportsCpuBW(virCgroupPtr cgroup ATTRIBUTE_UNUSED)
+{
+    VIR_DEBUG("Control groups not supported on this platform");
+    return false;
+}
+
 #endif /* !VIR_CGROUP_SUPPORTED */
index 7bb4b2a4504c81c6bd5961686109437462a1bd08..835eb306896eacac5208a111fbc85ec99c112c5f 100644 (file)
@@ -207,4 +207,6 @@ int virCgroupIsolateMount(virCgroupPtr group,
                           const char *oldroot,
                           const char *mountopts);
 
+bool virCgroupSupportsCpuBW(virCgroupPtr cgroup);
+
 #endif /* __VIR_CGROUP_H__ */