cpufreq: optimize cpufreq_notify_transition()

cpufreq_notify_transition() calls __cpufreq_notify_transition() for each
CPU of a policy. There is a lot of code in __cpufreq_notify_transition()
though which isn't required to be executed for each CPU, like checking
about disabled cpufreq or irqs, adjusting jiffies, updating cpufreq
stats and some debug print messages.

This commit merges __cpufreq_notify_transition() into
cpufreq_notify_transition() and modifies cpufreq_notify_transition() to
execute minimum amount of code for each CPU.

Also fix the kerneldoc for cpufreq_notify_transition() while at it.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Viresh Kumar 2018-05-10 15:00:29 +05:30 committed by Rafael J. Wysocki
parent 130fccd09f
commit 20b5324d83
1 changed files with 33 additions and 32 deletions

View File

@ -300,8 +300,19 @@ static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
#endif #endif
} }
static void __cpufreq_notify_transition(struct cpufreq_policy *policy, /**
struct cpufreq_freqs *freqs, unsigned int state) * cpufreq_notify_transition - Notify frequency transition and adjust_jiffies.
* @policy: cpufreq policy to enable fast frequency switching for.
* @freqs: contain details of the frequency update.
* @state: set to CPUFREQ_PRECHANGE or CPUFREQ_POSTCHANGE.
*
* This function calls the transition notifiers and the "adjust_jiffies"
* function. It is called twice on all CPU frequency changes that have
* external effects.
*/
static void cpufreq_notify_transition(struct cpufreq_policy *policy,
struct cpufreq_freqs *freqs,
unsigned int state)
{ {
BUG_ON(irqs_disabled()); BUG_ON(irqs_disabled());
@ -313,52 +324,42 @@ static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
state, freqs->new); state, freqs->new);
switch (state) { switch (state) {
case CPUFREQ_PRECHANGE: case CPUFREQ_PRECHANGE:
/* detect if the driver reported a value as "old frequency" /*
* Detect if the driver reported a value as "old frequency"
* which is not equal to what the cpufreq core thinks is * which is not equal to what the cpufreq core thinks is
* "old frequency". * "old frequency".
*/ */
if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) { if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
if ((policy) && (policy->cpu == freqs->cpu) && if (policy->cur && (policy->cur != freqs->old)) {
(policy->cur) && (policy->cur != freqs->old)) {
pr_debug("Warning: CPU frequency is %u, cpufreq assumed %u kHz\n", pr_debug("Warning: CPU frequency is %u, cpufreq assumed %u kHz\n",
freqs->old, policy->cur); freqs->old, policy->cur);
freqs->old = policy->cur; freqs->old = policy->cur;
} }
} }
srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
CPUFREQ_PRECHANGE, freqs); for_each_cpu(freqs->cpu, policy->cpus) {
srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
CPUFREQ_PRECHANGE, freqs);
}
adjust_jiffies(CPUFREQ_PRECHANGE, freqs); adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
break; break;
case CPUFREQ_POSTCHANGE: case CPUFREQ_POSTCHANGE:
adjust_jiffies(CPUFREQ_POSTCHANGE, freqs); adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
pr_debug("FREQ: %lu - CPU: %lu\n", pr_debug("FREQ: %u - CPUs: %*pbl\n", freqs->new,
(unsigned long)freqs->new, (unsigned long)freqs->cpu); cpumask_pr_args(policy->cpus));
trace_cpu_frequency(freqs->new, freqs->cpu);
cpufreq_stats_record_transition(policy, freqs->new);
srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
CPUFREQ_POSTCHANGE, freqs);
if (likely(policy) && likely(policy->cpu == freqs->cpu))
policy->cur = freqs->new;
break;
}
}
/** for_each_cpu(freqs->cpu, policy->cpus) {
* cpufreq_notify_transition - call notifier chain and adjust_jiffies trace_cpu_frequency(freqs->new, freqs->cpu);
* on frequency transition. srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
* CPUFREQ_POSTCHANGE, freqs);
* This function calls the transition notifiers and the "adjust_jiffies" }
* function. It is called twice on all CPU frequency changes that have
* external effects. cpufreq_stats_record_transition(policy, freqs->new);
*/ policy->cur = freqs->new;
static void cpufreq_notify_transition(struct cpufreq_policy *policy, }
struct cpufreq_freqs *freqs, unsigned int state)
{
for_each_cpu(freqs->cpu, policy->cpus)
__cpufreq_notify_transition(policy, freqs, state);
} }
/* Do post notifications when there are chances that transition has failed */ /* Do post notifications when there are chances that transition has failed */