2

以下是include/linux/rculist.h__list_add_rcu中的实现:

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;
}

在函数体内,rcu-lock保护 的更新prev->next,但不保护next->prev。为什么?我在这里错过了什么明显的东西吗?

4

1 回答 1

4

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

简而言之,这样的保证将需要一次next->prev“保护”两个指针(和prev->next)。但是RCU-section 不是一个独占的 section,所以两个指针之间的值可能不一致。

因此,RCU 只保证前向列表遍历的正确性。为此,仅保护prev->next.

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

于 2015-11-12T00:01:49.663 回答