Skip to contentSkip to conversation

sched/deadline: fix rq->dl.pushable_tasks bug in push_dl_task()

PATCH In review Wanpeng Li 4 participants 4 messages Nov 6, 2014 – Nov 16, 2014 Scheduler

lore
Share & tools
lore

Wanpeng Li

author
#0 lore raw

PATCH 1/1 sched/deadline: fix rq->dl.pushable_tasks bug in push_dl_task()

Do not call dequeue_pushable_dl_task() when failing to push an eligible task, as it remains pushable, merely not at this particular moment. Actually the patch is the same behavior as commit 311e800e16f6 ("sched,
rt: Fix rq->rt.pushable_tasks bug in push_rt_task()" in -rt side.

---
 kernel/sched/deadline.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/deadline.c +3 -2
index f3d7776..00324af 100644
@@ -1331,6 +1331,7 @@ static int push_dl_task(struct rq *rq)
 {
 	struct task_struct *next_task;
 	struct rq *later_rq;
+	int ret = 0;
 
 	if (!rq->dl.overloaded)
 		return 0;
@@ -1376,7 +1377,6 @@ retry:
 			 * The task is still there. We don't try
 			 * again, some other cpu will pull it when ready.
 			 */
-			dequeue_pushable_dl_task(rq, next_task);
 			goto out;
 		}
 
@@ -1392,6 +1392,7 @@ retry:
 	deactivate_task(rq, next_task, 0);
 	set_task_cpu(next_task, later_rq->cpu);
 	activate_task(later_rq, next_task, 0);
+	ret = 1;
 
 	resched_curr(later_rq);
 
@@ -1400,7 +1401,7 @@ retry:
 out:
 	put_task_struct(next_task);
 
-	return 1;
+	return ret;
 }
 
 static void push_dl_tasks(struct rq *rq)
Signature · 1 line
1.9.1
#1 lore raw

Ping Juri, could you review this one and other deadline patches of mine? ;-)

Quoted 47 lines · Wanpeng Li

Do not call dequeue_pushable_dl_task() when failing to push an eligible task, as it remains pushable, merely not at this particular moment. Actually the patch is the same behavior as commit 311e800e16f6 ("sched,
rt: Fix rq->rt.pushable_tasks bug in push_rt_task()" in -rt side.

---
  kernel/sched/deadline.c | 5 +++--
  1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/deadline.c +3 -2
index f3d7776..00324af 100644
@@ -1331,6 +1331,7 @@ static int push_dl_task(struct rq *rq)
  {
  	struct task_struct *next_task;
  	struct rq *later_rq;
+	int ret = 0;
 
  	if (!rq->dl.overloaded)
  		return 0;
@@ -1376,7 +1377,6 @@ retry:
  			 * The task is still there. We don't try
  			 * again, some other cpu will pull it when ready.
  			 */
-			dequeue_pushable_dl_task(rq, next_task);
  			goto out;
  		}
 
@@ -1392,6 +1392,7 @@ retry:
  	deactivate_task(rq, next_task, 0);
  	set_task_cpu(next_task, later_rq->cpu);
  	activate_task(later_rq, next_task, 0);
+	ret = 1;
 
  	resched_curr(later_rq);
 
@@ -1400,7 +1401,7 @@ retry:
  out:
  	put_task_struct(next_task);
 
-	return 1;
+	return ret;
  }
 
  static void push_dl_tasks(struct rq *rq)
Acked-by on v1 1/1
#2 lore raw
In reply to Wanpeng Li

Hi,

Quoted 40 lines · Wanpeng Li

Do not call dequeue_pushable_dl_task() when failing to push an eligible task, as it remains pushable, merely not at this particular moment. Actually the patch is the same behavior as commit 311e800e16f6 ("sched,
rt: Fix rq->rt.pushable_tasks bug in push_rt_task()" in -rt side.

---
 kernel/sched/deadline.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/deadline.c +2 -1
index f3d7776..00324af 100644
@@ -1331,6 +1331,7 @@ static int push_dl_task(struct rq *rq)
 {
 	struct task_struct *next_task;
 	struct rq *later_rq;
+	int ret = 0;
 
 	if (!rq->dl.overloaded)
 		return 0;
@@ -1376,7 +1377,6 @@ retry:
 			 * The task is still there. We don't try
 			 * again, some other cpu will pull it when ready.
 			 */
-			dequeue_pushable_dl_task(rq, next_task);
 			goto out;
 		}
 
@@ -1392,6 +1392,7 @@ retry:
 	deactivate_task(rq, next_task, 0);
 	set_task_cpu(next_task, later_rq->cpu);
 	activate_task(later_rq, next_task, 0);
+	ret = 1;
 
 	resched_curr(later_rq);
 

kernel/sched/deadline.c retry: · line 1407

Quoted 8 lines
kernel/sched/deadline.c +1 -1
@@ -1400,7 +1401,7 @@ retry:
 out:
 	put_task_struct(next_task);
 
-	return 1;
+	return ret;
 }
 
 static void push_dl_tasks(struct rq *rq)

This looks good.

Thanks,

- Juri

#3 lore raw

[tip:sched/core] sched/deadline: Fix rq-> dl.pushable_tasks bug in push_dl_task()

In reply to Wanpeng Li
sched/deadline: Fix rq->dl.pushable_tasks bug in push_dl_task()
Commit-ID:  c51b8ab5ad972df26fd9c0ffad34870e98273c4c
Gitweb:     http://git.kernel.org/tip/c51b8ab5ad972df26fd9c0ffad34870e98273c4c
Author:     Wanpeng Li <[email protected]>
AuthorDate: Thu, 6 Nov 2014 15:22:44 +0800
Committer:  Ingo Molnar <[email protected]>
CommitDate: Sun, 16 Nov 2014 10:58:57 +0100

sched/deadline: Fix rq->dl.pushable_tasks bug in push_dl_task()

Do not call dequeue_pushable_dl_task() when failing to push an eligible task, as it remains pushable, merely not at this particular moment.

Actually the patch is the same behavior as commit 311e800e16f6 ("sched,
rt: Fix rq->rt.pushable_tasks bug in push_rt_task()" in -rt side.

---
 kernel/sched/deadline.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/deadline.c +3 -2
index bb1464b..9594c12 100644
@@ -1328,6 +1328,7 @@ static int push_dl_task(struct rq *rq)
 {
 	struct task_struct *next_task;
 	struct rq *later_rq;
+	int ret = 0;
 
 	if (!rq->dl.overloaded)
 		return 0;
@@ -1373,7 +1374,6 @@ retry:
 			 * The task is still there. We don't try
 			 * again, some other cpu will pull it when ready.
 			 */
-			dequeue_pushable_dl_task(rq, next_task);
 			goto out;
 		}
 
@@ -1389,6 +1389,7 @@ retry:
 	deactivate_task(rq, next_task, 0);
 	set_task_cpu(next_task, later_rq->cpu);
 	activate_task(later_rq, next_task, 0);
+	ret = 1;
 
 	resched_curr(later_rq);
 
@@ -1397,7 +1398,7 @@ retry:
 out:
 	put_task_struct(next_task);
 
-	return 1;
+	return ret;
 }
 
 static void push_dl_tasks(struct rq *rq)