diff options
| author | 2016-12-16 22:20:24 +0000 | |
|---|---|---|
| committer | 2016-12-16 22:20:25 +0000 | |
| commit | d995c94426061ee5af7c90d58af8f600dfab4dd9 (patch) | |
| tree | 9a6451cc1c082105dd9ea82db0eb2c6436d1924a | |
| parent | f8882ae8345b5c21b6be0347496d0d6bc7251853 (diff) | |
| parent | 1e52ce48a6f2d98485d18585eb3452cab050ffb7 (diff) | |
Merge changes Ic85892b4,I627e47c6
* changes:
Make sure Zygote is running at process priority 0 after VM has started.
Revert "Add boost to increase the load on newly-forked zygote processes."
| -rw-r--r-- | core/jni/Android.mk | 4 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 53 |
2 files changed, 21 insertions, 36 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 5fcde8b5bc4e..70e90044f3c7 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -20,10 +20,6 @@ ifneq ($(ENABLE_CPUSETS),) LOCAL_CFLAGS += -DENABLE_CPUSETS endif -ifneq ($(ENABLE_SCHED_BOOST),) - LOCAL_CFLAGS += -DENABLE_SCHED_BOOST -endif - LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0 diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index d0815490159b..fec8f4e39efb 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -37,6 +37,7 @@ #include <sys/prctl.h> #include <sys/resource.h> #include <sys/stat.h> +#include <sys/time.h> #include <sys/types.h> #include <sys/utsname.h> #include <sys/wait.h> @@ -153,6 +154,24 @@ static void SetSigChldHandler() { } } +// Resets nice priority for zygote process. Zygote priority can be set +// to high value during boot phase to speed it up. We want to ensure +// zygote is running at normal priority before childs are forked from it. +// +// This ends up being called repeatedly before each fork(), but there's +// no real harm in that. +static void ResetNicePriority(JNIEnv* env) { + errno = 0; + int prio = getpriority(PRIO_PROCESS, 0); + if (prio == -1 && errno != 0) { + ALOGW("getpriority failed: %s\n", strerror(errno)); + } + if (prio != 0 && setpriority(PRIO_PROCESS, 0, 0) != 0) { + ALOGE("setpriority(%d, 0, 0) failed: %s", PRIO_PROCESS, strerror(errno)); + RuntimeAbort(env, __LINE__, "setpriority failed"); + } +} + // Sets the SIGCHLD handler back to default behavior in zygote children. static void UnsetSigChldHandler() { struct sigaction sa; @@ -418,27 +437,6 @@ void SetThreadName(const char* thread_name) { } } -#ifdef ENABLE_SCHED_BOOST -static void SetForkLoad(bool boost) { - // set scheduler knob to boost forked processes - pid_t currentPid = getpid(); - // fits at most "/proc/XXXXXXX/sched_init_task_load\0" - char schedPath[35]; - snprintf(schedPath, sizeof(schedPath), "/proc/%u/sched_init_task_load", currentPid); - int schedBoostFile = open(schedPath, O_WRONLY); - if (schedBoostFile < 0) { - ALOGW("Unable to set zygote scheduler boost"); - return; - } - if (boost) { - write(schedBoostFile, "100\0", 4); - } else { - write(schedBoostFile, "0\0", 2); - } - close(schedBoostFile); -} -#endif - // The list of open zygote file descriptors. static FileDescriptorTable* gOpenFdTable = NULL; @@ -452,10 +450,6 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra jstring instructionSet, jstring dataDir) { SetSigChldHandler(); -#ifdef ENABLE_SCHED_BOOST - SetForkLoad(true); -#endif - // Close any logging related FDs before we start evaluating the list of // file descriptors. __android_log_close(); @@ -472,6 +466,8 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table."); } + ResetNicePriority(env); + pid_t pid = fork(); if (pid == 0) { @@ -614,12 +610,6 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra } } else if (pid > 0) { // the parent process - -#ifdef ENABLE_SCHED_BOOST - // unset scheduler knob - SetForkLoad(false); -#endif - } return pid; } @@ -750,4 +740,3 @@ int register_com_android_internal_os_Zygote(JNIEnv* env) { return RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods)); } } // namespace android - |