首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保护RCU读取器部分不被抢占?

如何保护RCU读取器部分不被抢占?
EN

Stack Overflow用户
提问于 2015-08-27 22:25:08
回答 2查看 881关注 0票数 4

(摘自一篇关于LWN的文章)

代码语言:javascript
复制
 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内核也可以呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-28 17:40:41

在CONFIG_PREEMPT内核上,它是可以的,因为在任务被抢占之前,需要注意完成rcu读取关键部分。调度程序检查当前任务是否在rcu读取关键部分中,如果是,则提升优先级,从而完成关键部分。有关详细信息,请参阅本文:http://lwn.net/Articles/220677/

票数 5
EN

Stack Overflow用户

发布于 2015-08-28 09:22:39

我们需要CONFIG_PREEMPT内核的RCU。如果没有抢占或阻塞,那么我们就不会陷入这种同步混乱中。有两种类型的RCU实现:

代码语言:javascript
复制
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读取端关键部分可能被抢占,它们也可能被阻塞,但只有在获得受优先级继承约束的自旋锁时才能实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32260422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档