On Fri, 2012-04-06 at 09:14 +0200, Juri Lelli wrote:
/*
* Only called when both the current and waking task are -deadline
* tasks.
@@ -487,8 +819,20 @@ static void yield_task_dl(struct rq *rq)
static void check_preempt_curr_dl(struct rq *rq, struct task_struct *p,
int flags)
{
- if (dl_time_before(p->dl.deadline, rq->curr->dl.deadline))
+ if (dl_time_before(p->dl.deadline, rq->curr->dl.deadline)) {
resched_task(rq->curr);
+ return;
+ }
+
+#ifdef CONFIG_SMP
+ /*
+ * In the unlikely case current and p have the same deadline
+ * let us try to decide what's the best thing to do...
+ */
+ if ((s64)(p->dl.deadline - rq->curr->dl.deadline) == 0&&
+ !need_resched())
OK, maybe I'm thick. But how is:
(s64)(p->dl.deadline - rq->curr->dl.deadline) == 0
Better than:
p->dl.deadline == rq->curr->dl.deadline
?
+ check_preempt_equal_dl(rq, p);
+#endif /* CONFIG_SMP */
}