Loading lmkd/lmkd.c +48 −11 Original line number Diff line number Diff line Loading @@ -844,17 +844,10 @@ static void memory_stat_parse_line(char *line, struct memory_stat *mem_st) { mem_st->swap_in_bytes = value; } static int memory_stat_parse(struct memory_stat *mem_st, int pid, uid_t uid) { static int memory_stat_from_cgroup(struct memory_stat* mem_st, int pid, uid_t uid) { FILE *fp; char buf[PATH_MAX]; /* * Per-application memory.stat files are available only when * per-application memcgs are enabled. */ if (!per_app_memcg) return -1; snprintf(buf, sizeof(buf), MEMCG_PROCESS_MEMORY_STAT_PATH, uid, pid); fp = fopen(buf, "r"); Loading @@ -871,6 +864,43 @@ static int memory_stat_parse(struct memory_stat *mem_st, int pid, uid_t uid) { return 0; } static int memory_stat_from_procfs(struct memory_stat* mem_st, int pid) { char path[PATH_MAX]; char buffer[PROC_STAT_BUFFER_SIZE]; int fd, ret; snprintf(path, sizeof(path), PROC_STAT_FILE_PATH, pid); if ((fd = open(path, O_RDONLY | O_CLOEXEC)) < 0) { ALOGE("%s open failed: %s", path, strerror(errno)); return -1; } ret = read(fd, buffer, sizeof(buffer)); if (ret < 0) { ALOGE("%s read failed: %s", path, strerror(errno)); close(fd); return -1; } close(fd); // field 10 is pgfault // field 12 is pgmajfault // field 24 is rss_in_pages int64_t pgfault = 0, pgmajfault = 0, rss_in_pages = 0; if (sscanf(buffer, "%*u %*s %*s %*d %*d %*d %*d %*d %*d %" SCNd64 " %*d " "%" SCNd64 " %*d %*u %*u %*d %*d %*d %*d %*d %*d " "%*d %*d %" SCNd64 "", &pgfault, &pgmajfault, &rss_in_pages) != 3) { return -1; } mem_st->pgfault = pgfault; mem_st->pgmajfault = pgmajfault; mem_st->rss_in_bytes = (rss_in_pages * PAGE_SIZE); return 0; } #endif /* /prop/zoneinfo parsing routines */ Loading Loading @@ -1125,7 +1155,11 @@ static int kill_one_process(struct proc* procp) { #ifdef LMKD_LOG_STATS if (enable_stats_log) { memory_stat_parse_result = memory_stat_parse(&mem_st, pid, uid); if (per_app_memcg) { memory_stat_parse_result = memory_stat_from_cgroup(&mem_st, pid, uid); } else { memory_stat_parse_result = memory_stat_from_procfs(&mem_st, pid); } } #endif Loading @@ -1148,6 +1182,9 @@ static int kill_one_process(struct proc* procp) { stats_write_lmk_kill_occurred(log_ctx, LMK_KILL_OCCURRED, uid, taskname, procp->oomadj, mem_st.pgfault, mem_st.pgmajfault, mem_st.rss_in_bytes, mem_st.cache_in_bytes, mem_st.swap_in_bytes); } else if (enable_stats_log) { stats_write_lmk_kill_occurred(log_ctx, LMK_KILL_OCCURRED, uid, taskname, procp->oomadj, -1, -1, tasksize * BYTES_IN_KILOBYTE, -1, -1); } #endif return tasksize; Loading lmkd/statslog.h +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,9 @@ struct memory_stat { }; #define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat" #define PROC_STAT_FILE_PATH "/proc/%d/stat" #define PROC_STAT_BUFFER_SIZE 1024 #define BYTES_IN_KILOBYTE 1024 /** * Logs the change in LMKD state which is used as start/stop boundaries for logging Loading Loading
lmkd/lmkd.c +48 −11 Original line number Diff line number Diff line Loading @@ -844,17 +844,10 @@ static void memory_stat_parse_line(char *line, struct memory_stat *mem_st) { mem_st->swap_in_bytes = value; } static int memory_stat_parse(struct memory_stat *mem_st, int pid, uid_t uid) { static int memory_stat_from_cgroup(struct memory_stat* mem_st, int pid, uid_t uid) { FILE *fp; char buf[PATH_MAX]; /* * Per-application memory.stat files are available only when * per-application memcgs are enabled. */ if (!per_app_memcg) return -1; snprintf(buf, sizeof(buf), MEMCG_PROCESS_MEMORY_STAT_PATH, uid, pid); fp = fopen(buf, "r"); Loading @@ -871,6 +864,43 @@ static int memory_stat_parse(struct memory_stat *mem_st, int pid, uid_t uid) { return 0; } static int memory_stat_from_procfs(struct memory_stat* mem_st, int pid) { char path[PATH_MAX]; char buffer[PROC_STAT_BUFFER_SIZE]; int fd, ret; snprintf(path, sizeof(path), PROC_STAT_FILE_PATH, pid); if ((fd = open(path, O_RDONLY | O_CLOEXEC)) < 0) { ALOGE("%s open failed: %s", path, strerror(errno)); return -1; } ret = read(fd, buffer, sizeof(buffer)); if (ret < 0) { ALOGE("%s read failed: %s", path, strerror(errno)); close(fd); return -1; } close(fd); // field 10 is pgfault // field 12 is pgmajfault // field 24 is rss_in_pages int64_t pgfault = 0, pgmajfault = 0, rss_in_pages = 0; if (sscanf(buffer, "%*u %*s %*s %*d %*d %*d %*d %*d %*d %" SCNd64 " %*d " "%" SCNd64 " %*d %*u %*u %*d %*d %*d %*d %*d %*d " "%*d %*d %" SCNd64 "", &pgfault, &pgmajfault, &rss_in_pages) != 3) { return -1; } mem_st->pgfault = pgfault; mem_st->pgmajfault = pgmajfault; mem_st->rss_in_bytes = (rss_in_pages * PAGE_SIZE); return 0; } #endif /* /prop/zoneinfo parsing routines */ Loading Loading @@ -1125,7 +1155,11 @@ static int kill_one_process(struct proc* procp) { #ifdef LMKD_LOG_STATS if (enable_stats_log) { memory_stat_parse_result = memory_stat_parse(&mem_st, pid, uid); if (per_app_memcg) { memory_stat_parse_result = memory_stat_from_cgroup(&mem_st, pid, uid); } else { memory_stat_parse_result = memory_stat_from_procfs(&mem_st, pid); } } #endif Loading @@ -1148,6 +1182,9 @@ static int kill_one_process(struct proc* procp) { stats_write_lmk_kill_occurred(log_ctx, LMK_KILL_OCCURRED, uid, taskname, procp->oomadj, mem_st.pgfault, mem_st.pgmajfault, mem_st.rss_in_bytes, mem_st.cache_in_bytes, mem_st.swap_in_bytes); } else if (enable_stats_log) { stats_write_lmk_kill_occurred(log_ctx, LMK_KILL_OCCURRED, uid, taskname, procp->oomadj, -1, -1, tasksize * BYTES_IN_KILOBYTE, -1, -1); } #endif return tasksize; Loading
lmkd/statslog.h +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,9 @@ struct memory_stat { }; #define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat" #define PROC_STAT_FILE_PATH "/proc/%d/stat" #define PROC_STAT_BUFFER_SIZE 1024 #define BYTES_IN_KILOBYTE 1024 /** * Logs the change in LMKD state which is used as start/stop boundaries for logging Loading