Add write barriers
authorJens Axboe <jens.axboe@oracle.com>
Wed, 4 Jun 2008 12:31:25 +0000 (14:31 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 4 Jun 2008 12:31:25 +0000 (14:31 +0200)
And enable them in solarisaio, then it should be safe to use the
signal driven IO "interrupts".

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
arch/arch-alpha.h
arch/arch-ia64.h
arch/arch-ppc.h
arch/arch-s390.h
arch/arch-sparc.h
arch/arch-sparc64.h
arch/arch-x86.h
arch/arch-x86_64.h
engines/solarisaio.c

index 2b6832018f76baedcaea13e41bcf69f1f4c6e648..811d23a16612260cbd457db8248234e868252c19 100644 (file)
@@ -12,7 +12,8 @@
 #define __NR_fadvise64         413
 #endif
 
-#define nop            do { } while (0)
-#define read_barrier() __asm__ __volatile__("mb": : :"memory")
+#define nop                    do { } while (0)
+#define read_barrier()         __asm__ __volatile__("mb": : :"memory")
+#define writer_barrier()       __asm__ __volatile__("wmb": : :"memory")
 
 #endif
index 6dd8196d2e49231bf97bb4a651cd4b8571e886c8..2f926849fb04cc9e13d5e514c6ac6f255a32360e 100644 (file)
@@ -20,6 +20,7 @@
 
 #define nop            asm volatile ("hint @pause" ::: "memory");
 #define read_barrier() asm volatile ("mf" ::: "memory")
+#define writebarrier() asm volatile ("mf" ::: "memory")
 
 #define ia64_popcnt(x)                                                 \
 ({                                                                     \
index 6256d056c324c7ec8df797251ad61a66fdd87d8f..061153873131db5964ca650a6d255e72b8035866 100644 (file)
 #define nop    do { } while (0)
 
 #ifdef __powerpc64__
-#define read_barrier() \
-       __asm__ __volatile__ ("lwsync" : : : "memory")
+#define read_barrier() __asm__ __volatile__ ("lwsync" : : : "memory")
 #else
-#define read_barrier() \
-       __asm__ __volatile__ ("sync" : : : "memory")
+#define read_barrier() __asm__ __volatile__ ("sync" : : : "memory")
 #endif
 
+#define write_barrier()        __asm__ __volatile__ ("sync" : : : "memory")
+
 static inline int __ilog2(unsigned long bitmask)
 {
        int lz;
index c4ec1d12478cd17a5a0fd8943a4ca93264a6aff4..dfb7899ba7ce2d07ae365fdf91784e76f6b30359 100644 (file)
@@ -14,5 +14,6 @@
 
 #define nop            asm volatile ("diag 0,0,68" : : : "memory")
 #define read_barrier() asm volatile("bcr 15,0" : : : "memory")
+#define write_barrier()        asm volatile("bcr 15,0" : : : "memory")
 
 #endif
index be3b394a74c44b4d669e13bd0cd612e33cb4661f..cd552ab7c94fd8ce613e64b38739a4be6741c2f7 100644 (file)
@@ -21,5 +21,6 @@
 #define nop    do { } while (0)
 
 #define read_barrier() __asm__ __volatile__ ("" : : : "memory")
+#define write_barrier()        __asm__ __volatile__ ("" : : : "memory")
 
 #endif
index b916882a6ef9d18640711d8a8fe2eca15ea7a0e9..332cf9179388377ebfc12bf85458f1dd6b73d5ea 100644 (file)
@@ -27,7 +27,7 @@
                                        : : : "memory"); \
        } while (0)
 
-#define read_barrier() \
-       membar_safe("#LoadLoad")
+#define read_barrier()         membar_safe("#LoadLoad")
+#define write_barrier()                membar_safe("#StoreStore")
 
 #endif
index a396c850345ddc8cb90042b34d7d39c723aea4c8..97262ffe0769f9a445fe3042031867987350d9a2 100644 (file)
@@ -30,7 +30,8 @@
 #define FIO_HAVE_SYSLET
 
 #define nop            __asm__ __volatile__("rep;nop": : :"memory")
-#define read_barrier() asm volatile ("": : :"memory")
+#define read_barrier() __asm__ __volatile__("": : :"memory")
+#define write_barrier()        __asm__ __volatile__("": : :"memory")
 
 static inline unsigned long arch_ffz(unsigned long bitmask)
 {
index 0d26feeb3c68df9a24e0b257dfe382b8f865b2ca..216e74e2e32a409d1d7bbee30aa38f771cafdb40 100644 (file)
@@ -30,7 +30,8 @@
 #define FIO_HAVE_SYSLET
 
 #define nop            __asm__ __volatile__("rep;nop": : :"memory")
-#define read_barrier() asm volatile("lfence":::"memory")
+#define read_barrier() __asm__ __volatile__("lfence":::"memory")
+#define write_barrier()        __asm__ __volatile__("sfence":::"memory")
 
 static inline unsigned int arch_ffz(unsigned int bitmask)
 {
index b519fc54339b0ddde7fb3192db3b6afda9d9d64c..dfaa375a1e0aa6a06c91d97a6e54d93d9fb87041 100644 (file)
@@ -69,6 +69,7 @@ static void wait_for_event(struct timeval *tv)
         * the ->aio_pending store is seen after the ->aio_events store
         */
        sd->aio_events[sd->aio_pending] = io_u;
+       write_barrier();
        sd->aio_pending++;
        sd->nr--;
 }
@@ -97,10 +98,10 @@ static int fio_solarisaio_getevents(struct thread_data *td, unsigned int min,
                wait_for_event(&tv);
 
        /*
-        * Needs locking here for SIGIO
+        * should be OK without locking, as int operations should be atomic
         */
        ret = sd->aio_pending;
-       sd->aio_pending = 0;
+       sd->aio_pending -= ret;
        return ret;
 }
 
@@ -161,8 +162,7 @@ static void fio_solarisaio_cleanup(struct thread_data *td)
 }
 
 /*
- * Set USE_SIGNAL_COMPLETIONS to use SIGIO as completion events. Needs
- * locking around ->aio_pending and ->aio_events, see comment
+ * Set USE_SIGNAL_COMPLETIONS to use SIGIO as completion events.
  */
 static void fio_solarisaio_init_sigio(void)
 {