diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 2270a520d6..825f62a97b 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -407,7 +407,7 @@ virCgroupDetect(virCgroupPtr group, for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) { if (group->backends[i]) { - int rc = group->backends[i]->detectControllers(group, controllers); + int rc = group->backends[i]->detectControllers(group, controllers, parent); if (rc < 0) return -1; controllersAvailable |= rc; diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h index a91719f89d..77451b0cb6 100644 --- a/src/util/vircgroupbackend.h +++ b/src/util/vircgroupbackend.h @@ -98,7 +98,8 @@ typedef char * typedef int (*virCgroupDetectControllersCB)(virCgroupPtr group, - int controllers); + int controllers, + virCgroupPtr parent); typedef bool (*virCgroupHasControllerCB)(virCgroupPtr cgroup, diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index 7968ab3cf0..4231d8d6fa 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -420,7 +420,8 @@ virCgroupV1StealPlacement(virCgroupPtr group) static int virCgroupV1DetectControllers(virCgroupPtr group, - int controllers) + int controllers, + virCgroupPtr parent ATTRIBUTE_UNUSED) { size_t i; size_t j; diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c index 9d8a38925a..9c44b3473e 100644 --- a/src/util/vircgroupv2.c +++ b/src/util/vircgroupv2.c @@ -242,7 +242,8 @@ virCgroupV2StealPlacement(virCgroupPtr group) static int -virCgroupV2ParseControllersFile(virCgroupPtr group) +virCgroupV2ParseControllersFile(virCgroupPtr group, + virCgroupPtr parent) { int rc; VIR_AUTOFREE(char *) contStr = NULL; @@ -250,10 +251,17 @@ virCgroupV2ParseControllersFile(virCgroupPtr group) char **contList = NULL; char **tmp; - if (virAsprintf(&contFile, "%s%s/cgroup.controllers", - group->unified.mountPoint, - NULLSTR_EMPTY(group->unified.placement)) < 0) - return -1; + if (parent) { + if (virAsprintf(&contFile, "%s%s/cgroup.subtree_control", + parent->unified.mountPoint, + NULLSTR_EMPTY(parent->unified.placement)) < 0) + return -1; + } else { + if (virAsprintf(&contFile, "%s%s/cgroup.controllers", + group->unified.mountPoint, + NULLSTR_EMPTY(group->unified.placement)) < 0) + return -1; + } rc = virFileReadAll(contFile, 1024 * 1024, &contStr); if (rc < 0) { @@ -286,11 +294,12 @@ virCgroupV2ParseControllersFile(virCgroupPtr group) static int virCgroupV2DetectControllers(virCgroupPtr group, - int controllers) + int controllers, + virCgroupPtr parent) { size_t i; - if (virCgroupV2ParseControllersFile(group) < 0) + if (virCgroupV2ParseControllersFile(group, parent) < 0) return -1; /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always