Messages in this thread Patch in this message | | | Date | Mon, 06 Oct 2008 13:45:33 -0500 | From | Corey Minyard <> | Subject | [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 <cminyard@mvista.com> --- include/linux/rculist.h | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index eb4443c..f20fe61 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -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 -- 1.5.6.5
| |