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

Commit fe26dfb3 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan
Browse files

lmkd: Do not set soft_limit_in_bytes on high-end devices



Setting memory.soft_limit_in_bytes on high-end devices with large memory
reserves affects performance of memory-hungry applications that have
large workingsets and keep thrashing because of the memory limits imposed.
Limit the usage of memory.soft_limit_in_bytes to low-memory devices only.
Add debug messages for future troubleshooting to capture cases when
vmpressure events are being ignored.

Bug: 78916015
Test: collect vmstat while running a heavy app
Change-Id: Ib4434b96d2be802ef89960b573486eae8d12f198
Merged-In: Ib4434b96d2be802ef89960b573486eae8d12f198
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
parent c5fbf494
Loading
Loading
Loading
Loading
+49 −39
Original line number Diff line number Diff line
@@ -472,6 +472,7 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) {
        return;
    }

    if (low_ram_device) {
        if (params.oomadj >= 900) {
            soft_limit_mult = 0;
        } else if (params.oomadj >= 800) {
@@ -500,7 +501,8 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) {
            soft_limit_mult = 64;
        }

    snprintf(path, sizeof(path), MEMCG_SYSFS_PATH "apps/uid_%d/pid_%d/memory.soft_limit_in_bytes",
        snprintf(path, sizeof(path), MEMCG_SYSFS_PATH
                 "apps/uid_%d/pid_%d/memory.soft_limit_in_bytes",
                 params.uid, params.pid);
        snprintf(val, sizeof(val), "%d", soft_limit_mult * EIGHT_MEGA);

@@ -512,6 +514,7 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) {
                            (pwdrec = getpwnam("system")) != NULL &&
                            params.uid == pwdrec->pw_uid);
        writefilestring(path, val, !is_system_server);
    }

    procp = pid_lookup(params.pid);
    if (!procp) {
@@ -1150,8 +1153,15 @@ static void mp_event_common(int data, uint32_t events __unused) {
            }
        }

        if (min_score_adj == OOM_SCORE_ADJ_MAX + 1)
        if (min_score_adj == OOM_SCORE_ADJ_MAX + 1) {
            if (debug_process_killing) {
                ALOGI("Ignore %s memory pressure event "
                      "(free memory=%ldkB, cache=%ldkB, limit=%ldkB)",
                      level_name[level], other_free * page_k, other_file * page_k,
                      (long)lowmem_minfree[lowmem_targets_size - 1] * page_k);
            }
            return;
        }

        /* Free up enough pages to push over the highest minfree level */
        pages_to_free = lowmem_minfree[lowmem_targets_size - 1] -