Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752248AbdLET4S (ORCPT ); Tue, 5 Dec 2017 14:56:18 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:45852 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751945AbdLET4N (ORCPT ); Tue, 5 Dec 2017 14:56:13 -0500 Date: Tue, 5 Dec 2017 20:55:58 +0100 From: Peter Zijlstra To: "Michael S. Tsirkin" Cc: "Paul E. McKenney" , linux-kernel@vger.kernel.org, mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@efficios.com, josh@joshtriplett.org, tglx@linutronix.de, rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com, fweisbec@gmail.com, oleg@redhat.com, Jason Wang , kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org Subject: Re: [PATCH tip/core/rcu 21/21] drivers/vhost: Remove now-redundant read_barrier_depends() Message-ID: <20171205195558.GR3165@worktop.lehotels.local> References: <20171201195053.GA23494@linux.vnet.ibm.com> <1512157876-24665-21-git-send-email-paulmck@linux.vnet.ibm.com> <20171205202928-mutt-send-email-mst@kernel.org> <20171205183946.GP3165@worktop.lehotels.local> <20171205204928-mutt-send-email-mst@kernel.org> <20171205191733.GQ3165@worktop.lehotels.local> <20171205212053-mutt-send-email-mst@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20171205212053-mutt-send-email-mst@kernel.org> User-Agent: Mutt/1.5.22.1 (2013-10-16) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2184 Lines: 60 On Tue, Dec 05, 2017 at 09:24:21PM +0200, Michael S. Tsirkin wrote: > On Tue, Dec 05, 2017 at 08:17:33PM +0100, Peter Zijlstra wrote: > > On Tue, Dec 05, 2017 at 08:57:46PM +0200, Michael S. Tsirkin wrote: > > > > > I don't see WRITE_ONCE inserting any barriers, release or > > > write. > > > > Correct, never claimed there was. > > > > Just saying that: > > > > obj = READ_ONCE(*foo); > > val = READ_ONCE(obj->val); > > > > Never needs a barrier (except on Alpha and we want to make that go > > away). Simply because a CPU needs to complete the load of @obj before it > > can compute the address &obj->val. Thus the second load _must_ come > > after the first load and we get LOAD-LOAD ordering. > > > > Alpha messing that up is a royal pain, and Alpha not being an > > active/living architecture is just not worth the pain of keeping this in > > the generic model. > > > > Right. What I am saying is that for writes you need > > WRITE_ONCE(obj->val, 1); > smp_wmb(); > WRITE_ONCE(*foo, obj); You really should use smp_store_release() here instead of the smp_wmb(). But yes. > and this barrier is no longer paired with anything until > you realize there's a dependency barrier within READ_ONCE. No, there isn't. read_dependecy barriers are no more. They don't exist. They never did, except on Alpha anyway. There were a ton of sites that relied on this but never had the smp_read_barrier_depends() annotation, similarly there were quite a few sites that had the barrier but nobody could explain wtf for. What these patches do is return the sane rule that dependent loads are ordered. And like all memory ordering; it should come with comments. Any piece of code that relies on memory ordering and doesn't have big fat comments that explain the required ordering are broken per definition. Maybe not now, but they will be after a few years because someone changed it and didn't know. > Barrier pairing was a useful tool to check code validity, > maybe there are other, better tools now. Same is true for the closely related control dependency, you can pair against those just fine but they don't have an explicit barrier annotation. There are no tools, use brain.