diff options
author | Dmitry Adamushko <dmitry.adamushko@gmail.com> | 2007-08-24 14:39:10 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-08-24 14:39:10 -0400 |
commit | 98fbc798533339be802c6dcd48c2293c712e87db (patch) | |
tree | 14a5f3ba3ee5915e890a08c4c37216869700b756 | |
parent | deac4ee65af4befb66b542e4a782e63da93b51a0 (diff) |
sched: optimize task_tick_rt() a bit
Mitchell Erblich suggested a quality-of-implementation change to
not requeue SCHED_RR tasks if there's only a single task on the
runqueue, by checking for rq->nr_running == 1.
provide a more efficient implementation of that, to check that
particular RT priority-queue only.
[ From: mingo@elte.hu ]
Also first requeue the task then set need_resched - results in slightly
better machine-instruction ordering. Also clean up the code a bit.
Signed-off-by: Dmitry Adamushko <dmitry.adamushko@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | kernel/sched_rt.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index dcdcad632fd9..4b87476a02d0 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
@@ -207,10 +207,15 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p) | |||
207 | return; | 207 | return; |
208 | 208 | ||
209 | p->time_slice = static_prio_timeslice(p->static_prio); | 209 | p->time_slice = static_prio_timeslice(p->static_prio); |
210 | set_tsk_need_resched(p); | ||
211 | 210 | ||
212 | /* put it at the end of the queue: */ | 211 | /* |
213 | requeue_task_rt(rq, p); | 212 | * Requeue to the end of queue if we are not the only element |
213 | * on the queue: | ||
214 | */ | ||
215 | if (p->run_list.prev != p->run_list.next) { | ||
216 | requeue_task_rt(rq, p); | ||
217 | set_tsk_need_resched(p); | ||
218 | } | ||
214 | } | 219 | } |
215 | 220 | ||
216 | static struct sched_class rt_sched_class __read_mostly = { | 221 | static struct sched_class rt_sched_class __read_mostly = { |