rcu_read_lock的实现是禁用抢占和屏障.并且softirq上下文不会被抢占.
所以有必要在softirq上下文中调用rcu_read_lock.障碍重要吗?
解决方法:
是的,有必要使用rcu_read_lock来访问受rcu保护的指针,即使在softirq上下文中也是如此.
正如您所指出的,rcu_read_lock和softirqs的一些实现(例如:TINY_RCU)使得即使您没有使用rcu_read_lock分隔rcu读取端关键部分也不存在损坏风险.但是,这不是rcu api的保证,只是因为具体实施而“破解”.这个hack可能会破坏rcu的不同实现(例如:PREEMPT_RCU).
如果您希望将softirqs视为显式rcu读取端关键部分,则必须使用RCU-sched api:
Documentation/RCU/whatisRCU.txt
RCU主要作者撰写的文章的以下部分直接解决了您的问题:
Requirements for RCU part 1: the fundamentals – Disabling preemption does not block grace periods
我想补充一点,如果CONFIG_PROVE_RCU = y,在rcu_read_lock之外执行rcu_dereference的代码将触发lockdep警告.