diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index a07533545e..fa47229a5d 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -472,7 +472,7 @@ cleanup: } -int virLXCCgroupSetup(virDomainDefPtr def) +virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def) { virCgroupPtr driver = NULL; virCgroupPtr cgroup = NULL; @@ -494,6 +494,32 @@ int virLXCCgroupSetup(virDomainDefPtr def) goto cleanup; } + rc = virCgroupAddTask(cgroup, getpid()); + if (rc != 0) { + virReportSystemError(-rc, + _("Unable to add task %d to cgroup for domain %s"), + getpid(), def->name); + goto cleanup; + } + + ret = 0; + +cleanup: + virCgroupFree(&driver); + if (ret < 0) { + virCgroupFree(&cgroup); + return NULL; + } + + return cgroup; +} + + +int virLXCCgroupSetup(virDomainDefPtr def, + virCgroupPtr cgroup) +{ + int ret = -1; + if (virLXCCgroupSetupCpuTune(def, cgroup) < 0) goto cleanup; @@ -506,19 +532,8 @@ int virLXCCgroupSetup(virDomainDefPtr def) if (virLXCCgroupSetupDeviceACL(def, cgroup) < 0) goto cleanup; - rc = virCgroupAddTask(cgroup, getpid()); - if (rc != 0) { - virReportSystemError(-rc, - _("Unable to add task %d to cgroup for domain %s"), - getpid(), def->name); - goto cleanup; - } - ret = 0; cleanup: - virCgroupFree(&cgroup); - virCgroupFree(&driver); - return ret; } diff --git a/src/lxc/lxc_cgroup.h b/src/lxc/lxc_cgroup.h index fff554b3d4..18f54e630a 100644 --- a/src/lxc/lxc_cgroup.h +++ b/src/lxc/lxc_cgroup.h @@ -26,7 +26,9 @@ # include "lxc_fuse.h" # include "virusb.h" -int virLXCCgroupSetup(virDomainDefPtr def); +virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def); +int virLXCCgroupSetup(virDomainDefPtr def, + virCgroupPtr cgroup); int virLXCCgroupGetMeminfo(virLXCMeminfoPtr meminfo); int diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index becf811297..1508b9c281 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -628,7 +628,8 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl) * * Returns 0 on success or -1 in case of error */ -static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl) +static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl, + virCgroupPtr cgroup) { if (virLXCControllerSetupCpuAffinity(ctrl) < 0) @@ -637,7 +638,7 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl) if (virLXCControllerSetupNUMAPolicy(ctrl) < 0) return -1; - return virLXCCgroupSetup(ctrl->def); + return virLXCCgroupSetup(ctrl->def, cgroup); } @@ -1473,6 +1474,7 @@ virLXCControllerRun(virLXCControllerPtr ctrl) int containerhandshake[2] = { -1, -1 }; char **containerTTYPaths = NULL; size_t i; + virCgroupPtr cgroup = NULL; if (VIR_ALLOC_N(containerTTYPaths, ctrl->nconsoles) < 0) { virReportOOMError(); @@ -1494,10 +1496,13 @@ virLXCControllerRun(virLXCControllerPtr ctrl) if (virLXCControllerSetupPrivateNS() < 0) goto cleanup; + if (!(cgroup = virLXCCgroupCreate(ctrl->def))) + goto cleanup; + if (virLXCControllerSetupLoopDevices(ctrl) < 0) goto cleanup; - if (virLXCControllerSetupResourceLimits(ctrl) < 0) + if (virLXCControllerSetupResourceLimits(ctrl, cgroup) < 0) goto cleanup; if (virLXCControllerSetupDevPTS(ctrl) < 0) @@ -1570,6 +1575,7 @@ cleanup: VIR_FREE(containerTTYPaths[i]); VIR_FREE(containerTTYPaths); + virCgroupFree(&cgroup); virLXCControllerStopInit(ctrl); return rc;