Skip to contentSkip to conversation

sched/deadline: introduce start_hrtick_dl for !CONFIG_SCHED_HRTICK

PATCH In review Wanpeng Li 4 participants 8 messages Nov 11, 2014 – Nov 17, 2014 Scheduler

lore
Share & tools
lore

Wanpeng Li

author
#0 lore raw

PATCH 1/2 sched/deadline: introduce start_hrtick_dl for !CONFIG_SCHED_HRTICK

Introduce start_hrtick_dl for !CONFIG_SCHED_HRTICK to align with fair class.

---
 kernel/sched/deadline.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/sched/deadline.c +4 -4
index 04c2cbb..56674f6 100644
@@ -1013,6 +1013,10 @@ static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
 {
 	hrtick_start(rq, p->dl.runtime);
 }
+#else /* !CONFIG_SCHED_HRTICK */
+static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
+{
+}
 #endif
 
 static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq,
@@ -1066,10 +1070,8 @@ struct task_struct *pick_next_task_dl(struct rq *rq, struct task_struct *prev)
 	/* Running task will never be pushed. */
        dequeue_pushable_dl_task(rq, p);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq))
 		start_hrtick_dl(rq, p);
-#endif
 
 	set_post_schedule(rq);
 
@@ -1088,10 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
 {
 	update_curr_dl(rq);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
 		start_hrtick_dl(rq, p);
-#endif
 }
 
 static void task_fork_dl(struct task_struct *p)
Signature · 1 line
1.9.1
author Applied
#1 lore raw

PATCH 2/2 sched/deadline: fix start high-res preemption tick for a non-running task

Queued ticks are scheduled to match the budget, which means the budget is overall consumed and the dl task should be throttled. Dl task will be replenished immediately if fail to start a dl timer.

However, the curr maybe not the left most dl task in the rb tree any more after this immediately replenished and reschedule is needed. Start high-res preemption tick for this upcoming rescheduled dl task is not correct.

This patch fix it by not starting high-res preemption tick for a non-running dl task.

---
 kernel/sched/deadline.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +2 -1
index 56674f6..2a6a5bb 100644
@@ -1090,7 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
 {
 	update_curr_dl(rq);
 
-	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
+	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+	    is_leftmost(p, &rq->dl))
 		start_hrtick_dl(rq, p);
 }
 
Signature · 1 line
1.9.1
#2 lore raw

Re: [PATCH 2/2] sched/deadline: fix start high-res preemption tick for a non-running task

Hi,

not sure I understand what the problem is here.

Quoted 2 lines · Wanpeng Li

Queued ticks are scheduled to match the budget, which means the budget is overall consumed and the dl task should be throttled.

... enforce the budget? It means that when the budget is consumed the task has to be throttled...

Quoted 8 lines

Dl task will
be replenished immediately if fail to start a dl timer.

However, the curr maybe not the left most dl task in the rb tree any more after this immediately replenished and reschedule is needed. Start high-res preemption tick for this upcoming rescheduled dl task is not correct.

So, the task that is going to preempt curr is picked by pick_next_task_dl(), that correctly starts the hrtick for this new task.

Maybe you can add more information about what you are seeing? A callpath maybe?

Thanks,

- Juri

Quoted 23 lines

This patch fix it by not starting high-res preemption tick for a non-running dl task.

---
 kernel/sched/deadline.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +2 -1
index 56674f6..2a6a5bb 100644
@@ -1090,7 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
 {
 	update_curr_dl(rq);
 
-	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
+	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+	    is_leftmost(p, &rq->dl))
 		start_hrtick_dl(rq, p);
 }
 
#3 lore raw

Re: [PATCH 2/2] sched/deadline: fix start high-res preemption tick for a non-running task

Hi Juri,

Quoted 9 lines · Juri Lelli

Hi,

not sure I understand what the problem is here.

Quoted 2 lines · Wanpeng Li

Queued ticks are scheduled to match the budget, which means the budget is overall consumed and the dl task should be throttled.

... enforce the budget? It means that when the budget is consumed the task has to be throttled...

Agreed.

Quoted 9 lines
Quoted 9 lines

Dl task will
be replenished immediately if fail to start a dl timer.

However, the curr maybe not the left most dl task in the rb tree any more after this immediately replenished and reschedule is needed. Start high-res preemption tick for this upcoming rescheduled dl task is not correct.

Quoted 5 lines

So, the task that is going to preempt curr is picked by pick_next_task_dl(), that correctly starts the hrtick for this new task.

