lkml.org 
[lkml]   [2011]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 1/4] 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>
    ---
    kernel/sched.c | 15 ++++++++++-----
    1 file changed, 10 insertions(+), 5 deletions(-)

    Index: linux-2.6/kernel/sched.c
    ===================================================================
    --- linux-2.6.orig/kernel/sched.c
    +++ linux-2.6/kernel/sched.c
    @@ -4210,9 +4210,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;
    @@ -4300,6 +4300,11 @@ need_resched:
    if (need_resched())
    goto need_resched;
    }
    +
    +asmlinkage void schedule(void)
    +{
    + __schedule();
    +}
    EXPORT_SYMBOL(schedule);

    #ifdef CONFIG_MUTEX_SPIN_ON_OWNER
    @@ -4373,7 +4378,7 @@ asmlinkage void __sched notrace preempt_

    do {
    add_preempt_count_notrace(PREEMPT_ACTIVE);
    - schedule();
    + __schedule();
    sub_preempt_count_notrace(PREEMPT_ACTIVE);

    /*
    @@ -4401,7 +4406,7 @@ asmlinkage void __sched preempt_schedule
    do {
    add_preempt_count(PREEMPT_ACTIVE);
    local_irq_enable();
    - schedule();
    + __schedule();
    local_irq_disable();
    sub_preempt_count(PREEMPT_ACTIVE);

    @@ -5526,7 +5531,7 @@ static inline int should_resched(void)
    static void __cond_resched(void)
    {
    add_preempt_count(PREEMPT_ACTIVE);
    - schedule();
    + __schedule();
    sub_preempt_count(PREEMPT_ACTIVE);
    }




    \
     
     \ /
      Last update: 2011-06-22 19:55    [W:3.051 / U:0.740 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site