Add hlist_for_each_entry_from_rcu
Subsystems (3)
PATCH 1/3 Add hlist_for_each_entry_from_rcu
Add an RCU version of hlist_for_each_entry_from, getting ready for converting the UDP hash lock to RCU.
Signed-off-by Corey Minyard <[email protected]>
--- include/linux/rculist.h | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-)
include/linux/rculist.h +18 -0
@@ -397,5 +397,23 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, ({ tpos =hlist_entry (pos,typeof (*tpos), member);1 ; }); \ pos = rcu_dereference(pos->next)) + +/** +* hlist_for_each_entry_from_rcu - iterate over rcu list starting from pos +* @tpos: the type * to use as a loop cursor. +* @pos: the &struct hlist_node to use as a loop cursor. +* @member: the name of the hlist_node within the struct. +* +* This list-traversal primitive may safely run concurrently with +* the _rcu list-mutation primitives such as hlist_add_head_rcu() +* as long as the traversal is guarded by rcu_read_lock(). +*/ +#define hlist_for_each_entry_from_rcu (tpos, pos, member) \ + for (; \ + (pos) && ({ prefetch(pos->next); 1; }) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ + pos = rcu_dereference(pos->next)) + +#endif /* __KERNEL__ */ #endif
Signature · 1 line
1.5.6.5