On 02/10/2015 11:38 AM, Paul E. McKenney wrote: > On Tue, Feb 10, 2015 at 09:03:50AM -0500, Peter Hurley wrote: >> On 02/06/2015 09:08 PM, Mathieu Desnoyers wrote: >>> 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> >> >> Pranith, >> >> I didn't realize you put lockless_dereference() in rcupdate.h >> >> If the point of lockless_reference() is to provide a utility function for >> situations _not_ involving RCU, then it doesn't make sense to provide it >> in an RCU header file. > > OK, I'll bite. Just where do you suggest putting it? ;-) Two possibilities: 1. linux/compiler.h where READ/WRITE/ACCESS_ONCE() are, or 2. a new arch-independent header sucked in by asm/barrier.h (because it's basically a barrier abstraction, in the same way that smp_load_acquire/ smp_store_release are) > That question aside, lockless_dereference() does resemble the > rcu_dereference() family of APIs. This of course means that having it in > rcupdate.h near rcu_dereference() makes it easier to maintain, given that > needed changes to one are likely to require at least review of the rest. I can understand how and why it got there. But it's not an RCU abstraction, so having random users pulling in RCU headers to get at a convenient (but not strictly necessary) helper function is less than ideal. Honestly, I'd rather see the naked smp_read_barrier_depends() than wondering why someone grabbed linux/rcupdate.h for the lockless list implementation. Regards, Peter Hurley >>> /** >>> @@ -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; >>> >> > -- 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