|
@@ -2104,12 +2104,17 @@ static void rcu_nocb_wait_gp(struct rcu_data *rdp)
|
|
|
bool needwake;
|
|
|
struct rcu_node *rnp = rdp->mynode;
|
|
|
|
|
|
- raw_spin_lock_irqsave_rcu_node(rnp, flags);
|
|
|
+ local_irq_save(flags);
|
|
|
c = rcu_seq_snap(&rdp->rsp->gp_seq);
|
|
|
- needwake = rcu_start_this_gp(rnp, rdp, c);
|
|
|
- raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
|
|
|
- if (needwake)
|
|
|
- rcu_gp_kthread_wake(rdp->rsp);
|
|
|
+ if (!rdp->gpwrap && ULONG_CMP_GE(rdp->gp_seq_needed, c)) {
|
|
|
+ local_irq_restore(flags);
|
|
|
+ } else {
|
|
|
+ raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
|
|
|
+ needwake = rcu_start_this_gp(rnp, rdp, c);
|
|
|
+ raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
|
|
|
+ if (needwake)
|
|
|
+ rcu_gp_kthread_wake(rdp->rsp);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Wait for the grace period. Do so interruptibly to avoid messing
|