为什么list_add_rcu只保护" prev-> next"?

时间:2015-11-11 19:33:55

标签: linux-kernel locking rcu

以下是include/linux/rculist.hos.path.normpath(os.path.join(filepath, '../../..'))的实施:

__list_add_rcu

在函数体内, rcu-lock 保护static inline void __list_add_rcu(struct list_head *new, struct list_head *prev, struct list_head *next) { new->next = next; new->prev = prev; rcu_assign_pointer(list_next_rcu(prev), new); next->prev = new; } 的更新,但prev->next没有保护。为什么?我在这里错过了什么明显的东西吗?

1 个答案:

答案 0 :(得分:3)

RCU-lock 无法保证双向遍历列表的正确性

简而言之,这样的保证需要立即“保护”两个指针(next->prevprev->next 。但是 RCU-section不是一个独占的部分,所以两个指针有可能让它们之间的值不一致。

正因为如此, RCU仅保证前向列表遍历的正确性。为此,仅保护prev->next就足够了。

提示:虽然有反向列表遍历的宏(例如list_for_each_entry_reverse),但这些宏没有RCU对位。这只是因为RCU不支持这种遍历类型。