diff options
author | Dmitry Adamushko <dmitry.adamushko@gmail.com> | 2007-08-24 20:39:10 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-08-24 20:39:10 +0200 |
commit | 98fbc798533339be802c6dcd48c2293c712e87db (patch) | |
tree | 14a5f3ba3ee5915e890a08c4c37216869700b756 /kernel/sched_rt.c | |
parent | deac4ee65af4befb66b542e4a782e63da93b51a0 (diff) | |
download | lwn-98fbc798533339be802c6dcd48c2293c712e87db.tar.gz lwn-98fbc798533339be802c6dcd48c2293c712e87db.zip |
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>
Diffstat (limited to 'kernel/sched_rt.c')
-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) return; p->time_slice = static_prio_timeslice(p->static_prio); - set_tsk_need_resched(p); - /* put it at the end of the queue: */ - requeue_task_rt(rq, p); + /* + * Requeue to the end of queue if we are not the only element + * on the queue: + */ + if (p->run_list.prev != p->run_list.next) { + requeue_task_rt(rq, p); + set_tsk_need_resched(p); + } } static struct sched_class rt_sched_class __read_mostly = { |