Skip to content

Commit

Permalink
cpufreq: Process remote callbacks from any CPU if the platform permits
Browse files Browse the repository at this point in the history
On many platforms, CPUs can do DVFS across cpufreq policies. i.e CPU
from policy-A can change frequency of CPUs belonging to policy-B.

This is quite common in case of ARM platforms where we don't
configure any per-cpu register.

Add a flag to identify such platforms and update
cpufreq_can_do_remote_dvfs() to allow remote callbacks if this flag is
set.

Also enable the flag for cpufreq-dt driver which is used only on ARM
platforms currently.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Acked-by: Saravana Kannan <skannan@codeaurora.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Viresh Kumar authored and Rafael J. Wysocki committed Aug 1, 2017
1 parent 674e754 commit 99d14d0
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
1 change: 1 addition & 0 deletions drivers/cpufreq/cpufreq-dt.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ static int cpufreq_init(struct cpufreq_policy *policy)
transition_latency = CPUFREQ_ETERNAL;

policy->cpuinfo.transition_latency = transition_latency;
policy->dvfs_possible_from_any_cpu = true;

return 0;

Expand Down
18 changes: 16 additions & 2 deletions include/linux/cpufreq.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,15 @@ struct cpufreq_policy {
*/
unsigned int transition_delay_us;

/*
* Remote DVFS flag (Not added to the driver structure as we don't want
* to access another structure from scheduler hotpath).
*
* Should be set if CPUs can do DVFS on behalf of other CPUs from
* different cpufreq policies.
*/
bool dvfs_possible_from_any_cpu;

/* Cached frequency lookup from cpufreq_driver_resolve_freq. */
unsigned int cached_target_freq;
int cached_resolved_idx;
Expand Down Expand Up @@ -564,8 +573,13 @@ struct governor_attr {

static inline bool cpufreq_can_do_remote_dvfs(struct cpufreq_policy *policy)
{
/* Allow remote callbacks only on the CPUs sharing cpufreq policy */
if (cpumask_test_cpu(smp_processor_id(), policy->cpus))
/*
* Allow remote callbacks if:
* - dvfs_possible_from_any_cpu flag is set
* - the local and remote CPUs share cpufreq policy
*/
if (policy->dvfs_possible_from_any_cpu ||
cpumask_test_cpu(smp_processor_id(), policy->cpus))
return true;

return false;
Expand Down

0 comments on commit 99d14d0

Please sign in to comment.