From 37cdece0de26244c4d4607664626b26f06c75214 Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Mon, 18 Mar 2019 15:02:03 -0700 Subject: [PATCH] sched: Support Energy Aware Scheduling irrespective of governor This reverts commit 1e6b1214f107503 ("FROMLIST: sched/topology: Make Energy Aware Scheduling depend on schedutil"). Right now, EAS gets disabled when governor set to anything other than schedutil which affects scheduling decisions. To make sure we always get better scheduling decions, EAS needs to be supported irrespective of the governor. Change-Id: I788faaacd477b3ff93ea9787c18a1235c8c3eb0b Signed-off-by: Satya Durga Srinivasu Prabhala [shalagra@codeaurora.org: Fixed merge conflicts in port to 5.x] Signed-off-by: Shaleen Agrawal --- drivers/cpufreq/cpufreq.c | 1 - kernel/sched/cpufreq_schedutil.c | 37 ++------------------------------ kernel/sched/sched.h | 3 +-- kernel/sched/topology.c | 25 ++++----------------- 4 files changed, 7 insertions(+), 59 deletions(-) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index b4026b5fc359..d88321051130 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -2470,7 +2470,6 @@ int cpufreq_set_policy(struct cpufreq_policy *policy, ret = cpufreq_start_governor(policy); if (!ret) { pr_debug("governor change\n"); - sched_cpufreq_governor_change(policy, old_gov); return 0; } cpufreq_exit_governor(policy); diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 85c40622df3f..cc8e09dab45a 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -973,7 +973,7 @@ static 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) { @@ -1305,7 +1305,7 @@ static void sugov_limits(struct cpufreq_policy *policy) sg_policy->limits_changed = true; } -struct cpufreq_governor schedutil_gov = { +static struct cpufreq_governor schedutil_gov = { .name = "schedutil", .owner = THIS_MODULE, .dynamic_switching = true, @@ -1328,36 +1328,3 @@ static int __init sugov_register(void) return cpufreq_register_governor(&schedutil_gov); } fs_initcall(sugov_register); - -#ifdef CONFIG_ENERGY_MODEL -extern bool sched_energy_update; -extern struct mutex sched_energy_mutex; - -static void rebuild_sd_workfn(struct work_struct *work) -{ - mutex_lock(&sched_energy_mutex); - sched_energy_update = true; - rebuild_sched_domains(); - sched_energy_update = false; - mutex_unlock(&sched_energy_mutex); -} -static DECLARE_WORK(rebuild_sd_work, rebuild_sd_workfn); - -/* - * EAS shouldn't be attempted without sugov, so rebuild the sched_domains - * on governor changes to make sure the scheduler knows about it. - */ -void sched_cpufreq_governor_change(struct cpufreq_policy *policy, - struct cpufreq_governor *old_gov) -{ - if (old_gov == &schedutil_gov || policy->governor == &schedutil_gov) { - /* - * When called from the cpufreq_register_driver() path, the - * cpu_hotplug_lock is already held, so use a work item to - * avoid nested locking in rebuild_sched_domains(). - */ - schedule_work(&rebuild_sd_work); - } - -} -#endif diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 7d18bba2f956..f4e0790c4b42 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2827,8 +2827,7 @@ unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned } #endif -#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) - +#ifdef CONFIG_ENERGY_MODEL #define perf_domain_span(pd) (to_cpumask(((pd)->em_pd->cpus))) DECLARE_STATIC_KEY_FALSE(sched_energy_present); diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index dd72f9740f14..594f0cf9c0e8 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -201,7 +201,7 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent) return 1; } -#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) +#if defined(CONFIG_ENERGY_MODEL) DEFINE_STATIC_KEY_FALSE(sched_energy_present); unsigned int sysctl_sched_energy_aware = 1; DEFINE_MUTEX(sched_energy_mutex); @@ -318,7 +318,6 @@ static void sched_energy_set(bool has_eas) * 1. an Energy Model (EM) is available; * 2. the SD_ASYM_CPUCAPACITY flag is set in the sched_domain hierarchy. * 3. the EM complexity is low enough to keep scheduling overheads low; - * 4. schedutil is driving the frequency of all CPUs of the rd; * * The complexity of the Energy Model is defined as: * @@ -338,15 +337,12 @@ static void sched_energy_set(bool has_eas) */ #define EM_MAX_COMPLEXITY 2048 -extern struct cpufreq_governor schedutil_gov; static bool build_perf_domains(const struct cpumask *cpu_map) { int i, nr_pd = 0, nr_cs = 0, nr_cpus = cpumask_weight(cpu_map); struct perf_domain *pd = NULL, *tmp; int cpu = cpumask_first(cpu_map); struct root_domain *rd = cpu_rq(cpu)->rd; - struct cpufreq_policy *policy; - struct cpufreq_governor *gov; if (!sysctl_sched_energy_aware) goto free; @@ -365,19 +361,6 @@ static bool build_perf_domains(const struct cpumask *cpu_map) if (find_pd(pd, i)) continue; - /* Do not attempt EAS if schedutil is not being used. */ - policy = cpufreq_cpu_get(i); - if (!policy) - goto free; - gov = policy->governor; - cpufreq_cpu_put(policy); - if (gov != &schedutil_gov) { - if (rd->pd) - pr_warn("rd %*pbl: Disabling EAS, schedutil is mandatory\n", - cpumask_pr_args(cpu_map)); - goto free; - } - /* Create the new pd and add it to the local list. */ tmp = pd_init(i); if (!tmp) @@ -421,7 +404,7 @@ free: } #else static void free_pd(struct perf_domain *pd) { } -#endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL*/ +#endif /* CONFIG_ENERGY_MODEL */ static void free_rootdomain(struct rcu_head *rcu) { @@ -2307,10 +2290,10 @@ match2: ; } -#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) +#ifdef CONFIG_ENERGY_MODEL /* Build perf. domains: */ for (i = 0; i < ndoms_new; i++) { - for (j = 0; j < n && !sched_energy_update; j++) { + for (j = 0; j < n; j++) { if (cpumask_equal(doms_new[i], doms_cur[j]) && cpu_rq(cpumask_first(doms_cur[j]))->rd->pd) { has_eas = true;