Increase swappiness of processes when memcgroups are enabled
When memcgroups are enabled, migrate heavier and lower priority processes
to the sw memcgroup.
Change-Id: Iba07a723037a599736ef23dea16a30a26634428a
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 159d3eb..1d482dc 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -894,6 +894,19 @@
public static final native boolean setOomAdj(int pid, int amt);
/**
+ * Adjust the swappiness level for a process.
+ *
+ * @param pid The process identifier to set.
+ * @param is_increased Whether swappiness should be increased or default.
+ *
+ * @return Returns true if the underlying system supports this
+ * feature, else false.
+ *
+ * {@hide}
+ */
+ public static final native boolean setSwappiness(int pid, boolean is_increased);
+
+ /**
* Change this process's argv[0] parameter. This can be useful to show
* more descriptive information in things like the 'ps' command.
*
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 33ded03..6d97d01 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -33,6 +33,7 @@
#include <sys/errno.h>
#include <sys/resource.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <grp.h>
@@ -381,6 +382,32 @@
return false;
}
+jboolean android_os_Process_setSwappiness(JNIEnv *env, jobject clazz,
+ jint pid, jboolean is_increased)
+{
+ char text[64];
+
+ if (is_increased) {
+ strcpy(text, "/sys/fs/cgroup/memory/sw/tasks");
+ } else {
+ strcpy(text, "/sys/fs/cgroup/memory/tasks");
+ }
+
+ struct stat st;
+ if (stat(text, &st) || !S_ISREG(st.st_mode)) {
+ return false;
+ }
+
+ int fd = open(text, O_WRONLY);
+ if (fd >= 0) {
+ sprintf(text, "%d", pid);
+ write(fd, text, strlen(text));
+ close(fd);
+ }
+
+ return true;
+}
+
void android_os_Process_setArgV0(JNIEnv* env, jobject clazz, jstring name)
{
if (name == NULL) {
@@ -1022,6 +1049,7 @@
{"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup},
{"getProcessGroup", "(I)I", (void*)android_os_Process_getProcessGroup},
{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
+ {"setSwappiness", "(IZ)Z", (void*)android_os_Process_setSwappiness},
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
{"setUid", "(I)I", (void*)android_os_Process_setUid},
{"setGid", "(I)I", (void*)android_os_Process_setGid},
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 65006e5..8b7b6f6 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -14389,6 +14389,8 @@
}
}
}
+ Process.setSwappiness(app.pid,
+ app.curSchedGroup <= Process.THREAD_GROUP_BG_NONINTERACTIVE);
}
}
return success;