Parallel Module Loading: Add performance mode

Add the performance mode. It improved parallel module loading performance by enabling the main thread to identify any new independent modules without waiting for subthreads to load all the old independent threads.

Bug: 385049709
Change-Id: I638bc2d7d8fea6457be503c2b7aecd975250835a
Signed-off-by: Chungkai Mei <[email protected]>
diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp
index 49af5ed..749266e 100644
--- a/init/first_stage_init.cpp
+++ b/init/first_stage_init.cpp
@@ -442,6 +442,9 @@
     if (bootconfig.find("androidboot.load_modules_parallel = \"true\"")
         != std::string::npos)
         want_parallel_mode = Modprobe::LoadParallelMode::NORMAL;
+    else if (bootconfig.find("androidboot.load_modules_parallel_mode = \"performance\"")
+        != std::string::npos)
+        want_parallel_mode = Modprobe::LoadParallelMode::PERFORMANCE;
 
     boot_clock::time_point module_start_time = boot_clock::now();
     int module_count = 0;
diff --git a/libmodprobe/include/modprobe/modprobe.h b/libmodprobe/include/modprobe/modprobe.h
index de9dcd2..2d5145c 100644
--- a/libmodprobe/include/modprobe/modprobe.h
+++ b/libmodprobe/include/modprobe/modprobe.h
@@ -31,6 +31,7 @@
     enum LoadParallelMode {
       NONE = 0,
       NORMAL,
+      PERFORMANCE,
     };
 
     Modprobe(const std::vector<std::string>&, const std::string load_file = "modules.load",
diff --git a/libmodprobe/libmodprobe.cpp b/libmodprobe/libmodprobe.cpp
index 1b524e9..5f3419d 100644
--- a/libmodprobe/libmodprobe.cpp
+++ b/libmodprobe/libmodprobe.cpp
@@ -546,7 +546,9 @@
             if (sequential_modules.empty() && parallel_modules.empty()) {
                 sleeping_threads++;
 
-                if (mode == LoadParallelMode::NORMAL && sleeping_threads == num_threads)
+                if (mode == LoadParallelMode::PERFORMANCE)
+                    cv_update_module.notify_one();
+                else if (mode == LoadParallelMode::NORMAL && sleeping_threads == num_threads)
                     cv_update_module.notify_one();
 
                 cv_load_module.wait(lock, [&](){