sched: add sched_class->needs_post_schedule() member
We currently run class->post_schedule() outside of the rq->lock, which means that we need to test for the need to post_schedule outside of the lock to avoid a forced reacquistion. This is currently not a problem as we only look at rq->rt.overloaded. However, we want to enhance this going forward to look at more state to reduce the need to post_schedule to a bare minimum set. Therefore, we introduce a new member-func called needs_post_schedule() which tests for the post_schedule condtion without actually performing the work. Therefore it is safe to call this function before the rq->lock is released, because we are guaranteed not to drop the lock at an intermediate point (such as what post_schedule() may do). We will use this later in the series [ rostedt: removed paranoid BUG_ON ] Signed-off-by: Gregory Haskins <ghaskins@novell.com>
This commit is contained in:
@@ -2621,6 +2621,12 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
|
||||
{
|
||||
struct mm_struct *mm = rq->prev_mm;
|
||||
long prev_state;
|
||||
#ifdef CONFIG_SMP
|
||||
int post_schedule = 0;
|
||||
|
||||
if (current->sched_class->needs_post_schedule)
|
||||
post_schedule = current->sched_class->needs_post_schedule(rq);
|
||||
#endif
|
||||
|
||||
rq->prev_mm = NULL;
|
||||
|
||||
@@ -2639,7 +2645,7 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
|
||||
finish_arch_switch(prev);
|
||||
finish_lock_switch(rq, prev);
|
||||
#ifdef CONFIG_SMP
|
||||
if (current->sched_class->post_schedule)
|
||||
if (post_schedule)
|
||||
current->sched_class->post_schedule(rq);
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user