我应该如何处理不存在的 _bh RCU 函数?
What should I do with nonexistent _bh RCU functions?
有许多 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 表示 "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()
...
这是真的:
- 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_dereference
和 rcu_dereference_check
之间的区别仅在于注释:它们都扩展为 __rcu_dereference_check()
宏调用,具有不同的 c
参数。
因此,__clusterip_config_find
的实施从处理器的角度来看是正确的,但在启用检查器时可能会产生警告。 (当然,每个 driver 都应该在没有警告的情况下工作)。
有许多 RCU 函数没有对应的 _bh。
例子是:
list_entry_rcu()
list_for_each_entry_rcu()
这是因为...
- 他们可以从下半部调用(想想
list_empty()
vslist_empty_rcu()
)?- 这是否意味着我可以在这些情况下互换使用
rcu_read_lock()
和rcu_read_lock_bh()
?
- 这是否意味着我可以在这些情况下互换使用
- 到目前为止还没有人需要它们(因此我应该推出我自己的版本)?
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()
...
这是真的:
- 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_dereference
和 rcu_dereference_check
之间的区别仅在于注释:它们都扩展为 __rcu_dereference_check()
宏调用,具有不同的 c
参数。
因此,__clusterip_config_find
的实施从处理器的角度来看是正确的,但在启用检查器时可能会产生警告。 (当然,每个 driver 都应该在没有警告的情况下工作)。