A lockless_dereference() appears to be missing in llist_del_first(). It should only matter for Alpha in practice. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> CC: Huang Ying <ying.huang@xxxxxxxxx> CC: Paul McKenney <paulmck@xxxxxxxxxxxxxxxxxx> CC: David Howells <dhowells@xxxxxxxxxx> CC: Pranith Kumar <bobby.prani@xxxxxxxxx> CC: stable@xxxxxxxxxxxxxxx # v3.1+ --- lib/llist.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/llist.c b/lib/llist.c index f76196d..f34e176 100644 --- a/lib/llist.c +++ b/lib/llist.c @@ -26,6 +26,7 @@ #include <linux/export.h> #include <linux/interrupt.h> #include <linux/llist.h> +#include <linux/rcupdate.h> /** @@ -67,7 +68,12 @@ struct llist_node *llist_del_first(struct llist_head *head) { struct llist_node *entry, *old_entry, *next; - entry = head->first; + /* + * Load entry before entry->next. Matches the implicit + * memory barrier before the cmpxchg in llist_add_batch(), + * which ensures entry->next is stored before entry. + */ + entry = lockless_dereference(head->first); for (;;) { if (entry == NULL) return NULL; -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html