Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 360a113e authored by Vic Yang's avatar Vic Yang
Browse files

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
parent 5d707816
Loading
Loading
Loading
Loading
+23 −13
Original line number Diff line number Diff line
@@ -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,6 +1300,10 @@ static void mp_event_common(int data, uint32_t events __unused) {
        }
    }

    // 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) {
@@ -1303,14 +1311,14 @@ static void mp_event_common(int data, uint32_t events __unused) {
                ALOGI("Ignore %s memory pressure", level_name[level]);
            }
            return;
    } else if (level == VMPRESS_LEVEL_CRITICAL &&
               mem_pressure > upgrade_pressure) {
        } 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);
        }
    }

do_kill:
    if (low_ram_device) {
@@ -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);