diff options
author | Gregory Haskins <ghaskins@novell.com> | 2008-12-29 09:39:52 -0500 |
---|---|---|
committer | Gregory Haskins <ghaskins@novell.com> | 2008-12-29 09:39:52 -0500 |
commit | 967fc04671feea4dbf780c9e55a0bc8fcf68a14e (patch) | |
tree | 223f2bb8c59138cc70fbb0e438ae27819ebe1a92 /kernel/sched.c | |
parent | 8f45e2b516201d1bf681e6026fa5276385def565 (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.c | 8 |
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 | ||