Blame view

include/asm-generic/atomic-long.h 6.86 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
72099ed27   Arnd Bergmann   asm-generic: rena...
2
3
  #ifndef _ASM_GENERIC_ATOMIC_LONG_H
  #define _ASM_GENERIC_ATOMIC_LONG_H
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
4
5
  /*
   * Copyright (C) 2005 Silicon Graphics, Inc.
cde535359   Christoph Lameter   Christoph has moved
6
   *	Christoph Lameter
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
7
8
9
10
   *
   * Allows to provide arch independent atomic definitions without the need to
   * edit all arch specific atomic.h files.
   */
5998bf1dd   Andrew Morton   [PATCH] asm-gener...
11
  #include <asm/types.h>
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  
  /*
   * Suppport for atomic_long_t
   *
   * Casts for parameters are avoided for existing atomic functions in order to
   * avoid issues with cast-as-lval under gcc 4.x and other limitations that the
   * macros of a platform may have.
   */
  
  #if BITS_PER_LONG == 64
  
  typedef atomic64_t atomic_long_t;
  
  #define ATOMIC_LONG_INIT(i)	ATOMIC64_INIT(i)
586b610e4   Will Deacon   locking, asm-gene...
26
  #define ATOMIC_LONG_PFX(x)	atomic64 ## x
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
27

586b610e4   Will Deacon   locking, asm-gene...
28
  #else
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
29
30
31
32
  
  typedef atomic_t atomic_long_t;
  
  #define ATOMIC_LONG_INIT(i)	ATOMIC_INIT(i)
586b610e4   Will Deacon   locking, asm-gene...
33
34
35
  #define ATOMIC_LONG_PFX(x)	atomic ## x
  
  #endif
6d79ef2d3   Will Deacon   locking, asm-gene...
36
  #define ATOMIC_LONG_READ_OP(mo)						\
e3e72ab80   Peter Zijlstra   atomic: Implement...
37
  static inline long atomic_long_read##mo(const atomic_long_t *l)		\
6d79ef2d3   Will Deacon   locking, asm-gene...
38
39
40
41
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	return (long)ATOMIC_LONG_PFX(_read##mo)(v);			\
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
42
  }
6d79ef2d3   Will Deacon   locking, asm-gene...
43
44
  ATOMIC_LONG_READ_OP()
  ATOMIC_LONG_READ_OP(_acquire)
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
45

6d79ef2d3   Will Deacon   locking, asm-gene...
46
  #undef ATOMIC_LONG_READ_OP
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
47

6d79ef2d3   Will Deacon   locking, asm-gene...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  #define ATOMIC_LONG_SET_OP(mo)						\
  static inline void atomic_long_set##mo(atomic_long_t *l, long i)	\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	ATOMIC_LONG_PFX(_set##mo)(v, i);				\
  }
  ATOMIC_LONG_SET_OP()
  ATOMIC_LONG_SET_OP(_release)
  
  #undef ATOMIC_LONG_SET_OP
  
  #define ATOMIC_LONG_ADD_SUB_OP(op, mo)					\
  static inline long							\
  atomic_long_##op##_return##mo(long i, atomic_long_t *l)			\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(i, v);		\
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
67
  }
6d79ef2d3   Will Deacon   locking, asm-gene...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  ATOMIC_LONG_ADD_SUB_OP(add,)
  ATOMIC_LONG_ADD_SUB_OP(add, _relaxed)
  ATOMIC_LONG_ADD_SUB_OP(add, _acquire)
  ATOMIC_LONG_ADD_SUB_OP(add, _release)
  ATOMIC_LONG_ADD_SUB_OP(sub,)
  ATOMIC_LONG_ADD_SUB_OP(sub, _relaxed)
  ATOMIC_LONG_ADD_SUB_OP(sub, _acquire)
  ATOMIC_LONG_ADD_SUB_OP(sub, _release)
  
  #undef ATOMIC_LONG_ADD_SUB_OP
  
  #define atomic_long_cmpxchg_relaxed(l, old, new) \
  	(ATOMIC_LONG_PFX(_cmpxchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(l), \
  					   (old), (new)))
  #define atomic_long_cmpxchg_acquire(l, old, new) \
  	(ATOMIC_LONG_PFX(_cmpxchg_acquire)((ATOMIC_LONG_PFX(_t) *)(l), \
  					   (old), (new)))
  #define atomic_long_cmpxchg_release(l, old, new) \
  	(ATOMIC_LONG_PFX(_cmpxchg_release)((ATOMIC_LONG_PFX(_t) *)(l), \
  					   (old), (new)))
  #define atomic_long_cmpxchg(l, old, new) \
  	(ATOMIC_LONG_PFX(_cmpxchg)((ATOMIC_LONG_PFX(_t) *)(l), (old), (new)))
  
  #define atomic_long_xchg_relaxed(v, new) \
  	(ATOMIC_LONG_PFX(_xchg_relaxed)((ATOMIC_LONG_PFX(_t) *)(v), (new)))
  #define atomic_long_xchg_acquire(v, new) \
  	(ATOMIC_LONG_PFX(_xchg_acquire)((ATOMIC_LONG_PFX(_t) *)(v), (new)))
  #define atomic_long_xchg_release(v, new) \
  	(ATOMIC_LONG_PFX(_xchg_release)((ATOMIC_LONG_PFX(_t) *)(v), (new)))
  #define atomic_long_xchg(v, new) \
  	(ATOMIC_LONG_PFX(_xchg)((ATOMIC_LONG_PFX(_t) *)(v), (new)))
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
99

