Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea13ea46 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan Committed by android-build-merger
Browse files

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

am: 4d8a9caf

Change-Id: Iba588d2de887372874bacb1f0a6dc829c0c021c7
parents 563409bb 4d8a9caf
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -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 "