diff options
author | Vic Yang <victoryang@google.com> | 2018-08-07 10:18:22 -0700 |
---|---|---|
committer | Vic Yang <victoryang@google.com> | 2018-08-08 10:00:06 -0700 |
commit | 360a113e9ba1f30a5cabd9a2bec3be2f36774211 (patch) | |
tree | 8d98a260f4be59871e92cdae5fde68b6b8ba699c /lmkd/lmkd.c | |
parent | 5d707816ace0f2173310645363533fed2188acfd (diff) | |
download | system_core-360a113e9ba1f30a5cabd9a2bec3be2f36774211.tar.gz system_core-360a113e9ba1f30a5cabd9a2bec3be2f36774211.tar.bz2 system_core-360a113e9ba1f30a5cabd9a2bec3be2f36774211.zip |
lmkd: Do not downgrade/ignore events when swap is full
When the swap space is full, a pressure event is unlikely to resolve by
itself. In this case, do not downgrade or ignore the events.
Bug: 112056451
Test: Fill up swap on a 1GB device and check critical vmpressure events
are not downgraded.
Change-Id: If154dc364711bf7c86f32e24ddcd10be359386de
Diffstat (limited to 'lmkd/lmkd.c')
-rw-r--r-- | lmkd/lmkd.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index 8fda5636f..4fb9678af 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -116,6 +116,7 @@ static bool kill_heaviest_task; static unsigned long kill_timeout_ms; static bool use_minfree_levels; static bool per_app_memcg; +static int swap_free_low_percentage; /* data required to handle events */ struct event_handler_info { @@ -194,6 +195,7 @@ enum meminfo_field { MI_BUFFERS, MI_SHMEM, MI_UNEVICTABLE, + MI_TOTAL_SWAP, MI_FREE_SWAP, MI_DIRTY, MI_FIELD_COUNT @@ -206,6 +208,7 @@ static const char* const meminfo_field_names[MI_FIELD_COUNT] = { "Buffers:", "Shmem:", "Unevictable:", + "SwapTotal:", "SwapFree:", "Dirty:", }; @@ -218,6 +221,7 @@ union meminfo { int64_t buffers; int64_t shmem; int64_t unevictable; + int64_t total_swap; int64_t free_swap; int64_t dirty; /* fields below are calculated rather than read from the file */ @@ -1296,20 +1300,24 @@ static void mp_event_common(int data, uint32_t events __unused) { } } - // If the pressure is larger than downgrade_pressure lmk will not - // kill any process, since enough memory is available. - if (mem_pressure > downgrade_pressure) { - if (debug_process_killing) { - ALOGI("Ignore %s memory pressure", level_name[level]); - } - return; - } else if (level == VMPRESS_LEVEL_CRITICAL && - mem_pressure > upgrade_pressure) { - if (debug_process_killing) { - ALOGI("Downgrade critical memory pressure"); + // If we still have enough swap space available, check if we want to + // ignore/downgrade pressure events. + if (mi.field.free_swap >= + mi.field.total_swap * swap_free_low_percentage / 100) { + // If the pressure is larger than downgrade_pressure lmk will not + // kill any process, since enough memory is available. + if (mem_pressure > downgrade_pressure) { + if (debug_process_killing) { + ALOGI("Ignore %s memory pressure", level_name[level]); + } + return; + } else if (level == VMPRESS_LEVEL_CRITICAL && mem_pressure > upgrade_pressure) { + if (debug_process_killing) { + ALOGI("Downgrade critical memory pressure"); + } + // Downgrade event, since enough memory available. + level = downgrade_level(level); } - // Downgrade event, since enough memory available. - level = downgrade_level(level); } do_kill: @@ -1580,6 +1588,8 @@ int main(int argc __unused, char **argv __unused) { property_get_bool("ro.lmk.use_minfree_levels", false); per_app_memcg = property_get_bool("ro.config.per_app_memcg", low_ram_device); + swap_free_low_percentage = + property_get_int32("ro.lmk.swap_free_low_percentage", 10); #ifdef LMKD_LOG_STATS statslog_init(&log_ctx, &enable_stats_log); |