Loading arch/arm/include/asm/topology.h +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale #define arch_scale_freq_invariant topology_scale_freq_invariant /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading arch/arm64/include/asm/topology.h +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ void topology_scale_freq_tick(void); /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale #define arch_scale_freq_invariant topology_scale_freq_invariant /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading arch/arm64/kernel/topology.c +8 −1 Original line number Diff line number Diff line Loading @@ -246,6 +246,13 @@ static int __init init_amu_fie(void) static_branch_enable(&amu_fie_key); } /* * If the system is not fully invariant after AMU init, disable * partial use of counters for frequency invariance. */ if (!topology_scale_freq_invariant()) static_branch_disable(&amu_fie_key); free_valid_mask: free_cpumask_var(valid_cpus); Loading @@ -253,7 +260,7 @@ static int __init init_amu_fie(void) } late_initcall_sync(init_amu_fie); bool arch_freq_counters_available(struct cpumask *cpus) bool arch_freq_counters_available(const struct cpumask *cpus) { return amu_freq_invariant() && cpumask_subset(cpus, amu_fie_cpus); Loading drivers/base/arch_topology.c +11 −2 Original line number Diff line number Diff line Loading @@ -21,18 +21,27 @@ #include <linux/sched.h> #include <linux/smp.h> __weak bool arch_freq_counters_available(struct cpumask *cpus) bool topology_scale_freq_invariant(void) { return cpufreq_supports_freq_invariance() || arch_freq_counters_available(cpu_online_mask); } __weak bool arch_freq_counters_available(const struct cpumask *cpus) { return false; } DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE; void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, void arch_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq) { unsigned long scale; int i; if (WARN_ON_ONCE(!cur_freq || !max_freq)) return; /* * If the use of counters for FIE is enabled, just return as we don't * want to update the scale factor with information from CPUFREQ. Loading drivers/cpufreq/cpufreq-dt.c +1 −9 Original line number Diff line number Diff line Loading @@ -40,16 +40,8 @@ static int set_target(struct cpufreq_policy *policy, unsigned int index) { struct private_data *priv = policy->driver_data; unsigned long freq = policy->freq_table[index].frequency; int ret; ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); if (!ret) { arch_set_freq_scale(policy->related_cpus, freq, policy->cpuinfo.max_freq); } return ret; return dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); } /* Loading Loading
arch/arm/include/asm/topology.h +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale #define arch_scale_freq_invariant topology_scale_freq_invariant /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading
arch/arm64/include/asm/topology.h +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ void topology_scale_freq_tick(void); /* Replace task scheduler's default frequency-invariant accounting */ #define arch_scale_freq_capacity topology_get_freq_scale #define arch_scale_freq_invariant topology_scale_freq_invariant /* Replace task scheduler's default cpu-invariant accounting */ #define arch_scale_cpu_capacity topology_get_cpu_scale Loading
arch/arm64/kernel/topology.c +8 −1 Original line number Diff line number Diff line Loading @@ -246,6 +246,13 @@ static int __init init_amu_fie(void) static_branch_enable(&amu_fie_key); } /* * If the system is not fully invariant after AMU init, disable * partial use of counters for frequency invariance. */ if (!topology_scale_freq_invariant()) static_branch_disable(&amu_fie_key); free_valid_mask: free_cpumask_var(valid_cpus); Loading @@ -253,7 +260,7 @@ static int __init init_amu_fie(void) } late_initcall_sync(init_amu_fie); bool arch_freq_counters_available(struct cpumask *cpus) bool arch_freq_counters_available(const struct cpumask *cpus) { return amu_freq_invariant() && cpumask_subset(cpus, amu_fie_cpus); Loading
drivers/base/arch_topology.c +11 −2 Original line number Diff line number Diff line Loading @@ -21,18 +21,27 @@ #include <linux/sched.h> #include <linux/smp.h> __weak bool arch_freq_counters_available(struct cpumask *cpus) bool topology_scale_freq_invariant(void) { return cpufreq_supports_freq_invariance() || arch_freq_counters_available(cpu_online_mask); } __weak bool arch_freq_counters_available(const struct cpumask *cpus) { return false; } DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE; void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, void arch_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq, unsigned long max_freq) { unsigned long scale; int i; if (WARN_ON_ONCE(!cur_freq || !max_freq)) return; /* * If the use of counters for FIE is enabled, just return as we don't * want to update the scale factor with information from CPUFREQ. Loading
drivers/cpufreq/cpufreq-dt.c +1 −9 Original line number Diff line number Diff line Loading @@ -40,16 +40,8 @@ static int set_target(struct cpufreq_policy *policy, unsigned int index) { struct private_data *priv = policy->driver_data; unsigned long freq = policy->freq_table[index].frequency; int ret; ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); if (!ret) { arch_set_freq_scale(policy->related_cpus, freq, policy->cpuinfo.max_freq); } return ret; return dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); } /* Loading