diff options
Diffstat (limited to 'kernel/sched/deadline.c')
-rw-r--r-- | kernel/sched/deadline.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 27ef40925525..800e99b99075 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
@@ -528,6 +528,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) | |||
528 | sched_clock_tick(); | 528 | sched_clock_tick(); |
529 | update_rq_clock(rq); | 529 | update_rq_clock(rq); |
530 | dl_se->dl_throttled = 0; | 530 | dl_se->dl_throttled = 0; |
531 | dl_se->dl_yielded = 0; | ||
531 | if (p->on_rq) { | 532 | if (p->on_rq) { |
532 | enqueue_task_dl(rq, p, ENQUEUE_REPLENISH); | 533 | enqueue_task_dl(rq, p, ENQUEUE_REPLENISH); |
533 | if (task_has_dl_policy(rq->curr)) | 534 | if (task_has_dl_policy(rq->curr)) |
@@ -893,10 +894,10 @@ static void yield_task_dl(struct rq *rq) | |||
893 | * We make the task go to sleep until its current deadline by | 894 | * We make the task go to sleep until its current deadline by |
894 | * forcing its runtime to zero. This way, update_curr_dl() stops | 895 | * forcing its runtime to zero. This way, update_curr_dl() stops |
895 | * it and the bandwidth timer will wake it up and will give it | 896 | * it and the bandwidth timer will wake it up and will give it |
896 | * new scheduling parameters (thanks to dl_new=1). | 897 | * new scheduling parameters (thanks to dl_yielded=1). |
897 | */ | 898 | */ |
898 | if (p->dl.runtime > 0) { | 899 | if (p->dl.runtime > 0) { |
899 | rq->curr->dl.dl_new = 1; | 900 | rq->curr->dl.dl_yielded = 1; |
900 | p->dl.runtime = 0; | 901 | p->dl.runtime = 0; |
901 | } | 902 | } |
902 | update_curr_dl(rq); | 903 | update_curr_dl(rq); |
@@ -1021,8 +1022,17 @@ struct task_struct *pick_next_task_dl(struct rq *rq, struct task_struct *prev) | |||
1021 | 1022 | ||
1022 | dl_rq = &rq->dl; | 1023 | dl_rq = &rq->dl; |
1023 | 1024 | ||
1024 | if (need_pull_dl_task(rq, prev)) | 1025 | if (need_pull_dl_task(rq, prev)) { |
1025 | pull_dl_task(rq); | 1026 | pull_dl_task(rq); |
1027 | /* | ||
1028 | * pull_rt_task() can drop (and re-acquire) rq->lock; this | ||
1029 | * means a stop task can slip in, in which case we need to | ||
1030 | * re-start task selection. | ||
1031 | */ | ||
1032 | if (rq->stop && rq->stop->on_rq) | ||
1033 | return RETRY_TASK; | ||
1034 | } | ||
1035 | |||
1026 | /* | 1036 | /* |
1027 | * When prev is DL, we may throttle it in put_prev_task(). | 1037 | * When prev is DL, we may throttle it in put_prev_task(). |
1028 | * So, we update time before we check for dl_nr_running. | 1038 | * So, we update time before we check for dl_nr_running. |