add_requeue_task
PATCH 3/5 add_requeue_task
add_requeue_task
Please include in at least one -mm release.
We can requeue tasks for cheaper then doing a complete dequeue followed by an enqueue. Add the requeue_task function and perform it where possible.
This will be hit frequently by upcoming changes to the requeueing in timeslice granularity.
Signed-off-by Con Kolivas <[email protected]>
kernel/sched.c +18 -4
@@ -593,6 +593,15 @@ static void enqueue_task(struct task_str }/* +* Put task to the end of the run list without the overhead of dequeue +* followed by enqueue. +*/ +static void requeue_task (struct task_struct *p,prio_array_t *array) +{ +list_move_tail (&p->run_list, array->queue + p->prio); +} + +/* * Used by the migration code - we pull tasks from the head of the * remote queue so we want these tasks to show up at the head of the * local queue:
@@ -2456,8 +2465,7 @@ void scheduler_tick(void)set_tsk_need_resched (p);/* put it at the end of the queue: */ -dequeue_task (p, rq->active); -enqueue_task (p, rq->active); +requeue_task (p, rq->active); } goto out_unlock; }
@@ -3605,8 +3613,14 @@ asmlinkage long sys_sched_yield(void) }else if (!rq->expired->nr_active)schedstat_inc (rq, yld_exp_empty); -dequeue_task (current, array); -enqueue_task (current, target); +if (array != target) { +dequeue_task (current, array); +enqueue_task (current, target); + }else +/* +* requeue_task is cheaper so perform that if possible. +*/ +requeue_task (current, array);/* * Since we are going to call schedule() anyway, there's