Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1433989 > unrolled thread
| Started by | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| First post | 2016-06-29 21:10 +0200 |
| Last post | 2016-07-06 10:50 +0200 |
| Articles | 14 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-06-29 21:10 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity luca abeni <luca.abeni@unitn.it> - 2016-07-04 11:10 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-04 11:30 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Wanpeng Li <kernellwp@gmail.com> - 2016-07-05 09:40 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-05 11:00 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Steven Rostedt <rostedt@goodmis.org> - 2016-07-05 16:30 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-05 16:40 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Steven Rostedt <rostedt@goodmis.org> - 2016-07-05 18:50 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-05 19:00 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity luca abeni <luca.abeni@unitn.it> - 2016-07-06 10:50 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-07 10:40 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Steven Rostedt <rostedt@goodmis.org> - 2016-07-07 15:50 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity Juri Lelli <juri.lelli@arm.com> - 2016-07-08 13:40 +0200
Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity luca abeni <luca.abeni@unitn.it> - 2016-07-06 10:50 +0200
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-06-29 21:10 +0200 |
| Subject | [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rPt22-85k-13@gated-at.bofh.it> |
setup_new_dl_entity() takes two parameters, but it only actually uses
one of them, under a different name, to setup a new dl_entity, after:
2f9f3fdc928 "sched/deadline: Remove dl_new from struct sched_dl_entity"
as we currently do
setup_new_dl_entity(&p->dl, &p->dl)
However, before Luca's change we were doing
setup_new_dl_entity(dl_se, pi_se)
in update_dl_entity() for a dl_se->new entity: we were using pi_se's
parameters (the potential PI donor) for setting up a new entity.
Restore this behaviour (as we want to correctly initialize parameters of
a boosted task that enters DEADLINE) by removing the useless second
parameter of setup_new_dl_entity() and retrieving the top waiter
directly from inside that function.
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Luca Abeni <luca.abeni@unitn.it>
Signed-off-by: Juri Lelli <juri.lelli@arm.com>
---
Changes from v1:
- Steve pointed out that we were actually using the second parameter
to permorm initialization
- Luca confirmed that behavior is slightly changed w.r.t. before his
change
- changelog updated and original behavior restored
---
kernel/sched/deadline.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index fcb7f0217ff4..2000ad2294d5 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
* one, and to (try to!) reconcile itself with its own scheduling
* parameters.
*/
-static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
- struct sched_dl_entity *pi_se)
+static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
{
struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
struct rq *rq = rq_of_dl_rq(dl_rq);
+ struct task_struct *pi_task = rt_mutex_get_top_task(dl_task_of(dl_se));
+ struct sched_dl_entity *pi_se = dl_se;
WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
@@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
return;
/*
+ * Use the scheduling parameters of the top pi-waiter task,
+ * if we have one from which we can inherit a deadline.
+ */
+ if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio))
+ pi_se = &pi_task->dl;
+
+ /*
* We use the regular wall clock time to set deadlines in the
* future; in fact, we must consider execution overheads (time
* spent on hardirq context, etc.).
@@ -1721,7 +1729,7 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p)
static void switched_to_dl(struct rq *rq, struct task_struct *p)
{
if (dl_time_before(p->dl.deadline, rq_clock(rq)))
- setup_new_dl_entity(&p->dl, &p->dl);
+ setup_new_dl_entity(&p->dl);
if (task_on_rq_queued(p) && rq->curr != p) {
#ifdef CONFIG_SMP
--
2.7.0
[toc] | [next] | [standalone]
| From | luca abeni <luca.abeni@unitn.it> |
|---|---|
| Date | 2016-07-04 11:10 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rR837-3Kh-11@gated-at.bofh.it> |
| In reply to | #1433989 |
Hi Juri,
On Wed, 29 Jun 2016 20:07:43 +0100
Juri Lelli <juri.lelli@arm.com> wrote:
> setup_new_dl_entity() takes two parameters, but it only actually uses
> one of them, under a different name, to setup a new dl_entity, after:
>
> 2f9f3fdc928 "sched/deadline: Remove dl_new from struct
> sched_dl_entity"
>
> as we currently do
>
> setup_new_dl_entity(&p->dl, &p->dl)
>
> However, before Luca's change we were doing
>
> setup_new_dl_entity(dl_se, pi_se)
>
> in update_dl_entity() for a dl_se->new entity: we were using pi_se's
> parameters (the potential PI donor) for setting up a new entity.
>
> Restore this behaviour (as we want to correctly initialize parameters
> of a boosted task that enters DEADLINE) by removing the useless second
> parameter of setup_new_dl_entity() and retrieving the top waiter
> directly from inside that function.
I did not have time to test this patch yet, but it still looks good to
me.
Thanks,
Luca
>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Luca Abeni <luca.abeni@unitn.it>
> Signed-off-by: Juri Lelli <juri.lelli@arm.com>
>
> ---
> Changes from v1:
> - Steve pointed out that we were actually using the second
> parameter to permorm initialization
> - Luca confirmed that behavior is slightly changed w.r.t. before
> his change
> - changelog updated and original behavior restored
> ---
> kernel/sched/deadline.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index fcb7f0217ff4..2000ad2294d5 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq
> *rq, struct task_struct *p,
> * one, and to (try to!) reconcile itself with its own scheduling
> * parameters.
> */
> -static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> - struct sched_dl_entity *pi_se)
> +static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
> {
> struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
> struct rq *rq = rq_of_dl_rq(dl_rq);
> + struct task_struct *pi_task =
> rt_mutex_get_top_task(dl_task_of(dl_se));
> + struct sched_dl_entity *pi_se = dl_se;
>
> WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
>
> @@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct
> sched_dl_entity *dl_se, return;
>
> /*
> + * Use the scheduling parameters of the top pi-waiter task,
> + * if we have one from which we can inherit a deadline.
> + */
> + if (pi_task && dl_se->dl_boosted &&
> dl_prio(pi_task->normal_prio))
> + pi_se = &pi_task->dl;
> +
> + /*
> * We use the regular wall clock time to set deadlines in the
> * future; in fact, we must consider execution overheads
> (time
> * spent on hardirq context, etc.).
> @@ -1721,7 +1729,7 @@ static void switched_from_dl(struct rq *rq,
> struct task_struct *p) static void switched_to_dl(struct rq *rq,
> struct task_struct *p) {
> if (dl_time_before(p->dl.deadline, rq_clock(rq)))
> - setup_new_dl_entity(&p->dl, &p->dl);
> + setup_new_dl_entity(&p->dl);
>
> if (task_on_rq_queued(p) && rq->curr != p) {
> #ifdef CONFIG_SMP
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-04 11:30 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rR8mt-3QN-11@gated-at.bofh.it> |
| In reply to | #1436349 |
On 04/07/16 11:03, Luca Abeni wrote: > Hi Juri, > > On Wed, 29 Jun 2016 20:07:43 +0100 > Juri Lelli <juri.lelli@arm.com> wrote: > > > setup_new_dl_entity() takes two parameters, but it only actually uses > > one of them, under a different name, to setup a new dl_entity, after: > > > > 2f9f3fdc928 "sched/deadline: Remove dl_new from struct > > sched_dl_entity" > > > > as we currently do > > > > setup_new_dl_entity(&p->dl, &p->dl) > > > > However, before Luca's change we were doing > > > > setup_new_dl_entity(dl_se, pi_se) > > > > in update_dl_entity() for a dl_se->new entity: we were using pi_se's > > parameters (the potential PI donor) for setting up a new entity. > > > > Restore this behaviour (as we want to correctly initialize parameters > > of a boosted task that enters DEADLINE) by removing the useless second > > parameter of setup_new_dl_entity() and retrieving the top waiter > > directly from inside that function. > I did not have time to test this patch yet, but it still looks good to > me. > Thanks for reviewing it. Best, - Juri
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-05 09:40 +0200 |
| Message-ID | <rRt7A-8au-21@gated-at.bofh.it> |
| In reply to | #1433989 |
2016-06-30 3:07 GMT+08:00 Juri Lelli <juri.lelli@arm.com>:
> setup_new_dl_entity() takes two parameters, but it only actually uses
> one of them, under a different name, to setup a new dl_entity, after:
>
> 2f9f3fdc928 "sched/deadline: Remove dl_new from struct sched_dl_entity"
>
> as we currently do
>
> setup_new_dl_entity(&p->dl, &p->dl)
>
> However, before Luca's change we were doing
>
> setup_new_dl_entity(dl_se, pi_se)
>
> in update_dl_entity() for a dl_se->new entity: we were using pi_se's
> parameters (the potential PI donor) for setting up a new entity.
>
> Restore this behaviour (as we want to correctly initialize parameters of
> a boosted task that enters DEADLINE) by removing the useless second
> parameter of setup_new_dl_entity() and retrieving the top waiter
> directly from inside that function.
>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Luca Abeni <luca.abeni@unitn.it>
> Signed-off-by: Juri Lelli <juri.lelli@arm.com>
>
Reviewed-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
> Changes from v1:
> - Steve pointed out that we were actually using the second parameter
> to permorm initialization
> - Luca confirmed that behavior is slightly changed w.r.t. before his
> change
> - changelog updated and original behavior restored
> ---
> kernel/sched/deadline.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index fcb7f0217ff4..2000ad2294d5 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
> * one, and to (try to!) reconcile itself with its own scheduling
> * parameters.
> */
> -static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> - struct sched_dl_entity *pi_se)
> +static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
> {
> struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
> struct rq *rq = rq_of_dl_rq(dl_rq);
> + struct task_struct *pi_task = rt_mutex_get_top_task(dl_task_of(dl_se));
> + struct sched_dl_entity *pi_se = dl_se;
>
> WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
>
> @@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> return;
>
> /*
> + * Use the scheduling parameters of the top pi-waiter task,
> + * if we have one from which we can inherit a deadline.
> + */
> + if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio))
> + pi_se = &pi_task->dl;
> +
> + /*
> * We use the regular wall clock time to set deadlines in the
> * future; in fact, we must consider execution overheads (time
> * spent on hardirq context, etc.).
> @@ -1721,7 +1729,7 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p)
> static void switched_to_dl(struct rq *rq, struct task_struct *p)
> {
> if (dl_time_before(p->dl.deadline, rq_clock(rq)))
> - setup_new_dl_entity(&p->dl, &p->dl);
> + setup_new_dl_entity(&p->dl);
>
> if (task_on_rq_queued(p) && rq->curr != p) {
> #ifdef CONFIG_SMP
> --
> 2.7.0
>
--
Regards,
Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-05 11:00 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRun0-ty-33@gated-at.bofh.it> |
| In reply to | #1436819 |
On 05/07/16 15:37, Wanpeng Li wrote: > 2016-06-30 3:07 GMT+08:00 Juri Lelli <juri.lelli@arm.com>: > > setup_new_dl_entity() takes two parameters, but it only actually uses > > one of them, under a different name, to setup a new dl_entity, after: > > > > 2f9f3fdc928 "sched/deadline: Remove dl_new from struct sched_dl_entity" > > > > as we currently do > > > > setup_new_dl_entity(&p->dl, &p->dl) > > > > However, before Luca's change we were doing > > > > setup_new_dl_entity(dl_se, pi_se) > > > > in update_dl_entity() for a dl_se->new entity: we were using pi_se's > > parameters (the potential PI donor) for setting up a new entity. > > > > Restore this behaviour (as we want to correctly initialize parameters of > > a boosted task that enters DEADLINE) by removing the useless second > > parameter of setup_new_dl_entity() and retrieving the top waiter > > directly from inside that function. > > > > Cc: Ingo Molnar <mingo@redhat.com> > > Cc: Peter Zijlstra <peterz@infradead.org> > > Cc: Steven Rostedt <rostedt@goodmis.org> > > Cc: Luca Abeni <luca.abeni@unitn.it> > > Signed-off-by: Juri Lelli <juri.lelli@arm.com> > > > > Reviewed-by: Wanpeng Li <wanpeng.li@hotmail.com> > Thanks! - Juri
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-07-05 16:30 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRzwn-3YJ-43@gated-at.bofh.it> |
| In reply to | #1433989 |
On Wed, 29 Jun 2016 20:07:43 +0100
Juri Lelli <juri.lelli@arm.com> wrote:
> ---
> kernel/sched/deadline.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index fcb7f0217ff4..2000ad2294d5 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
> * one, and to (try to!) reconcile itself with its own scheduling
> * parameters.
> */
> -static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> - struct sched_dl_entity *pi_se)
> +static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
> {
> struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
> struct rq *rq = rq_of_dl_rq(dl_rq);
> + struct task_struct *pi_task = rt_mutex_get_top_task(dl_task_of(dl_se));
> + struct sched_dl_entity *pi_se = dl_se;
>
> WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
>
> @@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> return;
>
> /*
> + * Use the scheduling parameters of the top pi-waiter task,
> + * if we have one from which we can inherit a deadline.
> + */
> + if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio))
> + pi_se = &pi_task->dl;
> +
OK, I'm micro-optimizing now, but hey, isn't this a fast path?
What about changing the above to:
struct task_struct *pi_task;
[...]
if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio &&
(pi_task = rt_mutex_get_top_task(dl_task_of(dl_se)))
pe_se = &pi_task->dl;
This way we don't need to do any work of looking at
rt_mutex_get_top_task() for the normal case.
-- Steve
> + /*
> * We use the regular wall clock time to set deadlines in the
> * future; in fact, we must consider execution overheads (time
> * spent on hardirq context, etc.).
> @@ -1721,7 +1729,7 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p)
> static void switched_to_dl(struct rq *rq, struct task_struct *p)
> {
> if (dl_time_before(p->dl.deadline, rq_clock(rq)))
> - setup_new_dl_entity(&p->dl, &p->dl);
> + setup_new_dl_entity(&p->dl);
>
> if (task_on_rq_queued(p) && rq->curr != p) {
> #ifdef CONFIG_SMP
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-05 16:40 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRzG1-436-3@gated-at.bofh.it> |
| In reply to | #1437056 |
On 05/07/16 10:20, Steven Rostedt wrote:
> On Wed, 29 Jun 2016 20:07:43 +0100
> Juri Lelli <juri.lelli@arm.com> wrote:
>
>
> > ---
> > kernel/sched/deadline.c | 14 +++++++++++---
> > 1 file changed, 11 insertions(+), 3 deletions(-)
> >
> > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> > index fcb7f0217ff4..2000ad2294d5 100644
> > --- a/kernel/sched/deadline.c
> > +++ b/kernel/sched/deadline.c
> > @@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
> > * one, and to (try to!) reconcile itself with its own scheduling
> > * parameters.
> > */
> > -static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> > - struct sched_dl_entity *pi_se)
> > +static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se)
> > {
> > struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
> > struct rq *rq = rq_of_dl_rq(dl_rq);
> > + struct task_struct *pi_task = rt_mutex_get_top_task(dl_task_of(dl_se));
> > + struct sched_dl_entity *pi_se = dl_se;
> >
> > WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
> >
> > @@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct sched_dl_entity *dl_se,
> > return;
> >
> > /*
> > + * Use the scheduling parameters of the top pi-waiter task,
> > + * if we have one from which we can inherit a deadline.
> > + */
> > + if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio))
> > + pi_se = &pi_task->dl;
> > +
>
> OK, I'm micro-optimizing now, but hey, isn't this a fast path?
>
> What about changing the above to:
>
> struct task_struct *pi_task;
> [...]
>
> if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio &&
^
OK, we need to reorder these two
V
> (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se)))
> pe_se = &pi_task->dl;
>
> This way we don't need to do any work of looking at
> rt_mutex_get_top_task() for the normal case.
>
But, yes. Looks good to me. I'll shoot a v3 ASAP.
Thanks,
- Juri
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-07-05 18:50 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRBHR-5kY-53@gated-at.bofh.it> |
| In reply to | #1437057 |
On Tue, 5 Jul 2016 15:39:33 +0100 Juri Lelli <juri.lelli@arm.com> wrote: return; > > > > > > /* > > > + * Use the scheduling parameters of the top pi-waiter task, > > > + * if we have one from which we can inherit a deadline. > > > + */ > > > + if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio)) > > > + pi_se = &pi_task->dl; > > > + > > > > OK, I'm micro-optimizing now, but hey, isn't this a fast path? > > > > What about changing the above to: > > > > struct task_struct *pi_task; > > [...] > > > > if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio && > ^ > OK, we need to reorder these two > V > > (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se))) > > pe_se = &pi_task->dl; Opps, you're right. > > > > This way we don't need to do any work of looking at > > rt_mutex_get_top_task() for the normal case. > > > > But, yes. Looks good to me. I'll shoot a v3 ASAP. I have to ask, should there be any check if the dl_se has a shorter deadline than the pi one? -- Steve
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-05 19:00 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRBRv-5oU-1@gated-at.bofh.it> |
| In reply to | #1437190 |
On 05/07/16 12:47, Steven Rostedt wrote: > On Tue, 5 Jul 2016 15:39:33 +0100 > Juri Lelli <juri.lelli@arm.com> wrote: > > return; > > > > > > > > /* > > > > + * Use the scheduling parameters of the top pi-waiter task, > > > > + * if we have one from which we can inherit a deadline. > > > > + */ > > > > + if (pi_task && dl_se->dl_boosted && dl_prio(pi_task->normal_prio)) > > > > + pi_se = &pi_task->dl; > > > > + > > > > > > OK, I'm micro-optimizing now, but hey, isn't this a fast path? > > > > > > What about changing the above to: > > > > > > struct task_struct *pi_task; > > > [...] > > > > > > if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio && > > ^ > > OK, we need to reorder these two > > V > > > (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se))) > > > pe_se = &pi_task->dl; > > Opps, you're right. > > > > > > > This way we don't need to do any work of looking at > > > rt_mutex_get_top_task() for the normal case. > > > > > > > But, yes. Looks good to me. I'll shoot a v3 ASAP. > > I have to ask, should there be any check if the dl_se has a shorter > deadline than the pi one? > Yeah. I wondered the same actually. I convinced myself that, since the task is boosted, we assume that the donor will have a shorter deadline. We seem to be doing the same elsewhere, but Luca was saying some time ago that the DI thing my have some problems and needs to be revised. Is is fair enough fixing this bit in accordance with the current (maybe broken) behaviour and then spend time reviewing the whole thing, or do we want to do both at the same time (which will of course require more time)? Best, - Juri
[toc] | [prev] | [next] | [standalone]
| From | luca abeni <luca.abeni@unitn.it> |
|---|---|
| Date | 2016-07-06 10:50 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRQGS-6SL-27@gated-at.bofh.it> |
| In reply to | #1437191 |
On Tue, 5 Jul 2016 17:58:30 +0100 Juri Lelli <juri.lelli@arm.com> wrote: > On 05/07/16 12:47, Steven Rostedt wrote: > > On Tue, 5 Jul 2016 15:39:33 +0100 > > Juri Lelli <juri.lelli@arm.com> wrote: > > > > return; > > > > > > > > > > /* > > > > > + * Use the scheduling parameters of the top > > > > > pi-waiter task, > > > > > + * if we have one from which we can inherit a > > > > > deadline. > > > > > + */ > > > > > + if (pi_task && dl_se->dl_boosted && > > > > > dl_prio(pi_task->normal_prio)) > > > > > + pi_se = &pi_task->dl; > > > > > + > > > > > > > > OK, I'm micro-optimizing now, but hey, isn't this a fast path? > > > > > > > > What about changing the above to: > > > > > > > > struct task_struct *pi_task; > > > > [...] > > > > > > > > if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio > > > > && > > > ^ > > > OK, we need to reorder these two > > > V > > > > (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se))) > > > > pe_se = &pi_task->dl; > > > > Opps, you're right. > > > > > > > > > > This way we don't need to do any work of looking at > > > > rt_mutex_get_top_task() for the normal case. > > > > > > > > > > But, yes. Looks good to me. I'll shoot a v3 ASAP. > > > > I have to ask, should there be any check if the dl_se has a shorter > > deadline than the pi one? > > > > Yeah. I wondered the same actually. I convinced myself that, since the > task is boosted, we assume that the donor will have a shorter > deadline. Do you mean relative deadline (dl_se->dl_deadline) or absolute (scheduling) dealine (dl_se->deadline)? If I understand well, here we are in setup_new_dl_entity(), right? This should be called only from switched_to_dl(); so, dl_se is from a task that is switching to -deadline. If it is dl_boosted, it means that it is switching from SCHED_OTHER (or RT) to -deadline because of inheritance... So, it is very likely that dl_se->dl_deadline is not meaningful. Moreover, setup_new_dl_entity() is only called if the current scheduling deadline of the task is not usable (that is, if "dl_time_before(p->dl.deadline, rq_clock(rq)"). So, dl_se->deadline will be surely smaller than pi_se->deadline... But the inheritance has to happen anyway. > We seem to be doing the same elsewhere, but Luca was saying > some time ago that the DI thing my have some problems and needs to be > revised. My doubts regarding the inheritance code currently used for -deadline tasks are due to the fact that it is not clear which kind of inheritance algorithm is used... I think it should use deadline inheritance, that, AFAIK, says that when task T1 block waiting for task T2, T2 can inherit T1's _absolute_ deadline - if it is earlier than T2's one. But the current code seems to be using relative deadlines (dl_deadline) to decide the inheritance... Having a better look at this is in my TODO list... But I still need to find some time :) Luca > Is is fair enough fixing this bit in accordance with the > current (maybe broken) behaviour and then spend time reviewing the > whole thing, or do we want to do both at the same time (which will of > course require more time)? > > Best, > > - Juri
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-07 10:40 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rSd0J-4uy-11@gated-at.bofh.it> |
| In reply to | #1437552 |
On 06/07/16 10:44, Luca Abeni wrote: > On Tue, 5 Jul 2016 17:58:30 +0100 > Juri Lelli <juri.lelli@arm.com> wrote: > > > On 05/07/16 12:47, Steven Rostedt wrote: > > > On Tue, 5 Jul 2016 15:39:33 +0100 > > > Juri Lelli <juri.lelli@arm.com> wrote: > > > > > > return; > > > > > > > > > > > > /* > > > > > > + * Use the scheduling parameters of the top > > > > > > pi-waiter task, > > > > > > + * if we have one from which we can inherit a > > > > > > deadline. > > > > > > + */ > > > > > > + if (pi_task && dl_se->dl_boosted && > > > > > > dl_prio(pi_task->normal_prio)) > > > > > > + pi_se = &pi_task->dl; > > > > > > + > > > > > > > > > > OK, I'm micro-optimizing now, but hey, isn't this a fast path? > > > > > > > > > > What about changing the above to: > > > > > > > > > > struct task_struct *pi_task; > > > > > [...] > > > > > > > > > > if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio > > > > > && > > > > ^ > > > > OK, we need to reorder these two > > > > V > > > > > (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se))) > > > > > pe_se = &pi_task->dl; > > > > > > Opps, you're right. > > > > > > > > > > > > > This way we don't need to do any work of looking at > > > > > rt_mutex_get_top_task() for the normal case. > > > > > > > > > > > > > But, yes. Looks good to me. I'll shoot a v3 ASAP. > > > > > > I have to ask, should there be any check if the dl_se has a shorter > > > deadline than the pi one? > > > > > > > Yeah. I wondered the same actually. I convinced myself that, since the > > task is boosted, we assume that the donor will have a shorter > > deadline. > > Do you mean relative deadline (dl_se->dl_deadline) or absolute > (scheduling) dealine (dl_se->deadline)? > > If I understand well, here we are in setup_new_dl_entity(), right? > This should be called only from switched_to_dl(); so, dl_se is from a > task that is switching to -deadline. If it is dl_boosted, it means that > it is switching from SCHED_OTHER (or RT) to -deadline because of > inheritance... So, it is very likely that dl_se->dl_deadline is not > meaningful. > Right, very same thought I also had (and forgot to mention). So, we cannot really do here the check Steve was wondering about. > Moreover, setup_new_dl_entity() is only called if the current > scheduling deadline of the task is not usable (that is, if > "dl_time_before(p->dl.deadline, rq_clock(rq)"). So, dl_se->deadline > will be surely smaller than pi_se->deadline... But the inheritance has > to happen anyway. > > > > We seem to be doing the same elsewhere, but Luca was saying > > some time ago that the DI thing my have some problems and needs to be > > revised. > > My doubts regarding the inheritance code currently used for -deadline > tasks are due to the fact that it is not clear which kind of > inheritance algorithm is used... > I think it should use deadline inheritance, that, AFAIK, says that when > task T1 block waiting for task T2, T2 can inherit T1's _absolute_ > deadline - if it is earlier than T2's one. > But the current code seems to be using relative deadlines (dl_deadline) > to decide the inheritance... > True. Problem is however that, even if enforcing is disabled for a boosted task, we keep postponing the task's deadline when it depletes its runtime (soft-CBS). So, which one should we use to do so? At the instant of time the task gets a new potential donor this donor might have a shorter absolute deadline. But the task's relative deadline might be better (shorter w.r.t. donor's relative) to postpone the absolute one when needed. > Having a better look at this is in my TODO list... But I still need to > find some time :) > Same here. No spare cycles right now to have a thorough look at this. :( Thanks, - Juri
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-07-07 15:50 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rShQK-7yA-33@gated-at.bofh.it> |
| In reply to | #1438355 |
On Thu, 7 Jul 2016 09:39:09 +0100 Juri Lelli <juri.lelli@arm.com> wrote: > > Having a better look at this is in my TODO list... But I still need to > > find some time :) > > > > Same here. No spare cycles right now to have a thorough look at this. :( All in all, this should not hold up the current patch set. Maybe mark it with a "TODO" and try to remember to look into it at another time. The chances that we are switching from a SCHED_OTHER/RT to DEADLINE that is already boosted is extremely rare. It can happen, but it's not critical enough to hold this up. -- Steve
[toc] | [prev] | [next] | [standalone]
| From | Juri Lelli <juri.lelli@arm.com> |
|---|---|
| Date | 2016-07-08 13:40 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rSCiu-49I-29@gated-at.bofh.it> |
| In reply to | #1438632 |
On 07/07/16 09:47, Steven Rostedt wrote: > On Thu, 7 Jul 2016 09:39:09 +0100 > Juri Lelli <juri.lelli@arm.com> wrote: > > > > > Having a better look at this is in my TODO list... But I still need to > > > find some time :) > > > > > > > Same here. No spare cycles right now to have a thorough look at this. :( > > All in all, this should not hold up the current patch set. Maybe mark > it with a "TODO" and try to remember to look into it at another time. Added to my TODO list (right after reviewing Luca's reclaiming bits next version and fix the cpuset issue :/) and posted v3. > The chances that we are switching from a SCHED_OTHER/RT to DEADLINE > that is already boosted is extremely rare. It can happen, but it's not > critical enough to hold this up. > Thanks, - Juri
[toc] | [prev] | [next] | [standalone]
| From | luca abeni <luca.abeni@unitn.it> |
|---|---|
| Date | 2016-07-06 10:50 +0200 |
| Subject | Re: [PATCH v2] sched/deadline: remove useless param from setup_new_dl_entity |
| Message-ID | <rRQGS-6SL-19@gated-at.bofh.it> |
| In reply to | #1437056 |
On Tue, 5 Jul 2016 10:20:13 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:
> On Wed, 29 Jun 2016 20:07:43 +0100
> Juri Lelli <juri.lelli@arm.com> wrote:
>
>
> > ---
> > kernel/sched/deadline.c | 14 +++++++++++---
> > 1 file changed, 11 insertions(+), 3 deletions(-)
> >
> > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> > index fcb7f0217ff4..2000ad2294d5 100644
> > --- a/kernel/sched/deadline.c
> > +++ b/kernel/sched/deadline.c
> > @@ -346,11 +346,12 @@ static void check_preempt_curr_dl(struct rq
> > *rq, struct task_struct *p,
> > * one, and to (try to!) reconcile itself with its own scheduling
> > * parameters.
> > */
> > -static inline void setup_new_dl_entity(struct sched_dl_entity
> > *dl_se,
> > - struct sched_dl_entity
> > *pi_se) +static inline void setup_new_dl_entity(struct
> > sched_dl_entity *dl_se) {
> > struct dl_rq *dl_rq = dl_rq_of_se(dl_se);
> > struct rq *rq = rq_of_dl_rq(dl_rq);
> > + struct task_struct *pi_task =
> > rt_mutex_get_top_task(dl_task_of(dl_se));
> > + struct sched_dl_entity *pi_se = dl_se;
> >
> > WARN_ON(dl_time_before(rq_clock(rq), dl_se->deadline));
> >
> > @@ -363,6 +364,13 @@ static inline void setup_new_dl_entity(struct
> > sched_dl_entity *dl_se, return;
> >
> > /*
> > + * Use the scheduling parameters of the top pi-waiter task,
> > + * if we have one from which we can inherit a deadline.
> > + */
> > + if (pi_task && dl_se->dl_boosted &&
> > dl_prio(pi_task->normal_prio))
> > + pi_se = &pi_task->dl;
> > +
>
> OK, I'm micro-optimizing now, but hey, isn't this a fast path?
>
> What about changing the above to:
>
> struct task_struct *pi_task;
> [...]
>
> if (dl_se->dl_boosted && dl_prio(pi_task->normal_prio &&
> (pi_task = rt_mutex_get_top_task(dl_task_of(dl_se)))
> pe_se = &pi_task->dl;
>
> This way we don't need to do any work of looking at
> rt_mutex_get_top_task() for the normal case.
If something like this is done, I think that enqueue_task_dl() (that
contains similar code) should be updated too.
Thanks,
Luca
>
> -- Steve
>
>
> > + /*
> > * We use the regular wall clock time to set deadlines in
> > the
> > * future; in fact, we must consider execution overheads
> > (time
> > * spent on hardirq context, etc.).
> > @@ -1721,7 +1729,7 @@ static void switched_from_dl(struct rq *rq,
> > struct task_struct *p) static void switched_to_dl(struct rq *rq,
> > struct task_struct *p) {
> > if (dl_time_before(p->dl.deadline, rq_clock(rq)))
> > - setup_new_dl_entity(&p->dl, &p->dl);
> > + setup_new_dl_entity(&p->dl);
> >
> > if (task_on_rq_queued(p) && rq->curr != p) {
> > #ifdef CONFIG_SMP
>
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web