Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3836548imu; Mon, 10 Dec 2018 08:34:05 -0800 (PST) X-Google-Smtp-Source: AFSGD/XO5tiPKTY0DY6UQ81AFxBQR0oIZ13s99riKbmwFNASpKSRPj2sTwrrwHZHZsAXLP74xPft X-Received: by 2002:a63:fd0a:: with SMTP id d10mr11606218pgh.164.1544459645673; Mon, 10 Dec 2018 08:34:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544459645; cv=none; d=google.com; s=arc-20160816; b=avX0VqRr5hBiio491VvJifvwmtm+HRjEnKH4ciinXoH1SPz3Eormp2zHaV5aqdm4PU Nd2K8QIww4v3wGNPAPZ4tcCGy/mIjUANQfWyIBbkr+UrUyGeUoptseATHU7ES+dSZthc 5SPx9L8y6fZiZF0ctTzXFuEVh+edFUhX+bzcxCOmoxCrlhzeOmREfMv4hCIDBRzUt7MX R4WVBcSMyNuscp935x7O1ws1TuBmO2s/x+y8bkkqlhw5CZInIa7eYrK0dOBhshulZTun xbBFLtRGkpNI2bZsMQQgOk1J8qaX0/RTK6XID9o03Gqtea9jczMn98yT+TKwcY1GoUhJ z6Iw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date; bh=53jQbqTIItHkQbzamhLN5xtm7PoM89qxuG4kCQVWClc=; b=raRMF9SliGztHBLgUhiuKwlh64QgjGz0htkuOt1k4x/XoiTJZtGA0TvMU02zKjsaq4 xHeWFkSErLlxIxjBIvghrvhr4vVi/R1OoxTUwLKyLXSzO+3NL2p9KjEuN5tbweqqsTsK XUTYHnoGOT/aC957+pgtWvahmGwIH47TAfwKw6dDeovZ9leibsCRKRifgSslGoNMh1aM jCgZG02zfd2zovyMC3fGgtdb9l7lpkedwtqqDPonPticCi3Tjuvot2witmkz4NP9tzqI WqebeQbgpelEitmSfCVu9eUKmsrrhuAhCoXB6n7CzgyG7fyaLZQD6tR1BqZSruFk7kj7 KYlw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f5si10635584pgr.411.2018.12.10.08.33.50; Mon, 10 Dec 2018 08:34:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727650AbeLJQWd (ORCPT + 99 others); Mon, 10 Dec 2018 11:22:33 -0500 Received: from iolanthe.rowland.org ([192.131.102.54]:60826 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1726841AbeLJQWd (ORCPT ); Mon, 10 Dec 2018 11:22:33 -0500 Received: (qmail 4067 invoked by uid 2102); 10 Dec 2018 11:22:31 -0500 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 10 Dec 2018 11:22:31 -0500 Date: Mon, 10 Dec 2018 11:22:31 -0500 (EST) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: "Paul E. McKenney" cc: David Goldblatt , , Florian Weimer , , , , , , , , , , , , , , Subject: Re: [PATCH] Linux: Implement membarrier function In-Reply-To: <20181206215405.GL4170@linux.ibm.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 6 Dec 2018, Paul E. McKenney wrote: > Hello, David, > > I took a crack at extending LKMM to accommodate what I think would > support what you have in your paper. Please see the very end of this > email for a patch against the "dev" branch of my -rcu tree. > > This gives the expected result for the following three litmus tests, > but is probably deficient or otherwise misguided in other ways. I have > added the LKMM maintainers on CC for their amusement. ;-) > > Thoughts? Since sys_membarrier() provides a heavyweight barrier comparable to synchronize_rcu(), the memory model should treat the two in the same way. That's what this patch does. The corresponding critical section would be any region of code bounded by compiler barriers. Since the LKMM doesn't currently handle plain accesses, the effect is the same as if a compiler barrier were present between each pair of instructions. Basically, each instruction acts as its own critical section. Therefore the patch below defines memb-rscsi as the trivial identity relation. When plain accesses and compiler barriers are added to the memory model, a different definition will be needed. This gives the correct results for the three C-Goldblat-memb-* litmus tests in Paul's email. Alan PS: The patch below is meant to apply on top of the SRCU patches, which are not yet in the mainline kernel. Index: usb-4.x/tools/memory-model/linux-kernel.bell =================================================================== --- usb-4.x.orig/tools/memory-model/linux-kernel.bell +++ usb-4.x/tools/memory-model/linux-kernel.bell @@ -24,6 +24,7 @@ instructions RMW[{'once,'acquire,'releas enum Barriers = 'wmb (*smp_wmb*) || 'rmb (*smp_rmb*) || 'mb (*smp_mb*) || + 'memb (*sys_membarrier*) || 'rcu-lock (*rcu_read_lock*) || 'rcu-unlock (*rcu_read_unlock*) || 'sync-rcu (*synchronize_rcu*) || Index: usb-4.x/tools/memory-model/linux-kernel.cat =================================================================== --- usb-4.x.orig/tools/memory-model/linux-kernel.cat +++ usb-4.x/tools/memory-model/linux-kernel.cat @@ -33,7 +33,7 @@ let mb = ([M] ; fencerel(Mb) ; [M]) | ([M] ; po? ; [LKW] ; fencerel(After-spinlock) ; [M]) | ([M] ; po ; [UL] ; (co | po) ; [LKW] ; fencerel(After-unlock-lock) ; [M]) -let gp = po ; [Sync-rcu | Sync-srcu] ; po? +let gp = po ; [Sync-rcu | Sync-srcu | Memb] ; po? let strong-fence = mb | gp @@ -102,8 +102,10 @@ acyclic pb as propagation *) let rcu-gp = [Sync-rcu] (* Compare with gp *) let srcu-gp = [Sync-srcu] +let memb-gp = [Memb] let rcu-rscsi = rcu-rscs^-1 let srcu-rscsi = srcu-rscs^-1 +let memb-rscsi = id (* * The synchronize_rcu() strong fence is special in that it can order not @@ -119,15 +121,19 @@ let rcu-link = po? ; hb* ; pb* ; prop ; * the synchronize_srcu() and srcu_read_[un]lock() calls refer to the same * struct srcu_struct location. *) -let rec rcu-fence = rcu-gp | srcu-gp | +let rec rcu-fence = rcu-gp | srcu-gp | memb-gp | (rcu-gp ; rcu-link ; rcu-rscsi) | ((srcu-gp ; rcu-link ; srcu-rscsi) & loc) | + (memb-gp ; rcu-link ; memb-rscsi) | (rcu-rscsi ; rcu-link ; rcu-gp) | ((srcu-rscsi ; rcu-link ; srcu-gp) & loc) | + (memb-rscsi ; rcu-link ; memb-gp) | (rcu-gp ; rcu-link ; rcu-fence ; rcu-link ; rcu-rscsi) | ((srcu-gp ; rcu-link ; rcu-fence ; rcu-link ; srcu-rscsi) & loc) | + (memb-gp ; rcu-link ; rcu-fence ; rcu-link ; memb-rscsi) | (rcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; rcu-gp) | ((srcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; srcu-gp) & loc) | + (memb-rscsi ; rcu-link ; rcu-fence ; rcu-link ; memb-gp) | (rcu-fence ; rcu-link ; rcu-fence) (* rb orders instructions just as pb does *) Index: usb-4.x/tools/memory-model/linux-kernel.def =================================================================== --- usb-4.x.orig/tools/memory-model/linux-kernel.def +++ usb-4.x/tools/memory-model/linux-kernel.def @@ -20,6 +20,7 @@ smp_store_mb(X,V) { __store{once}(X,V); smp_mb() { __fence{mb}; } smp_rmb() { __fence{rmb}; } smp_wmb() { __fence{wmb}; } +smp_memb() { __fence{memb}; } smp_mb__before_atomic() { __fence{before-atomic}; } smp_mb__after_atomic() { __fence{after-atomic}; } smp_mb__after_spinlock() { __fence{after-spinlock}; }