a644fdf02   Denys Vlasenko   include/asm-gener...
100
  static __always_inline void atomic_long_inc(atomic_long_t *l)
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
101
  {
586b610e4   Will Deacon   locking, asm-gene...
102
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
103

586b610e4   Will Deacon   locking, asm-gene...
104
  	ATOMIC_LONG_PFX(_inc)(v);
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
105
  }
a644fdf02   Denys Vlasenko   include/asm-gener...
106
  static __always_inline void atomic_long_dec(atomic_long_t *l)
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
107
  {
586b610e4   Will Deacon   locking, asm-gene...
108
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
109

586b610e4   Will Deacon   locking, asm-gene...
110
  	ATOMIC_LONG_PFX(_dec)(v);
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
111
  }
28aa2bda2   Peter Zijlstra   locking/atomic: I...
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  #define ATOMIC_LONG_FETCH_OP(op, mo)					\
  static inline long							\
  atomic_long_fetch_##op##mo(long i, atomic_long_t *l)			\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	return (long)ATOMIC_LONG_PFX(_fetch_##op##mo)(i, v);		\
  }
  
  ATOMIC_LONG_FETCH_OP(add, )
  ATOMIC_LONG_FETCH_OP(add, _relaxed)
  ATOMIC_LONG_FETCH_OP(add, _acquire)
  ATOMIC_LONG_FETCH_OP(add, _release)
  ATOMIC_LONG_FETCH_OP(sub, )
  ATOMIC_LONG_FETCH_OP(sub, _relaxed)
  ATOMIC_LONG_FETCH_OP(sub, _acquire)
  ATOMIC_LONG_FETCH_OP(sub, _release)
  ATOMIC_LONG_FETCH_OP(and, )
  ATOMIC_LONG_FETCH_OP(and, _relaxed)
  ATOMIC_LONG_FETCH_OP(and, _acquire)
  ATOMIC_LONG_FETCH_OP(and, _release)
  ATOMIC_LONG_FETCH_OP(andnot, )
  ATOMIC_LONG_FETCH_OP(andnot, _relaxed)
  ATOMIC_LONG_FETCH_OP(andnot, _acquire)
  ATOMIC_LONG_FETCH_OP(andnot, _release)
  ATOMIC_LONG_FETCH_OP(or, )
  ATOMIC_LONG_FETCH_OP(or, _relaxed)
  ATOMIC_LONG_FETCH_OP(or, _acquire)
  ATOMIC_LONG_FETCH_OP(or, _release)
  ATOMIC_LONG_FETCH_OP(xor, )
  ATOMIC_LONG_FETCH_OP(xor, _relaxed)
  ATOMIC_LONG_FETCH_OP(xor, _acquire)
  ATOMIC_LONG_FETCH_OP(xor, _release)
f06628638   Davidlohr Bueso   locking/atomic: I...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  #undef ATOMIC_LONG_FETCH_OP
  
  #define ATOMIC_LONG_FETCH_INC_DEC_OP(op, mo)					\
  static inline long							\
  atomic_long_fetch_##op##mo(atomic_long_t *l)				\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	return (long)ATOMIC_LONG_PFX(_fetch_##op##mo)(v);		\
  }
  
  ATOMIC_LONG_FETCH_INC_DEC_OP(inc,)
  ATOMIC_LONG_FETCH_INC_DEC_OP(inc, _relaxed)
  ATOMIC_LONG_FETCH_INC_DEC_OP(inc, _acquire)
  ATOMIC_LONG_FETCH_INC_DEC_OP(inc, _release)
  ATOMIC_LONG_FETCH_INC_DEC_OP(dec,)
  ATOMIC_LONG_FETCH_INC_DEC_OP(dec, _relaxed)
  ATOMIC_LONG_FETCH_INC_DEC_OP(dec, _acquire)
  ATOMIC_LONG_FETCH_INC_DEC_OP(dec, _release)
  
  #undef ATOMIC_LONG_FETCH_INC_DEC_OP
