4pi*_*ie0 4 c algorithm linux-kernel preemption rcu
(来自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();
Run Code Online (Sandbox Code Playgroud)
RCU更新操作将执行synchronize_rcu()以断言每个CPU切换上下文,因此每个RCU读取器已完成它的工作.但RCU必须依靠读者不被抢先一步.事实上,LWN接下来说:
虽然这种简单的方法适用于在RCU读取端关键部分禁用抢占的内核,换句话说,对于非CONFIG_PREEMPT和CONFIG_PREEMPT内核,它不适用于CONFIG_PREEMPT_RT实时(-rt)内核.
我理解对于非CONFIG_PREEMPT内核禁用抢占,但为什么CONFIG_PREEMPT内核也可以呢?
在CONFIG_PREEMPT内核上没问题,因为在任务被抢占之前需要注意完成rcu read critical部分.调度程序检查当前任务是否在rcu读取临界区中,如果是,则增强其优先级以使其完成临界区.有关详细信息,请参阅此文章:http://lwn.net/Articles/220677/