Messages in this thread Patch in this message | | | Date | Thu, 28 Aug 2008 14:42:49 +0530 | From | Bharata B Rao <> | Subject | [patch] sched: call resched_task() conditionally from new task wake up path. |
| |
Hi,
sched: call resched_task() conditionally from new task wake up path.
- 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.
Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> CC: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com> CC: Peter Zijlstra <a.p.zijlstra@chello.nl> CC: Ingo Molnar <mingo@elte.hu> --- kernel/sched_fair.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
--- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c @@ -1348,6 +1348,13 @@ static void check_preempt_wakeup(struct 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; /* @@ -1615,10 +1622,10 @@ static void task_new_fair(struct rq *rq, * '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); } /* Regards, Bharata.
| |