X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=arch%2Farch-s390.h;h=8c6fa5ef2e5a92b0cbf391a8ca9a17efa663148a;hp=dfb7899ba7ce2d07ae365fdf91784e76f6b30359;hb=69ebbd397e80b23ec4281c99e9f7242a089cc771;hpb=44c47feb9edc7854bf3cfa2e3d843e90fc969b3a diff --git a/arch/arch-s390.h b/arch/arch-s390.h index dfb7899b..8c6fa5ef 100644 --- a/arch/arch-s390.h +++ b/arch/arch-s390.h @@ -12,8 +12,49 @@ #define __NR_fadvise64 253 #endif +#ifndef __NR_sys_splice +#define __NR_sys_splice 306 +#define __NR_sys_tee 308 +#define __NR_sys_vmsplice 309 +#endif + #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") +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