cpufreq/sched: schedutil: Add helper for governor checks
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 6 May 2025 20:34:31 +0000 (22:34 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 7 May 2025 19:17:56 +0000 (21:17 +0200)
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: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Christian Loehle <christian.loehle@arm.com>
Tested-by: Christian Loehle <christian.loehle@arm.com>
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Link: https://patch.msgid.link/3365956.44csPzL39Z@rjwysocki.net
include/linux/cpufreq.h
kernel/sched/cpufreq_schedutil.c
kernel/sched/sched.h
kernel/sched/topology.c

index 7bb760031dd71999ea0e559a4318c405a7eb6822..1d2c6c6d895246951b020f7f0720856d38272514 100644 (file)
@@ -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)
index 816f07f9d30f1a0d05642758c932bd564727b15d..461242ec958af040884c376cceec38cb38dac34c 100644 (file)
@@ -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);
index 47972f34ea70144d40446ee7bb6ca922608eed5c..5cbe3fd93fdad3a56017926860954cd519b305a8 100644 (file)
@@ -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
index f1ebc60d967f5e7c123a2662e2efece92a2a2b90..902d37f922b4029a13dac0bc8d029bdfadd93856 100644 (file)
@@ -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));