小知识点:1. RCU_SOFTIRQ软中断是所有软中断中优先级最低的。2. 在RT-Linux中并未使用软中断,而是为每个CPU都注册了一个rcu_cpu_kthread线程作为替代。 GP内核线程: 这里所谓的gp线程即rcu_gp_kthread(),主要功能是处理宽限期相关的事务,包括:开启新的宽限期、处理forcing QS、清理已结束的宽限期。 此线...
这些函数在调度器、__do_softirq()和rcu_check_callbacks()中被调用。后面这个函数在调度时钟中断中调用,并分析状态以确定中断是否发生在一个静止状态中,以确定是调用rcu_qsctr_inc()或者 rcu_bh_qsctr_inc()。它也触发RCU_SOFTIRQ软中断,并导致当前CPU在随后的软中断上下文中调用rcu_process_callbacks(),rcu_p...
很显然,对这种状态的检测通常都是周期性的进行,放置在时钟中断处理中就是情理之中了: rcu_sched/rcu_bh类型的RCU中,当检测CPU处于用户模式或处于idle线程中,说明当前CPU已经离开了临界区,经历了一个QS静止状态,对于rcu_bh的RCU,如果没有出去softirq上下文中,也表明CPU经历了QS静止状态; 在rcu_pending满足条件的情...
rcu_sched/rcu_bh类型的RCU中,当检测CPU处于用户模式或处于idle线程中,说明当前CPU已经离开了临界区,经历了一个QS静止状态,对于rcu_bh的RCU,如果没有出去softirq上下文中,也表明CPU经历了QS静止状态; 在rcu_pending满足条件的情况下,触发软中断的执行,rcu_process_callbacks将会被调用; 在rcu_process_callbacks回调函...
后面这个函数在调度时钟中断中调用,并分析状态以确定中断是否发生在一个静止状态中,以确定是调用rcu_qsctr_inc()或者 rcu_bh_qsctr_inc()。它也触发RCU_SOFTIRQ软中断,并导致当前CPU在随后的软中断上下文中调用rcu_process_callbacks(),rcu_process_callbacks函数处理RCU在每个CPU上的回调函数以释放资源。 2.7.3....
voidrcu_check_callbacks(int cpu,int user){if(user||(idle_cpu(cpu)&&!in_softirq()&&hardirq_count()<=(1<<HARDIRQ_SHIFT))){RCU_qsctr(cpu)++;}tasklet_schedule(&RCU_tasklet(cpu));// 这里会调用 rcu_process_callbacks() 函数} 这个函数主要做两件事情: ...
7. grpnum:这个字段包含与这个rcu_node对应的父 rcu_node结构的qsmask和qsmaskinit字段的位编号。换句话说,给定一个rcu_node结构指针rnp,总有1UL<< rnp->grpnum == rnp->grpmask。grpnum字段用于调试目的。 8. level:对根rcu_node结构来说,这个字段是0。根的子结点是1,依此类推。
Tree RCU以树形分层来组织CPU,将CPU分组,本小组的CPU争用同一个锁,当本小组的某个CPU经历了一个静止状态QS后,将其对应的位从位图清除,如果该小组最后一个CPU经历完静止状态QS后,表明该小组全部经历了CPU的QS状态,那么将上一层对应该组的位从位图清除; ...
rcu_sched/rcu_bh类型的RCU中,当检测CPU处于用户模式或处于idle线程中,说明当前CPU已经离开了临界区,经历了一个QS静止状态,对于rcu_bh的RCU,如果没有出去softirq上下文中,也表明CPU经历了QS静止状态; 在rcu_pending满足条件的情况下,触发软中断的执行,rcu_process_callbacks将会被调用; ...
关键点来了:Tree RCU使用rcu_node节点来构造层级结构,进而管理静止状态Quiescent State和宽限期Grace Period,静止状态信息QS是从每个CPU的rcu_data往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束 ...