Merge "lmkd: retune rate at which processes are killed" am: d5eaeffcf3

am: 4d8a9caf30

Change-Id: Iba588d2de887372874bacb1f0a6dc829c0c021c7
This commit is contained in:
Suren Baghdasaryan 2018-10-29 13:44:01 -07:00 committed by android-build-merger
commit ea13ea4669

View file

@ -1223,6 +1223,8 @@ static struct proc *proc_get_heaviest(int oomadj) {
return maxprocp;
}
static int last_killed_pid = -1;
/* Kill one process specified by procp. Returns the size of the process killed */
static int kill_one_process(struct proc* procp) {
int pid = procp->pid;
@ -1263,6 +1265,8 @@ static int kill_one_process(struct proc* procp) {
TRACE_KILL_END();
last_killed_pid = pid;
if (r) {
ALOGE("kill(%d): errno=%d", pid, errno);
goto out;
@ -1401,6 +1405,23 @@ enum vmpressure_level downgrade_level(enum vmpressure_level level) {
level - 1 : level);
}
static bool is_kill_pending(void) {
char buf[24];
if (last_killed_pid < 0) {
return false;
}
snprintf(buf, sizeof(buf), "/proc/%d/", last_killed_pid);
if (access(buf, F_OK) == 0) {
return true;
}
// reset last killed PID because there's nothing pending
last_killed_pid = -1;
return false;
}
static void mp_event_common(int data, uint32_t events __unused) {
int ret;
unsigned long long evcount;
@ -1446,7 +1467,11 @@ static void mp_event_common(int data, uint32_t events __unused) {
}
if (kill_timeout_ms) {
if (get_time_diff_ms(&last_kill_tm, &curr_tm) < kill_timeout_ms) {
// If we're within the timeout, see if there's pending reclaim work
// from the last killed process. If there is (as evidenced by
// /proc/<pid> continuing to exist), skip killing for now.
if ((get_time_diff_ms(&last_kill_tm, &curr_tm) < kill_timeout_ms) &&
(low_ram_device || is_kill_pending())) {
kill_skip_count++;
return;
}
@ -1589,7 +1614,7 @@ do_kill:
min_score_adj = level_oomadj[level];
}
pages_freed = find_and_kill_processes(min_score_adj, pages_to_free);
pages_freed = find_and_kill_processes(min_score_adj, 0);
if (pages_freed == 0) {
/* Rate limit kill reports when nothing was reclaimed */
@ -1597,14 +1622,13 @@ do_kill:
report_skip_count++;
return;
}
} else {
/* If we killed anything, update the last killed timestamp. */
last_kill_tm = curr_tm;
}
/* Log meminfo whenever we kill or when report rate limit allows */
meminfo_log(&mi);
if (pages_freed >= pages_to_free) {
/* Reset kill time only if reclaimed enough memory */
last_kill_tm = curr_tm;
}
if (use_minfree_levels) {
ALOGI("Killing to reclaim %ldkB, reclaimed %ldkB, cache(%ldkB) and "