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

cpufreq/sched: schedutil: Add helper for governor checks



Add a helper for checking if schedutil is the current governor for
a given cpufreq policy and use it in sched_is_eas_possible() to avoid
accessing cpufreq policy internals directly from there.

No intentional functional impact.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarChristian Loehle <christian.loehle@arm.com>
Tested-by: default avatarChristian Loehle <christian.loehle@arm.com>
Reviewed-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
Link: https://patch.msgid.link/3365956.44csPzL39Z@rjwysocki.net
parent 400da808
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -650,6 +650,15 @@ module_exit(__governor##_exit)
struct cpufreq_governor *cpufreq_default_governor(void);
struct cpufreq_governor *cpufreq_fallback_governor(void);

#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
bool sugov_is_governor(struct cpufreq_policy *policy);
#else
static inline bool sugov_is_governor(struct cpufreq_policy *policy)
{
	return false;
}
#endif

static inline void cpufreq_policy_apply_limits(struct cpufreq_policy *policy)
{
	if (policy->max < policy->cur)
+7 −2
Original line number Diff line number Diff line
@@ -630,7 +630,7 @@ static const struct kobj_type sugov_tunables_ktype = {

/********************** cpufreq governor interface *********************/

struct cpufreq_governor schedutil_gov;
static struct cpufreq_governor schedutil_gov;

static struct sugov_policy *sugov_policy_alloc(struct cpufreq_policy *policy)
{
@@ -909,7 +909,7 @@ static void sugov_limits(struct cpufreq_policy *policy)
	WRITE_ONCE(sg_policy->limits_changed, true);
}

struct cpufreq_governor schedutil_gov = {
static struct cpufreq_governor schedutil_gov = {
	.name			= "schedutil",
	.owner			= THIS_MODULE,
	.flags			= CPUFREQ_GOV_DYNAMIC_SWITCHING,
@@ -927,4 +927,9 @@ struct cpufreq_governor *cpufreq_default_governor(void)
}
#endif

bool sugov_is_governor(struct cpufreq_policy *policy)
{
	return policy->governor == &schedutil_gov;
}

cpufreq_governor_init(schedutil_gov);
+0 −2
Original line number Diff line number Diff line
@@ -3509,8 +3509,6 @@ static inline bool sched_energy_enabled(void)
	return static_branch_unlikely(&sched_energy_present);
}

extern struct cpufreq_governor schedutil_gov;

#else /* ! (CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL) */

#define perf_domain_span(pd) NULL
+3 −3
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ static bool sched_is_eas_possible(const struct cpumask *cpu_mask)
{
	bool any_asym_capacity = false;
	struct cpufreq_policy *policy;
	struct cpufreq_governor *gov;
	bool policy_is_ready;
	int i;

	/* EAS is enabled for asymmetric CPU capacity topologies. */
@@ -258,9 +258,9 @@ static bool sched_is_eas_possible(const struct cpumask *cpu_mask)
			}
			return false;
		}
		gov = policy->governor;
		policy_is_ready = sugov_is_governor(policy);
		cpufreq_cpu_put(policy);
		if (gov != &schedutil_gov) {
		if (!policy_is_ready) {
			if (sched_debug()) {
				pr_info("rd %*pbl: Checking EAS, schedutil is mandatory\n",
					cpumask_pr_args(cpu_mask));