sched: call resched_task() conditionally from new task wake up path.
PATCH 1/1 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.
--- kernel/sched_fair.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
kernel/sched_fair.c +8 -1
@@ -1348,6 +1348,13 @@ static void check_preempt_wakeup(structif (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.
Quoted 9 lines · Bharata B Rao
Hi,
sched: call
resched_task()conditionally from new task wake up path.- During wake up of a new task,
task_new_fair()can do aresched_task()on the current task. Later in the code path,check_preempt_curr()also ends up doing the same, which can be avoided. Check ifTIF_NEED_RESCHEDis already set for the current task.
Quoted 4 lines
-
task_new_fair()does aresched_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 <[email protected]>
well spotted - applied to tip/sched/devel, thanks Bharata.
Ingo
Quoted 9 lines · Bharata B Rao
Hi,
sched: call
resched_task()conditionally from new task wake up path.- During wake up of a new task,
task_new_fair()can do aresched_task()on the current task. Later in the code path,check_preempt_curr()also ends up doing the same, which can be avoided. Check ifTIF_NEED_RESCHEDis already set for the current task.
Quoted 5 lines
-
task_new_fair()does aresched_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 <[email protected]>CC Srivatsa Vaddagiri <[email protected]>
Quoted 36 lines
CC Ingo Molnar <[email protected]>--- kernel/sched_fair.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)kernel/sched_fair.c +8
-1@@ -1348,6 +1348,13 @@ static void check_preempt_wakeup(structif (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.