Loading lmkd/lmkd.c +30 −49 Original line number Diff line number Diff line Loading @@ -95,14 +95,9 @@ static const char *level_name[] = { "critical" }; struct mem_size { int free_mem; int free_swap; }; struct { int min_free; /* recorded but not used yet */ int max_free; int64_t min_nr_free_pages; /* recorded but not used yet */ int64_t max_nr_free_pages; } low_pressure_mem = { -1, -1 }; static int level_oomadj[VMPRESS_LEVEL_COUNT]; Loading Loading @@ -230,13 +225,6 @@ enum field_match_result { PARSE_SUCCESS }; struct sysmeminfo { int nr_free_pages; int nr_file_pages; int nr_shmem; int totalreserve_pages; }; struct adjslot_list { struct adjslot_list *next; struct adjslot_list *prev; Loading Loading @@ -862,18 +850,6 @@ static int meminfo_parse(union meminfo *mi) { return 0; } static int get_free_memory(struct mem_size *ms) { struct sysinfo si; if (sysinfo(&si) < 0) return -1; ms->free_mem = (int)(si.freeram * si.mem_unit / PAGE_SIZE); ms->free_swap = (int)(si.freeswap * si.mem_unit / PAGE_SIZE); return 0; } static int proc_get_size(int pid) { char path[PATH_MAX]; char line[LINE_MAX]; Loading Loading @@ -1045,29 +1021,30 @@ static int64_t get_memory_usage(struct reread_data *file_data) { return mem_usage; } void record_low_pressure_levels(struct mem_size *free_mem) { if (low_pressure_mem.min_free == -1 || low_pressure_mem.min_free > free_mem->free_mem) { void record_low_pressure_levels(union meminfo *mi) { if (low_pressure_mem.min_nr_free_pages == -1 || low_pressure_mem.min_nr_free_pages > mi->field.nr_free_pages) { if (debug_process_killing) { ALOGI("Low pressure min memory update from %d to %d", low_pressure_mem.min_free, free_mem->free_mem); ALOGI("Low pressure min memory update from %" PRId64 " to %" PRId64, low_pressure_mem.min_nr_free_pages, mi->field.nr_free_pages); } low_pressure_mem.min_free = free_mem->free_mem; low_pressure_mem.min_nr_free_pages = mi->field.nr_free_pages; } /* * Free memory at low vmpressure events occasionally gets spikes, * possibly a stale low vmpressure event with memory already * freed up (no memory pressure should have been reported). * Ignore large jumps in max_free that would mess up our stats. * Ignore large jumps in max_nr_free_pages that would mess up our stats. */ if (low_pressure_mem.max_free == -1 || (low_pressure_mem.max_free < free_mem->free_mem && free_mem->free_mem - low_pressure_mem.max_free < low_pressure_mem.max_free * 0.1)) { if (low_pressure_mem.max_nr_free_pages == -1 || (low_pressure_mem.max_nr_free_pages < mi->field.nr_free_pages && mi->field.nr_free_pages - low_pressure_mem.max_nr_free_pages < low_pressure_mem.max_nr_free_pages * 0.1)) { if (debug_process_killing) { ALOGI("Low pressure max memory update from %d to %d", low_pressure_mem.max_free, free_mem->free_mem); ALOGI("Low pressure max memory update from %" PRId64 " to %" PRId64, low_pressure_mem.max_nr_free_pages, mi->field.nr_free_pages); } low_pressure_mem.max_free = free_mem->free_mem; low_pressure_mem.max_nr_free_pages = mi->field.nr_free_pages; } } Loading @@ -1093,7 +1070,7 @@ static void mp_event_common(int data, uint32_t events __unused) { int64_t mem_usage, memsw_usage; int64_t mem_pressure; enum vmpressure_level lvl; struct mem_size free_mem; union meminfo mi; static struct timeval last_report_tm; static unsigned long skip_count = 0; enum vmpressure_level level = (enum vmpressure_level)data; Loading Loading @@ -1137,15 +1114,15 @@ static void mp_event_common(int data, uint32_t events __unused) { skip_count = 0; } if (get_free_memory(&free_mem) == 0) { if (level == VMPRESS_LEVEL_LOW) { record_low_pressure_levels(&free_mem); } } else { if (meminfo_parse(&mi) < 0) { ALOGE("Failed to get free memory!"); return; } if (level == VMPRESS_LEVEL_LOW) { record_low_pressure_levels(&mi); } if (level_oomadj[level] > OOM_SCORE_ADJ_MAX) { /* Do not monitor this pressure level */ return; Loading Loading @@ -1197,16 +1174,20 @@ do_kill: } } else { /* If pressure level is less than critical and enough free swap then ignore */ if (level < VMPRESS_LEVEL_CRITICAL && free_mem.free_swap > low_pressure_mem.max_free) { if (level < VMPRESS_LEVEL_CRITICAL && mi.field.free_swap > low_pressure_mem.max_nr_free_pages) { if (debug_process_killing) { ALOGI("Ignoring pressure since %d swap pages are available ", free_mem.free_swap); ALOGI("Ignoring pressure since %" PRId64 " swap pages are available ", mi.field.free_swap); } return; } /* Free up enough memory to downgrate the memory pressure to low level */ if (free_mem.free_mem < low_pressure_mem.max_free) { int pages_to_free = low_pressure_mem.max_free - free_mem.free_mem; if (mi.field.nr_free_pages < low_pressure_mem.max_nr_free_pages) { int pages_to_free = low_pressure_mem.max_nr_free_pages - mi.field.nr_free_pages; if (debug_process_killing) { ALOGI("Trying to free %d pages", pages_to_free); } Loading Loading
lmkd/lmkd.c +30 −49 Original line number Diff line number Diff line Loading @@ -95,14 +95,9 @@ static const char *level_name[] = { "critical" }; struct mem_size { int free_mem; int free_swap; }; struct { int min_free; /* recorded but not used yet */ int max_free; int64_t min_nr_free_pages; /* recorded but not used yet */ int64_t max_nr_free_pages; } low_pressure_mem = { -1, -1 }; static int level_oomadj[VMPRESS_LEVEL_COUNT]; Loading Loading @@ -230,13 +225,6 @@ enum field_match_result { PARSE_SUCCESS }; struct sysmeminfo { int nr_free_pages; int nr_file_pages; int nr_shmem; int totalreserve_pages; }; struct adjslot_list { struct adjslot_list *next; struct adjslot_list *prev; Loading Loading @@ -862,18 +850,6 @@ static int meminfo_parse(union meminfo *mi) { return 0; } static int get_free_memory(struct mem_size *ms) { struct sysinfo si; if (sysinfo(&si) < 0) return -1; ms->free_mem = (int)(si.freeram * si.mem_unit / PAGE_SIZE); ms->free_swap = (int)(si.freeswap * si.mem_unit / PAGE_SIZE); return 0; } static int proc_get_size(int pid) { char path[PATH_MAX]; char line[LINE_MAX]; Loading Loading @@ -1045,29 +1021,30 @@ static int64_t get_memory_usage(struct reread_data *file_data) { return mem_usage; } void record_low_pressure_levels(struct mem_size *free_mem) { if (low_pressure_mem.min_free == -1 || low_pressure_mem.min_free > free_mem->free_mem) { void record_low_pressure_levels(union meminfo *mi) { if (low_pressure_mem.min_nr_free_pages == -1 || low_pressure_mem.min_nr_free_pages > mi->field.nr_free_pages) { if (debug_process_killing) { ALOGI("Low pressure min memory update from %d to %d", low_pressure_mem.min_free, free_mem->free_mem); ALOGI("Low pressure min memory update from %" PRId64 " to %" PRId64, low_pressure_mem.min_nr_free_pages, mi->field.nr_free_pages); } low_pressure_mem.min_free = free_mem->free_mem; low_pressure_mem.min_nr_free_pages = mi->field.nr_free_pages; } /* * Free memory at low vmpressure events occasionally gets spikes, * possibly a stale low vmpressure event with memory already * freed up (no memory pressure should have been reported). * Ignore large jumps in max_free that would mess up our stats. * Ignore large jumps in max_nr_free_pages that would mess up our stats. */ if (low_pressure_mem.max_free == -1 || (low_pressure_mem.max_free < free_mem->free_mem && free_mem->free_mem - low_pressure_mem.max_free < low_pressure_mem.max_free * 0.1)) { if (low_pressure_mem.max_nr_free_pages == -1 || (low_pressure_mem.max_nr_free_pages < mi->field.nr_free_pages && mi->field.nr_free_pages - low_pressure_mem.max_nr_free_pages < low_pressure_mem.max_nr_free_pages * 0.1)) { if (debug_process_killing) { ALOGI("Low pressure max memory update from %d to %d", low_pressure_mem.max_free, free_mem->free_mem); ALOGI("Low pressure max memory update from %" PRId64 " to %" PRId64, low_pressure_mem.max_nr_free_pages, mi->field.nr_free_pages); } low_pressure_mem.max_free = free_mem->free_mem; low_pressure_mem.max_nr_free_pages = mi->field.nr_free_pages; } } Loading @@ -1093,7 +1070,7 @@ static void mp_event_common(int data, uint32_t events __unused) { int64_t mem_usage, memsw_usage; int64_t mem_pressure; enum vmpressure_level lvl; struct mem_size free_mem; union meminfo mi; static struct timeval last_report_tm; static unsigned long skip_count = 0; enum vmpressure_level level = (enum vmpressure_level)data; Loading Loading @@ -1137,15 +1114,15 @@ static void mp_event_common(int data, uint32_t events __unused) { skip_count = 0; } if (get_free_memory(&free_mem) == 0) { if (level == VMPRESS_LEVEL_LOW) { record_low_pressure_levels(&free_mem); } } else { if (meminfo_parse(&mi) < 0) { ALOGE("Failed to get free memory!"); return; } if (level == VMPRESS_LEVEL_LOW) { record_low_pressure_levels(&mi); } if (level_oomadj[level] > OOM_SCORE_ADJ_MAX) { /* Do not monitor this pressure level */ return; Loading Loading @@ -1197,16 +1174,20 @@ do_kill: } } else { /* If pressure level is less than critical and enough free swap then ignore */ if (level < VMPRESS_LEVEL_CRITICAL && free_mem.free_swap > low_pressure_mem.max_free) { if (level < VMPRESS_LEVEL_CRITICAL && mi.field.free_swap > low_pressure_mem.max_nr_free_pages) { if (debug_process_killing) { ALOGI("Ignoring pressure since %d swap pages are available ", free_mem.free_swap); ALOGI("Ignoring pressure since %" PRId64 " swap pages are available ", mi.field.free_swap); } return; } /* Free up enough memory to downgrate the memory pressure to low level */ if (free_mem.free_mem < low_pressure_mem.max_free) { int pages_to_free = low_pressure_mem.max_free - free_mem.free_mem; if (mi.field.nr_free_pages < low_pressure_mem.max_nr_free_pages) { int pages_to_free = low_pressure_mem.max_nr_free_pages - mi.field.nr_free_pages; if (debug_process_killing) { ALOGI("Trying to free %d pages", pages_to_free); } Loading