有许多RCU函数没有_bh对应函数。
例如:
list_entry_rcu()
list_for_each_entry_rcu()
这是因为......
list_empty()
vs list_empty_rcu()
)?
rcu_read_lock()
和rcu_read_lock_bh()
? Rule 9 of the RCU checklist说“在这种情况下必须使用匹配的rcu_dereference()
原语以保持lockdep的快乐”。所以我猜上面的第二个选项是正确的。但后来我发现代码如下:
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()
...
答案 0 :(得分:1)
这是真的:
- 到目前为止还没有人需要它们(因此我应该推出自己的版本)。
醇>
更准确地说,有很多RCU列表遍历函数,因此由于罕见的需要,决定不包括所有_rcu_bh
对等对。但请参见下文。
您不能互相使用rcu_read_lock()
和rcu_read_lock_bh
。但仅在注释中rcu_dereference
和rcu_dereference_check
之间存在差异:它们都扩展为使用不同__rcu_dereference_check()
参数的c
宏调用。
因此,从处理程序的视图来看,__clusterip_config_find
的实现是正确的,但在启用检查程序时可能会产生警告。 (对于cource来说,每个司机都应该在没有警告的情况下工作)。