login: pass scheduler-boost-urgent to chrome

Pass /scheduler-tool/boost-urgent from chromeos config to chrome
for platforms with boost-urgent config specified.

BUG=chromium:1041117
TEST=on trogdor, `cat /proc/${all urgent threads}/cmdline`
TEST=cros_run_unit_tests --board=trogdor --packages chromeos-login

Change-Id: I9103f2a2f40527de5a9832827888f4d6df12be94
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2513963
Reviewed-by: Ikjoon Jang <ikjn@chromium.org>
Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Joel Fernandes <joelaf@google.com>
Tested-by: Ikjoon Jang <ikjn@chromium.org>
Commit-Queue: Ikjoon Jang <ikjn@chromium.org>
diff --git a/login_manager/chrome_setup.cc b/login_manager/chrome_setup.cc
index 87f5c46..34703c9 100644
--- a/login_manager/chrome_setup.cc
+++ b/login_manager/chrome_setup.cc
@@ -87,6 +87,9 @@
 constexpr char kEnableCrashpadFlag[] = "--enable-crashpad";
 constexpr char kEnableBreakpadFlag[] = "--no-enable-crashpad";
 
+const char kSchedulerTunePath[] = "/scheduler-tune";
+const char kBoostUrgentProperty[] = "boost-urgent";
+
 // These hashes are only being used temporarily till we can determine if a
 // device is a Chromebox for Meetings or not from the Install Time attributes.
 // TODO(rkc, pbos): Remove these and related code once crbug.com/706523 is
@@ -420,7 +423,8 @@
 }
 
 // Adds system-related flags to the command line.
-void AddSystemFlags(ChromiumCommandBuilder* builder) {
+void AddSystemFlags(ChromiumCommandBuilder* builder,
+                    brillo::CrosConfigInterface* cros_config) {
   const base::FilePath data_dir = GetDataDir(builder);
 
   // We need to delete these files as Chrome may have left them around from its
@@ -463,6 +467,8 @@
     builder->AddArg("--ondevice_handwriting=use_rootfs");
   else if (builder->UseFlagIsSet("ondevice_handwriting_dlc"))
     builder->AddArg("--ondevice_handwriting=use_dlc");
+
+  SetUpSchedulerFlags(builder, cros_config);
 }
 
 // Adds UI-related flags to the command line.
@@ -601,6 +607,21 @@
 
 }  // namespace
 
+void SetUpSchedulerFlags(ChromiumCommandBuilder* builder,
+                         brillo::CrosConfigInterface* cros_config) {
+  // A platform can override default scheduler boosting value.
+  std::string boost_urgent_str;
+  int boost_urgent;
+
+  if (cros_config &&
+      cros_config->GetString(kSchedulerTunePath, kBoostUrgentProperty,
+                             &boost_urgent_str) &&
+      base::StringToInt(boost_urgent_str, &boost_urgent)) {
+    builder->AddArg(
+        base::StringPrintf("--scheduler-boost-urgent=%d", boost_urgent));
+  }
+}
+
 void AddSerializedAshFlags(ChromiumCommandBuilder* builder,
                            brillo::CrosConfigInterface* cros_config) {
   using std::string_literals::operator""s;
@@ -855,7 +876,7 @@
   // ChromiumCommandBuilder class instead.
   CreateDirectories(&builder);
   AddSerializedAshFlags(&builder, cros_config);
-  AddSystemFlags(&builder);
+  AddSystemFlags(&builder, cros_config);
   AddUiFlags(&builder, cros_config);
   AddArcFlags(&builder, &disallowed_prefixes, cros_config);
   AddCrostiniFlags(&builder);
diff --git a/login_manager/chrome_setup.h b/login_manager/chrome_setup.h
index ce5c2ca..5141db5 100644
--- a/login_manager/chrome_setup.h
+++ b/login_manager/chrome_setup.h
@@ -74,6 +74,12 @@
 // Property for radius polynomial in NNPalm for Ozone.
 extern const char kOzoneNNPalmRadiusProperty[];
 
+// Path to scheduler tune.
+extern const char kSchedulerTunePath[];
+
+// Property for urgent tasks boosting value.
+extern const char kBoostUrgentProperty[];
+
 // Initializes a ChromiumCommandBuilder and performs additional Chrome-specific
 // setup. Returns environment variables that the caller should export for Chrome
 // and arguments that it should pass to the Chrome binary, along with the UID
@@ -92,6 +98,10 @@
                         std::vector<std::string>* args_out,
                         uid_t* uid_out);
 
+// Add flags to override default scheduler tunings
+void SetUpSchedulerFlags(chromeos::ui::ChromiumCommandBuilder* builder,
+                         brillo::CrosConfigInterface* cros_config);
+
 // Add flags pertinent to the Ash window manager generated at
 // build-time by cros_config_schema.  These are stored in
 // /ui:serialized-ash-flags, an implicitly generated element.
diff --git a/login_manager/chrome_setup_test.cc b/login_manager/chrome_setup_test.cc
index 5fcc344..6408af1 100644
--- a/login_manager/chrome_setup_test.cc
+++ b/login_manager/chrome_setup_test.cc
@@ -274,6 +274,20 @@
   ASSERT_EQ(login_manager::kAllowAmbientEQFeature, GetFlag(argv, kFeatureFlag));
 }
 
+TEST_F(ChromeSetupTest, TestSchedulerFlags) {
+  constexpr char kBoostUrgentVal[] = "99";
+
+  login_manager::SetUpSchedulerFlags(&builder_, &cros_config_);
+  std::vector<std::string> argv = builder_.arguments();
+  ASSERT_EQ(0, argv.size());
+
+  cros_config_.SetString(login_manager::kSchedulerTunePath,
+                         login_manager::kBoostUrgentProperty, kBoostUrgentVal);
+  login_manager::SetUpSchedulerFlags(&builder_, &cros_config_);
+  argv = builder_.arguments();
+  EXPECT_EQ(kBoostUrgentVal, GetFlag(argv, "--scheduler-boost-urgent"));
+}
+
 void InitWithUseFlag(base::Optional<std::string> flag,
                      base::ScopedTempDir* temp_dir,
                      ChromiumCommandBuilder* builder) {