Received: by 10.223.176.5 with SMTP id f5csp998235wra; Sat, 3 Feb 2018 15:33:48 -0800 (PST) X-Google-Smtp-Source: AH8x227qf/F8HHD7cI3mqHglrIKoIe8JSgUVjov/uALjpxysbJ+MCICymE1AbB9ixI2BZtYwXyw9 X-Received: by 10.98.32.151 with SMTP id m23mr44784547pfj.182.1517700828352; Sat, 03 Feb 2018 15:33:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517700828; cv=none; d=google.com; s=arc-20160816; b=l7kj56h5i8XGu9st+xlR0R7S6K8lWY55odrv7Yq1VBhQsJSEwjGAcRHOO0VUTELnM9 kq2xSqlB0TxuLyqfArEkWY1eCTWn4RCPdP1XixwhJ9Mgy2Q/wpYUtLq6W+1cFGecZyFL S0DyxyzF8eN/6SsBEasJ8uo+JynXAzyOErMmRTUm0wvTxKDGpLf2vn3KTYPCX/HnxsLY SFG3NkbK0+9gQ+R8wIPOuy9rKnzGpQ7povpmCRen89hVsNdhG/vEann6UTXB97MM2b3H qg4Db9iWk1FgFgikt6YKrrg9ZpiaYsCIAcGGlTWoPpAampKyIzT056cWANi95oqoiOos qcJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:user-agent:in-reply-to :content-disposition:mime-version:references:reply-to:subject:cc:to :from:date:arc-authentication-results; bh=Vmz2zLfbSk71f4mh/srn1GN8ugs7XwAhEKbEWoqUkEU=; b=CFQzZ4rjLC+ECUmPzySZv2Zns4jkAcA9cFBtKN+MGSpc5ETGewJKvBNZ0ivxbJc1MB 2nseSRY/J21Fjmx3Qs0LJM6S8fciZEJ2WvlhG8WvQo/NRcLIF7eoG5rxstzVLONz4f2i mZHbAtI/eO3TnJTVD47Rm6yl4MacxDVS/ZWbepIk5fO5Ks2t+63mGzEF/qnnPr6/lVSC SZ44CfnkZ+OTOg54zshj5G+hKajH7dQx/tclo8yoDtU1CK++nbvMaxL7SgaKtulqOdB3 t3YGmzEiR9v38it9vXOr5n0ROfGVwtTYn93QVE+ku89Z+exBKEyZx55JY4S5pcdpHiA8 98/Q== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s190si3510566pgc.753.2018.02.03.15.33.34; Sat, 03 Feb 2018 15:33:48 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753396AbeBCUNI (ORCPT + 99 others); Sat, 3 Feb 2018 15:13:08 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:45490 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753211AbeBCUMk (ORCPT ); Sat, 3 Feb 2018 15:12:40 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w13K8aXg091358 for ; Sat, 3 Feb 2018 15:12:39 -0500 Received: from e14.ny.us.ibm.com (e14.ny.us.ibm.com [129.33.205.204]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fw9y7f3pj-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Sat, 03 Feb 2018 15:12:39 -0500 Received: from localhost by e14.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sat, 3 Feb 2018 15:12:38 -0500 Received: from b01cxnp22034.gho.pok.ibm.com (9.57.198.24) by e14.ny.us.ibm.com (146.89.104.201) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sat, 3 Feb 2018 15:12:33 -0500 Received: from b01ledav003.gho.pok.ibm.com (b01ledav003.gho.pok.ibm.com [9.57.199.108]) by b01cxnp22034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w13KCXji53215446; Sat, 3 Feb 2018 20:12:33 GMT Received: from b01ledav003.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A0A57B2046; Sat, 3 Feb 2018 15:09:29 -0500 (EST) Received: from paulmck-ThinkPad-W541 (unknown [9.80.207.245]) by b01ledav003.gho.pok.ibm.com (Postfix) with ESMTP id 37E6FB204D; Sat, 3 Feb 2018 15:09:28 -0500 (EST) Received: by paulmck-ThinkPad-W541 (Postfix, from userid 1000) id 354A316C3BC4; Sat, 3 Feb 2018 00:48:09 -0800 (PST) Date: Sat, 3 Feb 2018 00:48:09 -0800 From: "Paul E. McKenney" To: Ingo Molnar Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, stern@rowland.harvard.edu, parri.andrea@gmail.com, j.alglave@ucl.ac.uk, luc.maranget@inria.fr, boqun.feng@gmail.com, will.deacon@arm.com, peterz@infradead.org, npiggin@gmail.com, dhowells@redhat.com, elena.reshetova@intel.com, mhocko@suse.com, akiyks@gmail.com, Thomas Gleixner , Peter Zijlstra , Linus Torvalds Subject: Re: [GIT PULL tools] Linux kernel memory model Reply-To: paulmck@linux.vnet.ibm.com References: <20180125093440.GA875@linux.vnet.ibm.com> <20180129065724.ybrdsabvktq7fbqg@gmail.com> <20180129095449.GT3741@linux.vnet.ibm.com> <20180131090006.onaopgyqthppoysi@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180131090006.onaopgyqthppoysi@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-GCONF: 00 x-cbid: 18020320-0052-0000-0000-000002AF96E9 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008466; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000248; SDB=6.00984559; UDB=6.00499431; IPR=6.00763837; BA=6.00005810; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00019353; XFM=3.00000015; UTC=2018-02-03 20:12:38 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020320-0053-0000-0000-00005376E0B7 Message-Id: <20180203084809.GE3617@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-02-03_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802030269 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 31, 2018 at 10:00:06AM +0100, Ingo Molnar wrote: > * Paul E. McKenney wrote: > > On Mon, Jan 29, 2018 at 07:57:24AM +0100, Ingo Molnar wrote: [ . . . ] > A couple of questions: > > - Would it be possible to include all the nice descriptions of the litmus tests in > the tests themselves? Right now it's a bit weird that most of them come with > zero explanations, but the tools/memory-model/litmus-tests/README lists most of > them. Please see below for an initial patch to this effect. This activity proved to be more productive than expected for these tests, which certainly supports our assertion that locking needs more testing... MP+polocks.litmus MP+porevlocks.litmus These are allowed by the current model, which surprised me a bit, given that even powerpc would forbid them. Is the rationale that a lock-savvy compiler could pull accesses into the lock's critical section and then reorder those accesses? Or does this constitute a bug in our model of locking? (And these were allowed when I wrote recipes.txt, embarrassingly enough...) Z6.0+pooncelock+poonceLock+pombonce.litmus This was forbidden when I wrote recipes.txt, but now is allowed. The header comment for smp_mb__after_spinlock() makes it pretty clear that it must be forbidden. So this one is a bug in our model of locking. I did not add comments to the above three, but please see below for a patch for the remaining litmus tests. Thoughts? Thanx, Paul ------------------------------------------------------------------------ commit af55b248bec4ac2513d5715b10724d379099bb64 Author: Paul E. McKenney Date: Sat Feb 3 00:04:49 2018 -0800 litmus_tests: Add comments explaining tests' purposes This commit adds comments to the litmus tests summarizing what these tests are intended to demonstrate. Suggested-by: Ingo Molnar Signed-off-by: Paul E. McKenney diff --git a/tools/memory-model/litmus-tests/CoRR+poonceonce+Once.litmus b/tools/memory-model/litmus-tests/CoRR+poonceonce+Once.litmus index 5b83d57f6ac5..8e8ae8989085 100644 --- a/tools/memory-model/litmus-tests/CoRR+poonceonce+Once.litmus +++ b/tools/memory-model/litmus-tests/CoRR+poonceonce+Once.litmus @@ -1,5 +1,11 @@ C CoRR+poonceonce+Once +(* + * Test of read-read coherence, that is, whether or not two successive + * reads from the same variable are ordered. They should be ordered, + * that is, this test should be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/CoRW+poonceonce+Once.litmus b/tools/memory-model/litmus-tests/CoRW+poonceonce+Once.litmus index fab91c13d52c..0078ecd76f5e 100644 --- a/tools/memory-model/litmus-tests/CoRW+poonceonce+Once.litmus +++ b/tools/memory-model/litmus-tests/CoRW+poonceonce+Once.litmus @@ -1,5 +1,11 @@ C CoRW+poonceonce+Once +(* + * Test of read-write coherence, that is, whether or not a read from a + * given variable followed by a write to that same variable are ordered. + * This should be ordered, that is, this test should be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/CoWR+poonceonce+Once.litmus b/tools/memory-model/litmus-tests/CoWR+poonceonce+Once.litmus index 6a35ec2042ea..c9d342c8fbec 100644 --- a/tools/memory-model/litmus-tests/CoWR+poonceonce+Once.litmus +++ b/tools/memory-model/litmus-tests/CoWR+poonceonce+Once.litmus @@ -1,5 +1,11 @@ C CoWR+poonceonce+Once +(* + * Test of write-read coherence, that is, whether or not a write to a + * given variable followed by a read from that same variable are ordered. + * They should be ordered, that is, this test should be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/CoWW+poonceonce.litmus b/tools/memory-model/litmus-tests/CoWW+poonceonce.litmus index 32a96b832021..ad51c7b17f7b 100644 --- a/tools/memory-model/litmus-tests/CoWW+poonceonce.litmus +++ b/tools/memory-model/litmus-tests/CoWW+poonceonce.litmus @@ -1,5 +1,11 @@ C CoWW+poonceonce +(* + * Test of write-write coherence, that is, whether or not two successive + * writes to the same variable are ordered. They should be ordered, that + * is, this test should be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/IRIW+mbonceonces+OnceOnce.litmus b/tools/memory-model/litmus-tests/IRIW+mbonceonces+OnceOnce.litmus index 7eba2c68992b..8a58abce69fe 100644 --- a/tools/memory-model/litmus-tests/IRIW+mbonceonces+OnceOnce.litmus +++ b/tools/memory-model/litmus-tests/IRIW+mbonceonces+OnceOnce.litmus @@ -1,5 +1,14 @@ C IRIW+mbonceonces+OnceOnce +(* + * Test of independent reads from independent writes with smp_mb() + * between each pairs of reads. In other words, is smp_mb() sufficient to + * cause two different reading processes to agree on the order of a pair + * of writes, where each write is to a different variable by a different + * process? The smp_mb()s should be sufficient, that is, this test should + * be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/IRIW+poonceonces+OnceOnce.litmus b/tools/memory-model/litmus-tests/IRIW+poonceonces+OnceOnce.litmus index b0556c6c75d4..c736cd372207 100644 --- a/tools/memory-model/litmus-tests/IRIW+poonceonces+OnceOnce.litmus +++ b/tools/memory-model/litmus-tests/IRIW+poonceonces+OnceOnce.litmus @@ -1,5 +1,14 @@ C IRIW+poonceonces+OnceOnce +(* + * Test of independent reads from independent writes with nothing + * between each pairs of reads. In other words, is anything at all + * needed to cause two different reading processes to agree on the order + * of a pair of writes, where each write is to a different variable by a + * different process? Something is needed, in other words, this test + * should be allowed. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/ISA2+poonceonces.litmus b/tools/memory-model/litmus-tests/ISA2+poonceonces.litmus index 9a1a233d70c3..1f1c4220c92d 100644 --- a/tools/memory-model/litmus-tests/ISA2+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/ISA2+poonceonces.litmus @@ -1,5 +1,13 @@ C ISA2+poonceonces +(* + * Given a release-acquire chain ordering the first process's store + * against the last process's load, is ordering preserved if all of the + * smp_store_release() invocations be replaced by WRITE_ONCE() and all + * of the smp_load_acquire() invocations be replaced by READ_ONCE()? + * The answer is "no", that is, this test should be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus b/tools/memory-model/litmus-tests/ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus index 235195e87d4e..aa4b25838519 100644 --- a/tools/memory-model/litmus-tests/ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus +++ b/tools/memory-model/litmus-tests/ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus @@ -1,5 +1,14 @@ C ISA2+pooncerelease+poacquirerelease+poacquireonce +(* + * This litmus test demonstrates that a release-acquire chain suffices + * to order P0()'s initial write against P2()'s final read. The reason + * that the release-acquire chain suffices is because in all but one + * case (P2() to P0()), each process reads from the preceding process's + * write. In memory-model-speak, there is only one non-reads-from + * (AKA non-rf) link, so release-acquire is all that is needed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/LB+ctrlonceonce+mbonceonce.litmus b/tools/memory-model/litmus-tests/LB+ctrlonceonce+mbonceonce.litmus index dd5ac3a8974a..0b65048ad4db 100644 --- a/tools/memory-model/litmus-tests/LB+ctrlonceonce+mbonceonce.litmus +++ b/tools/memory-model/litmus-tests/LB+ctrlonceonce+mbonceonce.litmus @@ -1,5 +1,14 @@ C LB+ctrlonceonce+mbonceonce +(* + * This litmus test demonstrates that lightweight ordering suffices for + * the load-buffering pattern, in other words, preventing all processes + * reading from the preceding process's write. In this example, the + * combination of a control dependency and a full memory barrier are to do + * the trick. (But the full memory barrier could be replaced with another + * control dependency and order would still be maintained.) + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/LB+poacquireonce+pooncerelease.litmus b/tools/memory-model/litmus-tests/LB+poacquireonce+pooncerelease.litmus index 47bd61319d93..1d1f45ff1940 100644 --- a/tools/memory-model/litmus-tests/LB+poacquireonce+pooncerelease.litmus +++ b/tools/memory-model/litmus-tests/LB+poacquireonce+pooncerelease.litmus @@ -1,5 +1,12 @@ C LB+poacquireonce+pooncerelease +(* + * Does a release-acquire pair suffice for the load-buffering litmus + * test, where each process reads from one of two variables then writes + * to the other? The answer is "yes", that is, this test should be + * forbidden. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/LB+poonceonces.litmus b/tools/memory-model/litmus-tests/LB+poonceonces.litmus index a5cdf027e34b..383e3e0adb4e 100644 --- a/tools/memory-model/litmus-tests/LB+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/LB+poonceonces.litmus @@ -1,5 +1,11 @@ C LB+poonceonces +(* + * Can the counter-intuitive outcome for the load-buffering pattern + * be prevented even with no explicit ordering? The answer should be + * "no", that is, this test should be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/MP+onceassign+derefonce.litmus b/tools/memory-model/litmus-tests/MP+onceassign+derefonce.litmus index 1a2fe5830381..86ddc88a26a2 100644 --- a/tools/memory-model/litmus-tests/MP+onceassign+derefonce.litmus +++ b/tools/memory-model/litmus-tests/MP+onceassign+derefonce.litmus @@ -1,5 +1,12 @@ C MP+onceassign+derefonce.litmus +(* + * This litmus test demonstrates that rcu_assign_pointer() and + * rcu_dereference() suffice to ensure that an RCU reader will not see + * pre-initialization garbage when it traverses an RCU-protected data + * structure containing a newly inserted element. + *) + { y=z; z=0; diff --git a/tools/memory-model/litmus-tests/MP+poonceonces.litmus b/tools/memory-model/litmus-tests/MP+poonceonces.litmus index 46e1ac7ba126..16a1d45e3fde 100644 --- a/tools/memory-model/litmus-tests/MP+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/MP+poonceonces.litmus @@ -1,5 +1,11 @@ C MP+poonceonces +(* + * Can the counter-intuitive message-passing outcome be prevented with + * no ordering at all? The answer should be "no", that is, this test + * should be prohibited. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/MP+pooncerelease+poacquireonce.litmus b/tools/memory-model/litmus-tests/MP+pooncerelease+poacquireonce.litmus index 0b00cc7293ba..f7fbe2636287 100644 --- a/tools/memory-model/litmus-tests/MP+pooncerelease+poacquireonce.litmus +++ b/tools/memory-model/litmus-tests/MP+pooncerelease+poacquireonce.litmus @@ -1,5 +1,11 @@ C MP+pooncerelease+poacquireonce +(* + * This litmus test demonstrates that smp_store_release() and + * smp_load_acquire() provide sufficient ordering for the message-passing + * pattern. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/MP+wmbonceonce+rmbonceonce.litmus b/tools/memory-model/litmus-tests/MP+wmbonceonce+rmbonceonce.litmus index 604ad41ea0c2..3d53ba138acd 100644 --- a/tools/memory-model/litmus-tests/MP+wmbonceonce+rmbonceonce.litmus +++ b/tools/memory-model/litmus-tests/MP+wmbonceonce+rmbonceonce.litmus @@ -1,5 +1,11 @@ C MP+wmbonceonce+rmbonceonce +(* + * This litmus test demonstrates that smp_wmb() and smp_rmb() provide + * sufficient ordering for the message-passing pattern. However, it + * is usually better to use smp_store_release() and smp_load_acquire(). + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/R+mbonceonces.litmus b/tools/memory-model/litmus-tests/R+mbonceonces.litmus index e69b9e3e9436..4d64e547f1cd 100644 --- a/tools/memory-model/litmus-tests/R+mbonceonces.litmus +++ b/tools/memory-model/litmus-tests/R+mbonceonces.litmus @@ -1,5 +1,12 @@ C R+mbonceonces +(* + * This is the fully ordered (via smp_mb()) version of one of the classic + * counterintuitive litmus tests that illustrates the effects of store + * propagation delays. This test should be forbidden, but weaking either + * of the barriers would cause the resulting test to be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/R+poonceonces.litmus b/tools/memory-model/litmus-tests/R+poonceonces.litmus index f7a12e00f82d..e75295b4e7c1 100644 --- a/tools/memory-model/litmus-tests/R+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/R+poonceonces.litmus @@ -1,5 +1,11 @@ C R+poonceonces +(* + * This is the unordered (via smp_mb()) version of one of the classic + * counterintuitive litmus tests that illustrates the effects of store + * propagation delays. This test should be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/S+poonceonces.litmus b/tools/memory-model/litmus-tests/S+poonceonces.litmus index d0d541c8ec7d..7fe16920a228 100644 --- a/tools/memory-model/litmus-tests/S+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/S+poonceonces.litmus @@ -1,5 +1,13 @@ C S+poonceonces +(* + * Starting with a two-process release-acquire chain ordering P0()'s + * first store against P1()'s final load, if the smp_store_release() + * is replaced by WRITE_ONCE() and the smp_load_acquire() replaced by + * READ_ONCE(), is ordering preserved. The answer is "of course not!", + * so this test should be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/S+wmbonceonce+poacquireonce.litmus b/tools/memory-model/litmus-tests/S+wmbonceonce+poacquireonce.litmus index 1d292d0d6603..f78ce120863b 100644 --- a/tools/memory-model/litmus-tests/S+wmbonceonce+poacquireonce.litmus +++ b/tools/memory-model/litmus-tests/S+wmbonceonce+poacquireonce.litmus @@ -1,5 +1,11 @@ C S+wmbonceonce+poacquireonce +(* + * Can a smp_wmb(), instead of a release, and an acquire order a prior + * store against a subsequent store? The answer should be "yes", so + * this test should be forbidden. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/SB+mbonceonces.litmus b/tools/memory-model/litmus-tests/SB+mbonceonces.litmus index b76caa5af1af..476542cd4a49 100644 --- a/tools/memory-model/litmus-tests/SB+mbonceonces.litmus +++ b/tools/memory-model/litmus-tests/SB+mbonceonces.litmus @@ -1,5 +1,12 @@ C SB+mbonceonces +(* + * This litmus test demonstrates that full memory barriers suffice to + * order the store-buffering pattern, where each process writes to the + * variable that the preceding process read. (Locking and RCU can also + * suffice, but not much else.) + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/SB+poonceonces.litmus b/tools/memory-model/litmus-tests/SB+poonceonces.litmus index c1797e03807e..40d519408ea6 100644 --- a/tools/memory-model/litmus-tests/SB+poonceonces.litmus +++ b/tools/memory-model/litmus-tests/SB+poonceonces.litmus @@ -1,5 +1,11 @@ C SB+poonceonces +(* + * This litmus test demonstrates that at least some ordering is required + * to order the store-buffering pattern, where each process writes to the + * variable that the preceding process read. This test should be allowed. + *) + {} P0(int *x, int *y) diff --git a/tools/memory-model/litmus-tests/WRC+poonceonces+Once.litmus b/tools/memory-model/litmus-tests/WRC+poonceonces+Once.litmus index f5e7c92f61cc..0780a67cf3bd 100644 --- a/tools/memory-model/litmus-tests/WRC+poonceonces+Once.litmus +++ b/tools/memory-model/litmus-tests/WRC+poonceonces+Once.litmus @@ -1,5 +1,11 @@ C WRC+poonceonces+Once +(* + * This litmus test is an extension of the message-passing pattern, where + * the first write is moved to a separate process. But because this test + * has no ordering at all, it should be allowed. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/WRC+pooncerelease+rmbonceonce+Once.litmus b/tools/memory-model/litmus-tests/WRC+pooncerelease+rmbonceonce+Once.litmus index e3d0018025dd..070166d435e5 100644 --- a/tools/memory-model/litmus-tests/WRC+pooncerelease+rmbonceonce+Once.litmus +++ b/tools/memory-model/litmus-tests/WRC+pooncerelease+rmbonceonce+Once.litmus @@ -1,5 +1,11 @@ C WRC+pooncerelease+rmbonceonce+Once +(* + * This litmus test is an extension of the message-passing pattern, where + * the first write is moved to a separate process. Because it features + * a release and a read memory barrier, it should be forbidden. + *) + {} P0(int *x) diff --git a/tools/memory-model/litmus-tests/Z6.0+pooncelock+pooncelock+pombonce.litmus b/tools/memory-model/litmus-tests/Z6.0+pooncelock+pooncelock+pombonce.litmus index c9a1f1a49ae1..8c723892716f 100644 --- a/tools/memory-model/litmus-tests/Z6.0+pooncelock+pooncelock+pombonce.litmus +++ b/tools/memory-model/litmus-tests/Z6.0+pooncelock+pooncelock+pombonce.litmus @@ -1,5 +1,11 @@ C Z6.0+pooncelock+pooncelock+pombonce +(* + * This example demonstrates that a pair of accesses made by different + * processes each while holding a given lock will not necessarily be + * seen as ordered by a third process not holding that lock. + *) + {} P0(int *x, int *y, spinlock_t *mylock) diff --git a/tools/memory-model/litmus-tests/Z6.0+pooncerelease+poacquirerelease+mbonceonce.litmus b/tools/memory-model/litmus-tests/Z6.0+pooncerelease+poacquirerelease+mbonceonce.litmus index 25409a033514..8b0b1b3ca348 100644 --- a/tools/memory-model/litmus-tests/Z6.0+pooncerelease+poacquirerelease+mbonceonce.litmus +++ b/tools/memory-model/litmus-tests/Z6.0+pooncerelease+poacquirerelease+mbonceonce.litmus @@ -1,5 +1,17 @@ C Z6.0+pooncerelease+poacquirerelease+mbonceonce +(* + * This litmus test shows that a release-acquire chain, while sufficient + * when there is but one non-reads-from (AKA non-rf) link, does not suffice + * if there is more than one. Of the three processes, only P1() reads from + * P0's write, which means that there are two non-rf links: P1() to P2() + * is a write-to-write link (AKA a "coherence" or just "co" link) and P2() + * to P0() is a read-to-write link (AKA a "from-reads" or just "fr" link). + * When there are two or more non-rf links, you typically will need one + * full barrier for each non-rf link. (Exceptions include some cases + * involving locking.) + *) + {} P0(int *x, int *y)