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

Commit 79f5407b authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5101444 from afb3a15f to pi-qpr2-release

Change-Id: I5a5f1437eab7c9919ded24651fef547a0a920677
parents fd7eafca afb3a15f
Loading
Loading
Loading
Loading
+29 −7
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@
#include <sys/eventfd.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <unistd.h>

#include <cutils/properties.h>
@@ -1029,6 +1029,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;
@@ -1072,6 +1074,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;
@@ -1219,6 +1223,22 @@ static inline unsigned long get_time_diff_ms(struct timeval *from,
           (to->tv_usec - from->tv_usec) / 1000;
}

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;
@@ -1260,7 +1280,11 @@ static void mp_event_common(int data, uint32_t events __unused) {

    gettimeofday(&curr_tm, NULL);
    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;
        }
@@ -1397,7 +1421,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 */
@@ -1405,10 +1429,8 @@ do_kill:
                report_skip_count++;
                return;
            }
        }

        if (pages_freed >= pages_to_free) {
            /* Reset kill time only if reclaimed enough memory */
        } else {
            /* If we killed anything, update the last killed timestamp. */
            last_kill_tm = curr_tm;
        }