s390/barrier: avoid serialization in [smp_]rmb and [smp_]wmb
authorChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 11 Sep 2015 14:32:24 +0000 (16:32 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 14 Oct 2015 12:32:01 +0000 (14:32 +0200)
The principles of operation says:

The storage-operand fetch references of one instruction
occur after those of all preceding instructions and
before those of subsequent instructions, as observed
by other CPUs and by channel programs.
[...]
The CPU may fetch the operands of instructions before the
instructions are executed.
[...]
The CPU may delay placing results in storage.
[...]
the results of one instruction are placed in storage after
the results of all preceding instructions have been placed
in storage and before any results of the succeeding
instructions are stored, as observed by other CPUs and by
the channel subsystem.

which boils down to:
- reads are in order
- writes are in order
- reads can happen earlier
- writes can happen later

By definition (see memory-barrier.txt) read barriers orders
reads vs reads and write barriers orders writes agains writes.
but neither of these orders reads vs. writes.

That means we can implement smp_wmb,smp_rmb,wmb and rmb as
simple compiler barriers. To avoid reviewing all driver code
for correct barrier usage we keep dma_[rw]mb as serialization
for now.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/barrier.h

index d48fe0162331600c09ac630ad45f99e468a07d02..d68e11e0df5eada7e600f58529e8cbe60fab41c7 100644 (file)
 
 #define mb() do {  asm volatile(__ASM_BARRIER : : : "memory"); } while (0)
 
-#define rmb()                          mb()
-#define wmb()                          mb()
-#define dma_rmb()                      rmb()
-#define dma_wmb()                      wmb()
+#define rmb()                          barrier()
+#define wmb()                          barrier()
+#define dma_rmb()                      mb()
+#define dma_wmb()                      mb()
 #define smp_mb()                       mb()
 #define smp_rmb()                      rmb()
 #define smp_wmb()                      wmb()