rcu_gp_kthread 会注册新的grace period,开始新的grace period。 Grace Period完成 Quiescent Period完成,内核线程rcu_gp_kthread被唤醒后,执行:rcu_gp_cleanup(); 标记rcu_state上gp完成:rcu_seq_end(&new_gp_seq); 更新每个rcu_node上的gp_seq为完成状态:WRITE_ONCE(rnp->gp_seq, new_gp_seq); 进入ID...
内核分别为rcu_preempt_state, rcu_bh_state, rcu_sched_state创建了内核线程rcu_gp_kthread; rcu_gp_kthread内核线程主要完成三个工作:1)创建新的宽限期GP;2)等待强制静止状态,设置超时,提前唤醒说明所有处理器经过了静止状态;3)宽限期结束处理。其中,前边两个操作都是通过睡眠等待在某个条件上。 7. 静止状...
既然涉及到宽限期GP的操作,都放到了rcu_gp_kthread内核线程中了,那么来看看这个内核线程的逻辑操作吧: 内核分别为rcu_preempt_state, rcu_bh_state, rcu_sched_state创建了内核线程rcu_gp_kthread; rcu_gp_kthread内核线程主要完成三个工作:1)创建新的宽限期GP;2)等待强制静止状态,设置超时,提前唤醒说明所有...
如果相关的宽限期kthread在停顿警告之前无法运行(如上面"All QSes seen"行中的情况),则会打印以下附加行: kthread starved for 23807 jiffies! g7075 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1 ->cpu=5 即使所有CPU和任务均已通过所需的静态状态,使CPU时间的宽限期kthreads Starving, 当然也会导致RCU CPU...
关键点来了:Tree RCU使用rcu_node节点来构造层级结构,进而管理静止状态Quiescent State和宽限期Grace Period,静止状态信息QS是从每个CPU的rcu_data往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束 ...
内核分别为rcu_preempt_state, rcu_bh_state, rcu_sched_state创建了内核线程rcu_gp_kthread; rcu_gp_kthread内核线程主要完成三个工作:1)创建新的宽限期GP;2)等待强制静止状态,设置超时,提前唤醒说明所有处理器经过了静止状态;3)宽限期结束处理。其中,前边两个操作都是通过睡眠等待在某个条件上。
细分这些场景是为了提高RCU的效率。rcu_preempt_state将在下文进行说明。 1.3 汇报宽限期度过 每个CPU度过quiescentstate之后,需要向上汇报直至所有CPU完成quiescent state,从而标识宽限期的完成,这个汇报过程在软中断RCU_SOFTIRQ中完成。软中断的唤醒则是在上述的时钟中断中进行。
关键点来了:Tree RCU使用rcu_node节点来构造层级结构,进而管理静止状态Quiescent State和宽限期Grace Period,静止状态信息QS是从每个CPU的rcu_data往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束 ...
从上文1.3节宽限期的结束处理过程我们可以知道,rcu_gp_kthread会判断! (rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))两个条件来决定GP是否完成,其中!rnp->qsmask代表每个CPU都经过一次quiescent state,quiescent state的定义与传统RCU一致;!rcu_preempt_blocked_readers_cgp(rnp)这个条件就代表了rcu...
这发生在每个CPU的rcu_cpu_kthread中,其中内核线程rcu_gp_kthread仅更新了rcu_node的gp_seq,未直接触发回调执行。rcu_cpu_kthread在检查函数rcu_check_quiescent_state中确认Grace Period已完成,通过内部检查判断当前gp序列是否已完成,若已完成,则将所有callback移动到RCU_DONE_TAIL列表上,后续在rcu...