From 2fa5b7af73018adc6f0cd02d1c33bc88e51b47b5 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Tue, 4 Oct 2022 13:40:24 -0700 Subject: [PATCH] lmkd: remove priority setting for the kill target Setting cpusets and priorities for the kill target involves fs operations which can block on kernel internal locks. Doing that from lmkd main thread context has the danger of blocking lmkd. With the introduction of the reaper threads the time for the target to exit is not as critical since its memory is freed by the reaper thread. To prevent lmkd from being blocked, move setting cpuset for the kill target into the reaper thread and remove priority setting logic with heavy use of procfs reads. Bug: 238495258 Signed-off-by: Suren Baghdasaryan Change-Id: I5defc6baa4ff1425d9835371b47a64e375ebac10 Merged-In: I5defc6baa4ff1425d9835371b47a64e375ebac10 --- reaper.cpp | 47 ++++++++--------------------------------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/reaper.cpp b/reaper.cpp index 6e4ee6d..f9bb52a 100644 --- a/reaper.cpp +++ b/reaper.cpp @@ -89,6 +89,14 @@ static void* reaper_main(void* param) { ALOGI("Process %d was reaped in %ldms", target.pid, get_time_diff_ms(&start_tm, &end_tm)); } + + if (!SetProcessProfilesCached(target.uid, target.pid, + {"CPUSET_SP_FOREGROUND", "SCHED_SP_FOREGROUND"})) { + if (reaper->debug_enabled()) { + ALOGW("Failed to set task profiles for the process (%d) being killed", target.pid); + } + } + done: close(target.pidfd); reaper->request_complete(); @@ -152,41 +160,6 @@ bool Reaper::init(int comm_fd) { return true; } -static void set_process_group_and_prio(uid_t uid, int pid, const std::vector& profiles, - int prio) { - DIR* d; - char proc_path[PATH_MAX]; - struct dirent* de; - - if (!SetProcessProfilesCached(uid, pid, profiles)) { - ALOGW("Failed to set task profiles for the process (%d) being killed", pid); - } - - snprintf(proc_path, sizeof(proc_path), "/proc/%d/task", pid); - if (!(d = opendir(proc_path))) { - ALOGW("Failed to open %s; errno=%d: process pid(%d) might have died", proc_path, errno, - pid); - return; - } - - while ((de = readdir(d))) { - int t_pid; - - if (de->d_name[0] == '.') continue; - t_pid = atoi(de->d_name); - - if (!t_pid) { - ALOGW("Failed to get t_pid for '%s' of pid(%d)", de->d_name, pid); - continue; - } - - if (setpriority(PRIO_PROCESS, t_pid, prio) && errno != ESRCH) { - ALOGW("Unable to raise priority of killing t_pid (%d): errno=%d", t_pid, errno); - } - } - closedir(d); -} - bool Reaper::async_kill(const struct target_proc& target) { if (target.pidfd == -1) { return false; @@ -210,10 +183,6 @@ bool Reaper::async_kill(const struct target_proc& target) { cond_.notify_one(); mutex_.unlock(); - set_process_group_and_prio(target.uid, target.pid, - {"CPUSET_SP_FOREGROUND", "SCHED_SP_FOREGROUND"}, - ANDROID_PRIORITY_HIGHEST); - return true; }