summaryrefslogtreecommitdiffstats
path: root/lmkd/lmkd.c
diff options
context:
space:
mode:
Diffstat (limited to 'lmkd/lmkd.c')
-rw-r--r--lmkd/lmkd.c39
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();