parisc: convert /proc/pdc/{lcd,led} to seq_file
[safe/jmp/linux-2.6] / kernel / rcutree.c
index a9f5103..53ae959 100644 (file)
@@ -60,7 +60,8 @@ static struct lock_class_key rcu_node_class[NUM_RCU_LVLS];
                NUM_RCU_LVL_0,  /* root of hierarchy. */ \
                NUM_RCU_LVL_1, \
                NUM_RCU_LVL_2, \
-               NUM_RCU_LVL_3, /* == MAX_RCU_LVLS */ \
+               NUM_RCU_LVL_3, \
+               NUM_RCU_LVL_4, /* == MAX_RCU_LVLS */ \
        }, \
        .signaled = RCU_GP_IDLE, \
        .gpnum = -300, \
@@ -947,7 +948,7 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp)
 {
        unsigned long flags;
        unsigned long mask;
-       int need_quiet = 0;
+       int need_report = 0;
        struct rcu_data *rdp = rsp->rda[cpu];
        struct rcu_node *rnp;
 
@@ -966,7 +967,7 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp)
                        break;
                }
                if (rnp == rdp->mynode)
-                       need_quiet = rcu_preempt_offline_tasks(rsp, rnp, rdp);
+                       need_report = rcu_preempt_offline_tasks(rsp, rnp, rdp);
                else
                        spin_unlock(&rnp->lock); /* irqs remain disabled. */
                mask = rnp->grpmask;
@@ -981,10 +982,12 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp)
         */
        spin_unlock(&rsp->onofflock); /* irqs remain disabled. */
        rnp = rdp->mynode;
-       if (need_quiet)
+       if (need_report & RCU_OFL_TASKS_NORM_GP)
                rcu_report_unblock_qs_rnp(rnp, flags);
        else
                spin_unlock_irqrestore(&rnp->lock, flags);
+       if (need_report & RCU_OFL_TASKS_EXP_GP)
+               rcu_report_exp_rnp(rsp, rnp);
 
        rcu_adopt_orphan_cbs(rsp);
 }
@@ -1842,6 +1845,8 @@ static void __init rcu_init_one(struct rcu_state *rsp)
                        rnp->level = i;
                        INIT_LIST_HEAD(&rnp->blocked_tasks[0]);
                        INIT_LIST_HEAD(&rnp->blocked_tasks[1]);
+                       INIT_LIST_HEAD(&rnp->blocked_tasks[2]);
+                       INIT_LIST_HEAD(&rnp->blocked_tasks[3]);
                }
        }
 }
@@ -1877,6 +1882,9 @@ void __init rcu_init(void)
 #ifdef CONFIG_RCU_CPU_STALL_DETECTOR
        printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n");
 #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
+#if NUM_RCU_LVL_4 != 0
+       printk(KERN_INFO "Experimental four-level hierarchy is enabled.\n");
+#endif /* #if NUM_RCU_LVL_4 != 0 */
        RCU_INIT_FLAVOR(&rcu_sched_state, rcu_sched_data);
        RCU_INIT_FLAVOR(&rcu_bh_state, rcu_bh_data);
        __rcu_init_preempt();