summaryrefslogtreecommitdiffstats
path: root/lmkd
diff options
context:
space:
mode:
authorSuren Baghdasaryan <surenb@google.com>2018-04-16 20:44:46 -0700
committerandroid-build-merger <android-build-merger@google.com>2018-04-16 20:44:46 -0700
commit81999c34b4398b7e2ce3049ae1d44710ff366d74 (patch)
treedbc0964b8f3f7321697ece7863a6194bc94a6ccf /lmkd
parenta15a9c423d1335ff25e2a7ebbf76c0307e8649c6 (diff)
parent9926e57ee89a1d4de296ee1cb7113bdb215ef79d (diff)
downloadsystem_core-81999c34b4398b7e2ce3049ae1d44710ff366d74.tar.gz
system_core-81999c34b4398b7e2ce3049ae1d44710ff366d74.tar.bz2
system_core-81999c34b4398b7e2ce3049ae1d44710ff366d74.zip
lmkd: Switch to using /proc/meminfo to have access to file cache size
am: 9926e57ee8 Change-Id: Ie3f2773b2dc970ddea5b67632921eedfe87afd4d
Diffstat (limited to 'lmkd')
-rw-r--r--lmkd/lmkd.c79
1 files changed, 30 insertions, 49 deletions
diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c
index e27f675cc..7d5dad0d8 100644
--- a/lmkd/lmkd.c
+++ b/lmkd/lmkd.c
@@ -99,14 +99,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];
@@ -234,13 +229,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;
@@ -916,18 +904,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];
@@ -1138,29 +1114,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;
}
}
@@ -1186,7 +1163,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;
@@ -1230,15 +1207,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;
@@ -1290,16 +1267,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);
}