我正在使用list_for_each_entry_rcu,在循环中我想从列表中删除一个元素。如果没有list_for_each_entry_rcu_safe,我怎么能这样做?
我在过去看到过一个宏list_for_each_safe_rcu。为什么删除它?还有其他选择吗?
答案 0 :(得分:1)
从RCU列表的角度来看,所有线程分为两组:
此时,多位读者和单一修饰符可以访问该列表。
读者应使用_rcu
原语进行列表遍历。
如果有多个修饰符,则应通过锁定或其他同步手段保护其访问权限。
因此list_for_each_safe_rcu
无效:
如果您的主题是修饰符,则其他任何线程都不能同时修改列表。因此,不需要_rcu
保护,修饰符可以使用list_for_each_safe
进行列表遍历。
如果您的主题是读者,则不应修改列表,因此可以使用list_for_each_rcu
。
通过两个并发的修饰符访问RCU列表通常是不安全。例如,关于调整后元素的并发list_del_rcu
可能会破坏列表。
不确定为什么list_for_each_safe_rcu
已存在于内核2.6.25及之前。无论如何,它是hasn't been used anywhere。