Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752731AbbBJR3d (ORCPT ); Tue, 10 Feb 2015 12:29:33 -0500 Received: from mail-qc0-f175.google.com ([209.85.216.175]:61792 "EHLO mail-qc0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750726AbbBJR3c (ORCPT ); Tue, 10 Feb 2015 12:29:32 -0500 Message-ID: <54DA3FF4.3010700@hurleysoftware.com> Date: Tue, 10 Feb 2015 12:29:24 -0500 From: Peter Hurley User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: paulmck@linux.vnet.ibm.com CC: Pranith Kumar , Mathieu Desnoyers , Huang Ying , linux-kernel@vger.kernel.org, David Howells , stable@vger.kernel.org Subject: Re: [PATCH] llist: Fix missing lockless_dereference() References: <1423274934-10625-1-git-send-email-mathieu.desnoyers@efficios.com> <54DA0FC6.3090204@hurleysoftware.com> <20150210163810.GP4166@linux.vnet.ibm.com> In-Reply-To: <20150210163810.GP4166@linux.vnet.ibm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2968 Lines: 84 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 >>> CC: Huang Ying >>> CC: Paul McKenney >>> CC: David Howells >>> CC: Pranith Kumar >>> 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 >>> #include >>> #include >>> +#include >> >> 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 linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/