]> granicus.if.org Git - libatomic_ops/commitdiff
Relax shareability domain for dmb st in AO_nop_write (ARM/AArch64)
authorSteve Capper <steve.capper@linaro.org>
Wed, 29 Oct 2014 22:16:14 +0000 (01:16 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 29 Oct 2014 22:16:14 +0000 (01:16 +0300)
* src/atomic_ops/sysdeps/gcc/aarch64.h (AO_nop_write): Replace "dmb st"
to "dmb ishst" (this way the barriers will occupy the inner shareable
domain).
* src/atomic_ops/sysdeps/gcc/arm.h (AO_nop_write): Likewise.

src/atomic_ops/sysdeps/gcc/aarch64.h
src/atomic_ops/sysdeps/gcc/arm.h

index 54e6d7f6d50ed64a5ae69c6128b3f4e02209723a..f969f1388e7b8e2a99c2909aff3f4b0f8c32a383 100644 (file)
@@ -23,7 +23,8 @@
   AO_INLINE void
   AO_nop_write(void)
   {
-    __asm__ __volatile__("dmb st" : : : "memory");
+    /* TODO: Use C++11 primitive. */
+    __asm__ __volatile__("dmb ishst" : : : "memory");
   }
 # define AO_HAVE_nop_write
 #endif
index c19f6dabedbed012d86b11561b239c9913a2a0f8..3d841e96fcfee18bd5842264ffa798a332750622 100644 (file)
   AO_nop_write(void)
   {
     /* AO_THUMB_GO_ARM is empty. */
-    __asm__ __volatile__("dmb st" : : : "memory");
+    /* This will target the system domain and thus be overly            */
+    /* conservative as the CPUs will occupy the inner shareable domain. */
+    /* The plain variant (dmb st) is theoretically slower, and should   */
+    /* not be needed.  That said, with limited experimentation, a CPU   */
+    /* implementation for which it actually matters has not been found  */
+    /* yet, though they should already exist.                           */
+    /* Anyway, note that the "st" and "ishst" barriers are actually     */
+    /* quite weak and, as the libatomic_ops documentation states,       */
+    /* usually not what you really want.                                */
+    __asm__ __volatile__("dmb ishst" : : : "memory");
   }
 # define AO_HAVE_nop_write