From 611e7f29a553582c07bb7830519542ffccd66e27 Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Wed, 3 Jun 2020 20:23:34 -0700 Subject: [PATCH] sched/fair: Add policy for restricting prefer_spread to newly idle balance Add policy for restricting prefer_spread to newly idle load balance by expanding the tunable range. To allow lower capacity CPUs to do aggressive newly idle load balance: echo 3 > /proc/sys/kernel/sched_prefer_spread To allow bother lower capacity and higher capacity CPUs to do aggressive newly idle load balance: echo 4 > /proc/sys/kernel/sched_prefer_spread Change-Id: Ia62ddb29bdf592a956a9688f277178ef71dee1b3 Signed-off-by: Satya Durga Srinivasu Prabhala [pkondeti@codeaurora.org: The tunable range is expanded] Co-developed-by: Pavankumar Kondeti Signed-off-by: Pavankumar Kondeti --- kernel/sched/fair.c | 32 ++++++++++++++++++++------------ kernel/sysctl.c | 2 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index eb5cf294484a..5b42f1edaf03 100755 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -3909,20 +3909,26 @@ struct find_best_target_env { int skip_cpu; }; -static inline bool prefer_spread_on_idle(int cpu) +static inline bool prefer_spread_on_idle(int cpu, bool new_ilb) { #ifdef CONFIG_SCHED_WALT - if (likely(!sysctl_sched_prefer_spread)) + switch (sysctl_sched_prefer_spread) { + case 1: + return is_min_capacity_cpu(cpu); + case 2: + return true; + case 3: + return (new_ilb && is_min_capacity_cpu(cpu)); + case 4: + return new_ilb; + default: return false; - - if (is_min_capacity_cpu(cpu)) - return sysctl_sched_prefer_spread >= 1; - - return sysctl_sched_prefer_spread > 1; + } #else return false; #endif } + #ifdef CONFIG_SCHED_WALT static inline void walt_adjust_cpus_for_packing(struct task_struct *p, int *target_cpu, int *best_idle_cpu, @@ -3934,7 +3940,7 @@ static inline void walt_adjust_cpus_for_packing(struct task_struct *p, if (*best_idle_cpu == -1 || *target_cpu == -1) return; - if (prefer_spread_on_idle(*best_idle_cpu)) + if (prefer_spread_on_idle(*best_idle_cpu, false)) fbt_env->need_idle |= 2; if (task_rtg_high_prio(p) && walt_nr_rtg_high_prio(*target_cpu) > 0) { @@ -10082,7 +10088,8 @@ static int load_balance(int this_cpu, struct rq *this_rq, #ifdef CONFIG_SCHED_WALT env.prefer_spread = (idle != CPU_NOT_IDLE && - prefer_spread_on_idle(this_cpu) && + prefer_spread_on_idle(this_cpu, + idle == CPU_NEWLY_IDLE) && !((sd->flags & SD_ASYM_CPUCAPACITY) && !cpumask_test_cpu(this_cpu, &asym_cap_sibling_cpus))); @@ -10632,7 +10639,8 @@ static void rebalance_domains(struct rq *rq, enum cpu_idle_type idle) max_cost += sd->max_newidle_lb_cost; #ifdef CONFIG_SCHED_WALT - if (!sd_overutilized(sd) && !prefer_spread_on_idle(cpu)) + if (!sd_overutilized(sd) && !prefer_spread_on_idle(cpu, + idle == CPU_NEWLY_IDLE)) continue; #endif @@ -10892,7 +10900,7 @@ static void nohz_balancer_kick(struct rq *rq) */ if (sched_energy_enabled()) { if (rq->nr_running >= 2 && (cpu_overutilized(cpu) || - prefer_spread_on_idle(cpu))) + prefer_spread_on_idle(cpu, false))) flags = NOHZ_KICK_MASK; goto out; } @@ -11301,7 +11309,7 @@ int newidle_balance(struct rq *this_rq, struct rq_flags *rf) int pulled_task = 0; u64 curr_cost = 0; u64 avg_idle = this_rq->avg_idle; - bool prefer_spread = prefer_spread_on_idle(this_cpu); + bool prefer_spread = prefer_spread_on_idle(this_cpu, true); bool force_lb = (!is_min_capacity_cpu(this_cpu) && silver_has_big_tasks() && (atomic_read(&this_rq->nr_iowait) == 0)); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 559147b4e88d..162d0c946de7 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -552,7 +552,7 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = SYSCTL_ZERO, - .extra2 = &two, + .extra2 = &four, }, { .procname = "walt_rtg_cfs_boost_prio",