Anyway, the below seems to work; it avoids playing tricks with the idle
thread and instead uses a magic constant.
The comparison should be faster too; seeing how we avoid dereferencing
p->sched_class.
---
Subject: sched: Guarantee task priority in pick_next_task()
From: Peter Zijlstra<peterz@xxxxxxxxxxxxx>
Date: Fri Feb 14 12:25:08 CET 2014
Michael spotted that the idle_balance() push down created a task
priority problem.
Previously, when we called idle_balance() before pick_next_task() it
wasn't a problem when -- because of the rq->lock droppage -- an rt/dl
task slipped in.
Similarly for pre_schedule(), rt pre-schedule could have a dl task
slip in.
But by pulling it into the pick_next_task() loop, we'll not try a
higher task priority again.
Cure this by creating a re-start condition in pick_next_task(); and
triggering this from pick_next_task_{rt,fair}().
Fixes: 38033c37faab ("sched: Push down pre_schedule() and idle_balance()")
Cc: Juri Lelli<juri.lelli@xxxxxxxxx>
Cc: Ingo Molnar<mingo@xxxxxxxxxx>
Cc: Steven Rostedt<rostedt@xxxxxxxxxxx>
Reported-by: Michael Wang<wangyun@xxxxxxxxxxxxxxxxxx>
Signed-off-by: Peter Zijlstra<peterz@xxxxxxxxxxxxx>
Attachment:
0.txt.gz
Description: application/gzip