From 4f7cc8c3455b2a28984e2682c1b8075cb57d67fe Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Thu, 2 Mar 2023 14:12:49 -0800 Subject: [PATCH] libprocessgroup: fix boot time performance regression The way processes are accounted in DoKillProcessGroupOnce has been changed recently, which affects retries in KillProcessGroup. More specifically, initialPid was not counted before and would not cause a retry with 5ms sleep. Restore previous behavior to avoid boot time regressions. Bug: 271198843 Signed-off-by: Suren Baghdasaryan Change-Id: Ibc1bdd855898688a4a03806671e6ac31570aedf9 --- libprocessgroup/processgroup.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp index 384a8f07d..38f19ff58 100644 --- a/libprocessgroup/processgroup.cpp +++ b/libprocessgroup/processgroup.cpp @@ -372,6 +372,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, std::set pgids; pgids.emplace(initialPid); std::set pids; + int processes = 0; std::unique_ptr fd(nullptr, fclose); @@ -390,6 +391,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, pid_t pid; bool file_is_empty = true; while (fscanf(fd.get(), "%d\n", &pid) == 1 && pid >= 0) { + processes++; file_is_empty = false; if (pid == 0) { // Should never happen... but if it does, trying to kill this @@ -419,15 +421,12 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, } } - int processes = 0; // Kill all process groups. for (const auto pgid : pgids) { LOG(VERBOSE) << "Killing process group " << -pgid << " in uid " << uid << " as part of process cgroup " << initialPid; - if (kill(-pgid, signal) == 0) { - processes++; - } else if (errno != ESRCH) { + if (kill(-pgid, signal) == -1 && errno != ESRCH) { PLOG(WARNING) << "kill(" << -pgid << ", " << signal << ") failed"; } } @@ -437,9 +436,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid, LOG(VERBOSE) << "Killing pid " << pid << " in uid " << uid << " as part of process cgroup " << initialPid; - if (kill(pid, signal) == 0) { - processes++; - } else if (errno != ESRCH) { + if (kill(pid, signal) == -1 && errno != ESRCH) { PLOG(WARNING) << "kill(" << pid << ", " << signal << ") failed"; } }