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. |
