diff options
| author | Pavankumar Kondeti <pkondeti@codeaurora.org> | 2017-02-09 14:23:39 +0530 |
|---|---|---|
| committer | Pavankumar Kondeti <pkondeti@codeaurora.org> | 2017-02-09 16:33:53 +0530 |
| commit | 8485666f1c33f0a93580b01843a136277e8e8d33 (patch) | |
| tree | 71c111c79d6e4fbf6c649a58610ff7b984c34306 /kernel/sched | |
| parent | 2aa89ab3ff59a788321bc6af782d639cfc8dab1f (diff) | |
sched: don't select an inactive/isolated CPU in sbc()
In select_best_cpu(), if no CPU is selected from the candidate
cluster, the search is expanded to the backup cluster. The
current code may select an inactive/isolated CPU in the
backup cluster. Fix this.
Change-Id: Id1e8a2b2f84ea274cdeda408957490ca05ef5fdb
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Diffstat (limited to 'kernel/sched')
| -rw-r--r-- | kernel/sched/fair.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 6f68b0e19c4a..c782693c76c3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2834,11 +2834,18 @@ struct cpu_select_env *env, struct cluster_cpu_stats *stats) { struct sched_cluster *next = NULL; int i; + struct cpumask search_cpus; while (!bitmap_empty(env->backup_list, num_clusters)) { next = next_candidate(env->backup_list, 0, num_clusters); __clear_bit(next->id, env->backup_list); - for_each_cpu_and(i, &env->p->cpus_allowed, &next->cpus) { + + cpumask_and(&search_cpus, tsk_cpus_allowed(env->p), + &next->cpus); + cpumask_and(&search_cpus, &search_cpus, cpu_active_mask); + cpumask_andnot(&search_cpus, &search_cpus, cpu_isolated_mask); + + for_each_cpu(i, &search_cpus) { trace_sched_cpu_load_wakeup(cpu_rq(i), idle_cpu(i), sched_irqload(i), power_cost(i, task_load(env->p) + cpu_cravg_sync(i, env->sync)), 0); |
