From eb21408f4493a8348a2b643215d48d4c72de8238 Mon Sep 17 00:00:00 2001 From: Viktor Mihajlovski Date: Thu, 23 May 2013 15:26:31 +0200 Subject: [PATCH] cgroups: Do not enforce nonexistent controllers Currently, the controllers argument to virCgroupDetect acts both as a result filter and a required controller specification, which is a bit overloaded. If both functionalities are needed, it would be better to have them seperated into a filter and a requirement mask. The only situation where it is used today is to ensure that only CPU related controllers are used for the VCPU directories. But here we clearly do not want to enforce the existence of cpu, cpuacct and specifically not cpuset at the same time. This commit changes the semantics of controllers to "filter only". Should a required mask ever be needed, more work will have to be done. Signed-off-by: Viktor Mihajlovski --- src/util/vircgroup.c | 8 ++++---- tests/vircgrouptest.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 51f25f0100..fc0e43062a 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -368,18 +368,18 @@ static int virCgroupDetect(virCgroupPtr group, } if (controllers >= 0) { - VIR_DEBUG("Validating controllers %d", controllers); + VIR_DEBUG("Filtering controllers %d", controllers); for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { VIR_DEBUG("Controller '%s' wanted=%s, mount='%s'", virCgroupControllerTypeToString(i), (1 << i) & controllers ? "yes" : "no", NULLSTR(group->controllers[i].mountPoint)); if (((1 << i) & controllers)) { - /* Ensure requested controller is present */ + /* Remove non-existent controllers */ if (!group->controllers[i].mountPoint) { - VIR_DEBUG("Requested controlled '%s' not mounted", + VIR_DEBUG("Requested controller '%s' not mounted, ignoring", virCgroupControllerTypeToString(i)); - return -ENOENT; + controllers &= ~(1 << i); } } else { /* Check whether a request to disable a controller diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c index b00a1871ec..262eb8ba6b 100644 --- a/tests/vircgrouptest.c +++ b/tests/vircgrouptest.c @@ -176,7 +176,7 @@ static int testCgroupNewForDriver(const void *args ATTRIBUTE_UNUSED) /* Asking for impossible combination since devices is not mounted */ if ((rv = virCgroupNewDriver("lxc", true, (1 << VIR_CGROUP_CONTROLLER_DEVICES), - &cgroup)) != -ENOENT) { + &cgroup)) != -ENXIO) { fprintf(stderr, "Should not have created LXC cgroup: %d\n", -rv); goto cleanup; } @@ -280,7 +280,7 @@ static int testCgroupNewForPartition(const void *args ATTRIBUTE_UNUSED) /* Asking for impossible combination since devices is not mounted */ if ((rv = virCgroupNewPartition("/virtualmachines", true, (1 << VIR_CGROUP_CONTROLLER_DEVICES), - &cgroup)) != -ENOENT) { + &cgroup)) != -ENXIO) { fprintf(stderr, "Should not have created /virtualmachines cgroup: %d\n", -rv); goto cleanup; }