[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)

    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 <>

    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;

    - 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;
    @@ -233,11 +235,10 @@ static void rcu_offline_cpu(int cpu)
    if (rcu_ctrlblk.cur != rcu_ctrlblk.completed)

    - 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
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2005-03-22 14:04    [W:0.020 / U:64.700 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site