对于不存在的_bh RCU函数,我该怎么办?

时间:2015-09-02 17:56:39

标签: linux-kernel rcu

有许多RCU函数没有_bh对应函数。

例如:

  • list_entry_rcu()
  • list_for_each_entry_rcu()

这是因为......

  1. 他们可以从下半部调用就好了(想想list_empty() vs list_empty_rcu())?
    • 这是否意味着我可以在这些情况下互换使用rcu_read_lock()rcu_read_lock_bh()
  2. 到目前为止还没有人需要它们(因此我应该推出我自己的版本)?
  3. 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() ...

1 个答案:

答案 0 :(得分:1)

这是真的:

  
      
  1. 到目前为止还没有人需要它们(因此我应该推出自己的版本)。
  2.   

更准确地说,有很多RCU列表遍历函数,因此由于罕见的需要,决定不包括所有_rcu_bh对等对。但请参见下文。

您不能互相使用rcu_read_lock()rcu_read_lock_bh。但仅在注释中rcu_dereferencercu_dereference_check之间存在差异:它们都扩展为使用不同__rcu_dereference_check()参数的c宏调用。

因此,从处理程序的视图来看,__clusterip_config_find的实现是正确的,但在启用检查程序时可能会产生警告。 (对于cource来说,每个司机都应该在没有警告的情况下工作)。