diff --git a/rust/scx_utils/src/autopower.rs b/rust/scx_utils/src/autopower.rs index 4035b77233..27a6876974 100644 --- a/rust/scx_utils/src/autopower.rs +++ b/rust/scx_utils/src/autopower.rs @@ -24,7 +24,7 @@ const MAX_RETRIES: usize = 10; #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum PowerProfile { Powersave, - Balanced, + Balanced { power: bool }, Performance, Unknown, } @@ -33,7 +33,8 @@ impl fmt::Display for PowerProfile { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { PowerProfile::Powersave => "powersave", - PowerProfile::Balanced => "balanced", + PowerProfile::Balanced { power: true } => "balanced_power", + PowerProfile::Balanced { power: false } => "balanced_performance", PowerProfile::Performance => "performance", PowerProfile::Unknown => "unknown", } @@ -49,8 +50,9 @@ fn read_energy_profile() -> PowerProfile { .ok() .or_else(|| fs::read_to_string(scaling_governor_path).ok()) .map(|s| match s.trim_end() { - "power" | "balance_power" | "powersave" => PowerProfile::Powersave, - "balance_performance" => PowerProfile::Balanced, + "power" | "powersave" => PowerProfile::Powersave, + "balance_power" => PowerProfile::Balanced { power: true }, + "balance_performance" => PowerProfile::Balanced { power: false }, "performance" => PowerProfile::Performance, _ => PowerProfile::Unknown, }) @@ -61,7 +63,7 @@ pub fn fetch_power_profile(no_ppd: bool) -> PowerProfile { fn parse_profile(profile: &str) -> PowerProfile { match profile { "power-saver" => PowerProfile::Powersave, - "balanced" => PowerProfile::Balanced, + "balanced" => PowerProfile::Balanced { power: false }, "performance" => PowerProfile::Performance, _ => PowerProfile::Unknown, } diff --git a/scheds/rust/scx_bpfland/src/main.rs b/scheds/rust/scx_bpfland/src/main.rs index 7b106b993d..098b46a550 100644 --- a/scheds/rust/scx_bpfland/src/main.rs +++ b/scheds/rust/scx_bpfland/src/main.rs @@ -339,7 +339,7 @@ impl<'a> Scheduler<'a> { let mut skel = scx_ops_load!(skel, bpfland_ops, uei)?; // Initialize the primary scheduling domain and the preferred domain. - let power_profile = fetch_power_profile(false); + let power_profile = Self::power_profile(); if let Err(err) = Self::init_energy_domain(&mut skel, &opts.primary_domain, power_profile) { warn!("failed to initialize primary domain: error {}", err); } @@ -419,9 +419,11 @@ impl<'a> Scheduler<'a> { "performance" => Self::epp_to_cpumask(Powermode::Performance)?, "auto" => match power_profile { PowerProfile::Powersave => Self::epp_to_cpumask(Powermode::Powersave)?, - PowerProfile::Performance | PowerProfile::Balanced => { - Self::epp_to_cpumask(Powermode::Performance)? + PowerProfile::Balanced { power: true } => { + Self::epp_to_cpumask(Powermode::Powersave)? } + PowerProfile::Balanced { power: false } => Self::epp_to_cpumask(Powermode::Any)?, + PowerProfile::Performance => Self::epp_to_cpumask(Powermode::Any)?, PowerProfile::Unknown => Self::epp_to_cpumask(Powermode::Any)?, }, "all" => Self::epp_to_cpumask(Powermode::Any)?, @@ -473,9 +475,18 @@ impl<'a> Scheduler<'a> { Ok(()) } + fn power_profile() -> PowerProfile { + let profile = fetch_power_profile(true); + if profile == PowerProfile::Unknown { + fetch_power_profile(false) + } else { + profile + } + } + fn refresh_sched_domain(&mut self) -> bool { if self.power_profile != PowerProfile::Unknown { - let power_profile = fetch_power_profile(false); + let power_profile = Self::power_profile(); if power_profile != self.power_profile { self.power_profile = power_profile; diff --git a/scheds/rust/scx_lavd/src/main.rs b/scheds/rust/scx_lavd/src/main.rs index 569b30be63..190561c56c 100644 --- a/scheds/rust/scx_lavd/src/main.rs +++ b/scheds/rust/scx_lavd/src/main.rs @@ -950,7 +950,7 @@ impl<'a> Scheduler<'a> { let _ = match profile { PowerProfile::Performance => self.set_power_profile(LAVD_PM_PERFORMANCE), - PowerProfile::Balanced => self.set_power_profile(LAVD_PM_BALANCED), + PowerProfile::Balanced { .. } => self.set_power_profile(LAVD_PM_BALANCED), PowerProfile::Powersave => self.set_power_profile(LAVD_PM_POWERSAVE), PowerProfile::Unknown => { // We don't know how to handle an unknown energy profile,