rcu: use irq-safe locks
[safe/jmp/linux-2.6] / kernel / rcuclassic.c
index 01e761a..3f69189 100644 (file)
@@ -247,6 +247,7 @@ static inline void raise_rcu_softirq(void)
  */
 static void rcu_do_batch(struct rcu_data *rdp)
 {
+       unsigned long flags;
        struct rcu_head *next, *list;
        int count = 0;
 
@@ -261,9 +262,9 @@ static void rcu_do_batch(struct rcu_data *rdp)
        }
        rdp->donelist = list;
 
-       local_irq_disable();
+       local_irq_save(flags);
        rdp->qlen -= count;
-       local_irq_enable();
+       local_irq_restore(flags);
        if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark)
                rdp->blimit = blimit;
 
@@ -464,12 +465,14 @@ static void rcu_check_quiescent_state(struct rcu_ctrlblk *rcp,
 static void rcu_move_batch(struct rcu_data *this_rdp, struct rcu_head *list,
                                struct rcu_head **tail, long batch)
 {
+       unsigned long flags;
+
        if (list) {
-               local_irq_disable();
+               local_irq_save(flags);
                this_rdp->batch = batch;
                *this_rdp->nxttail[2] = list;
                this_rdp->nxttail[2] = tail;
-               local_irq_enable();
+               local_irq_restore(flags);
        }
 }
 
@@ -521,10 +524,11 @@ static void rcu_offline_cpu(int cpu)
 static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp,
                                        struct rcu_data *rdp)
 {
+       unsigned long flags;
        long completed_snap;
 
        if (rdp->nxtlist) {
-               local_irq_disable();
+               local_irq_save(flags);
                completed_snap = ACCESS_ONCE(rcp->completed);
 
                /*
@@ -554,7 +558,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp,
                        rdp->nxttail[0] = &rdp->nxtlist;
                }
 
-               local_irq_enable();
+               local_irq_restore(flags);
 
                if (rcu_batch_after(rdp->batch, rcp->pending)) {
                        unsigned long flags;