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 2b68320..811d23a 100644 (file)
@@ -12,7 +12,8 @@
 #define __NR_fadvise64         413
 #endif
 
 #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
 
 #endif
index 6dd8196..2f92684 100644 (file)
@@ -20,6 +20,7 @@
 
 #define nop            asm volatile ("hint @pause" ::: "memory");
 #define read_barrier() asm volatile ("mf" ::: "memory")
 
 #define nop            asm volatile ("hint @pause" ::: "memory");
 #define read_barrier() asm volatile ("mf" ::: "memory")
+#define writebarrier() asm volatile ("mf" ::: "memory")
 
 #define ia64_popcnt(x)                                                 \
 ({                                                                     \
 
 #define ia64_popcnt(x)                                                 \
 ({                                                                     \
index 6256d05..0611538 100644 (file)
 #define nop    do { } while (0)
 
 #ifdef __powerpc64__
 #define nop    do { } while (0)
 
 #ifdef __powerpc64__
-#define read_barrier() \
-       __asm__ __volatile__ ("lwsync" : : : "memory")
+#define read_barrier() __asm__ __volatile__ ("lwsync" : : : "memory")
 #else
 #else
-#define read_barrier() \
-       __asm__ __volatile__ ("sync" : : : "memory")
+#define read_barrier() __asm__ __volatile__ ("sync" : : : "memory")
 #endif
 
 #endif
 
+#define write_barrier()        __asm__ __volatile__ ("sync" : : : "memory")
+
 static inline int __ilog2(unsigned long bitmask)
 {
        int lz;
 static inline int __ilog2(unsigned long bitmask)
 {
        int lz;
index c4ec1d1..dfb7899 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 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
 
 #endif
index be3b394..cd552ab 100644 (file)
@@ -21,5 +21,6 @@
 #define nop    do { } while (0)
 
 #define read_barrier() __asm__ __volatile__ ("" : : : "memory")
 #define nop    do { } while (0)
 
 #define read_barrier() __asm__ __volatile__ ("" : : : "memory")
+#define write_barrier()        __asm__ __volatile__ ("" : : : "memory")
 
 #endif
 
 #endif
index b916882..332cf91 100644 (file)
@@ -27,7 +27,7 @@
                                        : : : "memory"); \
        } while (0)
 
                                        : : : "memory"); \
        } while (0)
 
-#define read_barrier() \
-       membar_safe("#LoadLoad")
+#define read_barrier()         membar_safe("#LoadLoad")
+#define write_barrier()                membar_safe("#StoreStore")
 
 #endif
 
 #endif
index a396c85..97262ff 100644 (file)
@@ -30,7 +30,8 @@
 #define FIO_HAVE_SYSLET
 
 #define nop            __asm__ __volatile__("rep;nop": : :"memory")
 #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)
 {
 
 static inline unsigned long arch_ffz(unsigned long bitmask)
 {
index 0d26fee..216e74e 100644 (file)
@@ -30,7 +30,8 @@
 #define FIO_HAVE_SYSLET
 
 #define nop            __asm__ __volatile__("rep;nop": : :"memory")
 #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)
 {
 
 static inline unsigned int arch_ffz(unsigned int bitmask)
 {
index b519fc5..dfaa375 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;
         * 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--;
 }
        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);
 
        /*
                wait_for_event(&tv);
 
        /*
-        * Needs locking here for SIGIO
+        * should be OK without locking, as int operations should be atomic
         */
        ret = sd->aio_pending;
         */
        ret = sd->aio_pending;
-       sd->aio_pending = 0;
+       sd->aio_pending -= ret;
        return 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)
 {
  */
 static void fio_solarisaio_init_sigio(void)
 {