diff options
author | Wei Wang <wvw@google.com> | 2020-07-06 15:26:49 -0700 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2020-12-15 23:57:01 +0100 |
commit | 4b05abc08a9db4e98ce2e873f80e893be9f6aac6 (patch) | |
tree | 73f19fbcb564e113f2d61efec44db0dce097742b | |
parent | e76ffcfc58b5f2f05af2bfe45140df128bb2cfc7 (diff) |
Boost init priority before main loop
Now we have more things e.g. loading kernel modules, initialize
selinux. And before all these, system cannot make further progress. It
should be beneficial to boost this critical peroid in init.
Benchmark on a Pixel device shows this saves 100+ms on early boot
ToT release + This CL (P15538587)
D/BaseBootTest: init_stage_second_START_TIME_avg : 1563.4
D/BaseBootTest: ueventd_Coldboot_avg : 219.0
D/BaseBootTest: action_init_/system/etc/init/hw/init.rc:114_START_TIME_avg : 2103.7
ToT release (6654154)
D/BaseBootTest: init_stage_second_START_TIME_avg : 1639.0
D/BaseBootTest: ueventd_Coldboot_avg : 238.2
D/BaseBootTest: action_init_/system/etc/init/hw/init.rc:114_START_TIME_avg : 2226.0
Bug: 143857500
Bug: 147997403
Bug: 160271169
Bug: 160696502
Test: Boottime
Signed-off-by: Wei Wang <wvw@google.com>
Change-Id: I21c9e051f4ae3e953d991c031f151b2779702548
-rw-r--r-- | init/init.cpp | 2 | ||||
-rw-r--r-- | init/main.cpp | 3 | ||||
-rw-r--r-- | init/subcontext.cpp | 4 | ||||
-rw-r--r-- | init/ueventd.cpp | 2 |
4 files changed, 10 insertions, 1 deletions
diff --git a/init/init.cpp b/init/init.cpp index 29859c5f5..ae8d23fdf 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -840,6 +840,8 @@ int SecondStageMain(int argc, char** argv) { // Run all property triggers based on current state of the properties. am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers"); + // Restore prio before main loop + setpriority(PRIO_PROCESS, 0, 0); while (true) { // By default, sleep until something happens. auto epoll_timeout = std::optional<std::chrono::milliseconds>{}; diff --git a/init/main.cpp b/init/main.cpp index 38bc74b62..23f5530fe 100644 --- a/init/main.cpp +++ b/init/main.cpp @@ -52,7 +52,8 @@ int main(int argc, char** argv) { #if __has_feature(address_sanitizer) __asan_set_error_report_callback(AsanReportCallback); #endif - + // Boost prio which will be restored later + setpriority(PRIO_PROCESS, 0, -20); if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); } diff --git a/init/subcontext.cpp b/init/subcontext.cpp index f3dd53826..9d4ea8cd3 100644 --- a/init/subcontext.cpp +++ b/init/subcontext.cpp @@ -18,6 +18,8 @@ #include <fcntl.h> #include <poll.h> +#include <sys/time.h> +#include <sys/resource.h> #include <unistd.h> #include <android-base/file.h> @@ -181,6 +183,8 @@ int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map trigger_shutdown = [](const std::string& command) { shutdown_command = command; }; auto subcontext_process = SubcontextProcess(function_map, context, init_fd); + // Restore prio before main loop + setpriority(PRIO_PROCESS, 0, 0); subcontext_process.MainLoop(); return 0; } diff --git a/init/ueventd.cpp b/init/ueventd.cpp index d2b503b4f..12aee62d1 100644 --- a/init/ueventd.cpp +++ b/init/ueventd.cpp @@ -322,6 +322,8 @@ int ueventd_main(int argc, char** argv) { while (waitpid(-1, nullptr, WNOHANG) > 0) { } + // Restore prio before main loop + setpriority(PRIO_PROCESS, 0, 0); uevent_listener.Poll([&uevent_handlers](const Uevent& uevent) { for (auto& uevent_handler : uevent_handlers) { uevent_handler->HandleUevent(uevent); |