Commit 684e1855 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

cpufreq: Introduce cpufreq_policy_refresh()



Since cpufreq_update_limits() obtains a cpufreq policy pointer for the
given CPU and reference counts the object pointed to by it, calling
cpufreq_update_policy() from cpufreq_update_limits() is somewhat
wasteful because that function calls cpufreq_cpu_get() on the same
CPU again.

To avoid that unnecessary overhead, move the part of the code running
under the policy rwsem from cpufreq_update_policy() to a new function
called cpufreq_policy_refresh() and invoke that new function from
both cpufreq_update_policy() and cpufreq_update_limits().

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Acked-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Link: https://patch.msgid.link/6047110.MhkbZ0Pkbq@rjwysocki.net
parent ece898da
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -2717,6 +2717,21 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy,
	return ret;
}

static void cpufreq_policy_refresh(struct cpufreq_policy *policy)
{
	guard(cpufreq_policy_write)(policy);

	/*
	 * BIOS might change freq behind our back
	 * -> ask driver for current freq and notify governors about a change
	 */
	if (cpufreq_driver->get && has_target() &&
	    (cpufreq_suspended || WARN_ON(!cpufreq_verify_current_freq(policy, false))))
		return;

	refresh_frequency_limits(policy);
}

/**
 * cpufreq_update_policy - Re-evaluate an existing cpufreq policy.
 * @cpu: CPU to re-evaluate the policy for.
@@ -2734,17 +2749,7 @@ void cpufreq_update_policy(unsigned int cpu)
	if (!policy)
		return;

	guard(cpufreq_policy_write)(policy);

	/*
	 * BIOS might change freq behind our back
	 * -> ask driver for current freq and notify governors about a change
	 */
	if (cpufreq_driver->get && has_target() &&
	    (cpufreq_suspended || WARN_ON(!cpufreq_verify_current_freq(policy, false))))
		return;

	refresh_frequency_limits(policy);
	cpufreq_policy_refresh(policy);
}
EXPORT_SYMBOL(cpufreq_update_policy);

@@ -2753,7 +2758,7 @@ EXPORT_SYMBOL(cpufreq_update_policy);
 * @cpu: CPU to update the policy limits for.
 *
 * Invoke the driver's ->update_limits callback if present or call
 * cpufreq_update_policy() for @cpu.
 * cpufreq_policy_refresh() for @cpu.
 */
void cpufreq_update_limits(unsigned int cpu)
{
@@ -2766,7 +2771,7 @@ void cpufreq_update_limits(unsigned int cpu)
	if (cpufreq_driver->update_limits)
		cpufreq_driver->update_limits(cpu);
	else
		cpufreq_update_policy(cpu);
		cpufreq_policy_refresh(policy);
}
EXPORT_SYMBOL_GPL(cpufreq_update_limits);