lkml.org 
[lkml]   [2009]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/2] sched: optimize cond_resched()
    Optimize cond_resched() by removing one conditional.

    Currently cond_resched() checks system_state ==
    SYSTEM_RUNNING in order to avoid scheduling before the
    scheduler is running.

    We can however, as per suggestion of Matt, use
    PREEMPT_ACTIVE to accomplish that very same.

    Suggested-by: Matt Mackall <mpm@selenic.com>
    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    ---
    include/linux/sched.h | 5 ++++-
    kernel/sched.c | 14 +++++++++-----
    2 files changed, 13 insertions(+), 6 deletions(-)

    Index: linux-2.6/include/linux/sched.h
    ===================================================================
    --- linux-2.6.orig/include/linux/sched.h
    +++ linux-2.6/include/linux/sched.h
    @@ -503,8 +503,11 @@ struct task_cputime {
    /*
    * Disable preemption until the scheduler is running.
    * Reset by start_kernel()->sched_init()->init_idle().
    + *
    + * We include PREEMPT_ACTIVE to avoid cond_resched() from working
    + * before the scheduler is active -- see should_resched().
    */
    -#define INIT_PREEMPT_COUNT (1)
    +#define INIT_PREEMPT_COUNT (1 + PREEMPT_ACTIVE)

    /**
    * struct thread_group_cputimer - thread group interval timer counts
    Index: linux-2.6/kernel/sched.c
    ===================================================================
    --- linux-2.6.orig/kernel/sched.c
    +++ linux-2.6/kernel/sched.c
    @@ -6580,6 +6580,11 @@ SYSCALL_DEFINE0(sched_yield)
    return 0;
    }

    +static inline int should_resched(void)
    +{
    + return need_resched() && !(preempt_count() & PREEMPT_ACTIVE);
    +}
    +
    static void __cond_resched(void)
    {
    #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
    @@ -6599,8 +6604,7 @@ static void __cond_resched(void)

    int __sched _cond_resched(void)
    {
    - if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE) &&
    - system_state == SYSTEM_RUNNING) {
    + if (should_resched()) {
    __cond_resched();
    return 1;
    }
    @@ -6618,12 +6622,12 @@ EXPORT_SYMBOL(_cond_resched);
    */
    int cond_resched_lock(spinlock_t *lock)
    {
    - int resched = need_resched() && system_state == SYSTEM_RUNNING;
    + int resched = should_resched();
    int ret = 0;

    if (spin_needbreak(lock) || resched) {
    spin_unlock(lock);
    - if (resched && need_resched())
    + if (resched)
    __cond_resched();
    else
    cpu_relax();
    @@ -6638,7 +6642,7 @@ int __sched cond_resched_softirq(void)
    {
    BUG_ON(!in_softirq());

    - if (need_resched() && system_state == SYSTEM_RUNNING) {
    + if (should_resched()) {
    local_bh_enable();
    __cond_resched();
    local_bh_disable();
    --



    \
     
     \ /
      Last update: 2009-07-10 15:07    [W:0.032 / U:179.792 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site