2022-08-26 03:10:41

by Shang XiaoJing

[permalink] [raw]
Subject: [PATCH -next] sched/deadline: Add start_new_instance helper

Wrap repeated code in helper function start_new_instance, which set
the deadline and runtiem of input dl_se based on pi_of(dl_se). Note that
setup_new_dl_entity originally set the deadline and runtime base on
dl_se, which should equals to pi_of(dl_se) for non-boosted task.

Signed-off-by: Shang XiaoJing <[email protected]>
---
kernel/sched/deadline.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 4a40a462717c..5e9c28847610 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -770,6 +770,13 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags);
static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags);
static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p, int flags);

+static inline void start_new_instance(struct sched_dl_entity *dl_se, struct rq *rq)
+{
+ /* for non-boosted task, pi_of(dl_se) == dl_se */
+ dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
+ dl_se->runtime = pi_of(dl_se)->dl_runtime;
+}
+
/*
* We are being explicitly informed that a new instance is starting,
* and this means that:
@@ -803,8 +810,7 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
* future; in fact, we must consider execution overheads (time
* spent on hardirq context, etc.).
*/
- dl_se->deadline = rq_clock(rq) + dl_se->dl_deadline;
- dl_se->runtime = dl_se->dl_runtime;
+ start_new_instance(dl_se, rq);
}

/*
@@ -836,10 +842,8 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se)
* This could be the case for a !-dl task that is boosted.
* Just go with full inherited parameters.
*/
- if (dl_se->dl_deadline == 0) {
- dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
- dl_se->runtime = pi_of(dl_se)->dl_runtime;
- }
+ if (dl_se->dl_deadline == 0)
+ start_new_instance(dl_se, rq);

if (dl_se->dl_yielded && dl_se->runtime > 0)
dl_se->runtime = 0;
@@ -866,8 +870,7 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se)
*/
if (dl_time_before(dl_se->deadline, rq_clock(rq))) {
printk_deferred_once("sched: DL replenish lagged too much\n");
- dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
- dl_se->runtime = pi_of(dl_se)->dl_runtime;
+ start_new_instance(dl_se, rq);
}

if (dl_se->dl_yielded)
@@ -1024,8 +1027,7 @@ static void update_dl_entity(struct sched_dl_entity *dl_se)
return;
}

- dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
- dl_se->runtime = pi_of(dl_se)->dl_runtime;
+ start_new_instance(dl_se, rq);
}
}

--
2.17.1


2022-08-26 08:13:22

by Shang XiaoJing

[permalink] [raw]
Subject: Re: [PATCH -next] sched/deadline: Add start_new_instance helper


On 2022/8/26 15:15, Daniel Bristot de Oliveira wrote:
> On 8/26/22 05:15, Shang XiaoJing wrote:
>> Wrap repeated code in helper function start_new_instance, which set
>> the deadline and runtiem of input dl_se based on pi_of(dl_se). Note that
> ^ runtime
oops
>> setup_new_dl_entity originally set the deadline and runtime base on
>> dl_se, which should equals to pi_of(dl_se) for non-boosted task.
>>
>> Signed-off-by: Shang XiaoJing <[email protected]>
>> ---
>> kernel/sched/deadline.c | 22 ++++++++++++----------
>> 1 file changed, 12 insertions(+), 10 deletions(-)
>>
>> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
>> index 4a40a462717c..5e9c28847610 100644
>> --- a/kernel/sched/deadline.c
>> +++ b/kernel/sched/deadline.c
>> @@ -770,6 +770,13 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags);
>> static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags);
>> static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p, int flags);
> again, this is not a good function name. Maybe, dl_replenish_new_period() ?

right, i have thought like replenish_new_instance, but when i'm making
patch,  i was worried that "replenish" is only for ENQUEUE_REPLENISH.

what about dl_start_new_period? which means a new deadline will be set,
rather than

    dl_se->deadline += pi_of(dl_se)->dl_period;

