Merge branch 'sched-fixes-for-linus' of git://tesla.tglx.de/git/linux-2.6-tip
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 7 Sep 2011 20:01:34 +0000 (13:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 7 Sep 2011 20:01:34 +0000 (13:01 -0700)
* 'sched-fixes-for-linus' of git://tesla.tglx.de/git/linux-2.6-tip:
  sched: Fix a memory leak in __sdt_free()
  sched: Move blk_schedule_flush_plug() out of __schedule()
  sched: Separate the scheduler entry for preemption

1  2 
kernel/sched.c

diff --combined kernel/sched.c
@@@ -3065,7 -3065,7 +3065,7 @@@ static void finish_task_switch(struct r
  #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
        local_irq_disable();
  #endif /* __ARCH_WANT_INTERRUPTS_ON_CTXSW */
 -      perf_event_task_sched_in(current);
 +      perf_event_task_sched_in(prev, current);
  #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
        local_irq_enable();
  #endif /* __ARCH_WANT_INTERRUPTS_ON_CTXSW */
@@@ -4279,9 -4279,9 +4279,9 @@@ pick_next_task(struct rq *rq
  }
  
  /*
-  * schedule() is the main scheduler function.
+  * __schedule() is the main scheduler function.
   */
asmlinkage void __sched schedule(void)
static void __sched __schedule(void)
  {
        struct task_struct *prev, *next;
        unsigned long *switch_count;
@@@ -4322,16 -4322,6 +4322,6 @@@ need_resched
                                if (to_wakeup)
                                        try_to_wake_up_local(to_wakeup);
                        }
-                       /*
-                        * If we are going to sleep and we have plugged IO
-                        * queued, make sure to submit it to avoid deadlocks.
-                        */
-                       if (blk_needs_flush_plug(prev)) {
-                               raw_spin_unlock(&rq->lock);
-                               blk_schedule_flush_plug(prev);
-                               raw_spin_lock(&rq->lock);
-                       }
                }
                switch_count = &prev->nvcsw;
        }
        if (need_resched())
                goto need_resched;
  }
+ static inline void sched_submit_work(struct task_struct *tsk)
+ {
+       if (!tsk->state)
+               return;
+       /*
+        * If we are going to sleep and we have plugged IO queued,
+        * make sure to submit it to avoid deadlocks.
+        */
+       if (blk_needs_flush_plug(tsk))
+               blk_schedule_flush_plug(tsk);
+ }
+ asmlinkage void schedule(void)
+ {
+       struct task_struct *tsk = current;
+       sched_submit_work(tsk);
+       __schedule();
+ }
  EXPORT_SYMBOL(schedule);
  
  #ifdef CONFIG_MUTEX_SPIN_ON_OWNER
@@@ -4435,7 -4445,7 +4445,7 @@@ asmlinkage void __sched notrace preempt
  
        do {
                add_preempt_count_notrace(PREEMPT_ACTIVE);
-               schedule();
+               __schedule();
                sub_preempt_count_notrace(PREEMPT_ACTIVE);
  
                /*
@@@ -4463,7 -4473,7 +4473,7 @@@ asmlinkage void __sched preempt_schedul
        do {
                add_preempt_count(PREEMPT_ACTIVE);
                local_irq_enable();
-               schedule();
+               __schedule();
                local_irq_disable();
                sub_preempt_count(PREEMPT_ACTIVE);
  
@@@ -5588,7 -5598,7 +5598,7 @@@ static inline int should_resched(void
  static void __cond_resched(void)
  {
        add_preempt_count(PREEMPT_ACTIVE);
-       schedule();
+       __schedule();
        sub_preempt_count(PREEMPT_ACTIVE);
  }
  
@@@ -7443,6 -7453,7 +7453,7 @@@ static void __sdt_free(const struct cpu
                        struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j);
                        if (sd && (sd->flags & SD_OVERLAP))
                                free_sched_groups(sd->groups, 0);
+                       kfree(*per_cpu_ptr(sdd->sd, j));
                        kfree(*per_cpu_ptr(sdd->sg, j));
                        kfree(*per_cpu_ptr(sdd->sgp, j));
                }