Maybe you can add more information about what you are seeing? A callpath maybe?

The parameter of task_tick_dl() queued == 1 means that hrtick is fired. hrtick() => task_tick_dl( , ,1), so p->dl.runtime should be <= 0 if queued == 1. What I see is queued == 1 && p->dl.runtime > 0 && p is not the left most task and hrtick is start for this task.

Regards,
Wanpeng Li

Quoted 33 lines

Thanks,

- Juri

Quoted 14 lines

This patch fix it by not starting high-res preemption tick for a non-running dl task.

---
  kernel/sched/deadline.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +0 -0
index 56674f6..2a6a5bb 100644

kernel/sched/deadline.c static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued) · line 1097

Quoted 9 lines
kernel/sched/deadline.c +2 -1
@@ -1090,7 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
  {
  	update_curr_dl(rq);
 
-	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
+	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+	    is_leftmost(p, &rq->dl))
  		start_hrtick_dl(rq, p);
  }
 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#4 lore raw

Re: [PATCH 2/2] sched/deadline: fix start high-res preemption tick for a non-running task

Hi,

Quoted 26 lines · Wanpeng Li

Hi Juri,

Quoted 9 lines · Juri Lelli

Hi,

not sure I understand what the problem is here.

Quoted 2 lines · Wanpeng Li

Queued ticks are scheduled to match the budget, which means the budget is overall consumed and the dl task should be throttled.

... enforce the budget? It means that when the budget is consumed the task has to be throttled...

Agreed.

Quoted 12 lines
Quoted 9 lines

Dl task will
be replenished immediately if fail to start a dl timer.

However, the curr maybe not the left most dl task in the rb tree any more after this immediately replenished and reschedule is needed. Start high-res preemption tick for this upcoming rescheduled dl task is not correct.

So, the task that is going to preempt curr is picked by pick_next_task_dl(), that correctly starts the hrtick for this new task.

Quoted 8 lines
Quoted 2 lines

Maybe you can add more information about what you are seeing? A callpath maybe?

The parameter of task_tick_dl() queued == 1 means that hrtick is fired. hrtick() => task_tick_dl( , ,1), so p->dl.runtime should be <= 0 if queued == 1. What I see is queued == 1 && p->dl.runtime > 0 && p is not the left most task and hrtick is start for this task.

Oh, right, now it makes sense. Good catch! :)

Could you please post a second version with a more explanatory changelog and maybe a comment just above the check?

Thanks,

- Juri

Quoted 38 lines

Regards,
Wanpeng Li

Quoted 33 lines

Thanks,

- Juri

Quoted 14 lines

This patch fix it by not starting high-res preemption tick for a non-running dl task.

---
  kernel/sched/deadline.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +0 -0
index 56674f6..2a6a5bb 100644

kernel/sched/deadline.c static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued) · line 1097

Quoted 9 lines
kernel/sched/deadline.c +2 -1
@@ -1090,7 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
  {
  	update_curr_dl(rq);
 
-	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
+	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+	    is_leftmost(p, &rq->dl))
  		start_hrtick_dl(rq, p);
  }
 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#5 lore raw

Re: [PATCH 2/2] sched/deadline: fix start high-res preemption tick for a non-running task

Hi Juri,

Quoted 34 lines · Juri Lelli

Hi,

Quoted 24 lines · Wanpeng Li

Hi Juri,

Quoted 9 lines · Juri Lelli

Hi,

not sure I understand what the problem is here.

Quoted 2 lines · Wanpeng Li

Queued ticks are scheduled to match the budget, which means the budget is overall consumed and the dl task should be throttled.

... enforce the budget? It means that when the budget is consumed the task has to be throttled...

Agreed.

Quoted 11 lines
Quoted 8 lines

Dl task will
be replenished immediately if fail to start a dl timer.

However, the curr maybe not the left most dl task in the rb tree any more after this immediately replenished and reschedule is needed. Start high-res preemption tick for this upcoming rescheduled dl task is not correct.

So, the task that is going to preempt curr is picked by pick_next_task_dl(), that correctly starts the hrtick for this new task.

Quoted 7 lines
Quoted 2 lines

Maybe you can add more information about what you are seeing? A callpath maybe?

The parameter of task_tick_dl() queued == 1 means that hrtick is fired. hrtick() => task_tick_dl( , ,1), so p->dl.runtime should be <= 0 if queued == 1. What I see is queued == 1 && p->dl.runtime > 0 && p is not the left most task and hrtick is start for this task.