in replenish_dl_entity.

>> +static inline void start_new_instance(struct sched_dl_entity *dl_se, struct rq *rq)
>> +{
>> + /* for non-boosted task, pi_of(dl_se) == dl_se */
>> + dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
>> + dl_se->runtime = pi_of(dl_se)->dl_runtime;
>> +}
>> +
> -- Daniel

Thanks,

Shang XiaoJing

Subject: Re: [PATCH -next] sched/deadline: Add start_new_instance helper

On 8/26/22 05:15, Shang XiaoJing wrote:
> Wrap repeated code in helper function start_new_instance, which set
> the deadline and runtiem of input dl_se based on pi_of(dl_se). Note that
^ runtime
> setup_new_dl_entity originally set the deadline and runtime base on
> dl_se, which should equals to pi_of(dl_se) for non-boosted task.
>
> Signed-off-by: Shang XiaoJing <[email protected]>
> ---
> kernel/sched/deadline.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index 4a40a462717c..5e9c28847610 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -770,6 +770,13 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags);
> static void __dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags);
> static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p, int flags);

again, this is not a good function name. Maybe, dl_replenish_new_period() ?

> +static inline void start_new_instance(struct sched_dl_entity *dl_se, struct rq *rq)
> +{
> + /* for non-boosted task, pi_of(dl_se) == dl_se */
> + dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
> + dl_se->runtime = pi_of(dl_se)->dl_runtime;
> +}
> +

-- Daniel

Subject: Re: [PATCH -next] sched/deadline: Add start_new_instance helper

On 8/26/22 09:40, shangxiaojing wrote:
>> again, this is not a good function name. Maybe, dl_replenish_new_period() ?
>
> right, i have thought like replenish_new_instance, but when i'm making
> patch,  i was worried that "replenish" is only for ENQUEUE_REPLENISH.

I see, but that is a flag, not the action.

> what about dl_start_new_period? which means a new deadline will be set, rather than

The thing it is doing is replenishing...

>     dl_se->deadline += pi_of(dl_se)->dl_period;
>
> in replenish_dl_entity.

that is why I added "new_period".... so replenish_dl_new_period() to keep the consistency.

>>> +static inline void start_new_instance(struct sched_dl_entity *dl_se, struct rq *rq)
>>>
>>> +{
>>> +    /* for non-boosted task, pi_of(dl_se) == dl_se */
>>> +    dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
>>> +    dl_se->runtime = pi_of(dl_se)->dl_runtime;
>>> +}
>>> +
>> -- Daniel

-- Daniel

2022-08-26 09:19:01

by Shang XiaoJing

[permalink] [raw]
Subject: Re: [PATCH -next] sched/deadline: Add start_new_instance helper


On 2022/8/26 16:57, Daniel Bristot de Oliveira wrote:
> On 8/26/22 09:40, shangxiaojing wrote:
>>> again, this is not a good function name. Maybe, dl_replenish_new_period() ?
>> right, i have thought like replenish_new_instance, but when i'm making
>> patch,  i was worried that "replenish" is only for ENQUEUE_REPLENISH.
> I see, but that is a flag, not the action.
>
>> what about dl_start_new_period? which means a new deadline will be set, rather than
> The thing it is doing is replenishing...
>
>>     dl_se->deadline += pi_of(dl_se)->dl_period;
>>
>> in replenish_dl_entity.
> that is why I added "new_period".... so replenish_dl_new_period() to keep the consistency.

ok, i'll use replenish_dl_new_period in v2.

>>>> +static inline void start_new_instance(struct sched_dl_entity *dl_se, struct rq *rq)
>>>>
>>>> +{
>>>> +    /* for non-boosted task, pi_of(dl_se) == dl_se */
>>>> +    dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
>>>> +    dl_se->runtime = pi_of(dl_se)->dl_runtime;
>>>> +}
>>>> +
>>> -- Daniel
> -- Daniel

Thanks,

Shang XiaoJing