aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-06-22 13:47:00 -0400
committerIngo Molnar <mingo@elte.hu>2011-08-29 06:26:57 -0400
commitc259e01a1ec90063042f758e409cd26b2a0963c8 (patch)
treedc5910233294b735fd389e0b0aab79cbb03c70a2 /kernel
parentc6a389f123b9f68d605bb7e0f9b32ec1e3e14132 (diff)
sched: Separate the scheduler entry for preemption
Block-IO and workqueues call into notifier functions from the scheduler core code with interrupts and preemption disabled. These calls should be made before entering the scheduler core. To simplify this, separate the scheduler core code into __schedule(). __schedule() is directly called from the places which set PREEMPT_ACTIVE and from schedule(). This allows us to add the work checks into schedule(), so they are only called when a task voluntary goes to sleep. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Tejun Heo <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: stable@kernel.org # 2.6.39+ Link: http://lkml.kernel.org/r/20110622174918.813258321@linutronix.de Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index ccacdbdecf45..ec15e8129cf7 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4279,9 +4279,9 @@ pick_next_task(struct rq *rq)
4279} 4279}
4280 4280
4281/* 4281/*
4282 * schedule() is the main scheduler function. 4282 * __schedule() is the main scheduler function.
4283 */ 4283 */
4284asmlinkage void __sched schedule(void) 4284static void __sched __schedule(void)
4285{ 4285{
4286 struct task_struct *prev, *next; 4286 struct task_struct *prev, *next;
4287 unsigned long *switch_count; 4287 unsigned long *switch_count;
@@ -4369,6 +4369,11 @@ need_resched:
4369 if (need_resched()) 4369 if (need_resched())
4370 goto need_resched; 4370 goto need_resched;
4371} 4371}
4372
4373asmlinkage void schedule(void)
4374{
4375 __schedule();
4376}
4372EXPORT_SYMBOL(schedule); 4377EXPORT_SYMBOL(schedule);
4373 4378
4374#ifdef CONFIG_MUTEX_SPIN_ON_OWNER 4379#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
@@ -4435,7 +4440,7 @@ asmlinkage void __sched notrace preempt_schedule(void)
4435 4440
4436 do { 4441 do {
4437 add_preempt_count_notrace(PREEMPT_ACTIVE); 4442 add_preempt_count_notrace(PREEMPT_ACTIVE);
4438 schedule(); 4443 __schedule();
4439 sub_preempt_count_notrace(PREEMPT_ACTIVE); 4444 sub_preempt_count_notrace(PREEMPT_ACTIVE);
4440 4445
4441 /* 4446 /*
@@ -4463,7 +4468,7 @@ asmlinkage void __sched preempt_schedule_irq(void)
4463 do { 4468 do {
4464 add_preempt_count(PREEMPT_ACTIVE); 4469 add_preempt_count(PREEMPT_ACTIVE);
4465 local_irq_enable(); 4470 local_irq_enable();
4466 schedule(); 4471 __schedule();
4467 local_irq_disable(); 4472 local_irq_disable();
4468 sub_preempt_count(PREEMPT_ACTIVE); 4473 sub_preempt_count(PREEMPT_ACTIVE);
4469 4474
@@ -5588,7 +5593,7 @@ static inline int should_resched(void)
5588static void __cond_resched(void) 5593static void __cond_resched(void)
5589{ 5594{
5590 add_preempt_count(PREEMPT_ACTIVE); 5595 add_preempt_count(PREEMPT_ACTIVE);
5591 schedule(); 5596 __schedule();
5592 sub_preempt_count(PREEMPT_ACTIVE); 5597 sub_preempt_count(PREEMPT_ACTIVE);
5593} 5598}
5594 5599