|
@@ -460,6 +460,26 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
|
|
pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(\
|
|
pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(\
|
|
&(pos)->member)), typeof(*(pos)), member))
|
|
&(pos)->member)), typeof(*(pos)), member))
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * hlist_for_each_entry_rcu_notrace - iterate over rcu list of given type (for tracing)
|
|
|
|
+ * @pos: the type * to use as a loop cursor.
|
|
|
|
+ * @head: the head for your list.
|
|
|
|
+ * @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().
|
|
|
|
+ *
|
|
|
|
+ * This is the same as hlist_for_each_entry_rcu() except that it does
|
|
|
|
+ * not do any RCU debugging or tracing.
|
|
|
|
+ */
|
|
|
|
+#define hlist_for_each_entry_rcu_notrace(pos, head, member) \
|
|
|
|
+ for (pos = hlist_entry_safe (rcu_dereference_raw_notrace(hlist_first_rcu(head)),\
|
|
|
|
+ typeof(*(pos)), member); \
|
|
|
|
+ pos; \
|
|
|
|
+ pos = hlist_entry_safe(rcu_dereference_raw_notrace(hlist_next_rcu(\
|
|
|
|
+ &(pos)->member)), typeof(*(pos)), member))
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* hlist_for_each_entry_rcu_bh - iterate over rcu list of given type
|
|
* hlist_for_each_entry_rcu_bh - iterate over rcu list of given type
|
|
* @pos: the type * to use as a loop cursor.
|
|
* @pos: the type * to use as a loop cursor.
|