image/svg+xml rcu_accelerate_cbs() rcu_prepare_for_idle() rcu_accelerate_cbs() note_gp_changes() rcu_advance_cbs() __note_gp_changes() call_rcu() Wake up grace-period kernel thread rcu_accelerate_cbs() takedown_cpu() rcutree_migrate_callbacks() rcu_migrate_callbacks() rcu_advance_cbs() Leaf Leaf Leaf Phase One of Update rsp->gpnum++ Root rcu_gp_init() Leaf Leaf Leaf Leaf End of Last Grace Period Grace-period kernel thread awakened Leaf ->qsmaskinit ->qsmaskinitnext Leaf Leaf Leaf ->qsmaskinit rcu_init_new_rnp() or rcu_cleanup_dead_rnp() (optional) ->qsmaskinit Root ->qsmaskinitnext ->gpnum = rsp->gpnum Root ->gpnum = rsp->gpnum Leaf ->gpnum = rsp->gpnum ->gpnum = rsp->gpnum Leaf Leaf ->gpnum = rsp->gpnum Leaf ->gpnum = rsp->gpnum ->gpnum = rsp->gpnum rcu_gp_fqs() ->qsmask &= ~->grpmask Leaf ->qsmask &= ~->grpmask Leaf Leaf Leaf ->qsmask &= ~->grpmask force_qs_rnp() dyntick_save_progress_counter() Root ->qsmask &= ~->grpmask rcu_implicit_dynticks_qs() ->qsmask &= ~->grpmask RCU read-side critical section rcu_dynticks_eqs_enter() atomic_add_return() rcu_dynticks_eqs_exit() atomic_add_return() RCU read-side critical section RCU read-side critical section rcu_report_dead() rcu_cleanup_dying_idle_cpu() ->qsmaskinitnext Leaf RCU read-side critical section rcu_cpu_starting() ->qsmaskinitnext Leaf ->qsmask &= ~->grpmask Root rcu_report_rnp() Leaf ->qsmask &= ~->grpmask Leaf Leaf Leaf ->qsmask &= ~->grpmask note_gp_changes() rdp->gpnum __note_gp_changes() Leaf rcu_node_context_switch() rcu_check_callbacks() rcu_process_callbacks() rcu_check_quiescent_state()) rcu__report_qs_rdp()) RCU read-side critical section RCU read-side critical section RCU read-side critical section RCU read-side critical section Wake up grace-period kernel thread rcu_report_qs_rsp() Grace-period kernel thread awakened ->completed = ->gpnum Root rcu_gp_cleanup() ->completed = ->gpnum Leaf ->completed = ->gpnum rsp->completed = Root rnp->completed Leaf Leaf Leaf Leaf ->completed = ->gpnum Leaf Leaf ->completed = ->gpnum Leaf ->completed = ->gpnum ->completed = ->gpnum Start of Next Grace Period rcu_check_callbacks() rcu_cleanup_after_idle() rcu_advance_cbs() Leaf __note_gp_changes() Phase Two of Update RCU_SOFTIRQ rcu_do_batch()