Revert "Revert "lmkd: set priority of the kill target from the reaper thread""

This reverts commit c5e4185a02.

Bug: 238495258
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Change-Id: Ib4665d3df62f58e36686ca134f9ae07836fd6945
This commit is contained in:
Suren Baghdasaryan 2022-10-22 01:05:35 +00:00
parent 0cb4aae3e6
commit 779a550826
1 changed files with 41 additions and 8 deletions

View File

@ -53,6 +53,41 @@ static inline long get_time_diff_ms(struct timespec *from,
(to->tv_nsec - from->tv_nsec) / (long)NS_PER_MS;
}
static void set_process_group_and_prio(uid_t uid, int pid, const std::vector<std::string>& 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);
}
static void* reaper_main(void* param) {
Reaper *reaper = static_cast<Reaper*>(param);
struct timespec start_tm, end_tm;
@ -80,8 +115,13 @@ static void* reaper_main(void* param) {
reaper->notify_kill_failure(target.pid);
goto done;
}
set_process_group_and_prio(target.uid, target.pid,
{"CPUSET_SP_FOREGROUND", "SCHED_SP_FOREGROUND"},
ANDROID_PRIORITY_NORMAL);
if (process_mrelease(target.pidfd, 0)) {
ALOGE("process_mrelease %d failed: %s", target.pidfd, strerror(errno));
ALOGE("process_mrelease %d failed: %s", target.pid, strerror(errno));
goto done;
}
if (reaper->debug_enabled()) {
@ -90,13 +130,6 @@ static void* reaper_main(void* param) {
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();