• Oleg Nesterov's avatar
    rcu/sync: Simplify the state machine · 89da3b94
    Oleg Nesterov authored
    With this patch rcu_sync has a single state variable and the transition rules
    become really simple:
    
    	GP_IDLE   - owned by the first rcu_sync_enter() which moves it to
    
    	GP_ENTER  - owned by rcu-callback which moves it to
    
    	GP_PASSED - owned by the last rcu_sync_exit() which moves it to
    
    	GP_EXIT   - and this is the only "nontrivial" state.
    
    		rcu-callback moves it back to GP_IDLE unless another enter()
    		comes before a GP pass.
    
    		If rcu-callback is invoked before the next rcu_sync_exit() it
    		must see gp_count incremented by that enter() and set GP_PASSED.
    
    		Otherwise, if the next rcu_sync_exit() wins the race, it will
    		move it to
    
    	GP_REPLAY - owned by rcu-callback which moves it to GP_EXIT
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    [ paulmck: While here, apply READ_ONCE() and WRITE_ONCE() to ->gp_state. ]
    [ paulmck: Tweaks to make htmldocs happy. (Reported by kbuild test robot.) ]
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    89da3b94
sync.c 6.2 KB