Messages in this thread Patch in this message | | | From | Mathieu Desnoyers <> | Subject | [PATCH] llist: Fix missing lockless_dereference() | Date | Fri, 6 Feb 2015 21:08:21 -0500 |
| |
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@efficios.com> CC: Huang Ying <ying.huang@intel.com> CC: Paul McKenney <paulmck@linux.vnet.ibm.com> CC: David Howells <dhowells@redhat.com> CC: Pranith Kumar <bobby.prani@gmail.com> CC: stable@vger.kernel.org # 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
| |