]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
vircgroup: Introduce virCgroupControllerAvailable
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 31 Mar 2015 09:39:13 +0000 (11:39 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 8 Apr 2015 09:54:24 +0000 (11:54 +0200)
This new internal API checks if given CGroup controller is
available.  It is going to be needed later when we need to make a
decision whether pin domain memory onto NUMA nodes using cpuset
CGroup controller or using numa_set_membind().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/libvirt_private.syms
src/util/vircgroup.c
src/util/vircgroup.h
tests/vircgrouptest.c

index b1cb9e5177c7af0946f582ef50769e5eebf2c8b4..a092714fedf8ab962a45a4f6694cdf0d285084dc 100644 (file)
@@ -1142,6 +1142,7 @@ virCgroupAllowDevice;
 virCgroupAllowDeviceMajor;
 virCgroupAllowDevicePath;
 virCgroupAvailable;
+virCgroupControllerAvailable;
 virCgroupControllerTypeFromString;
 virCgroupControllerTypeToString;
 virCgroupDenyAllDevices;
index d42f4335a14a5a12a36972be393edd505bc351d0..00c0bab490a458ab666d0be35b0d57ee54fbf064 100644 (file)
@@ -4011,6 +4011,20 @@ virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller)
     return ret;
 }
 
+bool
+virCgroupControllerAvailable(int controller)
+{
+    virCgroupPtr cgroup;
+    bool ret = false;
+
+    if (virCgroupNewSelf(&cgroup) < 0)
+        return ret;
+
+    ret = virCgroupHasController(cgroup, controller);
+    virCgroupFree(&cgroup);
+    return ret;
+}
+
 #else /* !VIR_CGROUP_SUPPORTED */
 
 bool
@@ -4781,4 +4795,9 @@ virCgroupHasEmptyTasks(virCgroupPtr cgroup ATTRIBUTE_UNUSED,
     return -1;
 }
 
+bool
+virCgroupControllerAvailable(int controller ATTRIBUTE_UNUSED)
+{
+    return false;
+}
 #endif /* !VIR_CGROUP_SUPPORTED */
index eee15cae944e3249af9fb6700b122906b67de58e..5d6356d7b98239a8b3037c7727309dfae8beff4f 100644 (file)
@@ -282,4 +282,5 @@ int virCgroupSetOwner(virCgroupPtr cgroup,
 
 int virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller);
 
+bool virCgroupControllerAvailable(int controller);
 #endif /* __VIR_CGROUP_H__ */
index bbf28d14a85d649f71582a9685ba981d7c156e84..2b302585a2112573436204fa53528eb8c5e65bd9 100644 (file)
@@ -586,6 +586,34 @@ static int testCgroupAvailable(const void *args)
     return 0;
 }
 
+static int testCgroupControllerAvailable(const void *args ATTRIBUTE_UNUSED)
+{
+    int ret = 0;
+
+# define CHECK_CONTROLLER(c, present)                                   \
+    if ((present && !virCgroupControllerAvailable(c)) ||                \
+        (!present && virCgroupControllerAvailable(c))) {                \
+        fprintf(stderr, present ?                                       \
+                "Expected controller %s not available\n" :              \
+                "Unexpected controller %s available\n", #c);            \
+        ret = -1;                                                       \
+    }
+
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_CPU, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_CPUACCT, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_CPUSET, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_MEMORY, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_DEVICES, false)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_FREEZER, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_BLKIO, true)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_NET_CLS, false)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_PERF_EVENT, false)
+    CHECK_CONTROLLER(VIR_CGROUP_CONTROLLER_SYSTEMD, true)
+
+# undef CHECK_CONTROLLER
+    return ret;
+}
+
 static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED)
 {
     virCgroupPtr cgroup = NULL;
@@ -886,6 +914,9 @@ mymain(void)
     if (virtTestRun("Cgroup available", testCgroupAvailable, (void*)0x1) < 0)
         ret = -1;
 
+    if (virtTestRun("Cgroup controller available", testCgroupControllerAvailable, NULL) < 0)
+        ret = -1;
+
     if (virtTestRun("virCgroupGetBlkioIoServiced works", testCgroupGetBlkioIoServiced, NULL) < 0)
         ret = -1;