From 9e41c7479ccaedb89a89a58079570ca0ee0e3727 Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Mon, 8 Jun 2015 14:56:53 -0700 Subject: [PATCH] add cpuset support This moves ActivityManager from using fg/bg cgroups to fg/bg cpusets, which improves load balancing on appropriate devices. bug 21782794 Change-Id: Ife149ea551b8b3611a826566b8c8fc8573fdf654 --- core/jni/Android.mk | 4 ++++ core/jni/android_util_Process.cpp | 25 ++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/core/jni/Android.mk b/core/jni/Android.mk index faf926cc53728..5e5450e953719 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -16,6 +16,10 @@ else LOCAL_CFLAGS += -DPACKED="" endif +ifneq ($(ENABLE_CPUSETS),) + LOCAL_CFLAGS += -DENABLE_CPUSETS +endif + LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0 diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 28307249249fc..ee8fb195002d3 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -239,7 +239,8 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin if (t_pri <= ANDROID_PRIORITY_AUDIO) { int scheduler = sched_getscheduler(t_pid); if ((scheduler == SCHED_FIFO) || (scheduler == SCHED_RR)) { - // This task wants to stay in it's current audio group so it can keep it's budget + // This task wants to stay in its current audio group so it can keep its budget + // don't update its cpuset or cgroup continue; } } @@ -247,15 +248,33 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin if (isDefault) { if (t_pri >= ANDROID_PRIORITY_BACKGROUND) { // This task wants to stay at background + // update its cpuset so it doesn't only run on bg core(s) +#ifdef ENABLE_CPUSETS + int err = set_cpuset_policy(t_pid, sp); + if (err != NO_ERROR) { + signalExceptionForGroupError(env, -err); + break; + } +#endif continue; } } - - int err = set_sched_policy(t_pid, sp); + int err; +#ifdef ENABLE_CPUSETS + // set both cpuset and cgroup for general threads + err = set_cpuset_policy(t_pid, sp); if (err != NO_ERROR) { signalExceptionForGroupError(env, -err); break; } +#endif + + err = set_sched_policy(t_pid, sp); + if (err != NO_ERROR) { + signalExceptionForGroupError(env, -err); + break; + } + } closedir(d); }