summaryrefslogtreecommitdiff
path: root/include/linux/rculist_nulls.h
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-06-14 10:16:06 +0100
committerMark Brown <broonie@linaro.org>2013-06-14 10:16:06 +0100
commit384b8345589cbbb18a99ce1b112da90c58c802e8 (patch)
tree51fee39fa19adad6b24fb90123e7a0ca3159c9c5 /include/linux/rculist_nulls.h
parent9c24b1672283644adf871244771ebf387dd73f90 (diff)
parent2e7ee15ced914e109a1a5b6dfcd463d846a13bd5 (diff)
Merge branch 'fix/wm8962' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-wm8962
Conflicts: sound/soc/codecs/wm8962.c
Diffstat (limited to 'include/linux/rculist_nulls.h')
-rw-r--r--include/linux/rculist_nulls.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h
index 2ae13714828b..1c33dd7da4a7 100644
--- a/include/linux/rculist_nulls.h
+++ b/include/linux/rculist_nulls.h
@@ -105,9 +105,14 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,
* @head: the head for your list.
* @member: the name of the hlist_nulls_node within the struct.
*
+ * The barrier() is needed to make sure compiler doesn't cache first element [1],
+ * as this loop can be restarted [2]
+ * [1] Documentation/atomic_ops.txt around line 114
+ * [2] Documentation/RCU/rculist_nulls.txt around line 146
*/
#define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \
- for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \
+ for (({barrier();}), \
+ pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \
(!is_a_nulls(pos)) && \
({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \
pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos)))