Quoted 4 lines

Oh, right, now it makes sense. Good catch! :)

Could you please post a second version with a more explanatory changelog and maybe a comment just above the check?

Ok, I will do it and send out a new version tomorrow. ;-) Btw, could you review this patch? https://lkml.org/lkml/2014/11/13/51 The bug is introduced by deadline.

Regards,
Wanpeng Li

Quoted 41 lines

Thanks,

- Juri

Quoted 36 lines

Regards,
Wanpeng Li

Quoted 32 lines

Thanks,

- Juri

Quoted 14 lines

This patch fix it by not starting high-res preemption tick for a non-running dl task.

---
   kernel/sched/deadline.c | 3 ++-
   1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +0 -0
index 56674f6..2a6a5bb 100644

kernel/sched/deadline.c static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued) · line 1097

Quoted 9 lines
kernel/sched/deadline.c +2 -1
@@ -1090,7 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
   {
   	update_curr_dl(rq);
 
-	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
+	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+	    is_leftmost(p, &rq->dl))
   		start_hrtick_dl(rq, p);
   }
 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Acked-by on v1 1/2
#6 lore raw
In reply to Wanpeng Li

Hi,

Quoted 36 lines · Wanpeng Li

Introduce start_hrtick_dl for !CONFIG_SCHED_HRTICK to align with fair class.

---
 kernel/sched/deadline.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/sched/deadline.c +4 -2
index 04c2cbb..56674f6 100644
@@ -1013,6 +1013,10 @@ static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
 {
 	hrtick_start(rq, p->dl.runtime);
 }
+#else /* !CONFIG_SCHED_HRTICK */
+static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
+{
+}
 #endif
 
 static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq,
@@ -1066,10 +1070,8 @@ struct task_struct *pick_next_task_dl(struct rq *rq, struct task_struct *prev)
 	/* Running task will never be pushed. */
        dequeue_pushable_dl_task(rq, p);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq))
 		start_hrtick_dl(rq, p);
-#endif
 
 	set_post_schedule(rq);
 

kernel/sched/deadline.c static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued) · line 1097

Quoted 10 lines
kernel/sched/deadline.c +0 -2
@@ -1088,10 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
 {
 	update_curr_dl(rq);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
 		start_hrtick_dl(rq, p);
-#endif
 }
 
 static void task_fork_dl(struct task_struct *p)

Looks good!

Thanks,

- Juri

#7 lore raw

[tip:sched/core] sched/deadline: Introduce start_hrtick_dl() for !CONFIG_SCHED_HRTICK

In reply to Wanpeng Li
sched/deadline: Introduce start_hrtick_dl() for !CONFIG_SCHED_HRTICK
Commit-ID:  36ce98818a4df66c8134c31fd6e768b4119c7a90
Gitweb:     http://git.kernel.org/tip/36ce98818a4df66c8134c31fd6e768b4119c7a90
Author:     Wanpeng Li <[email protected]>
AuthorDate: Tue, 11 Nov 2014 09:52:26 +0800
Committer:  Ingo Molnar <[email protected]>
CommitDate: Sun, 16 Nov 2014 10:59:03 +0100

sched/deadline: Introduce start_hrtick_dl() for !CONFIG_SCHED_HRTICK

Introduce start_hrtick_dl for !CONFIG_SCHED_HRTICK to align with the fair class.

---
 kernel/sched/deadline.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/sched/deadline.c +4 -4
index 9594c12..e5db8c6 100644
@@ -1013,6 +1013,10 @@ static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
 {
 	hrtick_start(rq, p->dl.runtime);
 }
+#else /* !CONFIG_SCHED_HRTICK */
+static void start_hrtick_dl(struct rq *rq, struct task_struct *p)
+{
+}
 #endif
 
 static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq,
@@ -1066,10 +1070,8 @@ struct task_struct *pick_next_task_dl(struct rq *rq, struct task_struct *prev)
 	/* Running task will never be pushed. */
        dequeue_pushable_dl_task(rq, p);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq))
 		start_hrtick_dl(rq, p);
-#endif
 
 	set_post_schedule(rq);
 
@@ -1088,10 +1090,8 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
 {
 	update_curr_dl(rq);
 
-#ifdef CONFIG_SCHED_HRTICK
 	if (hrtick_enabled(rq) && queued && p->dl.runtime > 0)
 		start_hrtick_dl(rq, p);
-#endif
 }
 
 static void task_fork_dl(struct task_struct *p)