diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index 769222257..c9c9e8e51 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -1335,14 +1335,12 @@ out: } /* - * Find processes to kill to free required number of pages. - * If pages_to_free is set to 0 only one process will be killed. - * Returns the size of the killed processes. + * Find one process to kill at or above the given oom_adj level. + * Returns size of the killed process. */ -static int find_and_kill_processes(int min_score_adj, int pages_to_free) { +static int find_and_kill_process(int min_score_adj) { int i; - int killed_size; - int pages_freed = 0; + int killed_size = 0; #ifdef LMKD_LOG_STATS bool lmk_state_change_start = false; @@ -1367,20 +1365,12 @@ static int find_and_kill_processes(int min_score_adj, int pages_to_free) { LMK_STATE_CHANGE_START); } #endif - - pages_freed += killed_size; - if (pages_freed >= pages_to_free) { - -#ifdef LMKD_LOG_STATS - if (enable_stats_log && lmk_state_change_start) { - stats_write_lmk_state_changed(log_ctx, LMK_STATE_CHANGED, - LMK_STATE_CHANGE_STOP); - } -#endif - return pages_freed; - } + break; } } + if (killed_size) { + break; + } } #ifdef LMKD_LOG_STATS @@ -1389,7 +1379,7 @@ static int find_and_kill_processes(int min_score_adj, int pages_to_free) { } #endif - return pages_freed; + return killed_size; } static int64_t get_memory_usage(struct reread_data *file_data) { @@ -1480,7 +1470,6 @@ static void mp_event_common(int data, uint32_t events __unused) { enum vmpressure_level level = (enum vmpressure_level)data; long other_free = 0, other_file = 0; int min_score_adj; - int pages_to_free = 0; int minfree = 0; static struct reread_data mem_usage_file_data = { .filename = MEMCG_MEMORY_USAGE, @@ -1562,9 +1551,6 @@ static void mp_event_common(int data, uint32_t events __unused) { return; } - /* Free up enough pages to push over the highest minfree level */ - pages_to_free = lowmem_minfree[lowmem_targets_size - 1] - - ((other_free < other_file) ? other_free : other_file); goto do_kill; } @@ -1620,7 +1606,7 @@ static void mp_event_common(int data, uint32_t events __unused) { do_kill: if (low_ram_device) { /* For Go devices kill only one task */ - if (find_and_kill_processes(level_oomadj[level], 0) == 0) { + if (find_and_kill_process(level_oomadj[level]) == 0) { if (debug_process_killing) { ALOGI("Nothing to kill"); } @@ -1644,10 +1630,7 @@ do_kill: return; } /* Free up enough memory to downgrate the memory pressure to low level */ - if (mi.field.nr_free_pages < low_pressure_mem.max_nr_free_pages) { - pages_to_free = low_pressure_mem.max_nr_free_pages - - mi.field.nr_free_pages; - } else { + if (mi.field.nr_free_pages >= low_pressure_mem.max_nr_free_pages) { if (debug_process_killing) { ALOGI("Ignoring pressure since more memory is " "available (%" PRId64 ") than watermark (%" PRId64 ")", @@ -1658,7 +1641,7 @@ do_kill: min_score_adj = level_oomadj[level]; } - pages_freed = find_and_kill_processes(min_score_adj, 0); + pages_freed = find_and_kill_process(min_score_adj); if (pages_freed == 0) { /* Rate limit kill reports when nothing was reclaimed */ @@ -1675,15 +1658,15 @@ do_kill: meminfo_log(&mi); if (use_minfree_levels) { - ALOGI("Killing to reclaim %ldkB, reclaimed %ldkB, cache(%ldkB) and " + ALOGI("Reclaimed %ldkB, cache(%ldkB) and " "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", - pages_to_free * page_k, pages_freed * page_k, + pages_freed * page_k, other_file * page_k, mi.field.nr_free_pages * page_k, zi.field.totalreserve_pages * page_k, minfree * page_k, min_score_adj); } else { - ALOGI("Killing to reclaim %ldkB, reclaimed %ldkB at oom_adj %d", - pages_to_free * page_k, pages_freed * page_k, min_score_adj); + ALOGI("Reclaimed %ldkB at oom_adj %d", + pages_freed * page_k, min_score_adj); } if (report_skip_count > 0) {