Hi Kirill,
On 02/10/14 10:52, Kirill Tkhai wrote:
Ð ÐÑ, 02/10/2014 Ð 11:36 +0200, Peter Zijlstra ÐÐÑÐÑ:So, I agree that calling switched_to_dl() makes little sense,
On Wed, Oct 01, 2014 at 01:04:35AM +0400, Kirill Tkhai wrote:Yeah, it's better to check for on_dl_rq():
From: Kirill Tkhai <ktkhai@xxxxxxxxxxxxx>the CBS timer can throttle it right?
rq->curr task can't be in "dequeued" state in prio_changed_dl().
(The only place we can have that is __schedule()). So, we delete
rq->curr check.
[PATCH]sched/dl: Cleanup prio_changed_dl()
rq->curr task can't be in "dequeued" state in prio_changed_dl().
(The only place we can have that is __schedule()). So, we delete
rq->curr check.
We shouldn't do balancing if deadline task is throttled too.
Also delete "else" branch which is dead code (switched_to_dl()
is not interested in dequeued tasks and we are not interested
in balancing in this case).
but don't we have to deal with updates to not running tasks as
in rt.c? Something like this maybe?
From 75ee75a5fd76526baaed3ba8a58f3ff7daa89cd6 Mon Sep 17 00:00:00 2001
From: Juri Lelli <juri.lelli@xxxxxxx>
Date: Tue, 21 Oct 2014 17:15:15 +0100
Subject: [PATCH] sched/deadline: cleanup prio_changed_dl()
---
kernel/sched/deadline.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 28d6088..1e62e31 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1661,7 +1661,10 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p)
static void prio_changed_dl(struct rq *rq, struct task_struct *p,
int oldprio)
{
- if (task_on_rq_queued(p) || rq->curr == p) {
+ if (!on_dl_rq(&p->dl))
+ return;
+
+ if (rq->curr == p) {
#ifdef CONFIG_SMP
/*
* This might be too much, but unfortunately
@@ -1688,8 +1691,15 @@ static void prio_changed_dl(struct rq *rq, struct task_struct *p,
*/
resched_curr(rq);
#endif /* CONFIG_SMP */
- } else
- switched_to_dl(rq, p);
+ } else {
+ /*
+ * This task is not running, so if its deadline is
+ * now more imminent than that of the current running
+ * task then reschedule.
+ */
+ if (dl_time_before(p->dl.deadline, rq->curr->dl.deadline))
+ resched_curr(rq);
+ }
}
const struct sched_class dl_sched_class = {