Merge "Improvements to lmkd" into oc-mr1-dev
diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c
index 27cc91b..02a9601 100644
--- a/lmkd/lmkd.c
+++ b/lmkd/lmkd.c
@@ -75,6 +75,7 @@
static int medium_oomadj;
static int critical_oomadj;
+static int debug_process_killing;
/* control socket listen and data */
static int ctrl_lfd;
@@ -262,7 +263,9 @@
} else if (oomadj >= 700) {
soft_limit_mult = 0;
} else if (oomadj >= 600) {
- soft_limit_mult = 0;
+ // Launcher should be perceptible, don't kill it.
+ oomadj = 200;
+ soft_limit_mult = 1;
} else if (oomadj >= 500) {
soft_limit_mult = 0;
} else if (oomadj >= 400) {
@@ -576,9 +579,7 @@
}
/* Kill one process specified by procp. Returns the size of the process killed */
-static int kill_one_process(struct proc *procp, int other_free, int other_file,
- int minfree, int min_score_adj, bool first)
-{
+static int kill_one_process(struct proc* procp, int min_score_adj, bool is_critical) {
int pid = procp->pid;
uid_t uid = procp->uid;
char *taskname;
@@ -597,12 +598,11 @@
return -1;
}
- ALOGI("Killing '%s' (%d), uid %d, adj %d\n"
- " to free %ldkB because cache %s%ldkB is below limit %ldkB for oom_adj %d\n"
- " Free memory is %s%ldkB %s reserved",
- taskname, pid, uid, procp->oomadj, tasksize * page_k,
- first ? "" : "~", other_file * page_k, minfree * page_k, min_score_adj,
- first ? "" : "~", other_free * page_k, other_free >= 0 ? "above" : "below");
+ ALOGI(
+ "Killing '%s' (%d), uid %d, adj %d\n"
+ " to free %ldkB because system is under %s memory pressure oom_adj %d\n",
+ taskname, pid, uid, procp->oomadj, tasksize * page_k, is_critical ? "critical" : "medium",
+ min_score_adj);
r = kill(pid, SIGKILL);
pid_remove(pid);
@@ -618,10 +618,8 @@
* Find a process to kill based on the current (possibly estimated) free memory
* and cached memory sizes. Returns the size of the killed processes.
*/
-static int find_and_kill_process(int other_free, int other_file, bool first, int min_score_adj)
-{
+static int find_and_kill_process(int min_score_adj, bool is_critical) {
int i;
- int minfree = 0;
int killed_size = 0;
for (i = OOM_SCORE_ADJ_MAX; i >= min_score_adj; i--) {
@@ -631,7 +629,7 @@
procp = proc_adj_lru(i);
if (procp) {
- killed_size = kill_one_process(procp, other_free, other_file, minfree, min_score_adj, first);
+ killed_size = kill_one_process(procp, min_score_adj, is_critical);
if (killed_size < 0) {
goto retry;
} else {
@@ -646,7 +644,6 @@
static void mp_event_common(bool is_critical) {
int ret;
unsigned long long evcount;
- bool first = true;
int min_adj_score = is_critical ? critical_oomadj : medium_oomadj;
int index = is_critical ? CRITICAL_INDEX : MEDIUM_INDEX;
@@ -655,8 +652,10 @@
ALOGE("Error reading memory pressure event fd; errno=%d",
errno);
- if (find_and_kill_process(0, 0, first, min_adj_score) == 0) {
- ALOGI("Nothing to kill");
+ if (find_and_kill_process(min_adj_score, is_critical) == 0) {
+ if (debug_process_killing) {
+ ALOGI("Nothing to kill");
+ }
}
}
@@ -665,7 +664,6 @@
}
static void mp_event_critical(uint32_t events __unused) {
- ALOGI("Memory pressure critical");
mp_event_common(true);
}
@@ -828,6 +826,7 @@
medium_oomadj = property_get_int32("ro.lmk.medium", 800);
critical_oomadj = property_get_int32("ro.lmk.critical", 0);
+ debug_process_killing = property_get_bool("ro.lmk.debug", false);
mlockall(MCL_FUTURE);
sched_setscheduler(0, SCHED_FIFO, ¶m);