aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
authorGregory Haskins <ghaskins@novell.com>2008-12-29 09:39:52 -0500
committerGregory Haskins <ghaskins@novell.com>2008-12-29 09:39:52 -0500
commit967fc04671feea4dbf780c9e55a0bc8fcf68a14e (patch)
tree223f2bb8c59138cc70fbb0e438ae27819ebe1a92 /kernel/sched.c
parent8f45e2b516201d1bf681e6026fa5276385def565 (diff)
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>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 8fca364f3593..3acbad8991a2 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2621,6 +2621,12 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
2621{ 2621{
2622 struct mm_struct *mm = rq->prev_mm; 2622 struct mm_struct *mm = rq->prev_mm;
2623 long prev_state; 2623 long prev_state;
2624#ifdef CONFIG_SMP
2625 int post_schedule = 0;
2626
2627 if (current->sched_class->needs_post_schedule)
2628 post_schedule = current->sched_class->needs_post_schedule(rq);
2629#endif
2624 2630
2625 rq->prev_mm = NULL; 2631 rq->prev_mm = NULL;
2626 2632
@@ -2639,7 +2645,7 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)
2639 finish_arch_switch(prev); 2645 finish_arch_switch(prev);
2640 finish_lock_switch(rq, prev); 2646 finish_lock_switch(rq, prev);
2641#ifdef CONFIG_SMP 2647#ifdef CONFIG_SMP
2642 if (current->sched_class->post_schedule) 2648 if (post_schedule)
2643 current->sched_class->post_schedule(rq); 2649 current->sched_class->post_schedule(rq);
2644#endif 2650#endif
2645 2651