Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7898840imu; Mon, 3 Dec 2018 22:36:39 -0800 (PST) X-Google-Smtp-Source: AFSGD/U5hQYu8QPgwkaGlr/WKBFh4/QMUabIyZ3hDvS46k6hVcci+2GLvs7nF9/xo0FjftC1qit3 X-Received: by 2002:a63:ac1a:: with SMTP id v26mr16046813pge.293.1543905399599; Mon, 03 Dec 2018 22:36:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543905399; cv=none; d=google.com; s=arc-20160816; b=gCwDzno7lxfhdabyyK2AmghBgQHjvioi8C5Sxbp64VkWgvKIol88XSeSUE+bY4YmQw Z4YZLSHXn2+FkOix8WGVQN9h6ktXksA6UDetaip2ceBrhmfTe9edMT85Vj6GqdmXlBSE 5ySoGjDv3s29YjRwoohSIwh0dkMBzdwi728iiOA29i5RAWIvGPpe+FsvSP8niSAa4tTp DjrCb2O5urw9A70HS7A5kTcz1QENnj3OOuX5VdY5ZuQBBISIfaVp1HBRY6p13oKhnWPZ c5vXJ8NPxyppHh+K/x+WUtySFId4HgpnF5dE0FdL0EcgSxo4HdkLcEFz3A+eFH/iv3I3 tOiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date; bh=a9ydt2A4H9aUOwL5dWuU7OjZx06u7cIvEIBBqajakVI=; b=T17qE6TIq0uzNpjC9UdTiVhsYumKKsQ3hB3x6BPdBdqWWJKV6gaWkm4c7NI/ESJkfU IBEnT+I+1SBv5W/B8z4Ds3w+Bzqhox2BOMLzJz5uobtK9rGSDEqGs0mx8momMx22j3WY gkip77Foxvxs/cVyjEeM08vysqgTma8T6/8NFenaNznunmltfu/52pVJ8hIEKL6hHfLm h/emul7phsPP31phXBUBDPw+xD16b53/D4rbR0Dgf3KRxncyML5MeKfzHMqFiHqPErCG +tJheqplJu+SO07Tx0D1ARr1hvOGtQGhnCjAVvbb/JAsf+nF81QeBaY2qaWahStkyihG Ju4w== 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 t5si15599747pgm.79.2018.12.03.22.36.24; Mon, 03 Dec 2018 22:36:39 -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 S1726090AbeLDGfX (ORCPT + 99 others); Tue, 4 Dec 2018 01:35:23 -0500 Received: from terminus.zytor.com ([198.137.202.136]:39585 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726026AbeLDGfW (ORCPT ); Tue, 4 Dec 2018 01:35:22 -0500 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTPS id wB46XvKV757542 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 3 Dec 2018 22:33:57 -0800 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id wB46XssG757539; Mon, 3 Dec 2018 22:33:54 -0800 Date: Mon, 3 Dec 2018 22:33:54 -0800 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: tip-bot for Andrea Parri Message-ID: Cc: dhowells@redhat.com, hpa@zytor.com, mingo@kernel.org, stern@rowland.harvard.edu, paulmck@linux.ibm.com, dlustig@nvidia.com, torvalds@linux-foundation.org, boqun.feng@gmail.com, peterz@infradead.org, andrea.parri@amarulasolutions.com, tglx@linutronix.de, linux-kernel@vger.kernel.org, npiggin@gmail.com, j.alglave@ucl.ac.uk, akiyks@gmail.com, will.deacon@arm.com, luc.maranget@inria.fr Reply-To: mingo@kernel.org, hpa@zytor.com, dhowells@redhat.com, paulmck@linux.ibm.com, stern@rowland.harvard.edu, dlustig@nvidia.com, peterz@infradead.org, andrea.parri@amarulasolutions.com, torvalds@linux-foundation.org, boqun.feng@gmail.com, npiggin@gmail.com, tglx@linutronix.de, linux-kernel@vger.kernel.org, will.deacon@arm.com, akiyks@gmail.com, luc.maranget@inria.fr, j.alglave@ucl.ac.uk In-Reply-To: <20181203230451.28921-1-paulmck@linux.ibm.com> References: <20181203230451.28921-1-paulmck@linux.ibm.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:locking/core] tools/memory-model: Model smp_mb__after_unlock_lock() Git-Commit-ID: 4607abbcf464ea2be14da444215d05c73025cf6e X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=2.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DATE_IN_FUTURE_96_Q,FREEMAIL_FORGED_REPLYTO autolearn=no autolearn_force=no version=3.4.2 X-Spam-Level: ** X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 4607abbcf464ea2be14da444215d05c73025cf6e Gitweb: https://git.kernel.org/tip/4607abbcf464ea2be14da444215d05c73025cf6e Author: Andrea Parri AuthorDate: Mon, 3 Dec 2018 15:04:49 -0800 Committer: Ingo Molnar CommitDate: Tue, 4 Dec 2018 07:29:51 +0100 tools/memory-model: Model smp_mb__after_unlock_lock() The kernel documents smp_mb__after_unlock_lock() the following way: "Place this after a lock-acquisition primitive to guarantee that an UNLOCK+LOCK pair acts as a full barrier. This guarantee applies if the UNLOCK and LOCK are executed by the same CPU or if the UNLOCK and LOCK operate on the same lock variable." Formalize in LKMM the above guarantee by defining (new) mb-links according to the law: ([M] ; po ; [UL] ; (co | po) ; [LKW] ; fencerel(After-unlock-lock) ; [M]) where the component ([UL] ; co ; [LKW]) identifies "UNLOCK+LOCK pairs on the same lock variable" and the component ([UL] ; po ; [LKW]) identifies "UNLOCK+LOCK pairs executed by the same CPU". In particular, the LKMM forbids the following two behaviors (the second litmus test below is based on: Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.html c.f., Section "Tree RCU Grace Period Memory Ordering Building Blocks"): C after-unlock-lock-same-cpu (* * Result: Never *) {} P0(spinlock_t *s, spinlock_t *t, int *x, int *y) { int r0; spin_lock(s); WRITE_ONCE(*x, 1); spin_unlock(s); spin_lock(t); smp_mb__after_unlock_lock(); r0 = READ_ONCE(*y); spin_unlock(t); } P1(int *x, int *y) { int r0; WRITE_ONCE(*y, 1); smp_mb(); r0 = READ_ONCE(*x); } exists (0:r0=0 /\ 1:r0=0) C after-unlock-lock-same-lock-variable (* * Result: Never *) {} P0(spinlock_t *s, int *x, int *y) { int r0; spin_lock(s); WRITE_ONCE(*x, 1); r0 = READ_ONCE(*y); spin_unlock(s); } P1(spinlock_t *s, int *y, int *z) { int r0; spin_lock(s); smp_mb__after_unlock_lock(); WRITE_ONCE(*y, 1); r0 = READ_ONCE(*z); spin_unlock(s); } P2(int *z, int *x) { int r0; WRITE_ONCE(*z, 1); smp_mb(); r0 = READ_ONCE(*x); } exists (0:r0=0 /\ 1:r0=0 /\ 2:r0=0) Signed-off-by: Andrea Parri Signed-off-by: Paul E. McKenney Cc: Akira Yokosawa Cc: Alan Stern Cc: Boqun Feng Cc: Daniel Lustig Cc: David Howells Cc: Jade Alglave Cc: Linus Torvalds Cc: Luc Maranget Cc: Nicholas Piggin Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Will Deacon Cc: linux-arch@vger.kernel.org Cc: parri.andrea@gmail.com Link: http://lkml.kernel.org/r/20181203230451.28921-1-paulmck@linux.ibm.com Signed-off-by: Ingo Molnar --- tools/memory-model/linux-kernel.bell | 3 ++- tools/memory-model/linux-kernel.cat | 4 +++- tools/memory-model/linux-kernel.def | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/memory-model/linux-kernel.bell b/tools/memory-model/linux-kernel.bell index b84fb2f67109..796513362c05 100644 --- a/tools/memory-model/linux-kernel.bell +++ b/tools/memory-model/linux-kernel.bell @@ -29,7 +29,8 @@ enum Barriers = 'wmb (*smp_wmb*) || 'sync-rcu (*synchronize_rcu*) || 'before-atomic (*smp_mb__before_atomic*) || 'after-atomic (*smp_mb__after_atomic*) || - 'after-spinlock (*smp_mb__after_spinlock*) + 'after-spinlock (*smp_mb__after_spinlock*) || + 'after-unlock-lock (*smp_mb__after_unlock_lock*) instructions F[Barriers] (* Compute matching pairs of nested Rcu-lock and Rcu-unlock *) diff --git a/tools/memory-model/linux-kernel.cat b/tools/memory-model/linux-kernel.cat index 882fc33274ac..8f23c74a96fd 100644 --- a/tools/memory-model/linux-kernel.cat +++ b/tools/memory-model/linux-kernel.cat @@ -30,7 +30,9 @@ let wmb = [W] ; fencerel(Wmb) ; [W] let mb = ([M] ; fencerel(Mb) ; [M]) | ([M] ; fencerel(Before-atomic) ; [RMW] ; po? ; [M]) | ([M] ; po? ; [RMW] ; fencerel(After-atomic) ; [M]) | - ([M] ; po? ; [LKW] ; fencerel(After-spinlock) ; [M]) + ([M] ; po? ; [LKW] ; fencerel(After-spinlock) ; [M]) | + ([M] ; po ; [UL] ; (co | po) ; [LKW] ; + fencerel(After-unlock-lock) ; [M]) let gp = po ; [Sync-rcu] ; po? let strong-fence = mb | gp diff --git a/tools/memory-model/linux-kernel.def b/tools/memory-model/linux-kernel.def index 6fa3eb28d40b..b27911cc087d 100644 --- a/tools/memory-model/linux-kernel.def +++ b/tools/memory-model/linux-kernel.def @@ -23,6 +23,7 @@ smp_wmb() { __fence{wmb}; } smp_mb__before_atomic() { __fence{before-atomic}; } smp_mb__after_atomic() { __fence{after-atomic}; } smp_mb__after_spinlock() { __fence{after-spinlock}; } +smp_mb__after_unlock_lock() { __fence{after-unlock-lock}; } // Exchange xchg(X,V) __xchg{mb}(X,V)