lkml.org 
[lkml]   [2006]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 1/5] Disable interrupts for locking in load_balance()
    scheduler: Disable interrupts for locking in load_balance()

    Interrupts must be disabled for request queue locks if we want
    to run load_balance() with interrupts enabled.

    Signed-off-by: Christoph Lameter <clameter@sgi.com>

    Index: linux-2.6.19-rc2-mm2/kernel/sched.c
    ===================================================================
    --- linux-2.6.19-rc2-mm2.orig/kernel/sched.c 2006-10-23 19:35:19.615025838 -0500
    +++ linux-2.6.19-rc2-mm2/kernel/sched.c 2006-10-23 19:36:26.208865512 -0500
    @@ -2530,8 +2530,6 @@ static inline unsigned long minus_1_or_z
    /*
    * Check this_cpu to ensure it is balanced within domain. Attempt to move
    * tasks if there is an imbalance.
    - *
    - * Called with this_rq unlocked.
    */
    static int load_balance(int this_cpu, struct rq *this_rq,
    struct sched_domain *sd, enum idle_type idle)
    @@ -2541,6 +2539,7 @@ static int load_balance(int this_cpu, st
    unsigned long imbalance;
    struct rq *busiest;
    cpumask_t cpus = CPU_MASK_ALL;
    + unsigned long flags;

    /*
    * When power savings policy is enabled for the parent domain, idle
    @@ -2580,11 +2579,13 @@ redo:
    * still unbalanced. nr_moved simply stays zero, so it is
    * correctly treated as an imbalance.
    */
    + local_irq_save(flags);
    double_rq_lock(this_rq, busiest);
    nr_moved = move_tasks(this_rq, this_cpu, busiest,
    minus_1_or_zero(busiest->nr_running),
    imbalance, sd, idle, &all_pinned);
    double_rq_unlock(this_rq, busiest);
    + local_irq_restore(flags);

    /* All tasks on this runqueue were pinned by CPU affinity */
    if (unlikely(all_pinned)) {
    @@ -2601,13 +2602,13 @@ redo:

    if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) {

    - spin_lock(&busiest->lock);
    + spin_lock_irqsave(&busiest->lock, flags);

    /* don't kick the migration_thread, if the curr
    * task on busiest cpu can't be moved to this_cpu
    */
    if (!cpu_isset(this_cpu, busiest->curr->cpus_allowed)) {
    - spin_unlock(&busiest->lock);
    + spin_unlock_irqrestore(&busiest->lock, flags);
    all_pinned = 1;
    goto out_one_pinned;
    }
    @@ -2617,7 +2618,7 @@ redo:
    busiest->push_cpu = this_cpu;
    active_balance = 1;
    }
    - spin_unlock(&busiest->lock);
    + spin_unlock_irqrestore(&busiest->lock, flags);
    if (active_balance)
    wake_up_process(busiest->migration_thread);

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-10-24 20:35    [W:0.022 / U:89.956 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site