All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] rculist.h: introduce list_entry_rcu and list_first_entry_rcu
@ 2009-04-14 15:33 Jiri Pirko
  2009-04-14 15:53 ` Paul E. McKenney
  2009-04-14 16:42 ` [tip:core/rcu] rculist.h: introduce list_entry_rcu() and list_first_entry_rcu() tip-bot for Jiri Pirko
  0 siblings, 2 replies; 6+ messages in thread
From: Jiri Pirko @ 2009-04-14 15:33 UTC (permalink / raw)
  To: linux-kernel; +Cc: dipankar, paulmck, mingo

I've run into the situation where I need to use list_first_entry with
rcu-guarded list. This patch introduces this. Also changed
list_for_each_entry_rcu to use new list_entry_rcu instead of list_entry.

Jirka

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
---
 include/linux/rculist.h |   30 ++++++++++++++++++++++++++++--
 1 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/include/linux/rculist.h b/include/linux/rculist.h
index e649bd3..5710f43 100644
--- a/include/linux/rculist.h
+++ b/include/linux/rculist.h
@@ -198,6 +198,32 @@ static inline void list_splice_init_rcu(struct list_head *list,
 	at->prev = last;
 }
 
+/**
+ * list_entry_rcu - get the struct for this entry
+ * @ptr:        the &struct list_head pointer.
+ * @type:       the type of the struct this is embedded in.
+ * @member:     the name of the list_struct within the struct.
+ *
+ * This primitive may safely run concurrently with the _rcu list-mutation
+ * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
+ */
+#define list_entry_rcu(ptr, type, member) \
+	container_of(rcu_dereference(ptr), type, member)
+
+/**
+ * list_first_entry_rcu - get the first element from a list
+ * @ptr:        the list head to take the element from.
+ * @type:       the type of the struct this is embedded in.
+ * @member:     the name of the list_struct within the struct.
+ *
+ * Note, that list is expected to be not empty.
+ *
+ * This primitive may safely run concurrently with the _rcu list-mutation
+ * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
+ */
+#define list_first_entry_rcu(ptr, type, member) \
+	list_entry_rcu((ptr)->next, type, member)
+
 #define __list_for_each_rcu(pos, head) \
 	for (pos = rcu_dereference((head)->next); \
 		pos != (head); \
@@ -214,9 +240,9 @@ static inline void list_splice_init_rcu(struct list_head *list,
  * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_entry_rcu(pos, head, member) \
-	for (pos = list_entry(rcu_dereference((head)->next), typeof(*pos), member); \
+	for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
 		prefetch(pos->member.next), &pos->member != (head); \
-		pos = list_entry(rcu_dereference(pos->member.next), typeof(*pos), member))
+		pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
 
 
 /**
-- 
1.6.0.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-04-14 16:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-14 15:33 [PATCH] rculist.h: introduce list_entry_rcu and list_first_entry_rcu Jiri Pirko
2009-04-14 15:53 ` Paul E. McKenney
2009-04-14 16:39   ` Jiri Pirko
2009-04-14 16:44     ` Ingo Molnar
2009-04-14 16:56     ` Paul E. McKenney
2009-04-14 16:42 ` [tip:core/rcu] rculist.h: introduce list_entry_rcu() and list_first_entry_rcu() tip-bot for Jiri Pirko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.