(摘自一篇关于LWN的文章)
1 rcu_read_lock();
2 list_for_each_entry_rcu(p, head, list) {
3 do_something_with(p->a, p->b, p->c);
4 }
5 rcu_read_unlock();RCU更新操作将执行synchronize_rcu(),以断言每个CPU切换了上下文,因此每个RCU阅读器都完成了它的工作。但RCU必须依赖于读者,而不是被抢占。事实上,LWN说下一步:
尽管这种简单的方法适用于在RCU读取端关键部分中禁用抢占的内核,换句话说,对于非配置_PREEMPT和CONFIG_PREEMPT内核,它不适用于CONFIG_PREEMPT_RT实时(-rt)内核。
我知道非配置抢占内核是禁用的,但是为什么CONFIG_PREEMPT内核也可以呢?
发布于 2015-08-28 17:40:41
在CONFIG_PREEMPT内核上,它是可以的,因为在任务被抢占之前,需要注意完成rcu读取关键部分。调度程序检查当前任务是否在rcu读取关键部分中,如果是,则提升优先级,从而完成关键部分。有关详细信息,请参阅本文:http://lwn.net/Articles/220677/
发布于 2015-08-28 09:22:39
我们需要CONFIG_PREEMPT内核的RCU。如果没有抢占或阻塞,那么我们就不会陷入这种同步混乱中。有两种类型的RCU实现:
1) Non-preemptible RCU implementation
2) Preemptible RCU implementation当在一个CPU上调用synchronize_rcu()而其他CPU位于RCU读取端关键部分时,则synchronize_rcu()将被保证阻塞,直到所有其他CPU退出其关键部分为止。类似地,如果在一个CPU上调用call_rcu(),而其他CPU位于RCU读取端关键部分内,则对相应RCU回调的调用将推迟到所有其他CPU退出其关键部分之后。
在不可抢占的RCU实现中,在RCU读取端关键部分中阻塞是非法的。在可抢占的RCU实现(PREEMPT_RCU)中,在CONFIG_PREEMPT内核构建中,RCU读取端关键部分可能被抢占,但显式阻塞是非法的。最后,在实时(带有-rt修补程序集)内核构建中的可抢占的RCU实现中,RCU读取端关键部分可能被抢占,它们也可能被阻塞,但只有在获得受优先级继承约束的自旋锁时才能实现。
https://stackoverflow.com/questions/32260422
复制相似问题