Loading libprocessgroup/processgroup.cpp +31 −11 Original line number Diff line number Diff line Loading @@ -69,6 +69,23 @@ bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path) return true; } static bool CgroupGetMemcgAppsPath(std::string* path) { CgroupController controller = CgroupMap::GetInstance().FindController("memory"); if (!controller.HasValue()) { return false; } if (path) { *path = controller.path(); if (controller.version() == 1) { *path += "/apps"; } } return true; } bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_name) { auto controller = CgroupMap::GetInstance().FindControllerByPath(path); Loading Loading @@ -199,13 +216,13 @@ void removeAllProcessGroups() { LOG(VERBOSE) << "removeAllProcessGroups()"; std::vector<std::string> cgroups; std::string path; std::string path, memcg_apps_path; if (CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &path)) { cgroups.push_back(path); } if (CgroupGetControllerPath("memory", &path)) { cgroups.push_back(path + "/apps"); if (CgroupGetMemcgAppsPath(&memcg_apps_path) && memcg_apps_path != path) { cgroups.push_back(memcg_apps_path); } for (std::string cgroup_root_path : cgroups) { Loading Loading @@ -411,10 +428,11 @@ static int KillProcessGroup(uid_t uid, int initialPid, int signal, int retries, int err = RemoveProcessGroup(cgroup, uid, initialPid, retries); if (isMemoryCgroupSupported() && UsePerAppMemcg()) { std::string memory_path; CgroupGetControllerPath("memory", &memory_path); memory_path += "/apps"; if (RemoveProcessGroup(memory_path.c_str(), uid, initialPid, retries)) return -1; std::string memcg_apps_path; if (CgroupGetMemcgAppsPath(&memcg_apps_path) && RemoveProcessGroup(memcg_apps_path.c_str(), uid, initialPid, retries) < 0) { return -1; } } return err; Loading Loading @@ -491,10 +509,12 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) { return -EINVAL; } if (isMemoryCgroupSupported() && UsePerAppMemcg()) { CgroupGetControllerPath("memory", &cgroup); cgroup += "/apps"; int ret = createProcessGroupInternal(uid, initialPid, cgroup, false); if (std::string memcg_apps_path; isMemoryCgroupSupported() && UsePerAppMemcg() && CgroupGetMemcgAppsPath(&memcg_apps_path)) { // Note by bvanassche: passing 'false' as fourth argument below implies that the v1 // hierarchy is used. It is not clear to me whether the above conditions guarantee that the // v1 hierarchy is used. int ret = createProcessGroupInternal(uid, initialPid, memcg_apps_path, false); if (ret != 0) { return ret; } Loading Loading
libprocessgroup/processgroup.cpp +31 −11 Original line number Diff line number Diff line Loading @@ -69,6 +69,23 @@ bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path) return true; } static bool CgroupGetMemcgAppsPath(std::string* path) { CgroupController controller = CgroupMap::GetInstance().FindController("memory"); if (!controller.HasValue()) { return false; } if (path) { *path = controller.path(); if (controller.version() == 1) { *path += "/apps"; } } return true; } bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_name) { auto controller = CgroupMap::GetInstance().FindControllerByPath(path); Loading Loading @@ -199,13 +216,13 @@ void removeAllProcessGroups() { LOG(VERBOSE) << "removeAllProcessGroups()"; std::vector<std::string> cgroups; std::string path; std::string path, memcg_apps_path; if (CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &path)) { cgroups.push_back(path); } if (CgroupGetControllerPath("memory", &path)) { cgroups.push_back(path + "/apps"); if (CgroupGetMemcgAppsPath(&memcg_apps_path) && memcg_apps_path != path) { cgroups.push_back(memcg_apps_path); } for (std::string cgroup_root_path : cgroups) { Loading Loading @@ -411,10 +428,11 @@ static int KillProcessGroup(uid_t uid, int initialPid, int signal, int retries, int err = RemoveProcessGroup(cgroup, uid, initialPid, retries); if (isMemoryCgroupSupported() && UsePerAppMemcg()) { std::string memory_path; CgroupGetControllerPath("memory", &memory_path); memory_path += "/apps"; if (RemoveProcessGroup(memory_path.c_str(), uid, initialPid, retries)) return -1; std::string memcg_apps_path; if (CgroupGetMemcgAppsPath(&memcg_apps_path) && RemoveProcessGroup(memcg_apps_path.c_str(), uid, initialPid, retries) < 0) { return -1; } } return err; Loading Loading @@ -491,10 +509,12 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) { return -EINVAL; } if (isMemoryCgroupSupported() && UsePerAppMemcg()) { CgroupGetControllerPath("memory", &cgroup); cgroup += "/apps"; int ret = createProcessGroupInternal(uid, initialPid, cgroup, false); if (std::string memcg_apps_path; isMemoryCgroupSupported() && UsePerAppMemcg() && CgroupGetMemcgAppsPath(&memcg_apps_path)) { // Note by bvanassche: passing 'false' as fourth argument below implies that the v1 // hierarchy is used. It is not clear to me whether the above conditions guarantee that the // v1 hierarchy is used. int ret = createProcessGroupInternal(uid, initialPid, memcg_apps_path, false); if (ret != 0) { return ret; } Loading