diff options
author | Suren Baghdasaryan <surenb@google.com> | 2022-05-04 15:58:58 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-05-04 15:58:58 +0000 |
commit | e31c7a17e51ecd311bbd1ef4219276ead8ff0353 (patch) | |
tree | dc4dbe5f0edffaa25093394a687f53cedf16580f | |
parent | bc752d279f65b11b3159f949db90f6a0210e581d (diff) | |
parent | 870725ac14440939b9bb7939f0ee1af1102f8a67 (diff) | |
download | core-e31c7a17e51ecd311bbd1ef4219276ead8ff0353.tar.gz |
Merge changes from topic "228160715_fix" into tm-dev
* changes:
init: Purge empty process groups on zygote restart
libprocessgroup: Add a function to remove only empty process groups
-rw-r--r-- | init/service.cpp | 4 | ||||
-rw-r--r-- | libprocessgroup/include/processgroup/processgroup.h | 1 | ||||
-rw-r--r-- | libprocessgroup/processgroup.cpp | 33 |
3 files changed, 33 insertions, 5 deletions
diff --git a/init/service.cpp b/init/service.cpp index 0f2443741..3fa935fdd 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -289,6 +289,10 @@ void Service::Reap(const siginfo_t& siginfo) { if (flags_ & SVC_EXEC) UnSetExec(); + if (name_ == "zygote" || name_ == "zygote64") { + removeAllEmptyProcessGroups(); + } + if (flags_ & SVC_TEMPORARY) return; pid_ = 0; diff --git a/libprocessgroup/include/processgroup/processgroup.h b/libprocessgroup/include/processgroup/processgroup.h index c5badc941..39b9f3fc0 100644 --- a/libprocessgroup/include/processgroup/processgroup.h +++ b/libprocessgroup/include/processgroup/processgroup.h @@ -67,6 +67,7 @@ bool setProcessGroupSoftLimit(uid_t uid, int initialPid, int64_t softLimitInByte bool setProcessGroupLimit(uid_t uid, int initialPid, int64_t limitInBytes); void removeAllProcessGroups(void); +void removeAllEmptyProcessGroups(void); // Provides the path for an attribute in a specific process group // Returns false in case of error, true in case of success diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp index e3a80e97b..267e62c67 100644 --- a/libprocessgroup/processgroup.cpp +++ b/libprocessgroup/processgroup.cpp @@ -200,7 +200,7 @@ static int RemoveProcessGroup(const char* cgroup, uid_t uid, int pid, unsigned i return ret; } -static bool RemoveUidProcessGroups(const std::string& uid_path) { +static bool RemoveUidProcessGroups(const std::string& uid_path, bool empty_only) { std::unique_ptr<DIR, decltype(&closedir)> uid(opendir(uid_path.c_str()), closedir); bool empty = true; if (uid != NULL) { @@ -215,6 +215,21 @@ static bool RemoveUidProcessGroups(const std::string& uid_path) { } auto path = StringPrintf("%s/%s", uid_path.c_str(), dir->d_name); + if (empty_only) { + struct stat st; + auto procs_file = StringPrintf("%s/%s", path.c_str(), + PROCESSGROUP_CGROUP_PROCS_FILE); + if (stat(procs_file.c_str(), &st) == -1) { + PLOG(ERROR) << "Failed to get stats for " << procs_file; + continue; + } + if (st.st_size > 0) { + // skip non-empty groups + LOG(VERBOSE) << "Skipping non-empty group " << path; + empty = false; + continue; + } + } LOG(VERBOSE) << "Removing " << path; if (rmdir(path.c_str()) == -1) { if (errno != EBUSY) { @@ -227,9 +242,7 @@ static bool RemoveUidProcessGroups(const std::string& uid_path) { return empty; } -void removeAllProcessGroups() { - LOG(VERBOSE) << "removeAllProcessGroups()"; - +void removeAllProcessGroupsInternal(bool empty_only) { std::vector<std::string> cgroups; std::string path, memcg_apps_path; @@ -256,7 +269,7 @@ void removeAllProcessGroups() { } auto path = StringPrintf("%s/%s", cgroup_root_path.c_str(), dir->d_name); - if (!RemoveUidProcessGroups(path)) { + if (!RemoveUidProcessGroups(path, empty_only)) { LOG(VERBOSE) << "Skip removing " << path; continue; } @@ -269,6 +282,16 @@ void removeAllProcessGroups() { } } +void removeAllProcessGroups() { + LOG(VERBOSE) << "removeAllProcessGroups()"; + removeAllProcessGroupsInternal(false); +} + +void removeAllEmptyProcessGroups() { + LOG(VERBOSE) << "removeAllEmptyProcessGroups()"; + removeAllProcessGroupsInternal(true); +} + /** * Process groups are primarily created by the Zygote, meaning that uid/pid groups are created by * the user root. Ownership for the newly created cgroup and all of its files must thus be |