X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=arch%2Farch-s390.h;h=169282b9d4d308de3e3ca23aa6ba5be7c46613e1;hb=f0cc675fd0a5902f3637a91024082d2d24a665a7;hp=8c6fa5ef2e5a92b0cbf391a8ca9a17efa663148a;hpb=69ebbd397e80b23ec4281c99e9f7242a089cc771;p=fio.git diff --git a/arch/arch-s390.h b/arch/arch-s390.h index 8c6fa5ef..169282b9 100644 --- a/arch/arch-s390.h +++ b/arch/arch-s390.h @@ -1,7 +1,7 @@ #ifndef ARCH_S390_H #define ARCH_S390_H -#define ARCH (arch_s390) +#define FIO_ARCH (arch_s390) #ifndef __NR_ioprio_set #define __NR_ioprio_set 282 @@ -18,43 +18,35 @@ #define __NR_sys_vmsplice 309 #endif -#define nop asm volatile ("diag 0,0,68" : : : "memory") +#define nop asm volatile("nop" : : : "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) +static inline unsigned long long get_cpu_clock(void) { - __asm__ __volatile__( - " cs %0,%3,0(%4)" - : "=d" (old), "=m" (*lock) - : "0" (old), "d" (new), "a" (lock), "m" (*lock) - : "cc", "memory" ); - - return old; + unsigned long long clk; + +#ifdef CONFIG_S390_Z196_FACILITIES + /* + * Fio needs monotonic (never lower), but not strict monotonic (never + * the same) so store clock fast is enough. + */ + __asm__ __volatile__("stckf %0" : "=Q" (clk) : : "cc"); +#else + __asm__ __volatile__("stck %0" : "=Q" (clk) : : "cc"); +#endif + return clk>>12; } -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; - } -} +#define ARCH_CPU_CLOCK_CYCLES_PER_USEC 1 +#define ARCH_HAVE_CPU_CLOCK -static inline void spin_unlock(spinlock_t *lock) +#define ARCH_HAVE_INIT +extern int tsc_reliable; +static inline int arch_init(char *envp[]) { - _raw_compare_and_swap(&lock->lock, 0x80000000, 0); + tsc_reliable = 1; + return 0; } #endif