summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-11-10 22:49:40 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-11-10 22:49:39 -0800
commitbefd24230391166ccdf67e0e394e35dd7bf04857 (patch)
tree96d5e567d3fafe50d943efb5f5eb184761b82764 /kernel
parent2401d64a48302bad3fc74e8ca02edd188d27ae61 (diff)
parent45b8775b62bb27f5e88b07c17f45dd9ab0cf9bd9 (diff)
Merge "sched/core: Fix migrate tasks bail-out condition"
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index e7196c3a3457..862eb8fd3860 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5497,7 +5497,7 @@ static void migrate_tasks(struct rq *dead_rq, bool migrate_pinned_tasks)
*/
if ((migrate_pinned_tasks && rq->nr_running == 1) ||
(!migrate_pinned_tasks &&
- rq->nr_running == num_pinned_kthreads))
+ rq->nr_running <= num_pinned_kthreads))
break;
/*
@@ -5533,8 +5533,12 @@ static void migrate_tasks(struct rq *dead_rq, bool migrate_pinned_tasks)
* Since we're inside stop-machine, _nothing_ should have
* changed the task, WARN if weird stuff happened, because in
* that case the above rq->lock drop is a fail too.
+ * However, during cpu isolation the load balancer might have
+ * interferred since we don't stop all CPUs. Ignore warning for
+ * this case.
*/
- if (WARN_ON(task_rq(next) != rq || !task_on_rq_queued(next))) {
+ if (WARN_ON((task_rq(next) != rq || !task_on_rq_queued(next)) &&
+ migrate_pinned_tasks)) {
raw_spin_unlock(&next->pi_lock);
continue;
}