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

What should I do with nonexistent _bh RCU functions?

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

例子是:

这是因为...

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

Rule 9 of the RCU checklist 表示 "in which case the matching rcu_dereference() primitive must be used in order to keep lockdep happy"。所以我猜上面的第二个选项是正确的。但后来我发现代码是这样的:

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. No one has so far needed them (and therefore I's supposed to roll out my own version of them).

更准确地说,有很多 RCU 列表遍历函数,因此由于很少需要,所以决定不包括所有 _rcu_bh 个配对。但见下文。

您不能交替使用 rcu_read_lock()rcu_read_lock_bh。但 rcu_dereferencercu_dereference_check 之间的区别仅在于注释:它们都扩展为 __rcu_dereference_check() 宏调用,具有不同的 c 参数。

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