Loading lmkd/event.logtags +4 −4 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,8 @@ # Multiple values are separated by commas. # Multiple values are separated by commas. # # # The data type is a number from the following values: # The data type is a number from the following values: # 1: int # 1: int32_t # 2: long # 2: int64_t # 3: string # 3: string # 4: list # 4: list # # Loading @@ -34,5 +34,5 @@ # # # TODO: generate ".java" and ".h" files with integer constants from this file. # TODO: generate ".java" and ".h" files with integer constants from this file. # for meminfo logs # for killinfo logs 10195355 meminfo (MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapTotal|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(ION_heap|1),(ION_heap_pool|1),(CmaFree|1) 10195355 killinfo (Pid|1|5),(Uid|1|5),(OomAdj|1),(MinOomAdj|1),(TaskSize|1),(enum kill_reasons|1|5),(MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapTotal|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(IonHeap|1),(IonHeapPool|1),(CmaFree|1) lmkd/lmkd.c +27 −17 Original line number Original line Diff line number Diff line Loading @@ -84,7 +84,7 @@ #define PERCEPTIBLE_APP_ADJ 200 #define PERCEPTIBLE_APP_ADJ 200 /* Android Logger event logtags (see event.logtags) */ /* Android Logger event logtags (see event.logtags) */ #define MEMINFO_LOG_TAG 10195355 #define KILLINFO_LOG_TAG 10195355 /* gid containing AID_SYSTEM required */ /* gid containing AID_SYSTEM required */ #define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" #define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" Loading Loading @@ -1566,7 +1566,17 @@ static int vmstat_parse(union vmstat *vs) { return 0; return 0; } } static void meminfo_log(union meminfo *mi) { static void killinfo_log(struct proc* procp, int min_oom_score, int tasksize, int kill_reason, union meminfo *mi) { /* log process information */ android_log_write_int32(ctx, procp->pid); android_log_write_int32(ctx, procp->uid); android_log_write_int32(ctx, procp->oomadj); android_log_write_int32(ctx, min_oom_score); android_log_write_int32(ctx, (int32_t)min(tasksize * page_k, INT32_MAX)); android_log_write_int32(ctx, kill_reason); /* log meminfo fields */ for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) { for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) { android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX)); android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX)); } } Loading Loading @@ -1640,7 +1650,8 @@ static void set_process_group_and_prio(int pid, SchedPolicy sp, int prio) { static int last_killed_pid = -1; static int last_killed_pid = -1; /* Kill one process specified by procp. Returns the size of the process killed */ /* Kill one process specified by procp. Returns the size of the process killed */ static int kill_one_process(struct proc* procp, int min_oom_score, const char *reason) { static int kill_one_process(struct proc* procp, int min_oom_score, int kill_reason, const char *kill_desc, union meminfo *mi) { int pid = procp->pid; int pid = procp->pid; uid_t uid = procp->uid; uid_t uid = procp->uid; int tgid; int tgid; Loading Loading @@ -1684,9 +1695,12 @@ static int kill_one_process(struct proc* procp, int min_oom_score, const char *r set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST); set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST); inc_killcnt(procp->oomadj); inc_killcnt(procp->oomadj); if (reason) { killinfo_log(procp, min_oom_score, tasksize, kill_reason, mi); if (kill_desc) { ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB; reason: %s", taskname, pid, ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB; reason: %s", taskname, pid, uid, procp->oomadj, tasksize * page_k, reason); uid, procp->oomadj, tasksize * page_k, kill_desc); } else { } else { ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB", taskname, pid, ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB", taskname, pid, uid, procp->oomadj, tasksize * page_k); uid, procp->oomadj, tasksize * page_k); Loading @@ -1712,7 +1726,8 @@ out: * Find one process to kill at or above the given oom_adj level. * Find one process to kill at or above the given oom_adj level. * Returns size of the killed process. * Returns size of the killed process. */ */ static int find_and_kill_process(int min_score_adj, const char *reason) { static int find_and_kill_process(int min_score_adj, int kill_reason, const char *kill_desc, union meminfo *mi) { int i; int i; int killed_size = 0; int killed_size = 0; bool lmk_state_change_start = false; bool lmk_state_change_start = false; Loading @@ -1727,7 +1742,7 @@ static int find_and_kill_process(int min_score_adj, const char *reason) { if (!procp) if (!procp) break; break; killed_size = kill_one_process(procp, min_score_adj, reason); killed_size = kill_one_process(procp, min_score_adj, kill_reason, kill_desc, mi); if (killed_size >= 0) { if (killed_size >= 0) { if (!lmk_state_change_start) { if (!lmk_state_change_start) { lmk_state_change_start = true; lmk_state_change_start = true; Loading Loading @@ -2051,7 +2066,7 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ /* Kill a process if necessary */ /* Kill a process if necessary */ if (kill_reason != NONE) { if (kill_reason != NONE) { int pages_freed = find_and_kill_process(min_score_adj, kill_desc); int pages_freed = find_and_kill_process(min_score_adj, kill_reason, kill_desc, &mi); if (pages_freed > 0) { if (pages_freed > 0) { killing = true; killing = true; if (cut_thrashing_limit) { if (cut_thrashing_limit) { Loading @@ -2062,7 +2077,6 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100; thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100; } } } } meminfo_log(&mi); } } no_kill: no_kill: Loading Loading @@ -2251,12 +2265,10 @@ static void mp_event_common(int data, uint32_t events, struct polling_params *po do_kill: do_kill: if (low_ram_device) { if (low_ram_device) { /* For Go devices kill only one task */ /* For Go devices kill only one task */ if (find_and_kill_process(level_oomadj[level], NULL) == 0) { if (find_and_kill_process(level_oomadj[level], -1, NULL, &mi) == 0) { if (debug_process_killing) { if (debug_process_killing) { ALOGI("Nothing to kill"); ALOGI("Nothing to kill"); } } } else { meminfo_log(&mi); } } } else { } else { int pages_freed; int pages_freed; Loading @@ -2276,7 +2288,7 @@ do_kill: min_score_adj = level_oomadj[level]; min_score_adj = level_oomadj[level]; } } pages_freed = find_and_kill_process(min_score_adj, NULL); pages_freed = find_and_kill_process(min_score_adj, -1, NULL, &mi); if (pages_freed == 0) { if (pages_freed == 0) { /* Rate limit kill reports when nothing was reclaimed */ /* Rate limit kill reports when nothing was reclaimed */ Loading @@ -2289,9 +2301,7 @@ do_kill: last_kill_tm = curr_tm; last_kill_tm = curr_tm; } } /* Log meminfo whenever we kill or when report rate limit allows */ /* Log whenever we kill or when report rate limit allows */ meminfo_log(&mi); if (use_minfree_levels) { if (use_minfree_levels) { ALOGI("Reclaimed %ldkB, cache(%ldkB) and " ALOGI("Reclaimed %ldkB, cache(%ldkB) and " "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", Loading Loading @@ -2714,7 +2724,7 @@ int main(int argc __unused, char **argv __unused) { thrashing_limit_decay_pct = clamp(0, 100, property_get_int32("ro.lmk.thrashing_limit_decay", thrashing_limit_decay_pct = clamp(0, 100, property_get_int32("ro.lmk.thrashing_limit_decay", low_ram_device ? DEF_THRASHING_DECAY_LOWRAM : DEF_THRASHING_DECAY)); low_ram_device ? DEF_THRASHING_DECAY_LOWRAM : DEF_THRASHING_DECAY)); ctx = create_android_logger(MEMINFO_LOG_TAG); ctx = create_android_logger(KILLINFO_LOG_TAG); statslog_init(); statslog_init(); Loading Loading
lmkd/event.logtags +4 −4 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,8 @@ # Multiple values are separated by commas. # Multiple values are separated by commas. # # # The data type is a number from the following values: # The data type is a number from the following values: # 1: int # 1: int32_t # 2: long # 2: int64_t # 3: string # 3: string # 4: list # 4: list # # Loading @@ -34,5 +34,5 @@ # # # TODO: generate ".java" and ".h" files with integer constants from this file. # TODO: generate ".java" and ".h" files with integer constants from this file. # for meminfo logs # for killinfo logs 10195355 meminfo (MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapTotal|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(ION_heap|1),(ION_heap_pool|1),(CmaFree|1) 10195355 killinfo (Pid|1|5),(Uid|1|5),(OomAdj|1),(MinOomAdj|1),(TaskSize|1),(enum kill_reasons|1|5),(MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapTotal|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(IonHeap|1),(IonHeapPool|1),(CmaFree|1)
lmkd/lmkd.c +27 −17 Original line number Original line Diff line number Diff line Loading @@ -84,7 +84,7 @@ #define PERCEPTIBLE_APP_ADJ 200 #define PERCEPTIBLE_APP_ADJ 200 /* Android Logger event logtags (see event.logtags) */ /* Android Logger event logtags (see event.logtags) */ #define MEMINFO_LOG_TAG 10195355 #define KILLINFO_LOG_TAG 10195355 /* gid containing AID_SYSTEM required */ /* gid containing AID_SYSTEM required */ #define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" #define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" Loading Loading @@ -1566,7 +1566,17 @@ static int vmstat_parse(union vmstat *vs) { return 0; return 0; } } static void meminfo_log(union meminfo *mi) { static void killinfo_log(struct proc* procp, int min_oom_score, int tasksize, int kill_reason, union meminfo *mi) { /* log process information */ android_log_write_int32(ctx, procp->pid); android_log_write_int32(ctx, procp->uid); android_log_write_int32(ctx, procp->oomadj); android_log_write_int32(ctx, min_oom_score); android_log_write_int32(ctx, (int32_t)min(tasksize * page_k, INT32_MAX)); android_log_write_int32(ctx, kill_reason); /* log meminfo fields */ for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) { for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) { android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX)); android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX)); } } Loading Loading @@ -1640,7 +1650,8 @@ static void set_process_group_and_prio(int pid, SchedPolicy sp, int prio) { static int last_killed_pid = -1; static int last_killed_pid = -1; /* Kill one process specified by procp. Returns the size of the process killed */ /* Kill one process specified by procp. Returns the size of the process killed */ static int kill_one_process(struct proc* procp, int min_oom_score, const char *reason) { static int kill_one_process(struct proc* procp, int min_oom_score, int kill_reason, const char *kill_desc, union meminfo *mi) { int pid = procp->pid; int pid = procp->pid; uid_t uid = procp->uid; uid_t uid = procp->uid; int tgid; int tgid; Loading Loading @@ -1684,9 +1695,12 @@ static int kill_one_process(struct proc* procp, int min_oom_score, const char *r set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST); set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST); inc_killcnt(procp->oomadj); inc_killcnt(procp->oomadj); if (reason) { killinfo_log(procp, min_oom_score, tasksize, kill_reason, mi); if (kill_desc) { ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB; reason: %s", taskname, pid, ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB; reason: %s", taskname, pid, uid, procp->oomadj, tasksize * page_k, reason); uid, procp->oomadj, tasksize * page_k, kill_desc); } else { } else { ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB", taskname, pid, ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB", taskname, pid, uid, procp->oomadj, tasksize * page_k); uid, procp->oomadj, tasksize * page_k); Loading @@ -1712,7 +1726,8 @@ out: * Find one process to kill at or above the given oom_adj level. * Find one process to kill at or above the given oom_adj level. * Returns size of the killed process. * Returns size of the killed process. */ */ static int find_and_kill_process(int min_score_adj, const char *reason) { static int find_and_kill_process(int min_score_adj, int kill_reason, const char *kill_desc, union meminfo *mi) { int i; int i; int killed_size = 0; int killed_size = 0; bool lmk_state_change_start = false; bool lmk_state_change_start = false; Loading @@ -1727,7 +1742,7 @@ static int find_and_kill_process(int min_score_adj, const char *reason) { if (!procp) if (!procp) break; break; killed_size = kill_one_process(procp, min_score_adj, reason); killed_size = kill_one_process(procp, min_score_adj, kill_reason, kill_desc, mi); if (killed_size >= 0) { if (killed_size >= 0) { if (!lmk_state_change_start) { if (!lmk_state_change_start) { lmk_state_change_start = true; lmk_state_change_start = true; Loading Loading @@ -2051,7 +2066,7 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ /* Kill a process if necessary */ /* Kill a process if necessary */ if (kill_reason != NONE) { if (kill_reason != NONE) { int pages_freed = find_and_kill_process(min_score_adj, kill_desc); int pages_freed = find_and_kill_process(min_score_adj, kill_reason, kill_desc, &mi); if (pages_freed > 0) { if (pages_freed > 0) { killing = true; killing = true; if (cut_thrashing_limit) { if (cut_thrashing_limit) { Loading @@ -2062,7 +2077,6 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100; thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100; } } } } meminfo_log(&mi); } } no_kill: no_kill: Loading Loading @@ -2251,12 +2265,10 @@ static void mp_event_common(int data, uint32_t events, struct polling_params *po do_kill: do_kill: if (low_ram_device) { if (low_ram_device) { /* For Go devices kill only one task */ /* For Go devices kill only one task */ if (find_and_kill_process(level_oomadj[level], NULL) == 0) { if (find_and_kill_process(level_oomadj[level], -1, NULL, &mi) == 0) { if (debug_process_killing) { if (debug_process_killing) { ALOGI("Nothing to kill"); ALOGI("Nothing to kill"); } } } else { meminfo_log(&mi); } } } else { } else { int pages_freed; int pages_freed; Loading @@ -2276,7 +2288,7 @@ do_kill: min_score_adj = level_oomadj[level]; min_score_adj = level_oomadj[level]; } } pages_freed = find_and_kill_process(min_score_adj, NULL); pages_freed = find_and_kill_process(min_score_adj, -1, NULL, &mi); if (pages_freed == 0) { if (pages_freed == 0) { /* Rate limit kill reports when nothing was reclaimed */ /* Rate limit kill reports when nothing was reclaimed */ Loading @@ -2289,9 +2301,7 @@ do_kill: last_kill_tm = curr_tm; last_kill_tm = curr_tm; } } /* Log meminfo whenever we kill or when report rate limit allows */ /* Log whenever we kill or when report rate limit allows */ meminfo_log(&mi); if (use_minfree_levels) { if (use_minfree_levels) { ALOGI("Reclaimed %ldkB, cache(%ldkB) and " ALOGI("Reclaimed %ldkB, cache(%ldkB) and " "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", Loading Loading @@ -2714,7 +2724,7 @@ int main(int argc __unused, char **argv __unused) { thrashing_limit_decay_pct = clamp(0, 100, property_get_int32("ro.lmk.thrashing_limit_decay", thrashing_limit_decay_pct = clamp(0, 100, property_get_int32("ro.lmk.thrashing_limit_decay", low_ram_device ? DEF_THRASHING_DECAY_LOWRAM : DEF_THRASHING_DECAY)); low_ram_device ? DEF_THRASHING_DECAY_LOWRAM : DEF_THRASHING_DECAY)); ctx = create_android_logger(MEMINFO_LOG_TAG); ctx = create_android_logger(KILLINFO_LOG_TAG); statslog_init(); statslog_init(); Loading