|
@@ -695,9 +695,12 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
|
|
|
|
|
|
raw_spin_lock_irqsave(&rnp->lock, flags);
|
|
raw_spin_lock_irqsave(&rnp->lock, flags);
|
|
for (;;) {
|
|
for (;;) {
|
|
- if (!sync_rcu_preempt_exp_done(rnp))
|
|
|
|
|
|
+ if (!sync_rcu_preempt_exp_done(rnp)) {
|
|
|
|
+ raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
break;
|
|
break;
|
|
|
|
+ }
|
|
if (rnp->parent == NULL) {
|
|
if (rnp->parent == NULL) {
|
|
|
|
+ raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
wake_up(&sync_rcu_preempt_exp_wq);
|
|
wake_up(&sync_rcu_preempt_exp_wq);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -707,7 +710,6 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
|
|
raw_spin_lock(&rnp->lock); /* irqs already disabled */
|
|
raw_spin_lock(&rnp->lock); /* irqs already disabled */
|
|
rnp->expmask &= ~mask;
|
|
rnp->expmask &= ~mask;
|
|
}
|
|
}
|
|
- raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|