summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Parri <andrea.parri@amarulasolutions.com>2019-06-29 17:10:44 -0400
committerPaul E. McKenney <paulmck@linux.ibm.com>2019-08-09 13:28:57 -0400
commit6738ff85c3ee8073d5b030cb26241d0009d4ce29 (patch)
tree925debdeae5d0d6ff762c0fbfa881823db134723
parent6240973e5661a83df24e35a9a9c2013496931e2b (diff)
tools/memory-model: Update the informal documentation
The formal memory consistency model has added support for plain accesses (and data races). While updating the informal documentation to describe this addition to the model is highly desirable and important future work, update the informal documentation to at least acknowledge such addition. Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: David Howells <dhowells@redhat.com> Cc: Jade Alglave <j.alglave@ucl.ac.uk> Cc: Luc Maranget <luc.maranget@inria.fr> Cc: "Paul E. McKenney" <paulmck@linux.ibm.com> Cc: Akira Yokosawa <akiyks@gmail.com> Cc: Daniel Lustig <dlustig@nvidia.com> Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com> Acked-by: Alan Stern <stern@rowland.harvard.edu>
-rw-r--r--tools/memory-model/Documentation/explanation.txt47
-rw-r--r--tools/memory-model/README18
2 files changed, 30 insertions, 35 deletions
diff --git a/tools/memory-model/Documentation/explanation.txt b/tools/memory-model/Documentation/explanation.txt
index 634dc6db26c4..488f11f6c588 100644
--- a/tools/memory-model/Documentation/explanation.txt
+++ b/tools/memory-model/Documentation/explanation.txt
@@ -42,7 +42,8 @@ linux-kernel.bell and linux-kernel.cat files that make up the formal
42version of the model; they are extremely terse and their meanings are 42version of the model; they are extremely terse and their meanings are
43far from clear. 43far from clear.
44 44
45This document describes the ideas underlying the LKMM. It is meant 45This document describes the ideas underlying the LKMM, but excluding
46the modeling of bare C (or plain) shared memory accesses. It is meant
46for people who want to understand how the model was designed. It does 47for people who want to understand how the model was designed. It does
47not go into the details of the code in the .bell and .cat files; 48not go into the details of the code in the .bell and .cat files;
48rather, it explains in English what the code expresses symbolically. 49rather, it explains in English what the code expresses symbolically.
@@ -354,31 +355,25 @@ be extremely complex.
354Optimizing compilers have great freedom in the way they translate 355Optimizing compilers have great freedom in the way they translate
355source code to object code. They are allowed to apply transformations 356source code to object code. They are allowed to apply transformations
356that add memory accesses, eliminate accesses, combine them, split them 357that add memory accesses, eliminate accesses, combine them, split them
357into pieces, or move them around. Faced with all these possibilities, 358into pieces, or move them around. The use of READ_ONCE(), WRITE_ONCE(),
358the LKMM basically gives up. It insists that the code it analyzes 359or one of the other atomic or synchronization primitives prevents a
359must contain no ordinary accesses to shared memory; all accesses must 360large number of compiler optimizations. In particular, it is guaranteed
360be performed using READ_ONCE(), WRITE_ONCE(), or one of the other 361that the compiler will not remove such accesses from the generated code
361atomic or synchronization primitives. These primitives prevent a 362(unless it can prove the accesses will never be executed), it will not
362large number of compiler optimizations. In particular, it is 363change the order in which they occur in the code (within limits imposed
363guaranteed that the compiler will not remove such accesses from the 364by the C standard), and it will not introduce extraneous accesses.
364generated code (unless it can prove the accesses will never be 365
365executed), it will not change the order in which they occur in the 366The MP and SB examples above used READ_ONCE() and WRITE_ONCE() rather
366code (within limits imposed by the C standard), and it will not 367than ordinary memory accesses. Thanks to this usage, we can be certain
367introduce extraneous accesses. 368that in the MP example, the compiler won't reorder P0's write event to
368 369buf and P0's write event to flag, and similarly for the other shared
369This explains why the MP and SB examples above used READ_ONCE() and 370memory accesses in the examples.
370WRITE_ONCE() rather than ordinary memory accesses. Thanks to this 371
371usage, we can be certain that in the MP example, P0's write event to 372Since private variables are not shared between CPUs, they can be
372buf really is po-before its write event to flag, and similarly for the 373accessed normally without READ_ONCE() or WRITE_ONCE(). In fact, they
373other shared memory accesses in the examples. 374need not even be stored in normal memory at all -- in principle a
374 375private variable could be stored in a CPU register (hence the convention
375Private variables are not subject to this restriction. Since they are 376that these variables have names starting with the letter 'r').
376not shared between CPUs, they can be accessed normally without
377READ_ONCE() or WRITE_ONCE(), and there will be no ill effects. In
378fact, they need not even be stored in normal memory at all -- in
379principle a private variable could be stored in a CPU register (hence
380the convention that these variables have names starting with the
381letter 'r').
382 377
383 378
384A WARNING 379A WARNING
diff --git a/tools/memory-model/README b/tools/memory-model/README
index 2b87f3971548..fc07b52f2028 100644
--- a/tools/memory-model/README
+++ b/tools/memory-model/README
@@ -167,15 +167,15 @@ scripts Various scripts, see scripts/README.
167LIMITATIONS 167LIMITATIONS
168=========== 168===========
169 169
170The Linux-kernel memory model has the following limitations: 170The Linux-kernel memory model (LKMM) has the following limitations:
171 171
1721. Compiler optimizations are not modeled. Of course, the use 1721. Compiler optimizations are not accurately modeled. Of course,
173 of READ_ONCE() and WRITE_ONCE() limits the compiler's ability 173 the use of READ_ONCE() and WRITE_ONCE() limits the compiler's
174 to optimize, but there is Linux-kernel code that uses bare C 174 ability to optimize, but under some circumstances it is possible
175 memory accesses. Handling this code is on the to-do list. 175 for the compiler to undermine the memory model. For more
176 For more information, see Documentation/explanation.txt (in 176 information, see Documentation/explanation.txt (in particular,
177 particular, the "THE PROGRAM ORDER RELATION: po AND po-loc" 177 the "THE PROGRAM ORDER RELATION: po AND po-loc" and "A WARNING"
178 and "A WARNING" sections). 178 sections).
179 179
180 Note that this limitation in turn limits LKMM's ability to 180 Note that this limitation in turn limits LKMM's ability to
181 accurately model address, control, and data dependencies. 181 accurately model address, control, and data dependencies.