summaryrefslogtreecommitdiffstats
path: root/lmkd/lmkd.c
diff options
context:
space:
mode:
authorVic Yang <victoryang@google.com>2018-08-07 10:18:22 -0700
committerVic Yang <victoryang@google.com>2018-08-08 10:00:06 -0700
commit360a113e9ba1f30a5cabd9a2bec3be2f36774211 (patch)
tree8d98a260f4be59871e92cdae5fde68b6b8ba699c /lmkd/lmkd.c
parent5d707816ace0f2173310645363533fed2188acfd (diff)
downloadsystem_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.c36
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);