diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 30 | 
1 files changed, 14 insertions, 16 deletions
| diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index a4a0475aede9..00f07d6436ce 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3716,24 +3716,22 @@ retry_ipi:  			ret = smp_call_function_single(cpu, func, rsp, 0);  			if (!ret) {  				mask_ofl_ipi &= ~mask; -			} else { -				/* Failed, raced with offline. */ -				raw_spin_lock_irqsave_rcu_node(rnp, flags); -				if (cpu_online(cpu) && -				    (rnp->expmask & mask)) { -					raw_spin_unlock_irqrestore(&rnp->lock, -								   flags); -					schedule_timeout_uninterruptible(1); -					if (cpu_online(cpu) && -					    (rnp->expmask & mask)) -						goto retry_ipi; -					raw_spin_lock_irqsave_rcu_node(rnp, -								       flags); -				} -				if (!(rnp->expmask & mask)) -					mask_ofl_ipi &= ~mask; +				continue; +			} +			/* Failed, raced with offline. */ +			raw_spin_lock_irqsave_rcu_node(rnp, flags); +			if (cpu_online(cpu) && +			    (rnp->expmask & mask)) {  				raw_spin_unlock_irqrestore(&rnp->lock, flags); +				schedule_timeout_uninterruptible(1); +				if (cpu_online(cpu) && +				    (rnp->expmask & mask)) +					goto retry_ipi; +				raw_spin_lock_irqsave_rcu_node(rnp, flags);  			} +			if (!(rnp->expmask & mask)) +				mask_ofl_ipi &= ~mask; +			raw_spin_unlock_irqrestore(&rnp->lock, flags);  		}  		/* Report quiescent states for those that went offline. */  		mask_ofl_test |= mask_ofl_ipi; | 
