From 3f11a4bc4f4e77c04c0f14aa56c14abfe3dd1743 Mon Sep 17 00:00:00 2001 From: Vikram Mulukutla Date: Fri, 11 Nov 2016 16:05:24 -0800 Subject: [PATCH] sched: core: Skip migrating tasks that aren't enqueued on dead_rq During migrate_tasks, we have to drop the dead_rq lock in order to preserve locking order when acquiring task->pi_lock. This may allow the task to migrate off of dead_rq. Therefore, don't attempt to migrate such a task again from dead_rq. Change-Id: Id31b58e231d3dcd7d32e0dc7f264595d60a7c408 Signed-off-by: Vikram Mulukutla --- kernel/sched/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 862eb8fd3860..84563da000cf 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5537,8 +5537,8 @@ static void migrate_tasks(struct rq *dead_rq, bool migrate_pinned_tasks) * 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)) && - migrate_pinned_tasks)) { + if (task_rq(next) != rq || !task_on_rq_queued(next)) { + WARN_ON(migrate_pinned_tasks); raw_spin_unlock(&next->pi_lock); continue; }