diff options
Diffstat (limited to 'arch/s390/include/asm/atomic.h')
| -rw-r--r-- | arch/s390/include/asm/atomic.h | 26 | 
1 files changed, 18 insertions, 8 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index 76daea11718..5c5ba10384c 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h @@ -36,14 +36,19 @@  static inline int atomic_read(const atomic_t *v)  { -	barrier(); -	return v->counter; +	int c; + +	asm volatile( +		"	l	%0,%1\n" +		: "=d" (c) : "Q" (v->counter)); +	return c;  }  static inline void atomic_set(atomic_t *v, int i)  { -	v->counter = i; -	barrier(); +	asm volatile( +		"	st	%1,%0\n" +		: "=Q" (v->counter) : "d" (i));  }  static inline int atomic_add_return(int i, atomic_t *v) @@ -128,14 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)  static inline long long atomic64_read(const atomic64_t *v)  { -	barrier(); -	return v->counter; +	long long c; + +	asm volatile( +		"	lg	%0,%1\n" +		: "=d" (c) : "Q" (v->counter)); +	return c;  }  static inline void atomic64_set(atomic64_t *v, long long i)  { -	v->counter = i; -	barrier(); +	asm volatile( +		"	stg	%1,%0\n" +		: "=Q" (v->counter) : "d" (i));  }  static inline long long atomic64_add_return(long long i, atomic64_t *v)  |