From: Michal Privoznik Date: Tue, 31 Mar 2015 09:39:13 +0000 (+0200) Subject: vircgroup: Introduce virCgroupControllerAvailable X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=d65acbde3502e9a16eea045c2d6cd1e02284f66b;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git vircgroup: Introduce virCgroupControllerAvailable 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 --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b1cb9e517..a092714fe 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1142,6 +1142,7 @@ virCgroupAllowDevice; virCgroupAllowDeviceMajor; virCgroupAllowDevicePath; virCgroupAvailable; +virCgroupControllerAvailable; virCgroupControllerTypeFromString; virCgroupControllerTypeToString; virCgroupDenyAllDevices; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index d42f4335a..00c0bab49 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -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 */ diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index eee15cae9..5d6356d7b 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -282,4 +282,5 @@ int virCgroupSetOwner(virCgroupPtr cgroup, int virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller); +bool virCgroupControllerAvailable(int controller); #endif /* __VIR_CGROUP_H__ */ diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c index bbf28d14a..2b302585a 100644 --- a/tests/vircgrouptest.c +++ b/tests/vircgrouptest.c @@ -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;