Re: [PATCH 2/6] sched/dl: fix yield task artificial overrun

Juri Lelli
2014-10-29T16:33:56Z

Hi,

On 27/10/14 01:41, Wanpeng Li wrote:
> The yield semantic of deadline class is to reduce remaining runtime to
> zero, and then update_curr_dl() will stop it. However, comsumed bandwidth
> is reduced from the budget of yield task again even if it has already been
> set to zero which leads to artificial overrun. This patch fix it by reduce
> remaining runtime to zero if there is still remaining runtime after comsumed
> bandwidth is accumulated.
>

Oh, right. But, how about what below instead (with a proper comment
and changelog)?

Thanks,

- Juri

>From 108ecdff52b154ea2c79d4aac552ddf1ead871c7 Mon Sep 17 00:00:00 2001
From: Juri Lelli <juri.lelli@arm.com>
Date: Wed, 29 Oct 2014 16:09:06 +0000
Subject: [PATCH] sched/deadline: fix artificial overrun introduced by
yield_task_dl

Signed-off-by: Juri Lelli <juri.lelli@arm.com>
---
kernel/sched/deadline.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 2e31a30..db6ad38 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -633,7 +633,7 @@ static void update_curr_dl(struct rq *rq)

sched_rt_avg_update(rq, delta_exec);

- dl_se->runtime -= delta_exec;
+ dl_se->runtime -= dl_se->dl_yielded ? 0 : delta_exec;
if (dl_runtime_exceeded(rq, dl_se)) {
__dequeue_task_dl(rq, curr, 0);
if (likely(start_dl_timer(dl_se, curr->dl.dl_boosted)))
--
2.1.2

> Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
> ---
> kernel/sched/deadline.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index abfaf3d..d4ffc1e 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -568,7 +568,12 @@ static
> int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se)
> {
> int dmiss = dl_time_before(dl_se->deadline, rq_clock(rq));
> - int rorun = dl_se->runtime <= 0;
> + int rorun;
> +
> + if (dl_se->dl_yielded && dl_se->runtime > 0)
> + dl_se->runtime = 0;
> +
> + rorun = dl_se->runtime <= 0;
>
> if (!rorun && !dmiss)
> return 0;
> @@ -897,10 +902,8 @@ static void yield_task_dl(struct rq *rq)
> * it and the bandwidth timer will wake it up and will give it
> * new scheduling parameters (thanks to dl_yielded=1).
> */
> - if (p->dl.runtime > 0) {
> + if (p->dl.runtime > 0)
> rq->curr->dl.dl_yielded = 1;
> - p->dl.runtime = 0;
> - }
> update_curr_dl(rq);
> }
>
>