From 30bbf7d0ad1b24b419edfc29e2d47da2db3664ca Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 6 Jul 2020 15:26:49 -0700 Subject: [PATCH] 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 Change-Id: I21c9e051f4ae3e953d991c031f151b2779702548 --- init/init.cpp | 2 ++ init/main.cpp | 3 ++- init/subcontext.cpp | 4 ++++ init/ueventd.cpp | 2 ++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/init/init.cpp b/init/init.cpp index 631db8e7f..ba880ea32 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -868,6 +868,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{}; 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 #include +#include +#include #include #include @@ -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 7514b6184..54659c5d7 100644 --- a/init/ueventd.cpp +++ b/init/ueventd.cpp @@ -321,6 +321,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);