RCU writer方在释放元素时的三种调用方式原文:Paul McKenney, "RCU and Unloadable Modules", http:///Articles/217119/, January 14, 2007.
RCU writer方在释放元素时有三种调用方式:
1. 调用synchronize_rcu()——同步方式 调用举例:从一个链表中删除元素p list_del_rcu(p); synchronize_rcu(); kfree(p); 2. 在IRQ中调用call_rcv()——异步方式 调用举例: 从一个链表中删除元素p list_del_rcu(p); call_rcu(&p->rcu, p_callback); static void p_callback(struct rcu_head *rp)
{ struct pstruct *p = container_of(rp, struct pstruct, rcu); kfree(p); } 3. 模块或文件系统卸载时调用rcu_barrier()
这里不能在卸载代码中简单调用synchronize_rcu(). 因为synchronize_rcu()虽然要等待一段grace period时间过去, 但它并不等待回调函数完成. 所以需要调用rcu_barrier(),以等待所有的rcu回调函数完成. 调用举例:模块卸载
(1) Prevent any new RCU callbacks from being posted. (2) Execute rcu_barrier(). (3) Allow the module to be unloaded. |
|