Merge changes I41ebaf72,I638bc2d7 into main am: 900221fe33

Original change: https://android-review.googlesource.com/c/platform/system/core/+/3556468

Change-Id: If6beb34d287922c7bc827856356ca6f0e377351f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp
index 68c0f52..1405fff 100644
--- a/init/first_stage_init.cpp
+++ b/init/first_stage_init.cpp
@@ -442,6 +442,12 @@
     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;
+    else if (bootconfig.find("androidboot.load_modules_parallel = \"conservative\"")
+        != std::string::npos)
+        want_parallel_mode = Modprobe::LoadParallelMode::CONSERVATIVE;
 
     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..55931b7 100644
--- a/libmodprobe/include/modprobe/modprobe.h
+++ b/libmodprobe/include/modprobe/modprobe.h
@@ -31,6 +31,8 @@
     enum LoadParallelMode {
       NONE = 0,
       NORMAL,
+      PERFORMANCE,
+      CONSERVATIVE,
     };
 
     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..c43ad96 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 (sleeping_threads == num_threads)
                     cv_update_module.notify_one();
 
                 cv_load_module.wait(lock, [&](){
@@ -601,6 +603,10 @@
                 else
                     parallel_modules.emplace_back(cnd_last);
             }
+
+            if (mode == LoadParallelMode::CONSERVATIVE &&
+                parallel_modules.size() >= num_threads)
+                break;
         }
 
         cv_load_module.notify_all();