diff options
Diffstat (limited to 'kernel/rcu/sync.c')
| -rw-r--r-- | kernel/rcu/sync.c | 12 | 
1 files changed, 4 insertions, 8 deletions
| diff --git a/kernel/rcu/sync.c b/kernel/rcu/sync.c index 6c2bd9001adc..da60a9947c00 100644 --- a/kernel/rcu/sync.c +++ b/kernel/rcu/sync.c @@ -122,7 +122,7 @@ void rcu_sync_enter(struct rcu_sync *rsp)  		 * we are called at early boot time but this shouldn't happen.  		 */  	} -	WRITE_ONCE(rsp->gp_count, rsp->gp_count + 1); +	rsp->gp_count++;  	spin_unlock_irq(&rsp->rss_lock);  	if (gp_state == GP_IDLE) { @@ -151,15 +151,11 @@ void rcu_sync_enter(struct rcu_sync *rsp)   */  void rcu_sync_exit(struct rcu_sync *rsp)  { -	int gpc; -  	WARN_ON_ONCE(READ_ONCE(rsp->gp_state) == GP_IDLE); -	WARN_ON_ONCE(READ_ONCE(rsp->gp_count) == 0);  	spin_lock_irq(&rsp->rss_lock); -	gpc = rsp->gp_count - 1; -	WRITE_ONCE(rsp->gp_count, gpc); -	if (!gpc) { +	WARN_ON_ONCE(rsp->gp_count == 0); +	if (!--rsp->gp_count) {  		if (rsp->gp_state == GP_PASSED) {  			WRITE_ONCE(rsp->gp_state, GP_EXIT);  			rcu_sync_call(rsp); @@ -178,10 +174,10 @@ void rcu_sync_dtor(struct rcu_sync *rsp)  {  	int gp_state; -	WARN_ON_ONCE(READ_ONCE(rsp->gp_count));  	WARN_ON_ONCE(READ_ONCE(rsp->gp_state) == GP_PASSED);  	spin_lock_irq(&rsp->rss_lock); +	WARN_ON_ONCE(rsp->gp_count);  	if (rsp->gp_state == GP_REPLAY)  		WRITE_ONCE(rsp->gp_state, GP_EXIT);  	gp_state = rsp->gp_state; |