Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/asm-generic/atomic-long.h
10814 views
1
#ifndef _ASM_GENERIC_ATOMIC_LONG_H
2
#define _ASM_GENERIC_ATOMIC_LONG_H
3
/*
4
* Copyright (C) 2005 Silicon Graphics, Inc.
5
* Christoph Lameter
6
*
7
* Allows to provide arch independent atomic definitions without the need to
8
* edit all arch specific atomic.h files.
9
*/
10
11
#include <asm/types.h>
12
13
/*
14
* Suppport for atomic_long_t
15
*
16
* Casts for parameters are avoided for existing atomic functions in order to
17
* avoid issues with cast-as-lval under gcc 4.x and other limitations that the
18
* macros of a platform may have.
19
*/
20
21
#if BITS_PER_LONG == 64
22
23
typedef atomic64_t atomic_long_t;
24
25
#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i)
26
27
static inline long atomic_long_read(atomic_long_t *l)
28
{
29
atomic64_t *v = (atomic64_t *)l;
30
31
return (long)atomic64_read(v);
32
}
33
34
static inline void atomic_long_set(atomic_long_t *l, long i)
35
{
36
atomic64_t *v = (atomic64_t *)l;
37
38
atomic64_set(v, i);
39
}
40
41
static inline void atomic_long_inc(atomic_long_t *l)
42
{
43
atomic64_t *v = (atomic64_t *)l;
44
45
atomic64_inc(v);
46
}
47
48
static inline void atomic_long_dec(atomic_long_t *l)
49
{
50
atomic64_t *v = (atomic64_t *)l;
51
52
atomic64_dec(v);
53
}
54
55
static inline void atomic_long_add(long i, atomic_long_t *l)
56
{
57
atomic64_t *v = (atomic64_t *)l;
58
59
atomic64_add(i, v);
60
}
61
62
static inline void atomic_long_sub(long i, atomic_long_t *l)
63
{
64
atomic64_t *v = (atomic64_t *)l;
65
66
atomic64_sub(i, v);
67
}
68
69
static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
70
{
71
atomic64_t *v = (atomic64_t *)l;
72
73
return atomic64_sub_and_test(i, v);
74
}
75
76
static inline int atomic_long_dec_and_test(atomic_long_t *l)
77
{
78
atomic64_t *v = (atomic64_t *)l;
79
80
return atomic64_dec_and_test(v);
81
}
82
83
static inline int atomic_long_inc_and_test(atomic_long_t *l)
84
{
85
atomic64_t *v = (atomic64_t *)l;
86
87
return atomic64_inc_and_test(v);
88
}
89
90
static inline int atomic_long_add_negative(long i, atomic_long_t *l)
91
{
92
atomic64_t *v = (atomic64_t *)l;
93
94
return atomic64_add_negative(i, v);
95
}
96
97
static inline long atomic_long_add_return(long i, atomic_long_t *l)
98
{
99
atomic64_t *v = (atomic64_t *)l;
100
101
return (long)atomic64_add_return(i, v);
102
}
103
104
static inline long atomic_long_sub_return(long i, atomic_long_t *l)
105
{
106
atomic64_t *v = (atomic64_t *)l;
107
108
return (long)atomic64_sub_return(i, v);
109
}
110
111
static inline long atomic_long_inc_return(atomic_long_t *l)
112
{
113
atomic64_t *v = (atomic64_t *)l;
114
115
return (long)atomic64_inc_return(v);
116
}
117
118
static inline long atomic_long_dec_return(atomic_long_t *l)
119
{
120
atomic64_t *v = (atomic64_t *)l;
121
122
return (long)atomic64_dec_return(v);
123
}
124
125
static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
126
{
127
atomic64_t *v = (atomic64_t *)l;
128
129
return (long)atomic64_add_unless(v, a, u);
130
}
131
132
#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
133
134
#define atomic_long_cmpxchg(l, old, new) \
135
(atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
136
#define atomic_long_xchg(v, new) \
137
(atomic64_xchg((atomic64_t *)(v), (new)))
138
139
#else /* BITS_PER_LONG == 64 */
140
141
typedef atomic_t atomic_long_t;
142
143
#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i)
144
static inline long atomic_long_read(atomic_long_t *l)
145
{
146
atomic_t *v = (atomic_t *)l;
147
148
return (long)atomic_read(v);
149
}
150
151
static inline void atomic_long_set(atomic_long_t *l, long i)
152
{
153
atomic_t *v = (atomic_t *)l;
154
155
atomic_set(v, i);
156
}
157
158
static inline void atomic_long_inc(atomic_long_t *l)
159
{
160
atomic_t *v = (atomic_t *)l;
161
162
atomic_inc(v);
163
}
164
165
static inline void atomic_long_dec(atomic_long_t *l)
166
{
167
atomic_t *v = (atomic_t *)l;
168
169
atomic_dec(v);
170
}
171
172
static inline void atomic_long_add(long i, atomic_long_t *l)
173
{
174
atomic_t *v = (atomic_t *)l;
175
176
atomic_add(i, v);
177
}
178
179
static inline void atomic_long_sub(long i, atomic_long_t *l)
180
{
181
atomic_t *v = (atomic_t *)l;
182
183
atomic_sub(i, v);
184
}
185
186
static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
187
{
188
atomic_t *v = (atomic_t *)l;
189
190
return atomic_sub_and_test(i, v);
191
}
192
193
static inline int atomic_long_dec_and_test(atomic_long_t *l)
194
{
195
atomic_t *v = (atomic_t *)l;
196
197
return atomic_dec_and_test(v);
198
}
199
200
static inline int atomic_long_inc_and_test(atomic_long_t *l)
201
{
202
atomic_t *v = (atomic_t *)l;
203
204
return atomic_inc_and_test(v);
205
}
206
207
static inline int atomic_long_add_negative(long i, atomic_long_t *l)
208
{
209
atomic_t *v = (atomic_t *)l;
210
211
return atomic_add_negative(i, v);
212
}
213
214
static inline long atomic_long_add_return(long i, atomic_long_t *l)
215
{
216
atomic_t *v = (atomic_t *)l;
217
218
return (long)atomic_add_return(i, v);
219
}
220
221
static inline long atomic_long_sub_return(long i, atomic_long_t *l)
222
{
223
atomic_t *v = (atomic_t *)l;
224
225
return (long)atomic_sub_return(i, v);
226
}
227
228
static inline long atomic_long_inc_return(atomic_long_t *l)
229
{
230
atomic_t *v = (atomic_t *)l;
231
232
return (long)atomic_inc_return(v);
233
}
234
235
static inline long atomic_long_dec_return(atomic_long_t *l)
236
{
237
atomic_t *v = (atomic_t *)l;
238
239
return (long)atomic_dec_return(v);
240
}
241
242
static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
243
{
244
atomic_t *v = (atomic_t *)l;
245
246
return (long)atomic_add_unless(v, a, u);
247
}
248
249
#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
250
251
#define atomic_long_cmpxchg(l, old, new) \
252
(atomic_cmpxchg((atomic_t *)(l), (old), (new)))
253
#define atomic_long_xchg(v, new) \
254
(atomic_xchg((atomic_t *)(v), (new)))
255
256
#endif /* BITS_PER_LONG == 64 */
257
258
#endif /* _ASM_GENERIC_ATOMIC_LONG_H */
259
260