Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6113685imu; Mon, 21 Jan 2019 03:29:26 -0800 (PST) X-Google-Smtp-Source: ALg8bN7GmbJf0CMTgijO8yYzF5rvPGPh1E40q7p4NKUY9j1xjYZbU6uPF/S44bGVTFLx6aNsO6GD X-Received: by 2002:a63:5c22:: with SMTP id q34mr27657557pgb.417.1548070166364; Mon, 21 Jan 2019 03:29:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548070166; cv=none; d=google.com; s=arc-20160816; b=qo9aKS+VHmwDrSsK/HxnK/Fp5hp+HbbYOahMCkDvURTsA5OIM9DweyhUIm5eDHbQcS ZqgQozEsV9buUmBp8SINMX1F9UwBPdC9h7PCdm/KBX8Olo8OzoWZFrkDUbo+dcHIRDBa 7aCM77jFJJP2TK9Iixdst92BtMcQO4XsK2OF1LJ5IWGCnt6aW/bXQ1LEoTRNa12cokZv y2Qdj8oj00IWgvzyizSxXPeuaReirVsfVPEeNP1483vt39EtAozvyXyPSz7whpzCwZPS xv78sqcvrlJRLTcphcqmNQKNQwihAbTyLpbNejjXlmQYQxZxilf1gcHF7YZiOaCL49sC EKEA== 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=YmK5u1qDkWQhd5HXjUacfxqyN+JG229g4cRkntZoaDs=; b=zimLwCkgymLGYEu8bZzaXCRJK78P9qi3yAjEKl1F11zl3nLcFAJWZjfrFMh5Nq8C2i lxpc/qU0VELBOXyDWNhfdxwQ2P7YReFkXq0oxPOIHe2lfb71Ndu6b6c6Wch/659JppFa mYk+kxVelfSsRur1kNjDanyxHuBBnjJxAXZsOBbonWYw3qd0OnV/c1/vzBIjdRYfHOuh fpfGqjb5fHcWYCYL2Xzg3IQ7W+h3MRNjzKbTbAWDpLWAw89ix9DCaQ13u+iD/kzFQZik 5EjG3kMRZiOwF1eZnJdew7lgaEaMAVXy62q/EJLz77RsXeyC0xIXt3n9Ac+uVUsoW2B9 Plzg== 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 w27si12893426pge.182.2019.01.21.03.29.10; Mon, 21 Jan 2019 03:29:26 -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 S1727989AbfAUL03 (ORCPT + 99 others); Mon, 21 Jan 2019 06:26:29 -0500 Received: from terminus.zytor.com ([198.137.202.136]:32789 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727679AbfAUL02 (ORCPT ); Mon, 21 Jan 2019 06:26:28 -0500 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTPS id x0LBNoP22493769 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Mon, 21 Jan 2019 03:23:50 -0800 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id x0LBNnNP2493766; Mon, 21 Jan 2019 03:23:49 -0800 Date: Mon, 21 Jan 2019 03:23:49 -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: will.deacon@arm.com, stern@rowland.harvard.edu, j.alglave@ucl.ac.uk, luc.maranget@inria.fr, peterz@infradead.org, tglx@linutronix.de, paulmck@linux.ibm.com, mingo@kernel.org, andrea.parri@amarulasolutions.com, dlustig@nvidia.com, npiggin@gmail.com, hpa@zytor.com, akiyks@gmail.com, dhowells@redhat.com, linux-kernel@vger.kernel.org, torvalds@linux-foundation.org, boqun.feng@gmail.com Reply-To: torvalds@linux-foundation.org, boqun.feng@gmail.com, akiyks@gmail.com, hpa@zytor.com, linux-kernel@vger.kernel.org, dhowells@redhat.com, andrea.parri@amarulasolutions.com, npiggin@gmail.com, dlustig@nvidia.com, mingo@kernel.org, tglx@linutronix.de, paulmck@linux.ibm.com, luc.maranget@inria.fr, peterz@infradead.org, j.alglave@ucl.ac.uk, stern@rowland.harvard.edu, will.deacon@arm.com 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: 5b735eb1ce481b2f1674a47c0995944b1cb6f5d5 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=-0.8 required=5.0 tests=ALL_TRUSTED,BAYES_00, FREEMAIL_FORGED_REPLYTO,T_DATE_IN_FUTURE_96_Q autolearn=no autolearn_force=no version=3.4.2 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: 5b735eb1ce481b2f1674a47c0995944b1cb6f5d5 Gitweb: https://git.kernel.org/tip/5b735eb1ce481b2f1674a47c0995944b1cb6f5d5 Author: Andrea Parri AuthorDate: Mon, 3 Dec 2018 15:04:49 -0800 Committer: Ingo Molnar CommitDate: Mon, 21 Jan 2019 11:06:55 +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)