Add spinlocks
[fio.git] / arch / arch-s390.h
index 06477503be02859a41bd3186d1c2666ed7abc64f..8c6fa5ef2e5a92b0cbf391a8ca9a17efa663148a 100644 (file)
 #define read_barrier() asm volatile("bcr 15,0" : : : "memory")
 #define write_barrier()        asm volatile("bcr 15,0" : : : "memory")
 
+typedef struct {
+       volatile unsigned int lock;
+} spinlock_t;
+
+static inline int
+_raw_compare_and_swap(volatile unsigned int *lock,
+                     unsigned int old, unsigned int new)
+{
+       __asm__ __volatile__(
+               "       cs      %0,%3,0(%4)"
+               : "=d" (old), "=m" (*lock)
+               : "0" (old), "d" (new), "a" (lock), "m" (*lock)
+               : "cc", "memory" );
+
+       return old;
+}
+
+static inline void spin_lock(spinlock_t *lock)
+{
+       if (!_raw_compare_and_swap(&lock->lock, 0, 0x80000000))
+               return;
+
+       while (1) {
+               if (lock->lock)
+                       continue;
+               if (!_raw_compare_and_swap(&lock->lock, 0, 0x80000000))
+                       break;
+       }
+}
+
+static inline void spin_unlock(spinlock_t *lock)
+{
+        _raw_compare_and_swap(&lock->lock, 0x80000000, 0);
+}
+
 #endif