summaryrefslogtreecommitdiff
path: root/kernel/sched
diff options
context:
space:
mode:
authorPavankumar Kondeti <pkondeti@codeaurora.org>2017-02-09 14:23:39 +0530
committerPavankumar Kondeti <pkondeti@codeaurora.org>2017-02-09 16:33:53 +0530
commit8485666f1c33f0a93580b01843a136277e8e8d33 (patch)
tree71c111c79d6e4fbf6c649a58610ff7b984c34306 /kernel/sched
parent2aa89ab3ff59a788321bc6af782d639cfc8dab1f (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.c9
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);