aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Adamushko <dmitry.adamushko@gmail.com>2007-08-24 20:39:10 +0200
committerIngo Molnar <mingo@elte.hu>2007-08-24 20:39:10 +0200
commit98fbc798533339be802c6dcd48c2293c712e87db (patch)
tree14a5f3ba3ee5915e890a08c4c37216869700b756
parentdeac4ee65af4befb66b542e4a782e63da93b51a0 (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.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index dcdcad632fd..4b87476a02d 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 = {