有很多RCU函数没有对应的_bh。
的例子有:
-
list_entry_rcu()
-
list_for_each_entry_rcu()
这是因为……
- 他们可以从下半部分调用(想想
list_empty()
和list_empty_rcu()
)?- 这是否意味着我可以在这些情况下互换使用
rcu_read_lock()
和rcu_read_lock_bh()
?
- 这是否意味着我可以在这些情况下互换使用
- 到目前为止还没有人需要它们(因此我应该推出我自己的版本)?
RCU检查表的规则9说:"在这种情况下,必须使用匹配的rcu_dereference()
原语,以保持lockdeep满意"。所以我想第二个选项是正确的。但后来我发现这样的代码:
rcu_read_lock_bh();
c = __clusterip_config_find(clusterip);
然后,在__clusterip_config_find()
期间:
list_for_each_entry_rcu(c, &clusterip_configs, list) {
发生什么事了?list_for_each_entry_rcu()
使用rcu_dereference_check()
,而不是rcu_dereference_bh_check()
…
这是真的:
- 到目前为止还没有人需要它们(因此我应该推出我自己的版本)。
更准确地说,有太多的RCU列表遍历函数,所以决定不包括所有的_rcu_bh
对,因为很少需要。
rcu_read_lock()
和rcu_read_lock_bh
不能互换使用。rcu_dereference
和rcu_dereference_check
的区别仅在于注释:它们都扩展为__rcu_dereference_check()
宏调用,但c
参数不同。
因此,从处理器的角度来看,__clusterip_config_find
的实现是正确的,但是当启用检查器时可能会产生警告。(当然,每个司机都应该倾向于在没有警告的情况下工作)。