|
@@ -5608,7 +5608,7 @@ static void migrate_tasks(struct rq *dead_rq)
|
|
|
{
|
|
|
struct rq *rq = dead_rq;
|
|
|
struct task_struct *next, *stop = rq->stop;
|
|
|
- struct rq_flags rf;
|
|
|
+ struct rq_flags rf, old_rf;
|
|
|
int dest_cpu;
|
|
|
|
|
|
/*
|
|
@@ -5669,6 +5669,13 @@ static void migrate_tasks(struct rq *dead_rq)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * __migrate_task() may return with a different
|
|
|
+ * rq->lock held and a new cookie in 'rf', but we need
|
|
|
+ * to preserve rf::clock_update_flags for 'dead_rq'.
|
|
|
+ */
|
|
|
+ old_rf = rf;
|
|
|
+
|
|
|
/* Find suitable destination for @next, with force if needed. */
|
|
|
dest_cpu = select_fallback_rq(dead_rq->cpu, next);
|
|
|
|
|
@@ -5677,6 +5684,7 @@ static void migrate_tasks(struct rq *dead_rq)
|
|
|
raw_spin_unlock(&rq->lock);
|
|
|
rq = dead_rq;
|
|
|
raw_spin_lock(&rq->lock);
|
|
|
+ rf = old_rf;
|
|
|
}
|
|
|
raw_spin_unlock(&next->pi_lock);
|
|
|
}
|