lkml.org 
[lkml]   [2004]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] fixes for rcu_offline_cpu, rcu_move_batch (2.6.8-rc2)
    From
    Date
    Hi,

    rcu_offline_cpu and rcu_move_batch have been broken since the
    list_head's in struct rcu_head and struct rcu_data were replaced with
    singly-linked lists:

    CC kernel/rcupdate.o
    kernel/rcupdate.c: In function `rcu_move_batch':
    kernel/rcupdate.c:222: warning: passing arg 2 of `list_add_tail' from
    incompatible pointer type
    kernel/rcupdate.c: In function `rcu_offline_cpu':
    kernel/rcupdate.c:239: warning: passing arg 1 of `rcu_move_batch' from
    incompatible pointer type
    kernel/rcupdate.c:240: warning: passing arg 1 of `rcu_move_batch' from
    incompatible pointer type
    kernel/rcupdate.c:236: warning: label `unlock' defined but not used

    Kernel crashes when you try to offline a cpu, not surprisingly.

    It also looks like rcu_move_batch isn't preempt-safe so I touched that
    up, and got rid of an unused label in rcu_offline_cpu.

    This fixes the crash for me; does it look ok?


    Signed-off-by: Nathan Lynch <nathanl@austin.ibm.com>

    diff -prauNX /home/nathanl/working/dontdiff 2.6.8-rc2/kernel/rcupdate.c 2.6.8-rc2-ntl/kernel/rcupdate.c
    --- 2.6.8-rc2/kernel/rcupdate.c 2004-07-23 19:58:35.000000000 -0500
    +++ 2.6.8-rc2-ntl/kernel/rcupdate.c 2004-07-26 13:41:15.000000000 -0500
    @@ -210,16 +210,18 @@ static void rcu_check_quiescent_state(vo
    * locking requirements, the list it's pulling from has to belong to a cpu
    * which is dead and hence not processing interrupts.
    */
    -static void rcu_move_batch(struct list_head *list)
    +static void rcu_move_batch(struct rcu_head *list)
    {
    - struct list_head *entry;
    - int cpu = smp_processor_id();
    + int cpu;

    local_irq_disable();
    - while (!list_empty(list)) {
    - entry = list->next;
    - list_del(entry);
    - list_add_tail(entry, &RCU_nxtlist(cpu));
    +
    + cpu = smp_processor_id();
    +
    + while (list != NULL) {
    + *RCU_nxttail(cpu) = list;
    + RCU_nxttail(cpu) = &list->next;
    + list = list->next;
    }
    local_irq_enable();
    }
    @@ -233,11 +235,10 @@ static void rcu_offline_cpu(int cpu)
    spin_lock_bh(&rcu_state.mutex);
    if (rcu_ctrlblk.cur != rcu_ctrlblk.completed)
    cpu_quiet(cpu);
    -unlock:
    spin_unlock_bh(&rcu_state.mutex);

    - rcu_move_batch(&RCU_curlist(cpu));
    - rcu_move_batch(&RCU_nxtlist(cpu));
    + rcu_move_batch(RCU_curlist(cpu));
    + rcu_move_batch(RCU_nxtlist(cpu));

    tasklet_kill_immediate(&RCU_tasklet(cpu), cpu);
    }

    -
    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: 2005-03-22 14:04    [W:0.023 / U:98.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site