深入理解RCU实现
|
D. 在等待quiescent state. 如果rcu_pending返回1,就会进入到rcu_check_callbacks(),rcu_check_callbacks()中主要工作就是调用raise_softirq(RCU_SOFTIRQ),触发RCU软中断。而RCU软中断的处理函数为rcu_process_callbacks,其中分别针对每cpu变量rcu_bh_data和rcu_data调用__rcu_process_callbacks。我们主要分析针对rcu_data的调用。 l __rcu_process_callbacks 1) 先看nxtlist里有没有待处理的回调(rcu_head),如果有的话,说明有写者待处理,那么还要分两种情况: 1.1)如果系统是第一次出现写者阻塞,也即之前的写者都已经处理完毕,那么此时curlist链表一定为空(curlist专门存放已被rcu检测到的写者请求),于是就把nxtlist里的所有成员都移动到curlist指向,并把当前CPU需要等待的grace period id:rdp->batch设置为当前系统处理的grace period的下一个grace周期,即rcp->cur+ 1。由于这算是一个新的grace period,即start_rcu_batch,所以还接着需要增加系统的grace period计数,即rcp->cur++,同时,将全局的cpusmask设置为全f,代表新的grace period开始,需要检测所有的cpu是否都经过了一次进程切换。代码如下: void __rcu_process_callbacks(struct rcu_ctrlblk *rcp, struct rcu_data *rdp) { if (rdp->nxtlist && !rdp->curlist) { move_local_cpu_nxtlist_to_curlist();
rdp->batch = rcp->cur + 1;
if (!rcp->next_pending) { rcp->next_pending = 1; rcp->cur++; cpus_andnot(rcp->cpumask, cpu_online_map, nohz_cpu_mask); } } } 接着跳转至1.2。
(编辑:网站开发网_安阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


