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()