Loading init/README.md +3 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,9 @@ Init records some boot timing information in system properties. `ro.boottime.init.selinux` > How long in ns it took to run SELinux stage. `ro.boottime.init.modules` > How long in ms it took to load kernel modules. `ro.boottime.init.cold_boot_wait` > How long init waited for ueventd's coldboot phase to end. Loading init/first_stage_init.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ std::string GetModuleLoadList(bool recovery, const std::string& dir_path) { } #define MODULE_BASE_DIR "/lib/modules" bool LoadKernelModules(bool recovery, bool want_console) { bool LoadKernelModules(bool recovery, bool want_console, int& modules_loaded) { struct utsname uts; if (uname(&uts)) { LOG(FATAL) << "Failed to get kernel version."; Loading Loading @@ -164,7 +164,7 @@ bool LoadKernelModules(bool recovery, bool want_console) { dir_path.append(module_dir); Modprobe m({dir_path}, GetModuleLoadList(recovery, dir_path)); bool retval = m.LoadListedModules(!want_console); int modules_loaded = m.GetModuleCount(); modules_loaded = m.GetModuleCount(); if (modules_loaded > 0) { return retval; } Loading @@ -172,7 +172,7 @@ bool LoadKernelModules(bool recovery, bool want_console) { Modprobe m({MODULE_BASE_DIR}, GetModuleLoadList(recovery, MODULE_BASE_DIR)); bool retval = m.LoadListedModules(!want_console); int modules_loaded = m.GetModuleCount(); modules_loaded = m.GetModuleCount(); if (modules_loaded > 0) { return retval; } Loading Loading @@ -278,13 +278,23 @@ int FirstStageMain(int argc, char** argv) { auto want_console = ALLOW_FIRST_STAGE_CONSOLE ? FirstStageConsole(cmdline) : 0; if (!LoadKernelModules(IsRecoveryMode() && !ForceNormalBoot(cmdline), want_console)) { boot_clock::time_point module_start_time = boot_clock::now(); int module_count = 0; if (!LoadKernelModules(IsRecoveryMode() && !ForceNormalBoot(cmdline), want_console, module_count)) { if (want_console != FirstStageConsoleParam::DISABLED) { LOG(ERROR) << "Failed to load kernel modules, starting console"; } else { LOG(FATAL) << "Failed to load kernel modules"; } } if (module_count > 0) { auto module_elapse_time = std::chrono::duration_cast<std::chrono::milliseconds>( boot_clock::now() - module_start_time); setenv(kEnvInitModuleDurationMs, std::to_string(module_elapse_time.count()).c_str(), 1); LOG(INFO) << "Loaded " << module_count << " kernel modules took " << module_elapse_time.count() << " ms"; } if (want_console == FirstStageConsoleParam::CONSOLE_ON_FAILURE) { StartConsole(cmdline); Loading init/first_stage_init.h +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ namespace init { int FirstStageMain(int argc, char** argv); static constexpr char kEnvFirstStageStartedAt[] = "FIRST_STAGE_STARTED_AT"; static constexpr char kEnvInitModuleDurationMs[] = "INIT_MODULE_DURATION_MS"; } // namespace init } // namespace android init/init.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -713,6 +713,10 @@ static void RecordStageBoottimes(const boot_clock::time_point& second_stage_star SetProperty("ro.boottime.init.selinux", std::to_string(second_stage_start_time.time_since_epoch().count() - selinux_start_time_ns)); if (auto init_module_time_str = getenv(kEnvInitModuleDurationMs); init_module_time_str) { SetProperty("ro.boottime.init.modules", init_module_time_str); unsetenv(kEnvInitModuleDurationMs); } } void SendLoadPersistentPropertiesMessage() { Loading Loading
init/README.md +3 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,9 @@ Init records some boot timing information in system properties. `ro.boottime.init.selinux` > How long in ns it took to run SELinux stage. `ro.boottime.init.modules` > How long in ms it took to load kernel modules. `ro.boottime.init.cold_boot_wait` > How long init waited for ueventd's coldboot phase to end. Loading
init/first_stage_init.cpp +14 −4 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ std::string GetModuleLoadList(bool recovery, const std::string& dir_path) { } #define MODULE_BASE_DIR "/lib/modules" bool LoadKernelModules(bool recovery, bool want_console) { bool LoadKernelModules(bool recovery, bool want_console, int& modules_loaded) { struct utsname uts; if (uname(&uts)) { LOG(FATAL) << "Failed to get kernel version."; Loading Loading @@ -164,7 +164,7 @@ bool LoadKernelModules(bool recovery, bool want_console) { dir_path.append(module_dir); Modprobe m({dir_path}, GetModuleLoadList(recovery, dir_path)); bool retval = m.LoadListedModules(!want_console); int modules_loaded = m.GetModuleCount(); modules_loaded = m.GetModuleCount(); if (modules_loaded > 0) { return retval; } Loading @@ -172,7 +172,7 @@ bool LoadKernelModules(bool recovery, bool want_console) { Modprobe m({MODULE_BASE_DIR}, GetModuleLoadList(recovery, MODULE_BASE_DIR)); bool retval = m.LoadListedModules(!want_console); int modules_loaded = m.GetModuleCount(); modules_loaded = m.GetModuleCount(); if (modules_loaded > 0) { return retval; } Loading Loading @@ -278,13 +278,23 @@ int FirstStageMain(int argc, char** argv) { auto want_console = ALLOW_FIRST_STAGE_CONSOLE ? FirstStageConsole(cmdline) : 0; if (!LoadKernelModules(IsRecoveryMode() && !ForceNormalBoot(cmdline), want_console)) { boot_clock::time_point module_start_time = boot_clock::now(); int module_count = 0; if (!LoadKernelModules(IsRecoveryMode() && !ForceNormalBoot(cmdline), want_console, module_count)) { if (want_console != FirstStageConsoleParam::DISABLED) { LOG(ERROR) << "Failed to load kernel modules, starting console"; } else { LOG(FATAL) << "Failed to load kernel modules"; } } if (module_count > 0) { auto module_elapse_time = std::chrono::duration_cast<std::chrono::milliseconds>( boot_clock::now() - module_start_time); setenv(kEnvInitModuleDurationMs, std::to_string(module_elapse_time.count()).c_str(), 1); LOG(INFO) << "Loaded " << module_count << " kernel modules took " << module_elapse_time.count() << " ms"; } if (want_console == FirstStageConsoleParam::CONSOLE_ON_FAILURE) { StartConsole(cmdline); Loading
init/first_stage_init.h +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ namespace init { int FirstStageMain(int argc, char** argv); static constexpr char kEnvFirstStageStartedAt[] = "FIRST_STAGE_STARTED_AT"; static constexpr char kEnvInitModuleDurationMs[] = "INIT_MODULE_DURATION_MS"; } // namespace init } // namespace android
init/init.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -713,6 +713,10 @@ static void RecordStageBoottimes(const boot_clock::time_point& second_stage_star SetProperty("ro.boottime.init.selinux", std::to_string(second_stage_start_time.time_since_epoch().count() - selinux_start_time_ns)); if (auto init_module_time_str = getenv(kEnvInitModuleDurationMs); init_module_time_str) { SetProperty("ro.boottime.init.modules", init_module_time_str); unsetenv(kEnvInitModuleDurationMs); } } void SendLoadPersistentPropertiesMessage() { Loading