diff options
Diffstat (limited to 'lmkd/lmkd.c')
-rw-r--r-- | lmkd/lmkd.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index 376410b..5caf77d 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -16,20 +16,26 @@ #define LOG_TAG "lowmemorykiller" +#include <arpa/inet.h> #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> -#include <unistd.h> -#include <arpa/inet.h> +#include <sys/cdefs.h> #include <sys/epoll.h> #include <sys/eventfd.h> #include <sys/socket.h> #include <sys/types.h> -#include <cutils/log.h> +#include <unistd.h> + #include <cutils/sockets.h> +#include <log/log.h> + +#ifndef __unused +#define __unused __attribute__((__unused__)) +#endif #define MEMCG_SYSFS_PATH "/dev/memcg/" #define MEMPRESSURE_WATCH_LEVEL "medium" @@ -75,6 +81,10 @@ static int maxevents; #define OOM_ADJUST_MIN (-16) #define OOM_ADJUST_MAX 15 +/* kernel OOM score values */ +#define OOM_SCORE_ADJ_MIN (-1000) +#define OOM_SCORE_ADJ_MAX 1000 + static int lowmem_adj[MAX_TARGETS]; static int lowmem_minfree[MAX_TARGETS]; static int lowmem_targets_size; @@ -116,6 +126,14 @@ static time_t kill_lasttime; /* PAGE_SIZE / 1024 */ static long page_k; +static int lowmem_oom_adj_to_oom_score_adj(int oom_adj) +{ + if (oom_adj == OOM_ADJUST_MAX) + return OOM_SCORE_ADJ_MAX; + else + return (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE; +} + static struct proc *pid_lookup(int pid) { struct proc *procp; @@ -219,8 +237,8 @@ static void cmd_procprio(int pid, int oomadj) { return; } - snprintf(path, sizeof(path), "/proc/%d/oom_adj", pid); - snprintf(val, sizeof(val), "%d", oomadj); + snprintf(path, sizeof(path), "/proc/%d/oom_score_adj", pid); + snprintf(val, sizeof(val), "%d", lowmem_oom_adj_to_oom_score_adj(oomadj)); writefilestring(path, val); if (use_inkernel_interface) @@ -245,8 +263,6 @@ static void cmd_procprio(int pid, int oomadj) { } static void cmd_procremove(int pid) { - struct proc *procp; - if (use_inkernel_interface) return; @@ -370,7 +386,7 @@ static void ctrl_data_handler(uint32_t events) { } } -static void ctrl_connect_handler(uint32_t events) { +static void ctrl_connect_handler(uint32_t events __unused) { struct sockaddr addr; socklen_t alen; struct epoll_event epev; @@ -412,7 +428,7 @@ static int zoneinfo_parse_protection(char *cp) { return 0; if (zoneval > max) max = zoneval; - } while (cp = strtok(NULL, " ")); + } while ((cp = strtok(NULL, " "))); return max; } @@ -443,7 +459,6 @@ static void zoneinfo_parse_line(char *line, struct sysmeminfo *mip) { static int zoneinfo_parse(struct sysmeminfo *mip) { FILE *f; - char *cp; char line[LINE_MAX]; memset(mip, 0, sizeof(struct sysmeminfo)); @@ -507,7 +522,7 @@ static struct proc *proc_adj_lru(int oomadj) { return (struct proc *)adjslot_tail(&procadjslot_list[ADJTOSLOT(oomadj)]); } -static void mp_event(uint32_t events) { +static void mp_event(uint32_t events __unused) { int i; int ret; unsigned long long evcount; @@ -726,7 +741,7 @@ static void mainloop(void) { } } -int main(int argc, char **argv) { +int main(int argc __unused, char **argv __unused) { if (!init()) mainloop(); |