Commit a1d9a3231eac4117cadaf4b6bba5b2902c15a33e

Authored by Kirill Tkhai
Committed by Ingo Molnar
1 parent 60e69eed85

sched: Check for stop task appearance when balancing happens

We need to do it like we do for the other higher priority classes..

Signed-off-by: Kirill Tkhai <tkhai@yandex.ru>
Cc: Michael wang <wangyun@linux.vnet.ibm.com>
Cc: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/336561397137116@web27h.yandex.ru
Signed-off-by: Ingo Molnar <mingo@kernel.org>

Showing 3 changed files with 16 additions and 5 deletions Side-by-side Diff

kernel/sched/deadline.c
... ... @@ -1021,8 +1021,17 @@
1021 1021  
1022 1022 dl_rq = &rq->dl;
1023 1023  
1024   - if (need_pull_dl_task(rq, prev))
  1024 + if (need_pull_dl_task(rq, prev)) {
1025 1025 pull_dl_task(rq);
  1026 + /*
  1027 + * pull_rt_task() can drop (and re-acquire) rq->lock; this
  1028 + * means a stop task can slip in, in which case we need to
  1029 + * re-start task selection.
  1030 + */
  1031 + if (rq->stop && rq->stop->on_rq)
  1032 + return RETRY_TASK;
  1033 + }
  1034 +
1026 1035 /*
1027 1036 * When prev is DL, we may throttle it in put_prev_task().
1028 1037 * So, we update time before we check for dl_nr_running.
... ... @@ -6728,7 +6728,8 @@
6728 6728 out:
6729 6729 /* Is there a task of a high priority class? */
6730 6730 if (this_rq->nr_running != this_rq->cfs.h_nr_running &&
6731   - (this_rq->dl.dl_nr_running ||
  6731 + ((this_rq->stop && this_rq->stop->on_rq) ||
  6732 + this_rq->dl.dl_nr_running ||
6732 6733 (this_rq->rt.rt_nr_running && !rt_rq_throttled(&this_rq->rt))))
6733 6734 pulled_task = -1;
6734 6735  
... ... @@ -1362,10 +1362,11 @@
1362 1362 pull_rt_task(rq);
1363 1363 /*
1364 1364 * pull_rt_task() can drop (and re-acquire) rq->lock; this
1365   - * means a dl task can slip in, in which case we need to
1366   - * re-start task selection.
  1365 + * means a dl or stop task can slip in, in which case we need
  1366 + * to re-start task selection.
1367 1367 */
1368   - if (unlikely(rq->dl.dl_nr_running))
  1368 + if (unlikely((rq->stop && rq->stop->on_rq) ||
  1369 + rq->dl.dl_nr_running))
1369 1370 return RETRY_TASK;
1370 1371 }
1371 1372