深入理解RCU实现
|
下面我们介绍剩下的三组指针,但首先注意这三组链表上的元素都是struct rcu_head 类型。这三个链表的作用还要结合整个RCU写者从阻塞到唤醒的过程来看。 rcu写者的整体流程,假设系统中出现rcu写者阻塞,那么流程如下: (1) 调用synchronize_rcu,将代表写者的rcu_head添加到CPU[n]每cpu变量rcu_data的nxtlist,这个链表代表有需要提交给rcu处理的回调(但还没有提交); (2) CPU[n]每次时钟中断时检测自己的nxtlist是否为null,若不为空,因此则唤醒rcu软中断; (3) RCU的软中断处理函数rcu_process_callbacks会挨个检查本CPU的三个链表。 下面分析RCU的核心处理函数,也就是软中断处理函数rcu_process_callbacks。 RCU软中断在“RCU API实现分析”一节我们知道调用synchronize_rcu,将代表写者的rcu_head添加到了CPU[n]每cpu变量rcu_data的nxtlist。 而另一方面,在每次时钟中断中,都会调用update_process_times函数。 l update_process_times
void update_process_times(int user_tick)
//...... l rcu_pending
rcu_pending()的代码如下: l __rcu_pending
static int __rcu_pending(struct rcu_ctrlblk *rcp, struct rcu_data *rdp) A. 该CPU上有等待处理的回调函数,且已经经过了一个batch(grace period).rdp->datch表示rdp在等待的batch序号; B. 上一个等待已经处理完了,又有了新注册的回调函数; C. 等待已经完成,但尚末调用该次等待的回调函数; (编辑:网站开发网_安阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


