summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuren Baghdasaryan <surenb@google.com>2022-05-04 15:58:58 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-05-04 15:58:58 +0000
commite31c7a17e51ecd311bbd1ef4219276ead8ff0353 (patch)
treedc4dbe5f0edffaa25093394a687f53cedf16580f
parentbc752d279f65b11b3159f949db90f6a0210e581d (diff)
parent870725ac14440939b9bb7939f0ee1af1102f8a67 (diff)
downloadcore-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.cpp4
-rw-r--r--libprocessgroup/include/processgroup/processgroup.h1
-rw-r--r--libprocessgroup/processgroup.cpp33
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