sched: call resched_task() conditionally from new task wake up path
authorBharata B Rao <bharata@linux.vnet.ibm.com>
Thu, 28 Aug 2008 09:12:49 +0000 (14:42 +0530)
committerIngo Molnar <mingo@elte.hu>
Thu, 28 Aug 2008 09:35:51 +0000 (11:35 +0200)
- During wake up of a new task, task_new_fair() can do a resched_task()
  on the current task. Later in the code path, check_preempt_curr() also ends
  up doing the same, which can be avoided. Check if TIF_NEED_RESCHED is
  already set for the current task.

- task_new_fair() does a resched_task() on the current task unconditionally.
  This can be done only in case when child runs before the parent.

So this is a small speedup.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/sched_fair.c

index fb8994c..8264bb5 100644 (file)
@@ -1348,6 +1348,13 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p)
        if (unlikely(se == pse))
                return;
 
+       /*
+        * We can come here with TIF_NEED_RESCHED already set from new task
+        * wake up path.
+        */
+       if (test_tsk_need_resched(curr))
+               return;
+
        cfs_rq_of(pse)->next = pse;
 
        /*
@@ -1620,10 +1627,10 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
                 * 'current' within the tree based on its new key value.
                 */
                swap(curr->vruntime, se->vruntime);
+               resched_task(rq->curr);
        }
 
        enqueue_task_fair(rq, p, 0);
-       resched_task(rq->curr);
 }
 
 /*