From 1e52ce48a6f2d98485d18585eb3452cab050ffb7 Mon Sep 17 00:00:00 2001 From: Vitalii Tomkiv Date: Wed, 18 May 2016 17:43:02 -0700 Subject: [PATCH] Make sure Zygote is running at process priority 0 after VM has started. Boosting up zygote priority before VM startup, saves ~450ms of boot time for N9, 180ms for Nexus 5X. (cherry picked from commit 5d551a5ac3d13706f62a86842ff6851e1d25213b) Bug: 28866384 Test: m Test: Device boots Change-Id: Ic85892b408e15bbc1de7ce706f113f23974fe478 --- core/jni/com_android_internal_os_Zygote.cpp | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 9c74d9a15e994..fec8f4e39efbe 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -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; @@ -447,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) { @@ -719,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 -