Loading libprocessgroup/cgroup_map.cpp +19 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ using android::base::GetBoolProperty; using android::base::GetBoolProperty; using android::base::StringPrintf; using android::base::StringPrintf; using android::base::unique_fd; using android::base::unique_fd; using android::base::WriteStringToFile; static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs"; static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs"; static constexpr const char* CGROUP_TASKS_FILE = "/tasks"; static constexpr const char* CGROUP_TASKS_FILE = "/tasks"; Loading Loading @@ -202,3 +203,21 @@ CgroupController CgroupMap::FindController(const std::string& name) const { return CgroupController(nullptr); return CgroupController(nullptr); } } int CgroupMap::ActivateControllers(const std::string& path) const { if (__builtin_available(android 30, *)) { auto controller_count = ACgroupFile_getControllerCount(); for (uint32_t i = 0; i < controller_count; ++i) { const ACgroupController* controller = ACgroupFile_getController(i); if (ACgroupController_getFlags(controller) & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION) { std::string str = std::string("+") + ACgroupController_getName(controller); if (!WriteStringToFile(str, path + "/cgroup.subtree_control")) { return -errno; } } } return 0; } return -ENOSYS; } libprocessgroup/cgroup_map.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -62,6 +62,7 @@ class CgroupMap { static CgroupMap& GetInstance(); static CgroupMap& GetInstance(); CgroupController FindController(const std::string& name) const; CgroupController FindController(const std::string& name) const; int ActivateControllers(const std::string& path) const; private: private: bool loaded_ = false; bool loaded_ = false; Loading libprocessgroup/processgroup.cpp +12 −4 Original line number Original line Diff line number Diff line Loading @@ -416,13 +416,15 @@ int killProcessGroupOnce(uid_t uid, int initialPid, int signal, int* max_process return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes); return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes); } } static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup) { static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup, bool activate_controllers) { auto uid_path = ConvertUidToPath(cgroup.c_str(), uid); auto uid_path = ConvertUidToPath(cgroup.c_str(), uid); struct stat cgroup_stat; struct stat cgroup_stat; mode_t cgroup_mode = 0750; mode_t cgroup_mode = 0750; gid_t cgroup_uid = AID_SYSTEM; gid_t cgroup_uid = AID_SYSTEM; uid_t cgroup_gid = AID_SYSTEM; uid_t cgroup_gid = AID_SYSTEM; int ret = 0; if (stat(cgroup.c_str(), &cgroup_stat) == 1) { if (stat(cgroup.c_str(), &cgroup_stat) == 1) { PLOG(ERROR) << "Failed to get stats for " << cgroup; PLOG(ERROR) << "Failed to get stats for " << cgroup; Loading @@ -436,6 +438,13 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr PLOG(ERROR) << "Failed to make and chown " << uid_path; PLOG(ERROR) << "Failed to make and chown " << uid_path; return -errno; return -errno; } } if (activate_controllers) { ret = CgroupMap::GetInstance().ActivateControllers(uid_path); if (ret) { LOG(ERROR) << "Failed to activate controllers in " << uid_path; return ret; } } auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid); auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid); Loading @@ -446,7 +455,6 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE; auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE; int ret = 0; if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) { if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) { ret = -errno; ret = -errno; PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file; PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file; Loading @@ -466,14 +474,14 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) { if (isMemoryCgroupSupported() && UsePerAppMemcg()) { if (isMemoryCgroupSupported() && UsePerAppMemcg()) { CgroupGetControllerPath("memory", &cgroup); CgroupGetControllerPath("memory", &cgroup); cgroup += "/apps"; cgroup += "/apps"; int ret = createProcessGroupInternal(uid, initialPid, cgroup); int ret = createProcessGroupInternal(uid, initialPid, cgroup, false); if (ret != 0) { if (ret != 0) { return ret; return ret; } } } } CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup); CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup); return createProcessGroupInternal(uid, initialPid, cgroup); return createProcessGroupInternal(uid, initialPid, cgroup, true); } } static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) { static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) { Loading Loading
libprocessgroup/cgroup_map.cpp +19 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ using android::base::GetBoolProperty; using android::base::GetBoolProperty; using android::base::StringPrintf; using android::base::StringPrintf; using android::base::unique_fd; using android::base::unique_fd; using android::base::WriteStringToFile; static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs"; static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs"; static constexpr const char* CGROUP_TASKS_FILE = "/tasks"; static constexpr const char* CGROUP_TASKS_FILE = "/tasks"; Loading Loading @@ -202,3 +203,21 @@ CgroupController CgroupMap::FindController(const std::string& name) const { return CgroupController(nullptr); return CgroupController(nullptr); } } int CgroupMap::ActivateControllers(const std::string& path) const { if (__builtin_available(android 30, *)) { auto controller_count = ACgroupFile_getControllerCount(); for (uint32_t i = 0; i < controller_count; ++i) { const ACgroupController* controller = ACgroupFile_getController(i); if (ACgroupController_getFlags(controller) & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION) { std::string str = std::string("+") + ACgroupController_getName(controller); if (!WriteStringToFile(str, path + "/cgroup.subtree_control")) { return -errno; } } } return 0; } return -ENOSYS; }
libprocessgroup/cgroup_map.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -62,6 +62,7 @@ class CgroupMap { static CgroupMap& GetInstance(); static CgroupMap& GetInstance(); CgroupController FindController(const std::string& name) const; CgroupController FindController(const std::string& name) const; int ActivateControllers(const std::string& path) const; private: private: bool loaded_ = false; bool loaded_ = false; Loading
libprocessgroup/processgroup.cpp +12 −4 Original line number Original line Diff line number Diff line Loading @@ -416,13 +416,15 @@ int killProcessGroupOnce(uid_t uid, int initialPid, int signal, int* max_process return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes); return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes); } } static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup) { static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup, bool activate_controllers) { auto uid_path = ConvertUidToPath(cgroup.c_str(), uid); auto uid_path = ConvertUidToPath(cgroup.c_str(), uid); struct stat cgroup_stat; struct stat cgroup_stat; mode_t cgroup_mode = 0750; mode_t cgroup_mode = 0750; gid_t cgroup_uid = AID_SYSTEM; gid_t cgroup_uid = AID_SYSTEM; uid_t cgroup_gid = AID_SYSTEM; uid_t cgroup_gid = AID_SYSTEM; int ret = 0; if (stat(cgroup.c_str(), &cgroup_stat) == 1) { if (stat(cgroup.c_str(), &cgroup_stat) == 1) { PLOG(ERROR) << "Failed to get stats for " << cgroup; PLOG(ERROR) << "Failed to get stats for " << cgroup; Loading @@ -436,6 +438,13 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr PLOG(ERROR) << "Failed to make and chown " << uid_path; PLOG(ERROR) << "Failed to make and chown " << uid_path; return -errno; return -errno; } } if (activate_controllers) { ret = CgroupMap::GetInstance().ActivateControllers(uid_path); if (ret) { LOG(ERROR) << "Failed to activate controllers in " << uid_path; return ret; } } auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid); auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid); Loading @@ -446,7 +455,6 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE; auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE; int ret = 0; if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) { if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) { ret = -errno; ret = -errno; PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file; PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file; Loading @@ -466,14 +474,14 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) { if (isMemoryCgroupSupported() && UsePerAppMemcg()) { if (isMemoryCgroupSupported() && UsePerAppMemcg()) { CgroupGetControllerPath("memory", &cgroup); CgroupGetControllerPath("memory", &cgroup); cgroup += "/apps"; cgroup += "/apps"; int ret = createProcessGroupInternal(uid, initialPid, cgroup); int ret = createProcessGroupInternal(uid, initialPid, cgroup, false); if (ret != 0) { if (ret != 0) { return ret; return ret; } } } } CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup); CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup); return createProcessGroupInternal(uid, initialPid, cgroup); return createProcessGroupInternal(uid, initialPid, cgroup, true); } } static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) { static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) { Loading