90fe65148   Peter Zijlstra   atomic: Add atomi...
166
  #define ATOMIC_LONG_OP(op)						\
a644fdf02   Denys Vlasenko   include/asm-gener...
167
  static __always_inline void						\
90fe65148   Peter Zijlstra   atomic: Add atomi...
168
169
170
171
172
  atomic_long_##op(long i, atomic_long_t *l)				\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	ATOMIC_LONG_PFX(_##op)(i, v);					\
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
173
  }
90fe65148   Peter Zijlstra   atomic: Add atomi...
174
175
176
  ATOMIC_LONG_OP(add)
  ATOMIC_LONG_OP(sub)
  ATOMIC_LONG_OP(and)
28aa2bda2   Peter Zijlstra   locking/atomic: I...
177
  ATOMIC_LONG_OP(andnot)
90fe65148   Peter Zijlstra   atomic: Add atomi...
178
179
  ATOMIC_LONG_OP(or)
  ATOMIC_LONG_OP(xor)
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
180

90fe65148   Peter Zijlstra   atomic: Add atomi...
181
  #undef ATOMIC_LONG_OP
d3cb48714   Christoph Lameter   [PATCH] atomic_lo...
182

bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
183
184
  static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
  {
586b610e4   Will Deacon   locking, asm-gene...
185
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
186

586b610e4   Will Deacon   locking, asm-gene...
187
  	return ATOMIC_LONG_PFX(_sub_and_test)(i, v);
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
188
189
190
191
  }
  
  static inline int atomic_long_dec_and_test(atomic_long_t *l)
  {
586b610e4   Will Deacon   locking, asm-gene...
192
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
193

586b610e4   Will Deacon   locking, asm-gene...
194
  	return ATOMIC_LONG_PFX(_dec_and_test)(v);
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
195
196
197
198
  }
  
  static inline int atomic_long_inc_and_test(atomic_long_t *l)
  {
586b610e4   Will Deacon   locking, asm-gene...
199
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
200

586b610e4   Will Deacon   locking, asm-gene...
201
  	return ATOMIC_LONG_PFX(_inc_and_test)(v);
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
202
203
204
205
  }
  
  static inline int atomic_long_add_negative(long i, atomic_long_t *l)
  {
586b610e4   Will Deacon   locking, asm-gene...
206
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
207

586b610e4   Will Deacon   locking, asm-gene...
208
  	return ATOMIC_LONG_PFX(_add_negative)(i, v);
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
209
  }
63ab7bd0d   Davidlohr Bueso   locking/asm-gener...
210
211
212
213
214
215
216
  #define ATOMIC_LONG_INC_DEC_OP(op, mo)					\
  static inline long							\
  atomic_long_##op##_return##mo(atomic_long_t *l)				\
  {									\
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;		\
  									\
  	return (long)ATOMIC_LONG_PFX(_##op##_return##mo)(v);		\
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
217
  }
63ab7bd0d   Davidlohr Bueso   locking/asm-gener...
218
219
220
221
222
223
224
225
226
227
  ATOMIC_LONG_INC_DEC_OP(inc,)
  ATOMIC_LONG_INC_DEC_OP(inc, _relaxed)
  ATOMIC_LONG_INC_DEC_OP(inc, _acquire)
  ATOMIC_LONG_INC_DEC_OP(inc, _release)
  ATOMIC_LONG_INC_DEC_OP(dec,)
  ATOMIC_LONG_INC_DEC_OP(dec, _relaxed)
  ATOMIC_LONG_INC_DEC_OP(dec, _acquire)
  ATOMIC_LONG_INC_DEC_OP(dec, _release)
  
  #undef ATOMIC_LONG_INC_DEC_OP
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
228

2856f5e31   Mathieu Desnoyers   atomic.h: atomic_...
229
230
  static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
  {
586b610e4   Will Deacon   locking, asm-gene...
231
  	ATOMIC_LONG_PFX(_t) *v = (ATOMIC_LONG_PFX(_t) *)l;
2856f5e31   Mathieu Desnoyers   atomic.h: atomic_...
232

586b610e4   Will Deacon   locking, asm-gene...
233
  	return (long)ATOMIC_LONG_PFX(_add_unless)(v, a, u);
2856f5e31   Mathieu Desnoyers   atomic.h: atomic_...
234
  }
bb2382c3e   Mathieu Desnoyers   atomic.h: complet...
235

586b610e4   Will Deacon   locking, asm-gene...
236
237
  #define atomic_long_inc_not_zero(l) \
  	ATOMIC_LONG_PFX(_inc_not_zero)((ATOMIC_LONG_PFX(_t) *)(l))
4b358e220   Adrian Bunk   [PATCH] cleanup i...
238

72099ed27   Arnd Bergmann   asm-generic: rena...
239
  #endif  /*  _ASM_GENERIC_ATOMIC_LONG_H  */