我应该如何处理不存在的_bh RCU函数



有很多RCU函数没有对应的_bh。

的例子有:

  • list_entry_rcu()
  • list_for_each_entry_rcu()

这是因为……

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

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_dereferencercu_dereference_check的区别仅在于注释:它们都扩展为__rcu_dereference_check()宏调用,但c参数不同。

    因此,从处理器的角度来看,__clusterip_config_find的实现是正确的,但是当启用检查器时可能会产生警告。(当然,每个司机都应该倾向于在没有警告的情况下工作)。

    相关内容

    • 没有找到相关文章

    最新更新