All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] sched/dl: Fix preemption checks
@ 2014-10-21 16:35 Kirill Tkhai
  2014-10-22  9:43 ` Juri Lelli
  2014-10-28 11:03 ` [tip:sched/core] " tip-bot for Kirill Tkhai
  0 siblings, 2 replies; 3+ messages in thread
From: Kirill Tkhai @ 2014-10-21 16:35 UTC (permalink / raw)
  To: Juri Lelli, linux-kernel; +Cc: Peter Zijlstra, Ingo Molnar, Kirill Tkhai


1)switched_to_dl() check is wrong. We reschedule only
if rq->curr is deadline task, and we do not reschedule
if it's a lower priority task. But we must always
preempt a task of other classes.

2)dl_task_timer():
Policy does not change in case of priority inheritance.
rt_mutex_setprio() changes prio, while policy remains old.

So we lose some balancing logic in dl_task_timer() and
switched_to_dl() when we check policy instead of priority.
Boosted task may be rq->curr.

(I didn't change switched_from_dl() because no check is
necessary there at all).

I've looked at this place(switched_to_dl) several times
and even fixed this function, but found just now...
I suppose some performance tests may work better after this.

Completely untested, just RFC.

Juri how about this?

Signed-off-by: Kirill Tkhai <ktkhai@parallels.com>
---
 kernel/sched/deadline.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 256e577..937a875 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -532,7 +532,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer)
 	dl_se->dl_yielded = 0;
 	if (task_on_rq_queued(p)) {
 		enqueue_task_dl(rq, p, ENQUEUE_REPLENISH);
-		if (task_has_dl_policy(rq->curr))
+		if (dl_task(rq->curr))
 			check_preempt_curr_dl(rq, p, 0);
 		else
 			resched_curr(rq);
@@ -1607,8 +1607,12 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p)
 			/* Only reschedule if pushing failed */
 			check_resched = 0;
 #endif /* CONFIG_SMP */
-		if (check_resched && task_has_dl_policy(rq->curr))
-			check_preempt_curr_dl(rq, p, 0);
+		if (check_resched) {
+			if (dl_task(rq->curr))
+				check_preempt_curr_dl(rq, p, 0);
+			else
+				resched_curr(rq);
+		}
 	}
 }
 





^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-10-28 11:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-21 16:35 [RFC] sched/dl: Fix preemption checks Kirill Tkhai
2014-10-22  9:43 ` Juri Lelli
2014-10-28 11:03 ` [tip:sched/core] " tip-bot for Kirill Tkhai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.