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

Commit 4d8a9caf 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

Change-Id: I5012c959668b9bf2f6ea055e6186be551bf5db20
parents bc3c6f67 d5eaeffc
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -1260,6 +1260,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;
@@ -1304,6 +1306,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;
@@ -1445,6 +1449,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;
@@ -1490,7 +1511,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;
        }
@@ -1633,7 +1658,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 */
@@ -1641,14 +1666,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 "