*/
static void rcu_do_batch(struct rcu_data *rdp)
{
+ unsigned long flags;
struct rcu_head *next, *list;
int count = 0;
}
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;
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);
}
}
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);
/*
rdp->nxttail[0] = &rdp->nxtlist;
}
- local_irq_enable();
+ local_irq_restore(flags);
if (rcu_batch_after(rdp->batch, rcp->pending)) {
unsigned long flags;