如何在list_for_each_entry_rcu中删除元素

时间:2017-10-29 11:38:26

标签: linux-kernel

  1. 我正在使用list_for_each_entry_rcu,在循环中我想从列表中删除一个元素。如果没有list_for_each_entry_rcu_safe,我怎么能这样做?

  2. 我在过去看到过一个宏list_for_each_safe_rcu。为什么删除它?还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

从RCU列表的角度来看,所有线程分为两组:

  • 读者
  • 改性剂

此时,多位读者单一修饰符可以访问该列表。

读者应使用_rcu原语进行列表遍历。

如果有多个修饰符,则应通过锁定或其他同步手段保护其访问权限。

因此list_for_each_safe_rcu无效:

  1. 如果您的主题是修饰符,则其他任何线程都不能同时修改列表。因此,不需要_rcu保护,修饰符可以使用list_for_each_safe进行列表遍历。

  2. 如果您的主题是读者,则不应修改列表,因此可以使用list_for_each_rcu

  3. 通过两个并发的修饰符访问RCU列表通常是不安全。例如,关于调整后元素的并发list_del_rcu可能会破坏列表。

    不确定为什么list_for_each_safe_rcu已存在于内核2.6.25及之前。无论如何,它是hasn't been used anywhere