|
@@ -1021,8 +1021,17 @@ struct task_struct *pick_next_task_dl(struct rq *rq, struct task_struct *prev)
|
|
|
|
|
|
dl_rq = &rq->dl;
|
|
dl_rq = &rq->dl;
|
|
|
|
|
|
- if (need_pull_dl_task(rq, prev))
|
|
|
|
|
|
+ if (need_pull_dl_task(rq, prev)) {
|
|
pull_dl_task(rq);
|
|
pull_dl_task(rq);
|
|
|
|
+ /*
|
|
|
|
+ * pull_rt_task() can drop (and re-acquire) rq->lock; this
|
|
|
|
+ * means a stop task can slip in, in which case we need to
|
|
|
|
+ * re-start task selection.
|
|
|
|
+ */
|
|
|
|
+ if (rq->stop && rq->stop->on_rq)
|
|
|
|
+ return RETRY_TASK;
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* When prev is DL, we may throttle it in put_prev_task().
|
|
* When prev is DL, we may throttle it in put_prev_task().
|
|
* So, we update time before we check for dl_nr_running.
|
|
* So, we update time before we check for dl_nr_running.
|