Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2
3// Generated by scripts/atomic/gen-atomic-fallback.sh
4// DO NOT MODIFY THIS FILE DIRECTLY
5
6#ifndef _LINUX_ATOMIC_FALLBACK_H
7#define _LINUX_ATOMIC_FALLBACK_H
8
9#include <linux/compiler.h>
10
11#if defined(arch_xchg)
12#define raw_xchg arch_xchg
13#elif defined(arch_xchg_relaxed)
14#define raw_xchg(...) \
15 __atomic_op_fence(arch_xchg, __VA_ARGS__)
16#else
17extern void raw_xchg_not_implemented(void);
18#define raw_xchg(...) raw_xchg_not_implemented()
19#endif
20
21#if defined(arch_xchg_acquire)
22#define raw_xchg_acquire arch_xchg_acquire
23#elif defined(arch_xchg_relaxed)
24#define raw_xchg_acquire(...) \
25 __atomic_op_acquire(arch_xchg, __VA_ARGS__)
26#elif defined(arch_xchg)
27#define raw_xchg_acquire arch_xchg
28#else
29extern void raw_xchg_acquire_not_implemented(void);
30#define raw_xchg_acquire(...) raw_xchg_acquire_not_implemented()
31#endif
32
33#if defined(arch_xchg_release)
34#define raw_xchg_release arch_xchg_release
35#elif defined(arch_xchg_relaxed)
36#define raw_xchg_release(...) \
37 __atomic_op_release(arch_xchg, __VA_ARGS__)
38#elif defined(arch_xchg)
39#define raw_xchg_release arch_xchg
40#else
41extern void raw_xchg_release_not_implemented(void);
42#define raw_xchg_release(...) raw_xchg_release_not_implemented()
43#endif
44
45#if defined(arch_xchg_relaxed)
46#define raw_xchg_relaxed arch_xchg_relaxed
47#elif defined(arch_xchg)
48#define raw_xchg_relaxed arch_xchg
49#else
50extern void raw_xchg_relaxed_not_implemented(void);
51#define raw_xchg_relaxed(...) raw_xchg_relaxed_not_implemented()
52#endif
53
54#if defined(arch_cmpxchg)
55#define raw_cmpxchg arch_cmpxchg
56#elif defined(arch_cmpxchg_relaxed)
57#define raw_cmpxchg(...) \
58 __atomic_op_fence(arch_cmpxchg, __VA_ARGS__)
59#else
60extern void raw_cmpxchg_not_implemented(void);
61#define raw_cmpxchg(...) raw_cmpxchg_not_implemented()
62#endif
63
64#if defined(arch_cmpxchg_acquire)
65#define raw_cmpxchg_acquire arch_cmpxchg_acquire
66#elif defined(arch_cmpxchg_relaxed)
67#define raw_cmpxchg_acquire(...) \
68 __atomic_op_acquire(arch_cmpxchg, __VA_ARGS__)
69#elif defined(arch_cmpxchg)
70#define raw_cmpxchg_acquire arch_cmpxchg
71#else
72extern void raw_cmpxchg_acquire_not_implemented(void);
73#define raw_cmpxchg_acquire(...) raw_cmpxchg_acquire_not_implemented()
74#endif
75
76#if defined(arch_cmpxchg_release)
77#define raw_cmpxchg_release arch_cmpxchg_release
78#elif defined(arch_cmpxchg_relaxed)
79#define raw_cmpxchg_release(...) \
80 __atomic_op_release(arch_cmpxchg, __VA_ARGS__)
81#elif defined(arch_cmpxchg)
82#define raw_cmpxchg_release arch_cmpxchg
83#else
84extern void raw_cmpxchg_release_not_implemented(void);
85#define raw_cmpxchg_release(...) raw_cmpxchg_release_not_implemented()
86#endif
87
88#if defined(arch_cmpxchg_relaxed)
89#define raw_cmpxchg_relaxed arch_cmpxchg_relaxed
90#elif defined(arch_cmpxchg)
91#define raw_cmpxchg_relaxed arch_cmpxchg
92#else
93extern void raw_cmpxchg_relaxed_not_implemented(void);
94#define raw_cmpxchg_relaxed(...) raw_cmpxchg_relaxed_not_implemented()
95#endif
96
97#if defined(arch_cmpxchg64)
98#define raw_cmpxchg64 arch_cmpxchg64
99#elif defined(arch_cmpxchg64_relaxed)
100#define raw_cmpxchg64(...) \
101 __atomic_op_fence(arch_cmpxchg64, __VA_ARGS__)
102#else
103extern void raw_cmpxchg64_not_implemented(void);
104#define raw_cmpxchg64(...) raw_cmpxchg64_not_implemented()
105#endif
106
107#if defined(arch_cmpxchg64_acquire)
108#define raw_cmpxchg64_acquire arch_cmpxchg64_acquire
109#elif defined(arch_cmpxchg64_relaxed)
110#define raw_cmpxchg64_acquire(...) \
111 __atomic_op_acquire(arch_cmpxchg64, __VA_ARGS__)
112#elif defined(arch_cmpxchg64)
113#define raw_cmpxchg64_acquire arch_cmpxchg64
114#else
115extern void raw_cmpxchg64_acquire_not_implemented(void);
116#define raw_cmpxchg64_acquire(...) raw_cmpxchg64_acquire_not_implemented()
117#endif
118
119#if defined(arch_cmpxchg64_release)
120#define raw_cmpxchg64_release arch_cmpxchg64_release
121#elif defined(arch_cmpxchg64_relaxed)
122#define raw_cmpxchg64_release(...) \
123 __atomic_op_release(arch_cmpxchg64, __VA_ARGS__)
124#elif defined(arch_cmpxchg64)
125#define raw_cmpxchg64_release arch_cmpxchg64
126#else
127extern void raw_cmpxchg64_release_not_implemented(void);
128#define raw_cmpxchg64_release(...) raw_cmpxchg64_release_not_implemented()
129#endif
130
131#if defined(arch_cmpxchg64_relaxed)
132#define raw_cmpxchg64_relaxed arch_cmpxchg64_relaxed
133#elif defined(arch_cmpxchg64)
134#define raw_cmpxchg64_relaxed arch_cmpxchg64
135#else
136extern void raw_cmpxchg64_relaxed_not_implemented(void);
137#define raw_cmpxchg64_relaxed(...) raw_cmpxchg64_relaxed_not_implemented()
138#endif
139
140#if defined(arch_cmpxchg128)
141#define raw_cmpxchg128 arch_cmpxchg128
142#elif defined(arch_cmpxchg128_relaxed)
143#define raw_cmpxchg128(...) \
144 __atomic_op_fence(arch_cmpxchg128, __VA_ARGS__)
145#else
146extern void raw_cmpxchg128_not_implemented(void);
147#define raw_cmpxchg128(...) raw_cmpxchg128_not_implemented()
148#endif
149
150#if defined(arch_cmpxchg128_acquire)
151#define raw_cmpxchg128_acquire arch_cmpxchg128_acquire
152#elif defined(arch_cmpxchg128_relaxed)
153#define raw_cmpxchg128_acquire(...) \
154 __atomic_op_acquire(arch_cmpxchg128, __VA_ARGS__)
155#elif defined(arch_cmpxchg128)
156#define raw_cmpxchg128_acquire arch_cmpxchg128
157#else
158extern void raw_cmpxchg128_acquire_not_implemented(void);
159#define raw_cmpxchg128_acquire(...) raw_cmpxchg128_acquire_not_implemented()
160#endif
161
162#if defined(arch_cmpxchg128_release)
163#define raw_cmpxchg128_release arch_cmpxchg128_release
164#elif defined(arch_cmpxchg128_relaxed)
165#define raw_cmpxchg128_release(...) \
166 __atomic_op_release(arch_cmpxchg128, __VA_ARGS__)
167#elif defined(arch_cmpxchg128)
168#define raw_cmpxchg128_release arch_cmpxchg128
169#else
170extern void raw_cmpxchg128_release_not_implemented(void);
171#define raw_cmpxchg128_release(...) raw_cmpxchg128_release_not_implemented()
172#endif
173
174#if defined(arch_cmpxchg128_relaxed)
175#define raw_cmpxchg128_relaxed arch_cmpxchg128_relaxed
176#elif defined(arch_cmpxchg128)
177#define raw_cmpxchg128_relaxed arch_cmpxchg128
178#else
179extern void raw_cmpxchg128_relaxed_not_implemented(void);
180#define raw_cmpxchg128_relaxed(...) raw_cmpxchg128_relaxed_not_implemented()
181#endif
182
183#if defined(arch_try_cmpxchg)
184#define raw_try_cmpxchg arch_try_cmpxchg
185#elif defined(arch_try_cmpxchg_relaxed)
186#define raw_try_cmpxchg(...) \
187 __atomic_op_fence(arch_try_cmpxchg, __VA_ARGS__)
188#else
189#define raw_try_cmpxchg(_ptr, _oldp, _new) \
190({ \
191 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
192 ___r = raw_cmpxchg((_ptr), ___o, (_new)); \
193 if (unlikely(___r != ___o)) \
194 *___op = ___r; \
195 likely(___r == ___o); \
196})
197#endif
198
199#if defined(arch_try_cmpxchg_acquire)
200#define raw_try_cmpxchg_acquire arch_try_cmpxchg_acquire
201#elif defined(arch_try_cmpxchg_relaxed)
202#define raw_try_cmpxchg_acquire(...) \
203 __atomic_op_acquire(arch_try_cmpxchg, __VA_ARGS__)
204#elif defined(arch_try_cmpxchg)
205#define raw_try_cmpxchg_acquire arch_try_cmpxchg
206#else
207#define raw_try_cmpxchg_acquire(_ptr, _oldp, _new) \
208({ \
209 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
210 ___r = raw_cmpxchg_acquire((_ptr), ___o, (_new)); \
211 if (unlikely(___r != ___o)) \
212 *___op = ___r; \
213 likely(___r == ___o); \
214})
215#endif
216
217#if defined(arch_try_cmpxchg_release)
218#define raw_try_cmpxchg_release arch_try_cmpxchg_release
219#elif defined(arch_try_cmpxchg_relaxed)
220#define raw_try_cmpxchg_release(...) \
221 __atomic_op_release(arch_try_cmpxchg, __VA_ARGS__)
222#elif defined(arch_try_cmpxchg)
223#define raw_try_cmpxchg_release arch_try_cmpxchg
224#else
225#define raw_try_cmpxchg_release(_ptr, _oldp, _new) \
226({ \
227 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
228 ___r = raw_cmpxchg_release((_ptr), ___o, (_new)); \
229 if (unlikely(___r != ___o)) \
230 *___op = ___r; \
231 likely(___r == ___o); \
232})
233#endif
234
235#if defined(arch_try_cmpxchg_relaxed)
236#define raw_try_cmpxchg_relaxed arch_try_cmpxchg_relaxed
237#elif defined(arch_try_cmpxchg)
238#define raw_try_cmpxchg_relaxed arch_try_cmpxchg
239#else
240#define raw_try_cmpxchg_relaxed(_ptr, _oldp, _new) \
241({ \
242 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
243 ___r = raw_cmpxchg_relaxed((_ptr), ___o, (_new)); \
244 if (unlikely(___r != ___o)) \
245 *___op = ___r; \
246 likely(___r == ___o); \
247})
248#endif
249
250#if defined(arch_try_cmpxchg64)
251#define raw_try_cmpxchg64 arch_try_cmpxchg64
252#elif defined(arch_try_cmpxchg64_relaxed)
253#define raw_try_cmpxchg64(...) \
254 __atomic_op_fence(arch_try_cmpxchg64, __VA_ARGS__)
255#else
256#define raw_try_cmpxchg64(_ptr, _oldp, _new) \
257({ \
258 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
259 ___r = raw_cmpxchg64((_ptr), ___o, (_new)); \
260 if (unlikely(___r != ___o)) \
261 *___op = ___r; \
262 likely(___r == ___o); \
263})
264#endif
265
266#if defined(arch_try_cmpxchg64_acquire)
267#define raw_try_cmpxchg64_acquire arch_try_cmpxchg64_acquire
268#elif defined(arch_try_cmpxchg64_relaxed)
269#define raw_try_cmpxchg64_acquire(...) \
270 __atomic_op_acquire(arch_try_cmpxchg64, __VA_ARGS__)
271#elif defined(arch_try_cmpxchg64)
272#define raw_try_cmpxchg64_acquire arch_try_cmpxchg64
273#else
274#define raw_try_cmpxchg64_acquire(_ptr, _oldp, _new) \
275({ \
276 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
277 ___r = raw_cmpxchg64_acquire((_ptr), ___o, (_new)); \
278 if (unlikely(___r != ___o)) \
279 *___op = ___r; \
280 likely(___r == ___o); \
281})
282#endif
283
284#if defined(arch_try_cmpxchg64_release)
285#define raw_try_cmpxchg64_release arch_try_cmpxchg64_release
286#elif defined(arch_try_cmpxchg64_relaxed)
287#define raw_try_cmpxchg64_release(...) \
288 __atomic_op_release(arch_try_cmpxchg64, __VA_ARGS__)
289#elif defined(arch_try_cmpxchg64)
290#define raw_try_cmpxchg64_release arch_try_cmpxchg64
291#else
292#define raw_try_cmpxchg64_release(_ptr, _oldp, _new) \
293({ \
294 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
295 ___r = raw_cmpxchg64_release((_ptr), ___o, (_new)); \
296 if (unlikely(___r != ___o)) \
297 *___op = ___r; \
298 likely(___r == ___o); \
299})
300#endif
301
302#if defined(arch_try_cmpxchg64_relaxed)
303#define raw_try_cmpxchg64_relaxed arch_try_cmpxchg64_relaxed
304#elif defined(arch_try_cmpxchg64)
305#define raw_try_cmpxchg64_relaxed arch_try_cmpxchg64
306#else
307#define raw_try_cmpxchg64_relaxed(_ptr, _oldp, _new) \
308({ \
309 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
310 ___r = raw_cmpxchg64_relaxed((_ptr), ___o, (_new)); \
311 if (unlikely(___r != ___o)) \
312 *___op = ___r; \
313 likely(___r == ___o); \
314})
315#endif
316
317#if defined(arch_try_cmpxchg128)
318#define raw_try_cmpxchg128 arch_try_cmpxchg128
319#elif defined(arch_try_cmpxchg128_relaxed)
320#define raw_try_cmpxchg128(...) \
321 __atomic_op_fence(arch_try_cmpxchg128, __VA_ARGS__)
322#else
323#define raw_try_cmpxchg128(_ptr, _oldp, _new) \
324({ \
325 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
326 ___r = raw_cmpxchg128((_ptr), ___o, (_new)); \
327 if (unlikely(___r != ___o)) \
328 *___op = ___r; \
329 likely(___r == ___o); \
330})
331#endif
332
333#if defined(arch_try_cmpxchg128_acquire)
334#define raw_try_cmpxchg128_acquire arch_try_cmpxchg128_acquire
335#elif defined(arch_try_cmpxchg128_relaxed)
336#define raw_try_cmpxchg128_acquire(...) \
337 __atomic_op_acquire(arch_try_cmpxchg128, __VA_ARGS__)
338#elif defined(arch_try_cmpxchg128)
339#define raw_try_cmpxchg128_acquire arch_try_cmpxchg128
340#else
341#define raw_try_cmpxchg128_acquire(_ptr, _oldp, _new) \
342({ \
343 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
344 ___r = raw_cmpxchg128_acquire((_ptr), ___o, (_new)); \
345 if (unlikely(___r != ___o)) \
346 *___op = ___r; \
347 likely(___r == ___o); \
348})
349#endif
350
351#if defined(arch_try_cmpxchg128_release)
352#define raw_try_cmpxchg128_release arch_try_cmpxchg128_release
353#elif defined(arch_try_cmpxchg128_relaxed)
354#define raw_try_cmpxchg128_release(...) \
355 __atomic_op_release(arch_try_cmpxchg128, __VA_ARGS__)
356#elif defined(arch_try_cmpxchg128)
357#define raw_try_cmpxchg128_release arch_try_cmpxchg128
358#else
359#define raw_try_cmpxchg128_release(_ptr, _oldp, _new) \
360({ \
361 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
362 ___r = raw_cmpxchg128_release((_ptr), ___o, (_new)); \
363 if (unlikely(___r != ___o)) \
364 *___op = ___r; \
365 likely(___r == ___o); \
366})
367#endif
368
369#if defined(arch_try_cmpxchg128_relaxed)
370#define raw_try_cmpxchg128_relaxed arch_try_cmpxchg128_relaxed
371#elif defined(arch_try_cmpxchg128)
372#define raw_try_cmpxchg128_relaxed arch_try_cmpxchg128
373#else
374#define raw_try_cmpxchg128_relaxed(_ptr, _oldp, _new) \
375({ \
376 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
377 ___r = raw_cmpxchg128_relaxed((_ptr), ___o, (_new)); \
378 if (unlikely(___r != ___o)) \
379 *___op = ___r; \
380 likely(___r == ___o); \
381})
382#endif
383
384#define raw_cmpxchg_local arch_cmpxchg_local
385
386#ifdef arch_try_cmpxchg_local
387#define raw_try_cmpxchg_local arch_try_cmpxchg_local
388#else
389#define raw_try_cmpxchg_local(_ptr, _oldp, _new) \
390({ \
391 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
392 ___r = raw_cmpxchg_local((_ptr), ___o, (_new)); \
393 if (unlikely(___r != ___o)) \
394 *___op = ___r; \
395 likely(___r == ___o); \
396})
397#endif
398
399#define raw_cmpxchg64_local arch_cmpxchg64_local
400
401#ifdef arch_try_cmpxchg64_local
402#define raw_try_cmpxchg64_local arch_try_cmpxchg64_local
403#else
404#define raw_try_cmpxchg64_local(_ptr, _oldp, _new) \
405({ \
406 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
407 ___r = raw_cmpxchg64_local((_ptr), ___o, (_new)); \
408 if (unlikely(___r != ___o)) \
409 *___op = ___r; \
410 likely(___r == ___o); \
411})
412#endif
413
414#define raw_cmpxchg128_local arch_cmpxchg128_local
415
416#ifdef arch_try_cmpxchg128_local
417#define raw_try_cmpxchg128_local arch_try_cmpxchg128_local
418#else
419#define raw_try_cmpxchg128_local(_ptr, _oldp, _new) \
420({ \
421 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
422 ___r = raw_cmpxchg128_local((_ptr), ___o, (_new)); \
423 if (unlikely(___r != ___o)) \
424 *___op = ___r; \
425 likely(___r == ___o); \
426})
427#endif
428
429#define raw_sync_cmpxchg arch_sync_cmpxchg
430
431/**
432 * raw_atomic_read() - atomic load with relaxed ordering
433 * @v: pointer to atomic_t
434 *
435 * Atomically loads the value of @v with relaxed ordering.
436 *
437 * Safe to use in noinstr code; prefer atomic_read() elsewhere.
438 *
439 * Return: The value loaded from @v.
440 */
441static __always_inline int
442raw_atomic_read(const atomic_t *v)
443{
444 return arch_atomic_read(v);
445}
446
447/**
448 * raw_atomic_read_acquire() - atomic load with acquire ordering
449 * @v: pointer to atomic_t
450 *
451 * Atomically loads the value of @v with acquire ordering.
452 *
453 * Safe to use in noinstr code; prefer atomic_read_acquire() elsewhere.
454 *
455 * Return: The value loaded from @v.
456 */
457static __always_inline int
458raw_atomic_read_acquire(const atomic_t *v)
459{
460#if defined(arch_atomic_read_acquire)
461 return arch_atomic_read_acquire(v);
462#elif defined(arch_atomic_read)
463 return arch_atomic_read(v);
464#else
465 int ret;
466
467 if (__native_word(atomic_t)) {
468 ret = smp_load_acquire(&(v)->counter);
469 } else {
470 ret = raw_atomic_read(v);
471 __atomic_acquire_fence();
472 }
473
474 return ret;
475#endif
476}
477
478/**
479 * raw_atomic_set() - atomic set with relaxed ordering
480 * @v: pointer to atomic_t
481 * @i: int value to assign
482 *
483 * Atomically sets @v to @i with relaxed ordering.
484 *
485 * Safe to use in noinstr code; prefer atomic_set() elsewhere.
486 *
487 * Return: Nothing.
488 */
489static __always_inline void
490raw_atomic_set(atomic_t *v, int i)
491{
492 arch_atomic_set(v, i);
493}
494
495/**
496 * raw_atomic_set_release() - atomic set with release ordering
497 * @v: pointer to atomic_t
498 * @i: int value to assign
499 *
500 * Atomically sets @v to @i with release ordering.
501 *
502 * Safe to use in noinstr code; prefer atomic_set_release() elsewhere.
503 *
504 * Return: Nothing.
505 */
506static __always_inline void
507raw_atomic_set_release(atomic_t *v, int i)
508{
509#if defined(arch_atomic_set_release)
510 arch_atomic_set_release(v, i);
511#elif defined(arch_atomic_set)
512 arch_atomic_set(v, i);
513#else
514 if (__native_word(atomic_t)) {
515 smp_store_release(&(v)->counter, i);
516 } else {
517 __atomic_release_fence();
518 raw_atomic_set(v, i);
519 }
520#endif
521}
522
523/**
524 * raw_atomic_add() - atomic add with relaxed ordering
525 * @i: int value to add
526 * @v: pointer to atomic_t
527 *
528 * Atomically updates @v to (@v + @i) with relaxed ordering.
529 *
530 * Safe to use in noinstr code; prefer atomic_add() elsewhere.
531 *
532 * Return: Nothing.
533 */
534static __always_inline void
535raw_atomic_add(int i, atomic_t *v)
536{
537 arch_atomic_add(i, v);
538}
539
540/**
541 * raw_atomic_add_return() - atomic add with full ordering
542 * @i: int value to add
543 * @v: pointer to atomic_t
544 *
545 * Atomically updates @v to (@v + @i) with full ordering.
546 *
547 * Safe to use in noinstr code; prefer atomic_add_return() elsewhere.
548 *
549 * Return: The updated value of @v.
550 */
551static __always_inline int
552raw_atomic_add_return(int i, atomic_t *v)
553{
554#if defined(arch_atomic_add_return)
555 return arch_atomic_add_return(i, v);
556#elif defined(arch_atomic_add_return_relaxed)
557 int ret;
558 __atomic_pre_full_fence();
559 ret = arch_atomic_add_return_relaxed(i, v);
560 __atomic_post_full_fence();
561 return ret;
562#else
563#error "Unable to define raw_atomic_add_return"
564#endif
565}
566
567/**
568 * raw_atomic_add_return_acquire() - atomic add with acquire ordering
569 * @i: int value to add
570 * @v: pointer to atomic_t
571 *
572 * Atomically updates @v to (@v + @i) with acquire ordering.
573 *
574 * Safe to use in noinstr code; prefer atomic_add_return_acquire() elsewhere.
575 *
576 * Return: The updated value of @v.
577 */
578static __always_inline int
579raw_atomic_add_return_acquire(int i, atomic_t *v)
580{
581#if defined(arch_atomic_add_return_acquire)
582 return arch_atomic_add_return_acquire(i, v);
583#elif defined(arch_atomic_add_return_relaxed)
584 int ret = arch_atomic_add_return_relaxed(i, v);
585 __atomic_acquire_fence();
586 return ret;
587#elif defined(arch_atomic_add_return)
588 return arch_atomic_add_return(i, v);
589#else
590#error "Unable to define raw_atomic_add_return_acquire"
591#endif
592}
593
594/**
595 * raw_atomic_add_return_release() - atomic add with release ordering
596 * @i: int value to add
597 * @v: pointer to atomic_t
598 *
599 * Atomically updates @v to (@v + @i) with release ordering.
600 *
601 * Safe to use in noinstr code; prefer atomic_add_return_release() elsewhere.
602 *
603 * Return: The updated value of @v.
604 */
605static __always_inline int
606raw_atomic_add_return_release(int i, atomic_t *v)
607{
608#if defined(arch_atomic_add_return_release)
609 return arch_atomic_add_return_release(i, v);
610#elif defined(arch_atomic_add_return_relaxed)
611 __atomic_release_fence();
612 return arch_atomic_add_return_relaxed(i, v);
613#elif defined(arch_atomic_add_return)
614 return arch_atomic_add_return(i, v);
615#else
616#error "Unable to define raw_atomic_add_return_release"
617#endif
618}
619
620/**
621 * raw_atomic_add_return_relaxed() - atomic add with relaxed ordering
622 * @i: int value to add
623 * @v: pointer to atomic_t
624 *
625 * Atomically updates @v to (@v + @i) with relaxed ordering.
626 *
627 * Safe to use in noinstr code; prefer atomic_add_return_relaxed() elsewhere.
628 *
629 * Return: The updated value of @v.
630 */
631static __always_inline int
632raw_atomic_add_return_relaxed(int i, atomic_t *v)
633{
634#if defined(arch_atomic_add_return_relaxed)
635 return arch_atomic_add_return_relaxed(i, v);
636#elif defined(arch_atomic_add_return)
637 return arch_atomic_add_return(i, v);
638#else
639#error "Unable to define raw_atomic_add_return_relaxed"
640#endif
641}
642
643/**
644 * raw_atomic_fetch_add() - atomic add with full ordering
645 * @i: int value to add
646 * @v: pointer to atomic_t
647 *
648 * Atomically updates @v to (@v + @i) with full ordering.
649 *
650 * Safe to use in noinstr code; prefer atomic_fetch_add() elsewhere.
651 *
652 * Return: The original value of @v.
653 */
654static __always_inline int
655raw_atomic_fetch_add(int i, atomic_t *v)
656{
657#if defined(arch_atomic_fetch_add)
658 return arch_atomic_fetch_add(i, v);
659#elif defined(arch_atomic_fetch_add_relaxed)
660 int ret;
661 __atomic_pre_full_fence();
662 ret = arch_atomic_fetch_add_relaxed(i, v);
663 __atomic_post_full_fence();
664 return ret;
665#else
666#error "Unable to define raw_atomic_fetch_add"
667#endif
668}
669
670/**
671 * raw_atomic_fetch_add_acquire() - atomic add with acquire ordering
672 * @i: int value to add
673 * @v: pointer to atomic_t
674 *
675 * Atomically updates @v to (@v + @i) with acquire ordering.
676 *
677 * Safe to use in noinstr code; prefer atomic_fetch_add_acquire() elsewhere.
678 *
679 * Return: The original value of @v.
680 */
681static __always_inline int
682raw_atomic_fetch_add_acquire(int i, atomic_t *v)
683{
684#if defined(arch_atomic_fetch_add_acquire)
685 return arch_atomic_fetch_add_acquire(i, v);
686#elif defined(arch_atomic_fetch_add_relaxed)
687 int ret = arch_atomic_fetch_add_relaxed(i, v);
688 __atomic_acquire_fence();
689 return ret;
690#elif defined(arch_atomic_fetch_add)
691 return arch_atomic_fetch_add(i, v);
692#else
693#error "Unable to define raw_atomic_fetch_add_acquire"
694#endif
695}
696
697/**
698 * raw_atomic_fetch_add_release() - atomic add with release ordering
699 * @i: int value to add
700 * @v: pointer to atomic_t
701 *
702 * Atomically updates @v to (@v + @i) with release ordering.
703 *
704 * Safe to use in noinstr code; prefer atomic_fetch_add_release() elsewhere.
705 *
706 * Return: The original value of @v.
707 */
708static __always_inline int
709raw_atomic_fetch_add_release(int i, atomic_t *v)
710{
711#if defined(arch_atomic_fetch_add_release)
712 return arch_atomic_fetch_add_release(i, v);
713#elif defined(arch_atomic_fetch_add_relaxed)
714 __atomic_release_fence();
715 return arch_atomic_fetch_add_relaxed(i, v);
716#elif defined(arch_atomic_fetch_add)
717 return arch_atomic_fetch_add(i, v);
718#else
719#error "Unable to define raw_atomic_fetch_add_release"
720#endif
721}
722
723/**
724 * raw_atomic_fetch_add_relaxed() - atomic add with relaxed ordering
725 * @i: int value to add
726 * @v: pointer to atomic_t
727 *
728 * Atomically updates @v to (@v + @i) with relaxed ordering.
729 *
730 * Safe to use in noinstr code; prefer atomic_fetch_add_relaxed() elsewhere.
731 *
732 * Return: The original value of @v.
733 */
734static __always_inline int
735raw_atomic_fetch_add_relaxed(int i, atomic_t *v)
736{
737#if defined(arch_atomic_fetch_add_relaxed)
738 return arch_atomic_fetch_add_relaxed(i, v);
739#elif defined(arch_atomic_fetch_add)
740 return arch_atomic_fetch_add(i, v);
741#else
742#error "Unable to define raw_atomic_fetch_add_relaxed"
743#endif
744}
745
746/**
747 * raw_atomic_sub() - atomic subtract with relaxed ordering
748 * @i: int value to subtract
749 * @v: pointer to atomic_t
750 *
751 * Atomically updates @v to (@v - @i) with relaxed ordering.
752 *
753 * Safe to use in noinstr code; prefer atomic_sub() elsewhere.
754 *
755 * Return: Nothing.
756 */
757static __always_inline void
758raw_atomic_sub(int i, atomic_t *v)
759{
760 arch_atomic_sub(i, v);
761}
762
763/**
764 * raw_atomic_sub_return() - atomic subtract with full ordering
765 * @i: int value to subtract
766 * @v: pointer to atomic_t
767 *
768 * Atomically updates @v to (@v - @i) with full ordering.
769 *
770 * Safe to use in noinstr code; prefer atomic_sub_return() elsewhere.
771 *
772 * Return: The updated value of @v.
773 */
774static __always_inline int
775raw_atomic_sub_return(int i, atomic_t *v)
776{
777#if defined(arch_atomic_sub_return)
778 return arch_atomic_sub_return(i, v);
779#elif defined(arch_atomic_sub_return_relaxed)
780 int ret;
781 __atomic_pre_full_fence();
782 ret = arch_atomic_sub_return_relaxed(i, v);
783 __atomic_post_full_fence();
784 return ret;
785#else
786#error "Unable to define raw_atomic_sub_return"
787#endif
788}
789
790/**
791 * raw_atomic_sub_return_acquire() - atomic subtract with acquire ordering
792 * @i: int value to subtract
793 * @v: pointer to atomic_t
794 *
795 * Atomically updates @v to (@v - @i) with acquire ordering.
796 *
797 * Safe to use in noinstr code; prefer atomic_sub_return_acquire() elsewhere.
798 *
799 * Return: The updated value of @v.
800 */
801static __always_inline int
802raw_atomic_sub_return_acquire(int i, atomic_t *v)
803{
804#if defined(arch_atomic_sub_return_acquire)
805 return arch_atomic_sub_return_acquire(i, v);
806#elif defined(arch_atomic_sub_return_relaxed)
807 int ret = arch_atomic_sub_return_relaxed(i, v);
808 __atomic_acquire_fence();
809 return ret;
810#elif defined(arch_atomic_sub_return)
811 return arch_atomic_sub_return(i, v);
812#else
813#error "Unable to define raw_atomic_sub_return_acquire"
814#endif
815}
816
817/**
818 * raw_atomic_sub_return_release() - atomic subtract with release ordering
819 * @i: int value to subtract
820 * @v: pointer to atomic_t
821 *
822 * Atomically updates @v to (@v - @i) with release ordering.
823 *
824 * Safe to use in noinstr code; prefer atomic_sub_return_release() elsewhere.
825 *
826 * Return: The updated value of @v.
827 */
828static __always_inline int
829raw_atomic_sub_return_release(int i, atomic_t *v)
830{
831#if defined(arch_atomic_sub_return_release)
832 return arch_atomic_sub_return_release(i, v);
833#elif defined(arch_atomic_sub_return_relaxed)
834 __atomic_release_fence();
835 return arch_atomic_sub_return_relaxed(i, v);
836#elif defined(arch_atomic_sub_return)
837 return arch_atomic_sub_return(i, v);
838#else
839#error "Unable to define raw_atomic_sub_return_release"
840#endif
841}
842
843/**
844 * raw_atomic_sub_return_relaxed() - atomic subtract with relaxed ordering
845 * @i: int value to subtract
846 * @v: pointer to atomic_t
847 *
848 * Atomically updates @v to (@v - @i) with relaxed ordering.
849 *
850 * Safe to use in noinstr code; prefer atomic_sub_return_relaxed() elsewhere.
851 *
852 * Return: The updated value of @v.
853 */
854static __always_inline int
855raw_atomic_sub_return_relaxed(int i, atomic_t *v)
856{
857#if defined(arch_atomic_sub_return_relaxed)
858 return arch_atomic_sub_return_relaxed(i, v);
859#elif defined(arch_atomic_sub_return)
860 return arch_atomic_sub_return(i, v);
861#else
862#error "Unable to define raw_atomic_sub_return_relaxed"
863#endif
864}
865
866/**
867 * raw_atomic_fetch_sub() - atomic subtract with full ordering
868 * @i: int value to subtract
869 * @v: pointer to atomic_t
870 *
871 * Atomically updates @v to (@v - @i) with full ordering.
872 *
873 * Safe to use in noinstr code; prefer atomic_fetch_sub() elsewhere.
874 *
875 * Return: The original value of @v.
876 */
877static __always_inline int
878raw_atomic_fetch_sub(int i, atomic_t *v)
879{
880#if defined(arch_atomic_fetch_sub)
881 return arch_atomic_fetch_sub(i, v);
882#elif defined(arch_atomic_fetch_sub_relaxed)
883 int ret;
884 __atomic_pre_full_fence();
885 ret = arch_atomic_fetch_sub_relaxed(i, v);
886 __atomic_post_full_fence();
887 return ret;
888#else
889#error "Unable to define raw_atomic_fetch_sub"
890#endif
891}
892
893/**
894 * raw_atomic_fetch_sub_acquire() - atomic subtract with acquire ordering
895 * @i: int value to subtract
896 * @v: pointer to atomic_t
897 *
898 * Atomically updates @v to (@v - @i) with acquire ordering.
899 *
900 * Safe to use in noinstr code; prefer atomic_fetch_sub_acquire() elsewhere.
901 *
902 * Return: The original value of @v.
903 */
904static __always_inline int
905raw_atomic_fetch_sub_acquire(int i, atomic_t *v)
906{
907#if defined(arch_atomic_fetch_sub_acquire)
908 return arch_atomic_fetch_sub_acquire(i, v);
909#elif defined(arch_atomic_fetch_sub_relaxed)
910 int ret = arch_atomic_fetch_sub_relaxed(i, v);
911 __atomic_acquire_fence();
912 return ret;
913#elif defined(arch_atomic_fetch_sub)
914 return arch_atomic_fetch_sub(i, v);
915#else
916#error "Unable to define raw_atomic_fetch_sub_acquire"
917#endif
918}
919
920/**
921 * raw_atomic_fetch_sub_release() - atomic subtract with release ordering
922 * @i: int value to subtract
923 * @v: pointer to atomic_t
924 *
925 * Atomically updates @v to (@v - @i) with release ordering.
926 *
927 * Safe to use in noinstr code; prefer atomic_fetch_sub_release() elsewhere.
928 *
929 * Return: The original value of @v.
930 */
931static __always_inline int
932raw_atomic_fetch_sub_release(int i, atomic_t *v)
933{
934#if defined(arch_atomic_fetch_sub_release)
935 return arch_atomic_fetch_sub_release(i, v);
936#elif defined(arch_atomic_fetch_sub_relaxed)
937 __atomic_release_fence();
938 return arch_atomic_fetch_sub_relaxed(i, v);
939#elif defined(arch_atomic_fetch_sub)
940 return arch_atomic_fetch_sub(i, v);
941#else
942#error "Unable to define raw_atomic_fetch_sub_release"
943#endif
944}
945
946/**
947 * raw_atomic_fetch_sub_relaxed() - atomic subtract with relaxed ordering
948 * @i: int value to subtract
949 * @v: pointer to atomic_t
950 *
951 * Atomically updates @v to (@v - @i) with relaxed ordering.
952 *
953 * Safe to use in noinstr code; prefer atomic_fetch_sub_relaxed() elsewhere.
954 *
955 * Return: The original value of @v.
956 */
957static __always_inline int
958raw_atomic_fetch_sub_relaxed(int i, atomic_t *v)
959{
960#if defined(arch_atomic_fetch_sub_relaxed)
961 return arch_atomic_fetch_sub_relaxed(i, v);
962#elif defined(arch_atomic_fetch_sub)
963 return arch_atomic_fetch_sub(i, v);
964#else
965#error "Unable to define raw_atomic_fetch_sub_relaxed"
966#endif
967}
968
969/**
970 * raw_atomic_inc() - atomic increment with relaxed ordering
971 * @v: pointer to atomic_t
972 *
973 * Atomically updates @v to (@v + 1) with relaxed ordering.
974 *
975 * Safe to use in noinstr code; prefer atomic_inc() elsewhere.
976 *
977 * Return: Nothing.
978 */
979static __always_inline void
980raw_atomic_inc(atomic_t *v)
981{
982#if defined(arch_atomic_inc)
983 arch_atomic_inc(v);
984#else
985 raw_atomic_add(1, v);
986#endif
987}
988
989/**
990 * raw_atomic_inc_return() - atomic increment with full ordering
991 * @v: pointer to atomic_t
992 *
993 * Atomically updates @v to (@v + 1) with full ordering.
994 *
995 * Safe to use in noinstr code; prefer atomic_inc_return() elsewhere.
996 *
997 * Return: The updated value of @v.
998 */
999static __always_inline int
1000raw_atomic_inc_return(atomic_t *v)
1001{
1002#if defined(arch_atomic_inc_return)
1003 return arch_atomic_inc_return(v);
1004#elif defined(arch_atomic_inc_return_relaxed)
1005 int ret;
1006 __atomic_pre_full_fence();
1007 ret = arch_atomic_inc_return_relaxed(v);
1008 __atomic_post_full_fence();
1009 return ret;
1010#else
1011 return raw_atomic_add_return(1, v);
1012#endif
1013}
1014
1015/**
1016 * raw_atomic_inc_return_acquire() - atomic increment with acquire ordering
1017 * @v: pointer to atomic_t
1018 *
1019 * Atomically updates @v to (@v + 1) with acquire ordering.
1020 *
1021 * Safe to use in noinstr code; prefer atomic_inc_return_acquire() elsewhere.
1022 *
1023 * Return: The updated value of @v.
1024 */
1025static __always_inline int
1026raw_atomic_inc_return_acquire(atomic_t *v)
1027{
1028#if defined(arch_atomic_inc_return_acquire)
1029 return arch_atomic_inc_return_acquire(v);
1030#elif defined(arch_atomic_inc_return_relaxed)
1031 int ret = arch_atomic_inc_return_relaxed(v);
1032 __atomic_acquire_fence();
1033 return ret;
1034#elif defined(arch_atomic_inc_return)
1035 return arch_atomic_inc_return(v);
1036#else
1037 return raw_atomic_add_return_acquire(1, v);
1038#endif
1039}
1040
1041/**
1042 * raw_atomic_inc_return_release() - atomic increment with release ordering
1043 * @v: pointer to atomic_t
1044 *
1045 * Atomically updates @v to (@v + 1) with release ordering.
1046 *
1047 * Safe to use in noinstr code; prefer atomic_inc_return_release() elsewhere.
1048 *
1049 * Return: The updated value of @v.
1050 */
1051static __always_inline int
1052raw_atomic_inc_return_release(atomic_t *v)
1053{
1054#if defined(arch_atomic_inc_return_release)
1055 return arch_atomic_inc_return_release(v);
1056#elif defined(arch_atomic_inc_return_relaxed)
1057 __atomic_release_fence();
1058 return arch_atomic_inc_return_relaxed(v);
1059#elif defined(arch_atomic_inc_return)
1060 return arch_atomic_inc_return(v);
1061#else
1062 return raw_atomic_add_return_release(1, v);
1063#endif
1064}
1065
1066/**
1067 * raw_atomic_inc_return_relaxed() - atomic increment with relaxed ordering
1068 * @v: pointer to atomic_t
1069 *
1070 * Atomically updates @v to (@v + 1) with relaxed ordering.
1071 *
1072 * Safe to use in noinstr code; prefer atomic_inc_return_relaxed() elsewhere.
1073 *
1074 * Return: The updated value of @v.
1075 */
1076static __always_inline int
1077raw_atomic_inc_return_relaxed(atomic_t *v)
1078{
1079#if defined(arch_atomic_inc_return_relaxed)
1080 return arch_atomic_inc_return_relaxed(v);
1081#elif defined(arch_atomic_inc_return)
1082 return arch_atomic_inc_return(v);
1083#else
1084 return raw_atomic_add_return_relaxed(1, v);
1085#endif
1086}
1087
1088/**
1089 * raw_atomic_fetch_inc() - atomic increment with full ordering
1090 * @v: pointer to atomic_t
1091 *
1092 * Atomically updates @v to (@v + 1) with full ordering.
1093 *
1094 * Safe to use in noinstr code; prefer atomic_fetch_inc() elsewhere.
1095 *
1096 * Return: The original value of @v.
1097 */
1098static __always_inline int
1099raw_atomic_fetch_inc(atomic_t *v)
1100{
1101#if defined(arch_atomic_fetch_inc)
1102 return arch_atomic_fetch_inc(v);
1103#elif defined(arch_atomic_fetch_inc_relaxed)
1104 int ret;
1105 __atomic_pre_full_fence();
1106 ret = arch_atomic_fetch_inc_relaxed(v);
1107 __atomic_post_full_fence();
1108 return ret;
1109#else
1110 return raw_atomic_fetch_add(1, v);
1111#endif
1112}
1113
1114/**
1115 * raw_atomic_fetch_inc_acquire() - atomic increment with acquire ordering
1116 * @v: pointer to atomic_t
1117 *
1118 * Atomically updates @v to (@v + 1) with acquire ordering.
1119 *
1120 * Safe to use in noinstr code; prefer atomic_fetch_inc_acquire() elsewhere.
1121 *
1122 * Return: The original value of @v.
1123 */
1124static __always_inline int
1125raw_atomic_fetch_inc_acquire(atomic_t *v)
1126{
1127#if defined(arch_atomic_fetch_inc_acquire)
1128 return arch_atomic_fetch_inc_acquire(v);
1129#elif defined(arch_atomic_fetch_inc_relaxed)
1130 int ret = arch_atomic_fetch_inc_relaxed(v);
1131 __atomic_acquire_fence();
1132 return ret;
1133#elif defined(arch_atomic_fetch_inc)
1134 return arch_atomic_fetch_inc(v);
1135#else
1136 return raw_atomic_fetch_add_acquire(1, v);
1137#endif
1138}
1139
1140/**
1141 * raw_atomic_fetch_inc_release() - atomic increment with release ordering
1142 * @v: pointer to atomic_t
1143 *
1144 * Atomically updates @v to (@v + 1) with release ordering.
1145 *
1146 * Safe to use in noinstr code; prefer atomic_fetch_inc_release() elsewhere.
1147 *
1148 * Return: The original value of @v.
1149 */
1150static __always_inline int
1151raw_atomic_fetch_inc_release(atomic_t *v)
1152{
1153#if defined(arch_atomic_fetch_inc_release)
1154 return arch_atomic_fetch_inc_release(v);
1155#elif defined(arch_atomic_fetch_inc_relaxed)
1156 __atomic_release_fence();
1157 return arch_atomic_fetch_inc_relaxed(v);
1158#elif defined(arch_atomic_fetch_inc)
1159 return arch_atomic_fetch_inc(v);
1160#else
1161 return raw_atomic_fetch_add_release(1, v);
1162#endif
1163}
1164
1165/**
1166 * raw_atomic_fetch_inc_relaxed() - atomic increment with relaxed ordering
1167 * @v: pointer to atomic_t
1168 *
1169 * Atomically updates @v to (@v + 1) with relaxed ordering.
1170 *
1171 * Safe to use in noinstr code; prefer atomic_fetch_inc_relaxed() elsewhere.
1172 *
1173 * Return: The original value of @v.
1174 */
1175static __always_inline int
1176raw_atomic_fetch_inc_relaxed(atomic_t *v)
1177{
1178#if defined(arch_atomic_fetch_inc_relaxed)
1179 return arch_atomic_fetch_inc_relaxed(v);
1180#elif defined(arch_atomic_fetch_inc)
1181 return arch_atomic_fetch_inc(v);
1182#else
1183 return raw_atomic_fetch_add_relaxed(1, v);
1184#endif
1185}
1186
1187/**
1188 * raw_atomic_dec() - atomic decrement with relaxed ordering
1189 * @v: pointer to atomic_t
1190 *
1191 * Atomically updates @v to (@v - 1) with relaxed ordering.
1192 *
1193 * Safe to use in noinstr code; prefer atomic_dec() elsewhere.
1194 *
1195 * Return: Nothing.
1196 */
1197static __always_inline void
1198raw_atomic_dec(atomic_t *v)
1199{
1200#if defined(arch_atomic_dec)
1201 arch_atomic_dec(v);
1202#else
1203 raw_atomic_sub(1, v);
1204#endif
1205}
1206
1207/**
1208 * raw_atomic_dec_return() - atomic decrement with full ordering
1209 * @v: pointer to atomic_t
1210 *
1211 * Atomically updates @v to (@v - 1) with full ordering.
1212 *
1213 * Safe to use in noinstr code; prefer atomic_dec_return() elsewhere.
1214 *
1215 * Return: The updated value of @v.
1216 */
1217static __always_inline int
1218raw_atomic_dec_return(atomic_t *v)
1219{
1220#if defined(arch_atomic_dec_return)
1221 return arch_atomic_dec_return(v);
1222#elif defined(arch_atomic_dec_return_relaxed)
1223 int ret;
1224 __atomic_pre_full_fence();
1225 ret = arch_atomic_dec_return_relaxed(v);
1226 __atomic_post_full_fence();
1227 return ret;
1228#else
1229 return raw_atomic_sub_return(1, v);
1230#endif
1231}
1232
1233/**
1234 * raw_atomic_dec_return_acquire() - atomic decrement with acquire ordering
1235 * @v: pointer to atomic_t
1236 *
1237 * Atomically updates @v to (@v - 1) with acquire ordering.
1238 *
1239 * Safe to use in noinstr code; prefer atomic_dec_return_acquire() elsewhere.
1240 *
1241 * Return: The updated value of @v.
1242 */
1243static __always_inline int
1244raw_atomic_dec_return_acquire(atomic_t *v)
1245{
1246#if defined(arch_atomic_dec_return_acquire)
1247 return arch_atomic_dec_return_acquire(v);
1248#elif defined(arch_atomic_dec_return_relaxed)
1249 int ret = arch_atomic_dec_return_relaxed(v);
1250 __atomic_acquire_fence();
1251 return ret;
1252#elif defined(arch_atomic_dec_return)
1253 return arch_atomic_dec_return(v);
1254#else
1255 return raw_atomic_sub_return_acquire(1, v);
1256#endif
1257}
1258
1259/**
1260 * raw_atomic_dec_return_release() - atomic decrement with release ordering
1261 * @v: pointer to atomic_t
1262 *
1263 * Atomically updates @v to (@v - 1) with release ordering.
1264 *
1265 * Safe to use in noinstr code; prefer atomic_dec_return_release() elsewhere.
1266 *
1267 * Return: The updated value of @v.
1268 */
1269static __always_inline int
1270raw_atomic_dec_return_release(atomic_t *v)
1271{
1272#if defined(arch_atomic_dec_return_release)
1273 return arch_atomic_dec_return_release(v);
1274#elif defined(arch_atomic_dec_return_relaxed)
1275 __atomic_release_fence();
1276 return arch_atomic_dec_return_relaxed(v);
1277#elif defined(arch_atomic_dec_return)
1278 return arch_atomic_dec_return(v);
1279#else
1280 return raw_atomic_sub_return_release(1, v);
1281#endif
1282}
1283
1284/**
1285 * raw_atomic_dec_return_relaxed() - atomic decrement with relaxed ordering
1286 * @v: pointer to atomic_t
1287 *
1288 * Atomically updates @v to (@v - 1) with relaxed ordering.
1289 *
1290 * Safe to use in noinstr code; prefer atomic_dec_return_relaxed() elsewhere.
1291 *
1292 * Return: The updated value of @v.
1293 */
1294static __always_inline int
1295raw_atomic_dec_return_relaxed(atomic_t *v)
1296{
1297#if defined(arch_atomic_dec_return_relaxed)
1298 return arch_atomic_dec_return_relaxed(v);
1299#elif defined(arch_atomic_dec_return)
1300 return arch_atomic_dec_return(v);
1301#else
1302 return raw_atomic_sub_return_relaxed(1, v);
1303#endif
1304}
1305
1306/**
1307 * raw_atomic_fetch_dec() - atomic decrement with full ordering
1308 * @v: pointer to atomic_t
1309 *
1310 * Atomically updates @v to (@v - 1) with full ordering.
1311 *
1312 * Safe to use in noinstr code; prefer atomic_fetch_dec() elsewhere.
1313 *
1314 * Return: The original value of @v.
1315 */
1316static __always_inline int
1317raw_atomic_fetch_dec(atomic_t *v)
1318{
1319#if defined(arch_atomic_fetch_dec)
1320 return arch_atomic_fetch_dec(v);
1321#elif defined(arch_atomic_fetch_dec_relaxed)
1322 int ret;
1323 __atomic_pre_full_fence();
1324 ret = arch_atomic_fetch_dec_relaxed(v);
1325 __atomic_post_full_fence();
1326 return ret;
1327#else
1328 return raw_atomic_fetch_sub(1, v);
1329#endif
1330}
1331
1332/**
1333 * raw_atomic_fetch_dec_acquire() - atomic decrement with acquire ordering
1334 * @v: pointer to atomic_t
1335 *
1336 * Atomically updates @v to (@v - 1) with acquire ordering.
1337 *
1338 * Safe to use in noinstr code; prefer atomic_fetch_dec_acquire() elsewhere.
1339 *
1340 * Return: The original value of @v.
1341 */
1342static __always_inline int
1343raw_atomic_fetch_dec_acquire(atomic_t *v)
1344{
1345#if defined(arch_atomic_fetch_dec_acquire)
1346 return arch_atomic_fetch_dec_acquire(v);
1347#elif defined(arch_atomic_fetch_dec_relaxed)
1348 int ret = arch_atomic_fetch_dec_relaxed(v);
1349 __atomic_acquire_fence();
1350 return ret;
1351#elif defined(arch_atomic_fetch_dec)
1352 return arch_atomic_fetch_dec(v);
1353#else
1354 return raw_atomic_fetch_sub_acquire(1, v);
1355#endif
1356}
1357
1358/**
1359 * raw_atomic_fetch_dec_release() - atomic decrement with release ordering
1360 * @v: pointer to atomic_t
1361 *
1362 * Atomically updates @v to (@v - 1) with release ordering.
1363 *
1364 * Safe to use in noinstr code; prefer atomic_fetch_dec_release() elsewhere.
1365 *
1366 * Return: The original value of @v.
1367 */
1368static __always_inline int
1369raw_atomic_fetch_dec_release(atomic_t *v)
1370{
1371#if defined(arch_atomic_fetch_dec_release)
1372 return arch_atomic_fetch_dec_release(v);
1373#elif defined(arch_atomic_fetch_dec_relaxed)
1374 __atomic_release_fence();
1375 return arch_atomic_fetch_dec_relaxed(v);
1376#elif defined(arch_atomic_fetch_dec)
1377 return arch_atomic_fetch_dec(v);
1378#else
1379 return raw_atomic_fetch_sub_release(1, v);
1380#endif
1381}
1382
1383/**
1384 * raw_atomic_fetch_dec_relaxed() - atomic decrement with relaxed ordering
1385 * @v: pointer to atomic_t
1386 *
1387 * Atomically updates @v to (@v - 1) with relaxed ordering.
1388 *
1389 * Safe to use in noinstr code; prefer atomic_fetch_dec_relaxed() elsewhere.
1390 *
1391 * Return: The original value of @v.
1392 */
1393static __always_inline int
1394raw_atomic_fetch_dec_relaxed(atomic_t *v)
1395{
1396#if defined(arch_atomic_fetch_dec_relaxed)
1397 return arch_atomic_fetch_dec_relaxed(v);
1398#elif defined(arch_atomic_fetch_dec)
1399 return arch_atomic_fetch_dec(v);
1400#else
1401 return raw_atomic_fetch_sub_relaxed(1, v);
1402#endif
1403}
1404
1405/**
1406 * raw_atomic_and() - atomic bitwise AND with relaxed ordering
1407 * @i: int value
1408 * @v: pointer to atomic_t
1409 *
1410 * Atomically updates @v to (@v & @i) with relaxed ordering.
1411 *
1412 * Safe to use in noinstr code; prefer atomic_and() elsewhere.
1413 *
1414 * Return: Nothing.
1415 */
1416static __always_inline void
1417raw_atomic_and(int i, atomic_t *v)
1418{
1419 arch_atomic_and(i, v);
1420}
1421
1422/**
1423 * raw_atomic_fetch_and() - atomic bitwise AND with full ordering
1424 * @i: int value
1425 * @v: pointer to atomic_t
1426 *
1427 * Atomically updates @v to (@v & @i) with full ordering.
1428 *
1429 * Safe to use in noinstr code; prefer atomic_fetch_and() elsewhere.
1430 *
1431 * Return: The original value of @v.
1432 */
1433static __always_inline int
1434raw_atomic_fetch_and(int i, atomic_t *v)
1435{
1436#if defined(arch_atomic_fetch_and)
1437 return arch_atomic_fetch_and(i, v);
1438#elif defined(arch_atomic_fetch_and_relaxed)
1439 int ret;
1440 __atomic_pre_full_fence();
1441 ret = arch_atomic_fetch_and_relaxed(i, v);
1442 __atomic_post_full_fence();
1443 return ret;
1444#else
1445#error "Unable to define raw_atomic_fetch_and"
1446#endif
1447}
1448
1449/**
1450 * raw_atomic_fetch_and_acquire() - atomic bitwise AND with acquire ordering
1451 * @i: int value
1452 * @v: pointer to atomic_t
1453 *
1454 * Atomically updates @v to (@v & @i) with acquire ordering.
1455 *
1456 * Safe to use in noinstr code; prefer atomic_fetch_and_acquire() elsewhere.
1457 *
1458 * Return: The original value of @v.
1459 */
1460static __always_inline int
1461raw_atomic_fetch_and_acquire(int i, atomic_t *v)
1462{
1463#if defined(arch_atomic_fetch_and_acquire)
1464 return arch_atomic_fetch_and_acquire(i, v);
1465#elif defined(arch_atomic_fetch_and_relaxed)
1466 int ret = arch_atomic_fetch_and_relaxed(i, v);
1467 __atomic_acquire_fence();
1468 return ret;
1469#elif defined(arch_atomic_fetch_and)
1470 return arch_atomic_fetch_and(i, v);
1471#else
1472#error "Unable to define raw_atomic_fetch_and_acquire"
1473#endif
1474}
1475
1476/**
1477 * raw_atomic_fetch_and_release() - atomic bitwise AND with release ordering
1478 * @i: int value
1479 * @v: pointer to atomic_t
1480 *
1481 * Atomically updates @v to (@v & @i) with release ordering.
1482 *
1483 * Safe to use in noinstr code; prefer atomic_fetch_and_release() elsewhere.
1484 *
1485 * Return: The original value of @v.
1486 */
1487static __always_inline int
1488raw_atomic_fetch_and_release(int i, atomic_t *v)
1489{
1490#if defined(arch_atomic_fetch_and_release)
1491 return arch_atomic_fetch_and_release(i, v);
1492#elif defined(arch_atomic_fetch_and_relaxed)
1493 __atomic_release_fence();
1494 return arch_atomic_fetch_and_relaxed(i, v);
1495#elif defined(arch_atomic_fetch_and)
1496 return arch_atomic_fetch_and(i, v);
1497#else
1498#error "Unable to define raw_atomic_fetch_and_release"
1499#endif
1500}
1501
1502/**
1503 * raw_atomic_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
1504 * @i: int value
1505 * @v: pointer to atomic_t
1506 *
1507 * Atomically updates @v to (@v & @i) with relaxed ordering.
1508 *
1509 * Safe to use in noinstr code; prefer atomic_fetch_and_relaxed() elsewhere.
1510 *
1511 * Return: The original value of @v.
1512 */
1513static __always_inline int
1514raw_atomic_fetch_and_relaxed(int i, atomic_t *v)
1515{
1516#if defined(arch_atomic_fetch_and_relaxed)
1517 return arch_atomic_fetch_and_relaxed(i, v);
1518#elif defined(arch_atomic_fetch_and)
1519 return arch_atomic_fetch_and(i, v);
1520#else
1521#error "Unable to define raw_atomic_fetch_and_relaxed"
1522#endif
1523}
1524
1525/**
1526 * raw_atomic_andnot() - atomic bitwise AND NOT with relaxed ordering
1527 * @i: int value
1528 * @v: pointer to atomic_t
1529 *
1530 * Atomically updates @v to (@v & ~@i) with relaxed ordering.
1531 *
1532 * Safe to use in noinstr code; prefer atomic_andnot() elsewhere.
1533 *
1534 * Return: Nothing.
1535 */
1536static __always_inline void
1537raw_atomic_andnot(int i, atomic_t *v)
1538{
1539#if defined(arch_atomic_andnot)
1540 arch_atomic_andnot(i, v);
1541#else
1542 raw_atomic_and(~i, v);
1543#endif
1544}
1545
1546/**
1547 * raw_atomic_fetch_andnot() - atomic bitwise AND NOT with full ordering
1548 * @i: int value
1549 * @v: pointer to atomic_t
1550 *
1551 * Atomically updates @v to (@v & ~@i) with full ordering.
1552 *
1553 * Safe to use in noinstr code; prefer atomic_fetch_andnot() elsewhere.
1554 *
1555 * Return: The original value of @v.
1556 */
1557static __always_inline int
1558raw_atomic_fetch_andnot(int i, atomic_t *v)
1559{
1560#if defined(arch_atomic_fetch_andnot)
1561 return arch_atomic_fetch_andnot(i, v);
1562#elif defined(arch_atomic_fetch_andnot_relaxed)
1563 int ret;
1564 __atomic_pre_full_fence();
1565 ret = arch_atomic_fetch_andnot_relaxed(i, v);
1566 __atomic_post_full_fence();
1567 return ret;
1568#else
1569 return raw_atomic_fetch_and(~i, v);
1570#endif
1571}
1572
1573/**
1574 * raw_atomic_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
1575 * @i: int value
1576 * @v: pointer to atomic_t
1577 *
1578 * Atomically updates @v to (@v & ~@i) with acquire ordering.
1579 *
1580 * Safe to use in noinstr code; prefer atomic_fetch_andnot_acquire() elsewhere.
1581 *
1582 * Return: The original value of @v.
1583 */
1584static __always_inline int
1585raw_atomic_fetch_andnot_acquire(int i, atomic_t *v)
1586{
1587#if defined(arch_atomic_fetch_andnot_acquire)
1588 return arch_atomic_fetch_andnot_acquire(i, v);
1589#elif defined(arch_atomic_fetch_andnot_relaxed)
1590 int ret = arch_atomic_fetch_andnot_relaxed(i, v);
1591 __atomic_acquire_fence();
1592 return ret;
1593#elif defined(arch_atomic_fetch_andnot)
1594 return arch_atomic_fetch_andnot(i, v);
1595#else
1596 return raw_atomic_fetch_and_acquire(~i, v);
1597#endif
1598}
1599
1600/**
1601 * raw_atomic_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
1602 * @i: int value
1603 * @v: pointer to atomic_t
1604 *
1605 * Atomically updates @v to (@v & ~@i) with release ordering.
1606 *
1607 * Safe to use in noinstr code; prefer atomic_fetch_andnot_release() elsewhere.
1608 *
1609 * Return: The original value of @v.
1610 */
1611static __always_inline int
1612raw_atomic_fetch_andnot_release(int i, atomic_t *v)
1613{
1614#if defined(arch_atomic_fetch_andnot_release)
1615 return arch_atomic_fetch_andnot_release(i, v);
1616#elif defined(arch_atomic_fetch_andnot_relaxed)
1617 __atomic_release_fence();
1618 return arch_atomic_fetch_andnot_relaxed(i, v);
1619#elif defined(arch_atomic_fetch_andnot)
1620 return arch_atomic_fetch_andnot(i, v);
1621#else
1622 return raw_atomic_fetch_and_release(~i, v);
1623#endif
1624}
1625
1626/**
1627 * raw_atomic_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
1628 * @i: int value
1629 * @v: pointer to atomic_t
1630 *
1631 * Atomically updates @v to (@v & ~@i) with relaxed ordering.
1632 *
1633 * Safe to use in noinstr code; prefer atomic_fetch_andnot_relaxed() elsewhere.
1634 *
1635 * Return: The original value of @v.
1636 */
1637static __always_inline int
1638raw_atomic_fetch_andnot_relaxed(int i, atomic_t *v)
1639{
1640#if defined(arch_atomic_fetch_andnot_relaxed)
1641 return arch_atomic_fetch_andnot_relaxed(i, v);
1642#elif defined(arch_atomic_fetch_andnot)
1643 return arch_atomic_fetch_andnot(i, v);
1644#else
1645 return raw_atomic_fetch_and_relaxed(~i, v);
1646#endif
1647}
1648
1649/**
1650 * raw_atomic_or() - atomic bitwise OR with relaxed ordering
1651 * @i: int value
1652 * @v: pointer to atomic_t
1653 *
1654 * Atomically updates @v to (@v | @i) with relaxed ordering.
1655 *
1656 * Safe to use in noinstr code; prefer atomic_or() elsewhere.
1657 *
1658 * Return: Nothing.
1659 */
1660static __always_inline void
1661raw_atomic_or(int i, atomic_t *v)
1662{
1663 arch_atomic_or(i, v);
1664}
1665
1666/**
1667 * raw_atomic_fetch_or() - atomic bitwise OR with full ordering
1668 * @i: int value
1669 * @v: pointer to atomic_t
1670 *
1671 * Atomically updates @v to (@v | @i) with full ordering.
1672 *
1673 * Safe to use in noinstr code; prefer atomic_fetch_or() elsewhere.
1674 *
1675 * Return: The original value of @v.
1676 */
1677static __always_inline int
1678raw_atomic_fetch_or(int i, atomic_t *v)
1679{
1680#if defined(arch_atomic_fetch_or)
1681 return arch_atomic_fetch_or(i, v);
1682#elif defined(arch_atomic_fetch_or_relaxed)
1683 int ret;
1684 __atomic_pre_full_fence();
1685 ret = arch_atomic_fetch_or_relaxed(i, v);
1686 __atomic_post_full_fence();
1687 return ret;
1688#else
1689#error "Unable to define raw_atomic_fetch_or"
1690#endif
1691}
1692
1693/**
1694 * raw_atomic_fetch_or_acquire() - atomic bitwise OR with acquire ordering
1695 * @i: int value
1696 * @v: pointer to atomic_t
1697 *
1698 * Atomically updates @v to (@v | @i) with acquire ordering.
1699 *
1700 * Safe to use in noinstr code; prefer atomic_fetch_or_acquire() elsewhere.
1701 *
1702 * Return: The original value of @v.
1703 */
1704static __always_inline int
1705raw_atomic_fetch_or_acquire(int i, atomic_t *v)
1706{
1707#if defined(arch_atomic_fetch_or_acquire)
1708 return arch_atomic_fetch_or_acquire(i, v);
1709#elif defined(arch_atomic_fetch_or_relaxed)
1710 int ret = arch_atomic_fetch_or_relaxed(i, v);
1711 __atomic_acquire_fence();
1712 return ret;
1713#elif defined(arch_atomic_fetch_or)
1714 return arch_atomic_fetch_or(i, v);
1715#else
1716#error "Unable to define raw_atomic_fetch_or_acquire"
1717#endif
1718}
1719
1720/**
1721 * raw_atomic_fetch_or_release() - atomic bitwise OR with release ordering
1722 * @i: int value
1723 * @v: pointer to atomic_t
1724 *
1725 * Atomically updates @v to (@v | @i) with release ordering.
1726 *
1727 * Safe to use in noinstr code; prefer atomic_fetch_or_release() elsewhere.
1728 *
1729 * Return: The original value of @v.
1730 */
1731static __always_inline int
1732raw_atomic_fetch_or_release(int i, atomic_t *v)
1733{
1734#if defined(arch_atomic_fetch_or_release)
1735 return arch_atomic_fetch_or_release(i, v);
1736#elif defined(arch_atomic_fetch_or_relaxed)
1737 __atomic_release_fence();
1738 return arch_atomic_fetch_or_relaxed(i, v);
1739#elif defined(arch_atomic_fetch_or)
1740 return arch_atomic_fetch_or(i, v);
1741#else
1742#error "Unable to define raw_atomic_fetch_or_release"
1743#endif
1744}
1745
1746/**
1747 * raw_atomic_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
1748 * @i: int value
1749 * @v: pointer to atomic_t
1750 *
1751 * Atomically updates @v to (@v | @i) with relaxed ordering.
1752 *
1753 * Safe to use in noinstr code; prefer atomic_fetch_or_relaxed() elsewhere.
1754 *
1755 * Return: The original value of @v.
1756 */
1757static __always_inline int
1758raw_atomic_fetch_or_relaxed(int i, atomic_t *v)
1759{
1760#if defined(arch_atomic_fetch_or_relaxed)
1761 return arch_atomic_fetch_or_relaxed(i, v);
1762#elif defined(arch_atomic_fetch_or)
1763 return arch_atomic_fetch_or(i, v);
1764#else
1765#error "Unable to define raw_atomic_fetch_or_relaxed"
1766#endif
1767}
1768
1769/**
1770 * raw_atomic_xor() - atomic bitwise XOR with relaxed ordering
1771 * @i: int value
1772 * @v: pointer to atomic_t
1773 *
1774 * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1775 *
1776 * Safe to use in noinstr code; prefer atomic_xor() elsewhere.
1777 *
1778 * Return: Nothing.
1779 */
1780static __always_inline void
1781raw_atomic_xor(int i, atomic_t *v)
1782{
1783 arch_atomic_xor(i, v);
1784}
1785
1786/**
1787 * raw_atomic_fetch_xor() - atomic bitwise XOR with full ordering
1788 * @i: int value
1789 * @v: pointer to atomic_t
1790 *
1791 * Atomically updates @v to (@v ^ @i) with full ordering.
1792 *
1793 * Safe to use in noinstr code; prefer atomic_fetch_xor() elsewhere.
1794 *
1795 * Return: The original value of @v.
1796 */
1797static __always_inline int
1798raw_atomic_fetch_xor(int i, atomic_t *v)
1799{
1800#if defined(arch_atomic_fetch_xor)
1801 return arch_atomic_fetch_xor(i, v);
1802#elif defined(arch_atomic_fetch_xor_relaxed)
1803 int ret;
1804 __atomic_pre_full_fence();
1805 ret = arch_atomic_fetch_xor_relaxed(i, v);
1806 __atomic_post_full_fence();
1807 return ret;
1808#else
1809#error "Unable to define raw_atomic_fetch_xor"
1810#endif
1811}
1812
1813/**
1814 * raw_atomic_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
1815 * @i: int value
1816 * @v: pointer to atomic_t
1817 *
1818 * Atomically updates @v to (@v ^ @i) with acquire ordering.
1819 *
1820 * Safe to use in noinstr code; prefer atomic_fetch_xor_acquire() elsewhere.
1821 *
1822 * Return: The original value of @v.
1823 */
1824static __always_inline int
1825raw_atomic_fetch_xor_acquire(int i, atomic_t *v)
1826{
1827#if defined(arch_atomic_fetch_xor_acquire)
1828 return arch_atomic_fetch_xor_acquire(i, v);
1829#elif defined(arch_atomic_fetch_xor_relaxed)
1830 int ret = arch_atomic_fetch_xor_relaxed(i, v);
1831 __atomic_acquire_fence();
1832 return ret;
1833#elif defined(arch_atomic_fetch_xor)
1834 return arch_atomic_fetch_xor(i, v);
1835#else
1836#error "Unable to define raw_atomic_fetch_xor_acquire"
1837#endif
1838}
1839
1840/**
1841 * raw_atomic_fetch_xor_release() - atomic bitwise XOR with release ordering
1842 * @i: int value
1843 * @v: pointer to atomic_t
1844 *
1845 * Atomically updates @v to (@v ^ @i) with release ordering.
1846 *
1847 * Safe to use in noinstr code; prefer atomic_fetch_xor_release() elsewhere.
1848 *
1849 * Return: The original value of @v.
1850 */
1851static __always_inline int
1852raw_atomic_fetch_xor_release(int i, atomic_t *v)
1853{
1854#if defined(arch_atomic_fetch_xor_release)
1855 return arch_atomic_fetch_xor_release(i, v);
1856#elif defined(arch_atomic_fetch_xor_relaxed)
1857 __atomic_release_fence();
1858 return arch_atomic_fetch_xor_relaxed(i, v);
1859#elif defined(arch_atomic_fetch_xor)
1860 return arch_atomic_fetch_xor(i, v);
1861#else
1862#error "Unable to define raw_atomic_fetch_xor_release"
1863#endif
1864}
1865
1866/**
1867 * raw_atomic_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
1868 * @i: int value
1869 * @v: pointer to atomic_t
1870 *
1871 * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1872 *
1873 * Safe to use in noinstr code; prefer atomic_fetch_xor_relaxed() elsewhere.
1874 *
1875 * Return: The original value of @v.
1876 */
1877static __always_inline int
1878raw_atomic_fetch_xor_relaxed(int i, atomic_t *v)
1879{
1880#if defined(arch_atomic_fetch_xor_relaxed)
1881 return arch_atomic_fetch_xor_relaxed(i, v);
1882#elif defined(arch_atomic_fetch_xor)
1883 return arch_atomic_fetch_xor(i, v);
1884#else
1885#error "Unable to define raw_atomic_fetch_xor_relaxed"
1886#endif
1887}
1888
1889/**
1890 * raw_atomic_xchg() - atomic exchange with full ordering
1891 * @v: pointer to atomic_t
1892 * @new: int value to assign
1893 *
1894 * Atomically updates @v to @new with full ordering.
1895 *
1896 * Safe to use in noinstr code; prefer atomic_xchg() elsewhere.
1897 *
1898 * Return: The original value of @v.
1899 */
1900static __always_inline int
1901raw_atomic_xchg(atomic_t *v, int new)
1902{
1903#if defined(arch_atomic_xchg)
1904 return arch_atomic_xchg(v, new);
1905#elif defined(arch_atomic_xchg_relaxed)
1906 int ret;
1907 __atomic_pre_full_fence();
1908 ret = arch_atomic_xchg_relaxed(v, new);
1909 __atomic_post_full_fence();
1910 return ret;
1911#else
1912 return raw_xchg(&v->counter, new);
1913#endif
1914}
1915
1916/**
1917 * raw_atomic_xchg_acquire() - atomic exchange with acquire ordering
1918 * @v: pointer to atomic_t
1919 * @new: int value to assign
1920 *
1921 * Atomically updates @v to @new with acquire ordering.
1922 *
1923 * Safe to use in noinstr code; prefer atomic_xchg_acquire() elsewhere.
1924 *
1925 * Return: The original value of @v.
1926 */
1927static __always_inline int
1928raw_atomic_xchg_acquire(atomic_t *v, int new)
1929{
1930#if defined(arch_atomic_xchg_acquire)
1931 return arch_atomic_xchg_acquire(v, new);
1932#elif defined(arch_atomic_xchg_relaxed)
1933 int ret = arch_atomic_xchg_relaxed(v, new);
1934 __atomic_acquire_fence();
1935 return ret;
1936#elif defined(arch_atomic_xchg)
1937 return arch_atomic_xchg(v, new);
1938#else
1939 return raw_xchg_acquire(&v->counter, new);
1940#endif
1941}
1942
1943/**
1944 * raw_atomic_xchg_release() - atomic exchange with release ordering
1945 * @v: pointer to atomic_t
1946 * @new: int value to assign
1947 *
1948 * Atomically updates @v to @new with release ordering.
1949 *
1950 * Safe to use in noinstr code; prefer atomic_xchg_release() elsewhere.
1951 *
1952 * Return: The original value of @v.
1953 */
1954static __always_inline int
1955raw_atomic_xchg_release(atomic_t *v, int new)
1956{
1957#if defined(arch_atomic_xchg_release)
1958 return arch_atomic_xchg_release(v, new);
1959#elif defined(arch_atomic_xchg_relaxed)
1960 __atomic_release_fence();
1961 return arch_atomic_xchg_relaxed(v, new);
1962#elif defined(arch_atomic_xchg)
1963 return arch_atomic_xchg(v, new);
1964#else
1965 return raw_xchg_release(&v->counter, new);
1966#endif
1967}
1968
1969/**
1970 * raw_atomic_xchg_relaxed() - atomic exchange with relaxed ordering
1971 * @v: pointer to atomic_t
1972 * @new: int value to assign
1973 *
1974 * Atomically updates @v to @new with relaxed ordering.
1975 *
1976 * Safe to use in noinstr code; prefer atomic_xchg_relaxed() elsewhere.
1977 *
1978 * Return: The original value of @v.
1979 */
1980static __always_inline int
1981raw_atomic_xchg_relaxed(atomic_t *v, int new)
1982{
1983#if defined(arch_atomic_xchg_relaxed)
1984 return arch_atomic_xchg_relaxed(v, new);
1985#elif defined(arch_atomic_xchg)
1986 return arch_atomic_xchg(v, new);
1987#else
1988 return raw_xchg_relaxed(&v->counter, new);
1989#endif
1990}
1991
1992/**
1993 * raw_atomic_cmpxchg() - atomic compare and exchange with full ordering
1994 * @v: pointer to atomic_t
1995 * @old: int value to compare with
1996 * @new: int value to assign
1997 *
1998 * If (@v == @old), atomically updates @v to @new with full ordering.
1999 *
2000 * Safe to use in noinstr code; prefer atomic_cmpxchg() elsewhere.
2001 *
2002 * Return: The original value of @v.
2003 */
2004static __always_inline int
2005raw_atomic_cmpxchg(atomic_t *v, int old, int new)
2006{
2007#if defined(arch_atomic_cmpxchg)
2008 return arch_atomic_cmpxchg(v, old, new);
2009#elif defined(arch_atomic_cmpxchg_relaxed)
2010 int ret;
2011 __atomic_pre_full_fence();
2012 ret = arch_atomic_cmpxchg_relaxed(v, old, new);
2013 __atomic_post_full_fence();
2014 return ret;
2015#else
2016 return raw_cmpxchg(&v->counter, old, new);
2017#endif
2018}
2019
2020/**
2021 * raw_atomic_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2022 * @v: pointer to atomic_t
2023 * @old: int value to compare with
2024 * @new: int value to assign
2025 *
2026 * If (@v == @old), atomically updates @v to @new with acquire ordering.
2027 *
2028 * Safe to use in noinstr code; prefer atomic_cmpxchg_acquire() elsewhere.
2029 *
2030 * Return: The original value of @v.
2031 */
2032static __always_inline int
2033raw_atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
2034{
2035#if defined(arch_atomic_cmpxchg_acquire)
2036 return arch_atomic_cmpxchg_acquire(v, old, new);
2037#elif defined(arch_atomic_cmpxchg_relaxed)
2038 int ret = arch_atomic_cmpxchg_relaxed(v, old, new);
2039 __atomic_acquire_fence();
2040 return ret;
2041#elif defined(arch_atomic_cmpxchg)
2042 return arch_atomic_cmpxchg(v, old, new);
2043#else
2044 return raw_cmpxchg_acquire(&v->counter, old, new);
2045#endif
2046}
2047
2048/**
2049 * raw_atomic_cmpxchg_release() - atomic compare and exchange with release ordering
2050 * @v: pointer to atomic_t
2051 * @old: int value to compare with
2052 * @new: int value to assign
2053 *
2054 * If (@v == @old), atomically updates @v to @new with release ordering.
2055 *
2056 * Safe to use in noinstr code; prefer atomic_cmpxchg_release() elsewhere.
2057 *
2058 * Return: The original value of @v.
2059 */
2060static __always_inline int
2061raw_atomic_cmpxchg_release(atomic_t *v, int old, int new)
2062{
2063#if defined(arch_atomic_cmpxchg_release)
2064 return arch_atomic_cmpxchg_release(v, old, new);
2065#elif defined(arch_atomic_cmpxchg_relaxed)
2066 __atomic_release_fence();
2067 return arch_atomic_cmpxchg_relaxed(v, old, new);
2068#elif defined(arch_atomic_cmpxchg)
2069 return arch_atomic_cmpxchg(v, old, new);
2070#else
2071 return raw_cmpxchg_release(&v->counter, old, new);
2072#endif
2073}
2074
2075/**
2076 * raw_atomic_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2077 * @v: pointer to atomic_t
2078 * @old: int value to compare with
2079 * @new: int value to assign
2080 *
2081 * If (@v == @old), atomically updates @v to @new with relaxed ordering.
2082 *
2083 * Safe to use in noinstr code; prefer atomic_cmpxchg_relaxed() elsewhere.
2084 *
2085 * Return: The original value of @v.
2086 */
2087static __always_inline int
2088raw_atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
2089{
2090#if defined(arch_atomic_cmpxchg_relaxed)
2091 return arch_atomic_cmpxchg_relaxed(v, old, new);
2092#elif defined(arch_atomic_cmpxchg)
2093 return arch_atomic_cmpxchg(v, old, new);
2094#else
2095 return raw_cmpxchg_relaxed(&v->counter, old, new);
2096#endif
2097}
2098
2099/**
2100 * raw_atomic_try_cmpxchg() - atomic compare and exchange with full ordering
2101 * @v: pointer to atomic_t
2102 * @old: pointer to int value to compare with
2103 * @new: int value to assign
2104 *
2105 * If (@v == @old), atomically updates @v to @new with full ordering.
2106 * Otherwise, updates @old to the current value of @v.
2107 *
2108 * Safe to use in noinstr code; prefer atomic_try_cmpxchg() elsewhere.
2109 *
2110 * Return: @true if the exchange occured, @false otherwise.
2111 */
2112static __always_inline bool
2113raw_atomic_try_cmpxchg(atomic_t *v, int *old, int new)
2114{
2115#if defined(arch_atomic_try_cmpxchg)
2116 return arch_atomic_try_cmpxchg(v, old, new);
2117#elif defined(arch_atomic_try_cmpxchg_relaxed)
2118 bool ret;
2119 __atomic_pre_full_fence();
2120 ret = arch_atomic_try_cmpxchg_relaxed(v, old, new);
2121 __atomic_post_full_fence();
2122 return ret;
2123#else
2124 int r, o = *old;
2125 r = raw_atomic_cmpxchg(v, o, new);
2126 if (unlikely(r != o))
2127 *old = r;
2128 return likely(r == o);
2129#endif
2130}
2131
2132/**
2133 * raw_atomic_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2134 * @v: pointer to atomic_t
2135 * @old: pointer to int value to compare with
2136 * @new: int value to assign
2137 *
2138 * If (@v == @old), atomically updates @v to @new with acquire ordering.
2139 * Otherwise, updates @old to the current value of @v.
2140 *
2141 * Safe to use in noinstr code; prefer atomic_try_cmpxchg_acquire() elsewhere.
2142 *
2143 * Return: @true if the exchange occured, @false otherwise.
2144 */
2145static __always_inline bool
2146raw_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
2147{
2148#if defined(arch_atomic_try_cmpxchg_acquire)
2149 return arch_atomic_try_cmpxchg_acquire(v, old, new);
2150#elif defined(arch_atomic_try_cmpxchg_relaxed)
2151 bool ret = arch_atomic_try_cmpxchg_relaxed(v, old, new);
2152 __atomic_acquire_fence();
2153 return ret;
2154#elif defined(arch_atomic_try_cmpxchg)
2155 return arch_atomic_try_cmpxchg(v, old, new);
2156#else
2157 int r, o = *old;
2158 r = raw_atomic_cmpxchg_acquire(v, o, new);
2159 if (unlikely(r != o))
2160 *old = r;
2161 return likely(r == o);
2162#endif
2163}
2164
2165/**
2166 * raw_atomic_try_cmpxchg_release() - atomic compare and exchange with release ordering
2167 * @v: pointer to atomic_t
2168 * @old: pointer to int value to compare with
2169 * @new: int value to assign
2170 *
2171 * If (@v == @old), atomically updates @v to @new with release ordering.
2172 * Otherwise, updates @old to the current value of @v.
2173 *
2174 * Safe to use in noinstr code; prefer atomic_try_cmpxchg_release() elsewhere.
2175 *
2176 * Return: @true if the exchange occured, @false otherwise.
2177 */
2178static __always_inline bool
2179raw_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
2180{
2181#if defined(arch_atomic_try_cmpxchg_release)
2182 return arch_atomic_try_cmpxchg_release(v, old, new);
2183#elif defined(arch_atomic_try_cmpxchg_relaxed)
2184 __atomic_release_fence();
2185 return arch_atomic_try_cmpxchg_relaxed(v, old, new);
2186#elif defined(arch_atomic_try_cmpxchg)
2187 return arch_atomic_try_cmpxchg(v, old, new);
2188#else
2189 int r, o = *old;
2190 r = raw_atomic_cmpxchg_release(v, o, new);
2191 if (unlikely(r != o))
2192 *old = r;
2193 return likely(r == o);
2194#endif
2195}
2196
2197/**
2198 * raw_atomic_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2199 * @v: pointer to atomic_t
2200 * @old: pointer to int value to compare with
2201 * @new: int value to assign
2202 *
2203 * If (@v == @old), atomically updates @v to @new with relaxed ordering.
2204 * Otherwise, updates @old to the current value of @v.
2205 *
2206 * Safe to use in noinstr code; prefer atomic_try_cmpxchg_relaxed() elsewhere.
2207 *
2208 * Return: @true if the exchange occured, @false otherwise.
2209 */
2210static __always_inline bool
2211raw_atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
2212{
2213#if defined(arch_atomic_try_cmpxchg_relaxed)
2214 return arch_atomic_try_cmpxchg_relaxed(v, old, new);
2215#elif defined(arch_atomic_try_cmpxchg)
2216 return arch_atomic_try_cmpxchg(v, old, new);
2217#else
2218 int r, o = *old;
2219 r = raw_atomic_cmpxchg_relaxed(v, o, new);
2220 if (unlikely(r != o))
2221 *old = r;
2222 return likely(r == o);
2223#endif
2224}
2225
2226/**
2227 * raw_atomic_sub_and_test() - atomic subtract and test if zero with full ordering
2228 * @i: int value to add
2229 * @v: pointer to atomic_t
2230 *
2231 * Atomically updates @v to (@v - @i) with full ordering.
2232 *
2233 * Safe to use in noinstr code; prefer atomic_sub_and_test() elsewhere.
2234 *
2235 * Return: @true if the resulting value of @v is zero, @false otherwise.
2236 */
2237static __always_inline bool
2238raw_atomic_sub_and_test(int i, atomic_t *v)
2239{
2240#if defined(arch_atomic_sub_and_test)
2241 return arch_atomic_sub_and_test(i, v);
2242#else
2243 return raw_atomic_sub_return(i, v) == 0;
2244#endif
2245}
2246
2247/**
2248 * raw_atomic_dec_and_test() - atomic decrement and test if zero with full ordering
2249 * @v: pointer to atomic_t
2250 *
2251 * Atomically updates @v to (@v - 1) with full ordering.
2252 *
2253 * Safe to use in noinstr code; prefer atomic_dec_and_test() elsewhere.
2254 *
2255 * Return: @true if the resulting value of @v is zero, @false otherwise.
2256 */
2257static __always_inline bool
2258raw_atomic_dec_and_test(atomic_t *v)
2259{
2260#if defined(arch_atomic_dec_and_test)
2261 return arch_atomic_dec_and_test(v);
2262#else
2263 return raw_atomic_dec_return(v) == 0;
2264#endif
2265}
2266
2267/**
2268 * raw_atomic_inc_and_test() - atomic increment and test if zero with full ordering
2269 * @v: pointer to atomic_t
2270 *
2271 * Atomically updates @v to (@v + 1) with full ordering.
2272 *
2273 * Safe to use in noinstr code; prefer atomic_inc_and_test() elsewhere.
2274 *
2275 * Return: @true if the resulting value of @v is zero, @false otherwise.
2276 */
2277static __always_inline bool
2278raw_atomic_inc_and_test(atomic_t *v)
2279{
2280#if defined(arch_atomic_inc_and_test)
2281 return arch_atomic_inc_and_test(v);
2282#else
2283 return raw_atomic_inc_return(v) == 0;
2284#endif
2285}
2286
2287/**
2288 * raw_atomic_add_negative() - atomic add and test if negative with full ordering
2289 * @i: int value to add
2290 * @v: pointer to atomic_t
2291 *
2292 * Atomically updates @v to (@v + @i) with full ordering.
2293 *
2294 * Safe to use in noinstr code; prefer atomic_add_negative() elsewhere.
2295 *
2296 * Return: @true if the resulting value of @v is negative, @false otherwise.
2297 */
2298static __always_inline bool
2299raw_atomic_add_negative(int i, atomic_t *v)
2300{
2301#if defined(arch_atomic_add_negative)
2302 return arch_atomic_add_negative(i, v);
2303#elif defined(arch_atomic_add_negative_relaxed)
2304 bool ret;
2305 __atomic_pre_full_fence();
2306 ret = arch_atomic_add_negative_relaxed(i, v);
2307 __atomic_post_full_fence();
2308 return ret;
2309#else
2310 return raw_atomic_add_return(i, v) < 0;
2311#endif
2312}
2313
2314/**
2315 * raw_atomic_add_negative_acquire() - atomic add and test if negative with acquire ordering
2316 * @i: int value to add
2317 * @v: pointer to atomic_t
2318 *
2319 * Atomically updates @v to (@v + @i) with acquire ordering.
2320 *
2321 * Safe to use in noinstr code; prefer atomic_add_negative_acquire() elsewhere.
2322 *
2323 * Return: @true if the resulting value of @v is negative, @false otherwise.
2324 */
2325static __always_inline bool
2326raw_atomic_add_negative_acquire(int i, atomic_t *v)
2327{
2328#if defined(arch_atomic_add_negative_acquire)
2329 return arch_atomic_add_negative_acquire(i, v);
2330#elif defined(arch_atomic_add_negative_relaxed)
2331 bool ret = arch_atomic_add_negative_relaxed(i, v);
2332 __atomic_acquire_fence();
2333 return ret;
2334#elif defined(arch_atomic_add_negative)
2335 return arch_atomic_add_negative(i, v);
2336#else
2337 return raw_atomic_add_return_acquire(i, v) < 0;
2338#endif
2339}
2340
2341/**
2342 * raw_atomic_add_negative_release() - atomic add and test if negative with release ordering
2343 * @i: int value to add
2344 * @v: pointer to atomic_t
2345 *
2346 * Atomically updates @v to (@v + @i) with release ordering.
2347 *
2348 * Safe to use in noinstr code; prefer atomic_add_negative_release() elsewhere.
2349 *
2350 * Return: @true if the resulting value of @v is negative, @false otherwise.
2351 */
2352static __always_inline bool
2353raw_atomic_add_negative_release(int i, atomic_t *v)
2354{
2355#if defined(arch_atomic_add_negative_release)
2356 return arch_atomic_add_negative_release(i, v);
2357#elif defined(arch_atomic_add_negative_relaxed)
2358 __atomic_release_fence();
2359 return arch_atomic_add_negative_relaxed(i, v);
2360#elif defined(arch_atomic_add_negative)
2361 return arch_atomic_add_negative(i, v);
2362#else
2363 return raw_atomic_add_return_release(i, v) < 0;
2364#endif
2365}
2366
2367/**
2368 * raw_atomic_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
2369 * @i: int value to add
2370 * @v: pointer to atomic_t
2371 *
2372 * Atomically updates @v to (@v + @i) with relaxed ordering.
2373 *
2374 * Safe to use in noinstr code; prefer atomic_add_negative_relaxed() elsewhere.
2375 *
2376 * Return: @true if the resulting value of @v is negative, @false otherwise.
2377 */
2378static __always_inline bool
2379raw_atomic_add_negative_relaxed(int i, atomic_t *v)
2380{
2381#if defined(arch_atomic_add_negative_relaxed)
2382 return arch_atomic_add_negative_relaxed(i, v);
2383#elif defined(arch_atomic_add_negative)
2384 return arch_atomic_add_negative(i, v);
2385#else
2386 return raw_atomic_add_return_relaxed(i, v) < 0;
2387#endif
2388}
2389
2390/**
2391 * raw_atomic_fetch_add_unless() - atomic add unless value with full ordering
2392 * @v: pointer to atomic_t
2393 * @a: int value to add
2394 * @u: int value to compare with
2395 *
2396 * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
2397 *
2398 * Safe to use in noinstr code; prefer atomic_fetch_add_unless() elsewhere.
2399 *
2400 * Return: The original value of @v.
2401 */
2402static __always_inline int
2403raw_atomic_fetch_add_unless(atomic_t *v, int a, int u)
2404{
2405#if defined(arch_atomic_fetch_add_unless)
2406 return arch_atomic_fetch_add_unless(v, a, u);
2407#else
2408 int c = raw_atomic_read(v);
2409
2410 do {
2411 if (unlikely(c == u))
2412 break;
2413 } while (!raw_atomic_try_cmpxchg(v, &c, c + a));
2414
2415 return c;
2416#endif
2417}
2418
2419/**
2420 * raw_atomic_add_unless() - atomic add unless value with full ordering
2421 * @v: pointer to atomic_t
2422 * @a: int value to add
2423 * @u: int value to compare with
2424 *
2425 * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
2426 *
2427 * Safe to use in noinstr code; prefer atomic_add_unless() elsewhere.
2428 *
2429 * Return: @true if @v was updated, @false otherwise.
2430 */
2431static __always_inline bool
2432raw_atomic_add_unless(atomic_t *v, int a, int u)
2433{
2434#if defined(arch_atomic_add_unless)
2435 return arch_atomic_add_unless(v, a, u);
2436#else
2437 return raw_atomic_fetch_add_unless(v, a, u) != u;
2438#endif
2439}
2440
2441/**
2442 * raw_atomic_inc_not_zero() - atomic increment unless zero with full ordering
2443 * @v: pointer to atomic_t
2444 *
2445 * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
2446 *
2447 * Safe to use in noinstr code; prefer atomic_inc_not_zero() elsewhere.
2448 *
2449 * Return: @true if @v was updated, @false otherwise.
2450 */
2451static __always_inline bool
2452raw_atomic_inc_not_zero(atomic_t *v)
2453{
2454#if defined(arch_atomic_inc_not_zero)
2455 return arch_atomic_inc_not_zero(v);
2456#else
2457 return raw_atomic_add_unless(v, 1, 0);
2458#endif
2459}
2460
2461/**
2462 * raw_atomic_inc_unless_negative() - atomic increment unless negative with full ordering
2463 * @v: pointer to atomic_t
2464 *
2465 * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
2466 *
2467 * Safe to use in noinstr code; prefer atomic_inc_unless_negative() elsewhere.
2468 *
2469 * Return: @true if @v was updated, @false otherwise.
2470 */
2471static __always_inline bool
2472raw_atomic_inc_unless_negative(atomic_t *v)
2473{
2474#if defined(arch_atomic_inc_unless_negative)
2475 return arch_atomic_inc_unless_negative(v);
2476#else
2477 int c = raw_atomic_read(v);
2478
2479 do {
2480 if (unlikely(c < 0))
2481 return false;
2482 } while (!raw_atomic_try_cmpxchg(v, &c, c + 1));
2483
2484 return true;
2485#endif
2486}
2487
2488/**
2489 * raw_atomic_dec_unless_positive() - atomic decrement unless positive with full ordering
2490 * @v: pointer to atomic_t
2491 *
2492 * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
2493 *
2494 * Safe to use in noinstr code; prefer atomic_dec_unless_positive() elsewhere.
2495 *
2496 * Return: @true if @v was updated, @false otherwise.
2497 */
2498static __always_inline bool
2499raw_atomic_dec_unless_positive(atomic_t *v)
2500{
2501#if defined(arch_atomic_dec_unless_positive)
2502 return arch_atomic_dec_unless_positive(v);
2503#else
2504 int c = raw_atomic_read(v);
2505
2506 do {
2507 if (unlikely(c > 0))
2508 return false;
2509 } while (!raw_atomic_try_cmpxchg(v, &c, c - 1));
2510
2511 return true;
2512#endif
2513}
2514
2515/**
2516 * raw_atomic_dec_if_positive() - atomic decrement if positive with full ordering
2517 * @v: pointer to atomic_t
2518 *
2519 * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
2520 *
2521 * Safe to use in noinstr code; prefer atomic_dec_if_positive() elsewhere.
2522 *
2523 * Return: The old value of (@v - 1), regardless of whether @v was updated.
2524 */
2525static __always_inline int
2526raw_atomic_dec_if_positive(atomic_t *v)
2527{
2528#if defined(arch_atomic_dec_if_positive)
2529 return arch_atomic_dec_if_positive(v);
2530#else
2531 int dec, c = raw_atomic_read(v);
2532
2533 do {
2534 dec = c - 1;
2535 if (unlikely(dec < 0))
2536 break;
2537 } while (!raw_atomic_try_cmpxchg(v, &c, dec));
2538
2539 return dec;
2540#endif
2541}
2542
2543#ifdef CONFIG_GENERIC_ATOMIC64
2544#include <asm-generic/atomic64.h>
2545#endif
2546
2547/**
2548 * raw_atomic64_read() - atomic load with relaxed ordering
2549 * @v: pointer to atomic64_t
2550 *
2551 * Atomically loads the value of @v with relaxed ordering.
2552 *
2553 * Safe to use in noinstr code; prefer atomic64_read() elsewhere.
2554 *
2555 * Return: The value loaded from @v.
2556 */
2557static __always_inline s64
2558raw_atomic64_read(const atomic64_t *v)
2559{
2560 return arch_atomic64_read(v);
2561}
2562
2563/**
2564 * raw_atomic64_read_acquire() - atomic load with acquire ordering
2565 * @v: pointer to atomic64_t
2566 *
2567 * Atomically loads the value of @v with acquire ordering.
2568 *
2569 * Safe to use in noinstr code; prefer atomic64_read_acquire() elsewhere.
2570 *
2571 * Return: The value loaded from @v.
2572 */
2573static __always_inline s64
2574raw_atomic64_read_acquire(const atomic64_t *v)
2575{
2576#if defined(arch_atomic64_read_acquire)
2577 return arch_atomic64_read_acquire(v);
2578#elif defined(arch_atomic64_read)
2579 return arch_atomic64_read(v);
2580#else
2581 s64 ret;
2582
2583 if (__native_word(atomic64_t)) {
2584 ret = smp_load_acquire(&(v)->counter);
2585 } else {
2586 ret = raw_atomic64_read(v);
2587 __atomic_acquire_fence();
2588 }
2589
2590 return ret;
2591#endif
2592}
2593
2594/**
2595 * raw_atomic64_set() - atomic set with relaxed ordering
2596 * @v: pointer to atomic64_t
2597 * @i: s64 value to assign
2598 *
2599 * Atomically sets @v to @i with relaxed ordering.
2600 *
2601 * Safe to use in noinstr code; prefer atomic64_set() elsewhere.
2602 *
2603 * Return: Nothing.
2604 */
2605static __always_inline void
2606raw_atomic64_set(atomic64_t *v, s64 i)
2607{
2608 arch_atomic64_set(v, i);
2609}
2610
2611/**
2612 * raw_atomic64_set_release() - atomic set with release ordering
2613 * @v: pointer to atomic64_t
2614 * @i: s64 value to assign
2615 *
2616 * Atomically sets @v to @i with release ordering.
2617 *
2618 * Safe to use in noinstr code; prefer atomic64_set_release() elsewhere.
2619 *
2620 * Return: Nothing.
2621 */
2622static __always_inline void
2623raw_atomic64_set_release(atomic64_t *v, s64 i)
2624{
2625#if defined(arch_atomic64_set_release)
2626 arch_atomic64_set_release(v, i);
2627#elif defined(arch_atomic64_set)
2628 arch_atomic64_set(v, i);
2629#else
2630 if (__native_word(atomic64_t)) {
2631 smp_store_release(&(v)->counter, i);
2632 } else {
2633 __atomic_release_fence();
2634 raw_atomic64_set(v, i);
2635 }
2636#endif
2637}
2638
2639/**
2640 * raw_atomic64_add() - atomic add with relaxed ordering
2641 * @i: s64 value to add
2642 * @v: pointer to atomic64_t
2643 *
2644 * Atomically updates @v to (@v + @i) with relaxed ordering.
2645 *
2646 * Safe to use in noinstr code; prefer atomic64_add() elsewhere.
2647 *
2648 * Return: Nothing.
2649 */
2650static __always_inline void
2651raw_atomic64_add(s64 i, atomic64_t *v)
2652{
2653 arch_atomic64_add(i, v);
2654}
2655
2656/**
2657 * raw_atomic64_add_return() - atomic add with full ordering
2658 * @i: s64 value to add
2659 * @v: pointer to atomic64_t
2660 *
2661 * Atomically updates @v to (@v + @i) with full ordering.
2662 *
2663 * Safe to use in noinstr code; prefer atomic64_add_return() elsewhere.
2664 *
2665 * Return: The updated value of @v.
2666 */
2667static __always_inline s64
2668raw_atomic64_add_return(s64 i, atomic64_t *v)
2669{
2670#if defined(arch_atomic64_add_return)
2671 return arch_atomic64_add_return(i, v);
2672#elif defined(arch_atomic64_add_return_relaxed)
2673 s64 ret;
2674 __atomic_pre_full_fence();
2675 ret = arch_atomic64_add_return_relaxed(i, v);
2676 __atomic_post_full_fence();
2677 return ret;
2678#else
2679#error "Unable to define raw_atomic64_add_return"
2680#endif
2681}
2682
2683/**
2684 * raw_atomic64_add_return_acquire() - atomic add with acquire ordering
2685 * @i: s64 value to add
2686 * @v: pointer to atomic64_t
2687 *
2688 * Atomically updates @v to (@v + @i) with acquire ordering.
2689 *
2690 * Safe to use in noinstr code; prefer atomic64_add_return_acquire() elsewhere.
2691 *
2692 * Return: The updated value of @v.
2693 */
2694static __always_inline s64
2695raw_atomic64_add_return_acquire(s64 i, atomic64_t *v)
2696{
2697#if defined(arch_atomic64_add_return_acquire)
2698 return arch_atomic64_add_return_acquire(i, v);
2699#elif defined(arch_atomic64_add_return_relaxed)
2700 s64 ret = arch_atomic64_add_return_relaxed(i, v);
2701 __atomic_acquire_fence();
2702 return ret;
2703#elif defined(arch_atomic64_add_return)
2704 return arch_atomic64_add_return(i, v);
2705#else
2706#error "Unable to define raw_atomic64_add_return_acquire"
2707#endif
2708}
2709
2710/**
2711 * raw_atomic64_add_return_release() - atomic add with release ordering
2712 * @i: s64 value to add
2713 * @v: pointer to atomic64_t
2714 *
2715 * Atomically updates @v to (@v + @i) with release ordering.
2716 *
2717 * Safe to use in noinstr code; prefer atomic64_add_return_release() elsewhere.
2718 *
2719 * Return: The updated value of @v.
2720 */
2721static __always_inline s64
2722raw_atomic64_add_return_release(s64 i, atomic64_t *v)
2723{
2724#if defined(arch_atomic64_add_return_release)
2725 return arch_atomic64_add_return_release(i, v);
2726#elif defined(arch_atomic64_add_return_relaxed)
2727 __atomic_release_fence();
2728 return arch_atomic64_add_return_relaxed(i, v);
2729#elif defined(arch_atomic64_add_return)
2730 return arch_atomic64_add_return(i, v);
2731#else
2732#error "Unable to define raw_atomic64_add_return_release"
2733#endif
2734}
2735
2736/**
2737 * raw_atomic64_add_return_relaxed() - atomic add with relaxed ordering
2738 * @i: s64 value to add
2739 * @v: pointer to atomic64_t
2740 *
2741 * Atomically updates @v to (@v + @i) with relaxed ordering.
2742 *
2743 * Safe to use in noinstr code; prefer atomic64_add_return_relaxed() elsewhere.
2744 *
2745 * Return: The updated value of @v.
2746 */
2747static __always_inline s64
2748raw_atomic64_add_return_relaxed(s64 i, atomic64_t *v)
2749{
2750#if defined(arch_atomic64_add_return_relaxed)
2751 return arch_atomic64_add_return_relaxed(i, v);
2752#elif defined(arch_atomic64_add_return)
2753 return arch_atomic64_add_return(i, v);
2754#else
2755#error "Unable to define raw_atomic64_add_return_relaxed"
2756#endif
2757}
2758
2759/**
2760 * raw_atomic64_fetch_add() - atomic add with full ordering
2761 * @i: s64 value to add
2762 * @v: pointer to atomic64_t
2763 *
2764 * Atomically updates @v to (@v + @i) with full ordering.
2765 *
2766 * Safe to use in noinstr code; prefer atomic64_fetch_add() elsewhere.
2767 *
2768 * Return: The original value of @v.
2769 */
2770static __always_inline s64
2771raw_atomic64_fetch_add(s64 i, atomic64_t *v)
2772{
2773#if defined(arch_atomic64_fetch_add)
2774 return arch_atomic64_fetch_add(i, v);
2775#elif defined(arch_atomic64_fetch_add_relaxed)
2776 s64 ret;
2777 __atomic_pre_full_fence();
2778 ret = arch_atomic64_fetch_add_relaxed(i, v);
2779 __atomic_post_full_fence();
2780 return ret;
2781#else
2782#error "Unable to define raw_atomic64_fetch_add"
2783#endif
2784}
2785
2786/**
2787 * raw_atomic64_fetch_add_acquire() - atomic add with acquire ordering
2788 * @i: s64 value to add
2789 * @v: pointer to atomic64_t
2790 *
2791 * Atomically updates @v to (@v + @i) with acquire ordering.
2792 *
2793 * Safe to use in noinstr code; prefer atomic64_fetch_add_acquire() elsewhere.
2794 *
2795 * Return: The original value of @v.
2796 */
2797static __always_inline s64
2798raw_atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
2799{
2800#if defined(arch_atomic64_fetch_add_acquire)
2801 return arch_atomic64_fetch_add_acquire(i, v);
2802#elif defined(arch_atomic64_fetch_add_relaxed)
2803 s64 ret = arch_atomic64_fetch_add_relaxed(i, v);
2804 __atomic_acquire_fence();
2805 return ret;
2806#elif defined(arch_atomic64_fetch_add)
2807 return arch_atomic64_fetch_add(i, v);
2808#else
2809#error "Unable to define raw_atomic64_fetch_add_acquire"
2810#endif
2811}
2812
2813/**
2814 * raw_atomic64_fetch_add_release() - atomic add with release ordering
2815 * @i: s64 value to add
2816 * @v: pointer to atomic64_t
2817 *
2818 * Atomically updates @v to (@v + @i) with release ordering.
2819 *
2820 * Safe to use in noinstr code; prefer atomic64_fetch_add_release() elsewhere.
2821 *
2822 * Return: The original value of @v.
2823 */
2824static __always_inline s64
2825raw_atomic64_fetch_add_release(s64 i, atomic64_t *v)
2826{
2827#if defined(arch_atomic64_fetch_add_release)
2828 return arch_atomic64_fetch_add_release(i, v);
2829#elif defined(arch_atomic64_fetch_add_relaxed)
2830 __atomic_release_fence();
2831 return arch_atomic64_fetch_add_relaxed(i, v);
2832#elif defined(arch_atomic64_fetch_add)
2833 return arch_atomic64_fetch_add(i, v);
2834#else
2835#error "Unable to define raw_atomic64_fetch_add_release"
2836#endif
2837}
2838
2839/**
2840 * raw_atomic64_fetch_add_relaxed() - atomic add with relaxed ordering
2841 * @i: s64 value to add
2842 * @v: pointer to atomic64_t
2843 *
2844 * Atomically updates @v to (@v + @i) with relaxed ordering.
2845 *
2846 * Safe to use in noinstr code; prefer atomic64_fetch_add_relaxed() elsewhere.
2847 *
2848 * Return: The original value of @v.
2849 */
2850static __always_inline s64
2851raw_atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
2852{
2853#if defined(arch_atomic64_fetch_add_relaxed)
2854 return arch_atomic64_fetch_add_relaxed(i, v);
2855#elif defined(arch_atomic64_fetch_add)
2856 return arch_atomic64_fetch_add(i, v);
2857#else
2858#error "Unable to define raw_atomic64_fetch_add_relaxed"
2859#endif
2860}
2861
2862/**
2863 * raw_atomic64_sub() - atomic subtract with relaxed ordering
2864 * @i: s64 value to subtract
2865 * @v: pointer to atomic64_t
2866 *
2867 * Atomically updates @v to (@v - @i) with relaxed ordering.
2868 *
2869 * Safe to use in noinstr code; prefer atomic64_sub() elsewhere.
2870 *
2871 * Return: Nothing.
2872 */
2873static __always_inline void
2874raw_atomic64_sub(s64 i, atomic64_t *v)
2875{
2876 arch_atomic64_sub(i, v);
2877}
2878
2879/**
2880 * raw_atomic64_sub_return() - atomic subtract with full ordering
2881 * @i: s64 value to subtract
2882 * @v: pointer to atomic64_t
2883 *
2884 * Atomically updates @v to (@v - @i) with full ordering.
2885 *
2886 * Safe to use in noinstr code; prefer atomic64_sub_return() elsewhere.
2887 *
2888 * Return: The updated value of @v.
2889 */
2890static __always_inline s64
2891raw_atomic64_sub_return(s64 i, atomic64_t *v)
2892{
2893#if defined(arch_atomic64_sub_return)
2894 return arch_atomic64_sub_return(i, v);
2895#elif defined(arch_atomic64_sub_return_relaxed)
2896 s64 ret;
2897 __atomic_pre_full_fence();
2898 ret = arch_atomic64_sub_return_relaxed(i, v);
2899 __atomic_post_full_fence();
2900 return ret;
2901#else
2902#error "Unable to define raw_atomic64_sub_return"
2903#endif
2904}
2905
2906/**
2907 * raw_atomic64_sub_return_acquire() - atomic subtract with acquire ordering
2908 * @i: s64 value to subtract
2909 * @v: pointer to atomic64_t
2910 *
2911 * Atomically updates @v to (@v - @i) with acquire ordering.
2912 *
2913 * Safe to use in noinstr code; prefer atomic64_sub_return_acquire() elsewhere.
2914 *
2915 * Return: The updated value of @v.
2916 */
2917static __always_inline s64
2918raw_atomic64_sub_return_acquire(s64 i, atomic64_t *v)
2919{
2920#if defined(arch_atomic64_sub_return_acquire)
2921 return arch_atomic64_sub_return_acquire(i, v);
2922#elif defined(arch_atomic64_sub_return_relaxed)
2923 s64 ret = arch_atomic64_sub_return_relaxed(i, v);
2924 __atomic_acquire_fence();
2925 return ret;
2926#elif defined(arch_atomic64_sub_return)
2927 return arch_atomic64_sub_return(i, v);
2928#else
2929#error "Unable to define raw_atomic64_sub_return_acquire"
2930#endif
2931}
2932
2933/**
2934 * raw_atomic64_sub_return_release() - atomic subtract with release ordering
2935 * @i: s64 value to subtract
2936 * @v: pointer to atomic64_t
2937 *
2938 * Atomically updates @v to (@v - @i) with release ordering.
2939 *
2940 * Safe to use in noinstr code; prefer atomic64_sub_return_release() elsewhere.
2941 *
2942 * Return: The updated value of @v.
2943 */
2944static __always_inline s64
2945raw_atomic64_sub_return_release(s64 i, atomic64_t *v)
2946{
2947#if defined(arch_atomic64_sub_return_release)
2948 return arch_atomic64_sub_return_release(i, v);
2949#elif defined(arch_atomic64_sub_return_relaxed)
2950 __atomic_release_fence();
2951 return arch_atomic64_sub_return_relaxed(i, v);
2952#elif defined(arch_atomic64_sub_return)
2953 return arch_atomic64_sub_return(i, v);
2954#else
2955#error "Unable to define raw_atomic64_sub_return_release"
2956#endif
2957}
2958
2959/**
2960 * raw_atomic64_sub_return_relaxed() - atomic subtract with relaxed ordering
2961 * @i: s64 value to subtract
2962 * @v: pointer to atomic64_t
2963 *
2964 * Atomically updates @v to (@v - @i) with relaxed ordering.
2965 *
2966 * Safe to use in noinstr code; prefer atomic64_sub_return_relaxed() elsewhere.
2967 *
2968 * Return: The updated value of @v.
2969 */
2970static __always_inline s64
2971raw_atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
2972{
2973#if defined(arch_atomic64_sub_return_relaxed)
2974 return arch_atomic64_sub_return_relaxed(i, v);
2975#elif defined(arch_atomic64_sub_return)
2976 return arch_atomic64_sub_return(i, v);
2977#else
2978#error "Unable to define raw_atomic64_sub_return_relaxed"
2979#endif
2980}
2981
2982/**
2983 * raw_atomic64_fetch_sub() - atomic subtract with full ordering
2984 * @i: s64 value to subtract
2985 * @v: pointer to atomic64_t
2986 *
2987 * Atomically updates @v to (@v - @i) with full ordering.
2988 *
2989 * Safe to use in noinstr code; prefer atomic64_fetch_sub() elsewhere.
2990 *
2991 * Return: The original value of @v.
2992 */
2993static __always_inline s64
2994raw_atomic64_fetch_sub(s64 i, atomic64_t *v)
2995{
2996#if defined(arch_atomic64_fetch_sub)
2997 return arch_atomic64_fetch_sub(i, v);
2998#elif defined(arch_atomic64_fetch_sub_relaxed)
2999 s64 ret;
3000 __atomic_pre_full_fence();
3001 ret = arch_atomic64_fetch_sub_relaxed(i, v);
3002 __atomic_post_full_fence();
3003 return ret;
3004#else
3005#error "Unable to define raw_atomic64_fetch_sub"
3006#endif
3007}
3008
3009/**
3010 * raw_atomic64_fetch_sub_acquire() - atomic subtract with acquire ordering
3011 * @i: s64 value to subtract
3012 * @v: pointer to atomic64_t
3013 *
3014 * Atomically updates @v to (@v - @i) with acquire ordering.
3015 *
3016 * Safe to use in noinstr code; prefer atomic64_fetch_sub_acquire() elsewhere.
3017 *
3018 * Return: The original value of @v.
3019 */
3020static __always_inline s64
3021raw_atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
3022{
3023#if defined(arch_atomic64_fetch_sub_acquire)
3024 return arch_atomic64_fetch_sub_acquire(i, v);
3025#elif defined(arch_atomic64_fetch_sub_relaxed)
3026 s64 ret = arch_atomic64_fetch_sub_relaxed(i, v);
3027 __atomic_acquire_fence();
3028 return ret;
3029#elif defined(arch_atomic64_fetch_sub)
3030 return arch_atomic64_fetch_sub(i, v);
3031#else
3032#error "Unable to define raw_atomic64_fetch_sub_acquire"
3033#endif
3034}
3035
3036/**
3037 * raw_atomic64_fetch_sub_release() - atomic subtract with release ordering
3038 * @i: s64 value to subtract
3039 * @v: pointer to atomic64_t
3040 *
3041 * Atomically updates @v to (@v - @i) with release ordering.
3042 *
3043 * Safe to use in noinstr code; prefer atomic64_fetch_sub_release() elsewhere.
3044 *
3045 * Return: The original value of @v.
3046 */
3047static __always_inline s64
3048raw_atomic64_fetch_sub_release(s64 i, atomic64_t *v)
3049{
3050#if defined(arch_atomic64_fetch_sub_release)
3051 return arch_atomic64_fetch_sub_release(i, v);
3052#elif defined(arch_atomic64_fetch_sub_relaxed)
3053 __atomic_release_fence();
3054 return arch_atomic64_fetch_sub_relaxed(i, v);
3055#elif defined(arch_atomic64_fetch_sub)
3056 return arch_atomic64_fetch_sub(i, v);
3057#else
3058#error "Unable to define raw_atomic64_fetch_sub_release"
3059#endif
3060}
3061
3062/**
3063 * raw_atomic64_fetch_sub_relaxed() - atomic subtract with relaxed ordering
3064 * @i: s64 value to subtract
3065 * @v: pointer to atomic64_t
3066 *
3067 * Atomically updates @v to (@v - @i) with relaxed ordering.
3068 *
3069 * Safe to use in noinstr code; prefer atomic64_fetch_sub_relaxed() elsewhere.
3070 *
3071 * Return: The original value of @v.
3072 */
3073static __always_inline s64
3074raw_atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
3075{
3076#if defined(arch_atomic64_fetch_sub_relaxed)
3077 return arch_atomic64_fetch_sub_relaxed(i, v);
3078#elif defined(arch_atomic64_fetch_sub)
3079 return arch_atomic64_fetch_sub(i, v);
3080#else
3081#error "Unable to define raw_atomic64_fetch_sub_relaxed"
3082#endif
3083}
3084
3085/**
3086 * raw_atomic64_inc() - atomic increment with relaxed ordering
3087 * @v: pointer to atomic64_t
3088 *
3089 * Atomically updates @v to (@v + 1) with relaxed ordering.
3090 *
3091 * Safe to use in noinstr code; prefer atomic64_inc() elsewhere.
3092 *
3093 * Return: Nothing.
3094 */
3095static __always_inline void
3096raw_atomic64_inc(atomic64_t *v)
3097{
3098#if defined(arch_atomic64_inc)
3099 arch_atomic64_inc(v);
3100#else
3101 raw_atomic64_add(1, v);
3102#endif
3103}
3104
3105/**
3106 * raw_atomic64_inc_return() - atomic increment with full ordering
3107 * @v: pointer to atomic64_t
3108 *
3109 * Atomically updates @v to (@v + 1) with full ordering.
3110 *
3111 * Safe to use in noinstr code; prefer atomic64_inc_return() elsewhere.
3112 *
3113 * Return: The updated value of @v.
3114 */
3115static __always_inline s64
3116raw_atomic64_inc_return(atomic64_t *v)
3117{
3118#if defined(arch_atomic64_inc_return)
3119 return arch_atomic64_inc_return(v);
3120#elif defined(arch_atomic64_inc_return_relaxed)
3121 s64 ret;
3122 __atomic_pre_full_fence();
3123 ret = arch_atomic64_inc_return_relaxed(v);
3124 __atomic_post_full_fence();
3125 return ret;
3126#else
3127 return raw_atomic64_add_return(1, v);
3128#endif
3129}
3130
3131/**
3132 * raw_atomic64_inc_return_acquire() - atomic increment with acquire ordering
3133 * @v: pointer to atomic64_t
3134 *
3135 * Atomically updates @v to (@v + 1) with acquire ordering.
3136 *
3137 * Safe to use in noinstr code; prefer atomic64_inc_return_acquire() elsewhere.
3138 *
3139 * Return: The updated value of @v.
3140 */
3141static __always_inline s64
3142raw_atomic64_inc_return_acquire(atomic64_t *v)
3143{
3144#if defined(arch_atomic64_inc_return_acquire)
3145 return arch_atomic64_inc_return_acquire(v);
3146#elif defined(arch_atomic64_inc_return_relaxed)
3147 s64 ret = arch_atomic64_inc_return_relaxed(v);
3148 __atomic_acquire_fence();
3149 return ret;
3150#elif defined(arch_atomic64_inc_return)
3151 return arch_atomic64_inc_return(v);
3152#else
3153 return raw_atomic64_add_return_acquire(1, v);
3154#endif
3155}
3156
3157/**
3158 * raw_atomic64_inc_return_release() - atomic increment with release ordering
3159 * @v: pointer to atomic64_t
3160 *
3161 * Atomically updates @v to (@v + 1) with release ordering.
3162 *
3163 * Safe to use in noinstr code; prefer atomic64_inc_return_release() elsewhere.
3164 *
3165 * Return: The updated value of @v.
3166 */
3167static __always_inline s64
3168raw_atomic64_inc_return_release(atomic64_t *v)
3169{
3170#if defined(arch_atomic64_inc_return_release)
3171 return arch_atomic64_inc_return_release(v);
3172#elif defined(arch_atomic64_inc_return_relaxed)
3173 __atomic_release_fence();
3174 return arch_atomic64_inc_return_relaxed(v);
3175#elif defined(arch_atomic64_inc_return)
3176 return arch_atomic64_inc_return(v);
3177#else
3178 return raw_atomic64_add_return_release(1, v);
3179#endif
3180}
3181
3182/**
3183 * raw_atomic64_inc_return_relaxed() - atomic increment with relaxed ordering
3184 * @v: pointer to atomic64_t
3185 *
3186 * Atomically updates @v to (@v + 1) with relaxed ordering.
3187 *
3188 * Safe to use in noinstr code; prefer atomic64_inc_return_relaxed() elsewhere.
3189 *
3190 * Return: The updated value of @v.
3191 */
3192static __always_inline s64
3193raw_atomic64_inc_return_relaxed(atomic64_t *v)
3194{
3195#if defined(arch_atomic64_inc_return_relaxed)
3196 return arch_atomic64_inc_return_relaxed(v);
3197#elif defined(arch_atomic64_inc_return)
3198 return arch_atomic64_inc_return(v);
3199#else
3200 return raw_atomic64_add_return_relaxed(1, v);
3201#endif
3202}
3203
3204/**
3205 * raw_atomic64_fetch_inc() - atomic increment with full ordering
3206 * @v: pointer to atomic64_t
3207 *
3208 * Atomically updates @v to (@v + 1) with full ordering.
3209 *
3210 * Safe to use in noinstr code; prefer atomic64_fetch_inc() elsewhere.
3211 *
3212 * Return: The original value of @v.
3213 */
3214static __always_inline s64
3215raw_atomic64_fetch_inc(atomic64_t *v)
3216{
3217#if defined(arch_atomic64_fetch_inc)
3218 return arch_atomic64_fetch_inc(v);
3219#elif defined(arch_atomic64_fetch_inc_relaxed)
3220 s64 ret;
3221 __atomic_pre_full_fence();
3222 ret = arch_atomic64_fetch_inc_relaxed(v);
3223 __atomic_post_full_fence();
3224 return ret;
3225#else
3226 return raw_atomic64_fetch_add(1, v);
3227#endif
3228}
3229
3230/**
3231 * raw_atomic64_fetch_inc_acquire() - atomic increment with acquire ordering
3232 * @v: pointer to atomic64_t
3233 *
3234 * Atomically updates @v to (@v + 1) with acquire ordering.
3235 *
3236 * Safe to use in noinstr code; prefer atomic64_fetch_inc_acquire() elsewhere.
3237 *
3238 * Return: The original value of @v.
3239 */
3240static __always_inline s64
3241raw_atomic64_fetch_inc_acquire(atomic64_t *v)
3242{
3243#if defined(arch_atomic64_fetch_inc_acquire)
3244 return arch_atomic64_fetch_inc_acquire(v);
3245#elif defined(arch_atomic64_fetch_inc_relaxed)
3246 s64 ret = arch_atomic64_fetch_inc_relaxed(v);
3247 __atomic_acquire_fence();
3248 return ret;
3249#elif defined(arch_atomic64_fetch_inc)
3250 return arch_atomic64_fetch_inc(v);
3251#else
3252 return raw_atomic64_fetch_add_acquire(1, v);
3253#endif
3254}
3255
3256/**
3257 * raw_atomic64_fetch_inc_release() - atomic increment with release ordering
3258 * @v: pointer to atomic64_t
3259 *
3260 * Atomically updates @v to (@v + 1) with release ordering.
3261 *
3262 * Safe to use in noinstr code; prefer atomic64_fetch_inc_release() elsewhere.
3263 *
3264 * Return: The original value of @v.
3265 */
3266static __always_inline s64
3267raw_atomic64_fetch_inc_release(atomic64_t *v)
3268{
3269#if defined(arch_atomic64_fetch_inc_release)
3270 return arch_atomic64_fetch_inc_release(v);
3271#elif defined(arch_atomic64_fetch_inc_relaxed)
3272 __atomic_release_fence();
3273 return arch_atomic64_fetch_inc_relaxed(v);
3274#elif defined(arch_atomic64_fetch_inc)
3275 return arch_atomic64_fetch_inc(v);
3276#else
3277 return raw_atomic64_fetch_add_release(1, v);
3278#endif
3279}
3280
3281/**
3282 * raw_atomic64_fetch_inc_relaxed() - atomic increment with relaxed ordering
3283 * @v: pointer to atomic64_t
3284 *
3285 * Atomically updates @v to (@v + 1) with relaxed ordering.
3286 *
3287 * Safe to use in noinstr code; prefer atomic64_fetch_inc_relaxed() elsewhere.
3288 *
3289 * Return: The original value of @v.
3290 */
3291static __always_inline s64
3292raw_atomic64_fetch_inc_relaxed(atomic64_t *v)
3293{
3294#if defined(arch_atomic64_fetch_inc_relaxed)
3295 return arch_atomic64_fetch_inc_relaxed(v);
3296#elif defined(arch_atomic64_fetch_inc)
3297 return arch_atomic64_fetch_inc(v);
3298#else
3299 return raw_atomic64_fetch_add_relaxed(1, v);
3300#endif
3301}
3302
3303/**
3304 * raw_atomic64_dec() - atomic decrement with relaxed ordering
3305 * @v: pointer to atomic64_t
3306 *
3307 * Atomically updates @v to (@v - 1) with relaxed ordering.
3308 *
3309 * Safe to use in noinstr code; prefer atomic64_dec() elsewhere.
3310 *
3311 * Return: Nothing.
3312 */
3313static __always_inline void
3314raw_atomic64_dec(atomic64_t *v)
3315{
3316#if defined(arch_atomic64_dec)
3317 arch_atomic64_dec(v);
3318#else
3319 raw_atomic64_sub(1, v);
3320#endif
3321}
3322
3323/**
3324 * raw_atomic64_dec_return() - atomic decrement with full ordering
3325 * @v: pointer to atomic64_t
3326 *
3327 * Atomically updates @v to (@v - 1) with full ordering.
3328 *
3329 * Safe to use in noinstr code; prefer atomic64_dec_return() elsewhere.
3330 *
3331 * Return: The updated value of @v.
3332 */
3333static __always_inline s64
3334raw_atomic64_dec_return(atomic64_t *v)
3335{
3336#if defined(arch_atomic64_dec_return)
3337 return arch_atomic64_dec_return(v);
3338#elif defined(arch_atomic64_dec_return_relaxed)
3339 s64 ret;
3340 __atomic_pre_full_fence();
3341 ret = arch_atomic64_dec_return_relaxed(v);
3342 __atomic_post_full_fence();
3343 return ret;
3344#else
3345 return raw_atomic64_sub_return(1, v);
3346#endif
3347}
3348
3349/**
3350 * raw_atomic64_dec_return_acquire() - atomic decrement with acquire ordering
3351 * @v: pointer to atomic64_t
3352 *
3353 * Atomically updates @v to (@v - 1) with acquire ordering.
3354 *
3355 * Safe to use in noinstr code; prefer atomic64_dec_return_acquire() elsewhere.
3356 *
3357 * Return: The updated value of @v.
3358 */
3359static __always_inline s64
3360raw_atomic64_dec_return_acquire(atomic64_t *v)
3361{
3362#if defined(arch_atomic64_dec_return_acquire)
3363 return arch_atomic64_dec_return_acquire(v);
3364#elif defined(arch_atomic64_dec_return_relaxed)
3365 s64 ret = arch_atomic64_dec_return_relaxed(v);
3366 __atomic_acquire_fence();
3367 return ret;
3368#elif defined(arch_atomic64_dec_return)
3369 return arch_atomic64_dec_return(v);
3370#else
3371 return raw_atomic64_sub_return_acquire(1, v);
3372#endif
3373}
3374
3375/**
3376 * raw_atomic64_dec_return_release() - atomic decrement with release ordering
3377 * @v: pointer to atomic64_t
3378 *
3379 * Atomically updates @v to (@v - 1) with release ordering.
3380 *
3381 * Safe to use in noinstr code; prefer atomic64_dec_return_release() elsewhere.
3382 *
3383 * Return: The updated value of @v.
3384 */
3385static __always_inline s64
3386raw_atomic64_dec_return_release(atomic64_t *v)
3387{
3388#if defined(arch_atomic64_dec_return_release)
3389 return arch_atomic64_dec_return_release(v);
3390#elif defined(arch_atomic64_dec_return_relaxed)
3391 __atomic_release_fence();
3392 return arch_atomic64_dec_return_relaxed(v);
3393#elif defined(arch_atomic64_dec_return)
3394 return arch_atomic64_dec_return(v);
3395#else
3396 return raw_atomic64_sub_return_release(1, v);
3397#endif
3398}
3399
3400/**
3401 * raw_atomic64_dec_return_relaxed() - atomic decrement with relaxed ordering
3402 * @v: pointer to atomic64_t
3403 *
3404 * Atomically updates @v to (@v - 1) with relaxed ordering.
3405 *
3406 * Safe to use in noinstr code; prefer atomic64_dec_return_relaxed() elsewhere.
3407 *
3408 * Return: The updated value of @v.
3409 */
3410static __always_inline s64
3411raw_atomic64_dec_return_relaxed(atomic64_t *v)
3412{
3413#if defined(arch_atomic64_dec_return_relaxed)
3414 return arch_atomic64_dec_return_relaxed(v);
3415#elif defined(arch_atomic64_dec_return)
3416 return arch_atomic64_dec_return(v);
3417#else
3418 return raw_atomic64_sub_return_relaxed(1, v);
3419#endif
3420}
3421
3422/**
3423 * raw_atomic64_fetch_dec() - atomic decrement with full ordering
3424 * @v: pointer to atomic64_t
3425 *
3426 * Atomically updates @v to (@v - 1) with full ordering.
3427 *
3428 * Safe to use in noinstr code; prefer atomic64_fetch_dec() elsewhere.
3429 *
3430 * Return: The original value of @v.
3431 */
3432static __always_inline s64
3433raw_atomic64_fetch_dec(atomic64_t *v)
3434{
3435#if defined(arch_atomic64_fetch_dec)
3436 return arch_atomic64_fetch_dec(v);
3437#elif defined(arch_atomic64_fetch_dec_relaxed)
3438 s64 ret;
3439 __atomic_pre_full_fence();
3440 ret = arch_atomic64_fetch_dec_relaxed(v);
3441 __atomic_post_full_fence();
3442 return ret;
3443#else
3444 return raw_atomic64_fetch_sub(1, v);
3445#endif
3446}
3447
3448/**
3449 * raw_atomic64_fetch_dec_acquire() - atomic decrement with acquire ordering
3450 * @v: pointer to atomic64_t
3451 *
3452 * Atomically updates @v to (@v - 1) with acquire ordering.
3453 *
3454 * Safe to use in noinstr code; prefer atomic64_fetch_dec_acquire() elsewhere.
3455 *
3456 * Return: The original value of @v.
3457 */
3458static __always_inline s64
3459raw_atomic64_fetch_dec_acquire(atomic64_t *v)
3460{
3461#if defined(arch_atomic64_fetch_dec_acquire)
3462 return arch_atomic64_fetch_dec_acquire(v);
3463#elif defined(arch_atomic64_fetch_dec_relaxed)
3464 s64 ret = arch_atomic64_fetch_dec_relaxed(v);
3465 __atomic_acquire_fence();
3466 return ret;
3467#elif defined(arch_atomic64_fetch_dec)
3468 return arch_atomic64_fetch_dec(v);
3469#else
3470 return raw_atomic64_fetch_sub_acquire(1, v);
3471#endif
3472}
3473
3474/**
3475 * raw_atomic64_fetch_dec_release() - atomic decrement with release ordering
3476 * @v: pointer to atomic64_t
3477 *
3478 * Atomically updates @v to (@v - 1) with release ordering.
3479 *
3480 * Safe to use in noinstr code; prefer atomic64_fetch_dec_release() elsewhere.
3481 *
3482 * Return: The original value of @v.
3483 */
3484static __always_inline s64
3485raw_atomic64_fetch_dec_release(atomic64_t *v)
3486{
3487#if defined(arch_atomic64_fetch_dec_release)
3488 return arch_atomic64_fetch_dec_release(v);
3489#elif defined(arch_atomic64_fetch_dec_relaxed)
3490 __atomic_release_fence();
3491 return arch_atomic64_fetch_dec_relaxed(v);
3492#elif defined(arch_atomic64_fetch_dec)
3493 return arch_atomic64_fetch_dec(v);
3494#else
3495 return raw_atomic64_fetch_sub_release(1, v);
3496#endif
3497}
3498
3499/**
3500 * raw_atomic64_fetch_dec_relaxed() - atomic decrement with relaxed ordering
3501 * @v: pointer to atomic64_t
3502 *
3503 * Atomically updates @v to (@v - 1) with relaxed ordering.
3504 *
3505 * Safe to use in noinstr code; prefer atomic64_fetch_dec_relaxed() elsewhere.
3506 *
3507 * Return: The original value of @v.
3508 */
3509static __always_inline s64
3510raw_atomic64_fetch_dec_relaxed(atomic64_t *v)
3511{
3512#if defined(arch_atomic64_fetch_dec_relaxed)
3513 return arch_atomic64_fetch_dec_relaxed(v);
3514#elif defined(arch_atomic64_fetch_dec)
3515 return arch_atomic64_fetch_dec(v);
3516#else
3517 return raw_atomic64_fetch_sub_relaxed(1, v);
3518#endif
3519}
3520
3521/**
3522 * raw_atomic64_and() - atomic bitwise AND with relaxed ordering
3523 * @i: s64 value
3524 * @v: pointer to atomic64_t
3525 *
3526 * Atomically updates @v to (@v & @i) with relaxed ordering.
3527 *
3528 * Safe to use in noinstr code; prefer atomic64_and() elsewhere.
3529 *
3530 * Return: Nothing.
3531 */
3532static __always_inline void
3533raw_atomic64_and(s64 i, atomic64_t *v)
3534{
3535 arch_atomic64_and(i, v);
3536}
3537
3538/**
3539 * raw_atomic64_fetch_and() - atomic bitwise AND with full ordering
3540 * @i: s64 value
3541 * @v: pointer to atomic64_t
3542 *
3543 * Atomically updates @v to (@v & @i) with full ordering.
3544 *
3545 * Safe to use in noinstr code; prefer atomic64_fetch_and() elsewhere.
3546 *
3547 * Return: The original value of @v.
3548 */
3549static __always_inline s64
3550raw_atomic64_fetch_and(s64 i, atomic64_t *v)
3551{
3552#if defined(arch_atomic64_fetch_and)
3553 return arch_atomic64_fetch_and(i, v);
3554#elif defined(arch_atomic64_fetch_and_relaxed)
3555 s64 ret;
3556 __atomic_pre_full_fence();
3557 ret = arch_atomic64_fetch_and_relaxed(i, v);
3558 __atomic_post_full_fence();
3559 return ret;
3560#else
3561#error "Unable to define raw_atomic64_fetch_and"
3562#endif
3563}
3564
3565/**
3566 * raw_atomic64_fetch_and_acquire() - atomic bitwise AND with acquire ordering
3567 * @i: s64 value
3568 * @v: pointer to atomic64_t
3569 *
3570 * Atomically updates @v to (@v & @i) with acquire ordering.
3571 *
3572 * Safe to use in noinstr code; prefer atomic64_fetch_and_acquire() elsewhere.
3573 *
3574 * Return: The original value of @v.
3575 */
3576static __always_inline s64
3577raw_atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
3578{
3579#if defined(arch_atomic64_fetch_and_acquire)
3580 return arch_atomic64_fetch_and_acquire(i, v);
3581#elif defined(arch_atomic64_fetch_and_relaxed)
3582 s64 ret = arch_atomic64_fetch_and_relaxed(i, v);
3583 __atomic_acquire_fence();
3584 return ret;
3585#elif defined(arch_atomic64_fetch_and)
3586 return arch_atomic64_fetch_and(i, v);
3587#else
3588#error "Unable to define raw_atomic64_fetch_and_acquire"
3589#endif
3590}
3591
3592/**
3593 * raw_atomic64_fetch_and_release() - atomic bitwise AND with release ordering
3594 * @i: s64 value
3595 * @v: pointer to atomic64_t
3596 *
3597 * Atomically updates @v to (@v & @i) with release ordering.
3598 *
3599 * Safe to use in noinstr code; prefer atomic64_fetch_and_release() elsewhere.
3600 *
3601 * Return: The original value of @v.
3602 */
3603static __always_inline s64
3604raw_atomic64_fetch_and_release(s64 i, atomic64_t *v)
3605{
3606#if defined(arch_atomic64_fetch_and_release)
3607 return arch_atomic64_fetch_and_release(i, v);
3608#elif defined(arch_atomic64_fetch_and_relaxed)
3609 __atomic_release_fence();
3610 return arch_atomic64_fetch_and_relaxed(i, v);
3611#elif defined(arch_atomic64_fetch_and)
3612 return arch_atomic64_fetch_and(i, v);
3613#else
3614#error "Unable to define raw_atomic64_fetch_and_release"
3615#endif
3616}
3617
3618/**
3619 * raw_atomic64_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
3620 * @i: s64 value
3621 * @v: pointer to atomic64_t
3622 *
3623 * Atomically updates @v to (@v & @i) with relaxed ordering.
3624 *
3625 * Safe to use in noinstr code; prefer atomic64_fetch_and_relaxed() elsewhere.
3626 *
3627 * Return: The original value of @v.
3628 */
3629static __always_inline s64
3630raw_atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
3631{
3632#if defined(arch_atomic64_fetch_and_relaxed)
3633 return arch_atomic64_fetch_and_relaxed(i, v);
3634#elif defined(arch_atomic64_fetch_and)
3635 return arch_atomic64_fetch_and(i, v);
3636#else
3637#error "Unable to define raw_atomic64_fetch_and_relaxed"
3638#endif
3639}
3640
3641/**
3642 * raw_atomic64_andnot() - atomic bitwise AND NOT with relaxed ordering
3643 * @i: s64 value
3644 * @v: pointer to atomic64_t
3645 *
3646 * Atomically updates @v to (@v & ~@i) with relaxed ordering.
3647 *
3648 * Safe to use in noinstr code; prefer atomic64_andnot() elsewhere.
3649 *
3650 * Return: Nothing.
3651 */
3652static __always_inline void
3653raw_atomic64_andnot(s64 i, atomic64_t *v)
3654{
3655#if defined(arch_atomic64_andnot)
3656 arch_atomic64_andnot(i, v);
3657#else
3658 raw_atomic64_and(~i, v);
3659#endif
3660}
3661
3662/**
3663 * raw_atomic64_fetch_andnot() - atomic bitwise AND NOT with full ordering
3664 * @i: s64 value
3665 * @v: pointer to atomic64_t
3666 *
3667 * Atomically updates @v to (@v & ~@i) with full ordering.
3668 *
3669 * Safe to use in noinstr code; prefer atomic64_fetch_andnot() elsewhere.
3670 *
3671 * Return: The original value of @v.
3672 */
3673static __always_inline s64
3674raw_atomic64_fetch_andnot(s64 i, atomic64_t *v)
3675{
3676#if defined(arch_atomic64_fetch_andnot)
3677 return arch_atomic64_fetch_andnot(i, v);
3678#elif defined(arch_atomic64_fetch_andnot_relaxed)
3679 s64 ret;
3680 __atomic_pre_full_fence();
3681 ret = arch_atomic64_fetch_andnot_relaxed(i, v);
3682 __atomic_post_full_fence();
3683 return ret;
3684#else
3685 return raw_atomic64_fetch_and(~i, v);
3686#endif
3687}
3688
3689/**
3690 * raw_atomic64_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
3691 * @i: s64 value
3692 * @v: pointer to atomic64_t
3693 *
3694 * Atomically updates @v to (@v & ~@i) with acquire ordering.
3695 *
3696 * Safe to use in noinstr code; prefer atomic64_fetch_andnot_acquire() elsewhere.
3697 *
3698 * Return: The original value of @v.
3699 */
3700static __always_inline s64
3701raw_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
3702{
3703#if defined(arch_atomic64_fetch_andnot_acquire)
3704 return arch_atomic64_fetch_andnot_acquire(i, v);
3705#elif defined(arch_atomic64_fetch_andnot_relaxed)
3706 s64 ret = arch_atomic64_fetch_andnot_relaxed(i, v);
3707 __atomic_acquire_fence();
3708 return ret;
3709#elif defined(arch_atomic64_fetch_andnot)
3710 return arch_atomic64_fetch_andnot(i, v);
3711#else
3712 return raw_atomic64_fetch_and_acquire(~i, v);
3713#endif
3714}
3715
3716/**
3717 * raw_atomic64_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
3718 * @i: s64 value
3719 * @v: pointer to atomic64_t
3720 *
3721 * Atomically updates @v to (@v & ~@i) with release ordering.
3722 *
3723 * Safe to use in noinstr code; prefer atomic64_fetch_andnot_release() elsewhere.
3724 *
3725 * Return: The original value of @v.
3726 */
3727static __always_inline s64
3728raw_atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
3729{
3730#if defined(arch_atomic64_fetch_andnot_release)
3731 return arch_atomic64_fetch_andnot_release(i, v);
3732#elif defined(arch_atomic64_fetch_andnot_relaxed)
3733 __atomic_release_fence();
3734 return arch_atomic64_fetch_andnot_relaxed(i, v);
3735#elif defined(arch_atomic64_fetch_andnot)
3736 return arch_atomic64_fetch_andnot(i, v);
3737#else
3738 return raw_atomic64_fetch_and_release(~i, v);
3739#endif
3740}
3741
3742/**
3743 * raw_atomic64_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
3744 * @i: s64 value
3745 * @v: pointer to atomic64_t
3746 *
3747 * Atomically updates @v to (@v & ~@i) with relaxed ordering.
3748 *
3749 * Safe to use in noinstr code; prefer atomic64_fetch_andnot_relaxed() elsewhere.
3750 *
3751 * Return: The original value of @v.
3752 */
3753static __always_inline s64
3754raw_atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
3755{
3756#if defined(arch_atomic64_fetch_andnot_relaxed)
3757 return arch_atomic64_fetch_andnot_relaxed(i, v);
3758#elif defined(arch_atomic64_fetch_andnot)
3759 return arch_atomic64_fetch_andnot(i, v);
3760#else
3761 return raw_atomic64_fetch_and_relaxed(~i, v);
3762#endif
3763}
3764
3765/**
3766 * raw_atomic64_or() - atomic bitwise OR with relaxed ordering
3767 * @i: s64 value
3768 * @v: pointer to atomic64_t
3769 *
3770 * Atomically updates @v to (@v | @i) with relaxed ordering.
3771 *
3772 * Safe to use in noinstr code; prefer atomic64_or() elsewhere.
3773 *
3774 * Return: Nothing.
3775 */
3776static __always_inline void
3777raw_atomic64_or(s64 i, atomic64_t *v)
3778{
3779 arch_atomic64_or(i, v);
3780}
3781
3782/**
3783 * raw_atomic64_fetch_or() - atomic bitwise OR with full ordering
3784 * @i: s64 value
3785 * @v: pointer to atomic64_t
3786 *
3787 * Atomically updates @v to (@v | @i) with full ordering.
3788 *
3789 * Safe to use in noinstr code; prefer atomic64_fetch_or() elsewhere.
3790 *
3791 * Return: The original value of @v.
3792 */
3793static __always_inline s64
3794raw_atomic64_fetch_or(s64 i, atomic64_t *v)
3795{
3796#if defined(arch_atomic64_fetch_or)
3797 return arch_atomic64_fetch_or(i, v);
3798#elif defined(arch_atomic64_fetch_or_relaxed)
3799 s64 ret;
3800 __atomic_pre_full_fence();
3801 ret = arch_atomic64_fetch_or_relaxed(i, v);
3802 __atomic_post_full_fence();
3803 return ret;
3804#else
3805#error "Unable to define raw_atomic64_fetch_or"
3806#endif
3807}
3808
3809/**
3810 * raw_atomic64_fetch_or_acquire() - atomic bitwise OR with acquire ordering
3811 * @i: s64 value
3812 * @v: pointer to atomic64_t
3813 *
3814 * Atomically updates @v to (@v | @i) with acquire ordering.
3815 *
3816 * Safe to use in noinstr code; prefer atomic64_fetch_or_acquire() elsewhere.
3817 *
3818 * Return: The original value of @v.
3819 */
3820static __always_inline s64
3821raw_atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
3822{
3823#if defined(arch_atomic64_fetch_or_acquire)
3824 return arch_atomic64_fetch_or_acquire(i, v);
3825#elif defined(arch_atomic64_fetch_or_relaxed)
3826 s64 ret = arch_atomic64_fetch_or_relaxed(i, v);
3827 __atomic_acquire_fence();
3828 return ret;
3829#elif defined(arch_atomic64_fetch_or)
3830 return arch_atomic64_fetch_or(i, v);
3831#else
3832#error "Unable to define raw_atomic64_fetch_or_acquire"
3833#endif
3834}
3835
3836/**
3837 * raw_atomic64_fetch_or_release() - atomic bitwise OR with release ordering
3838 * @i: s64 value
3839 * @v: pointer to atomic64_t
3840 *
3841 * Atomically updates @v to (@v | @i) with release ordering.
3842 *
3843 * Safe to use in noinstr code; prefer atomic64_fetch_or_release() elsewhere.
3844 *
3845 * Return: The original value of @v.
3846 */
3847static __always_inline s64
3848raw_atomic64_fetch_or_release(s64 i, atomic64_t *v)
3849{
3850#if defined(arch_atomic64_fetch_or_release)
3851 return arch_atomic64_fetch_or_release(i, v);
3852#elif defined(arch_atomic64_fetch_or_relaxed)
3853 __atomic_release_fence();
3854 return arch_atomic64_fetch_or_relaxed(i, v);
3855#elif defined(arch_atomic64_fetch_or)
3856 return arch_atomic64_fetch_or(i, v);
3857#else
3858#error "Unable to define raw_atomic64_fetch_or_release"
3859#endif
3860}
3861
3862/**
3863 * raw_atomic64_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
3864 * @i: s64 value
3865 * @v: pointer to atomic64_t
3866 *
3867 * Atomically updates @v to (@v | @i) with relaxed ordering.
3868 *
3869 * Safe to use in noinstr code; prefer atomic64_fetch_or_relaxed() elsewhere.
3870 *
3871 * Return: The original value of @v.
3872 */
3873static __always_inline s64
3874raw_atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
3875{
3876#if defined(arch_atomic64_fetch_or_relaxed)
3877 return arch_atomic64_fetch_or_relaxed(i, v);
3878#elif defined(arch_atomic64_fetch_or)
3879 return arch_atomic64_fetch_or(i, v);
3880#else
3881#error "Unable to define raw_atomic64_fetch_or_relaxed"
3882#endif
3883}
3884
3885/**
3886 * raw_atomic64_xor() - atomic bitwise XOR with relaxed ordering
3887 * @i: s64 value
3888 * @v: pointer to atomic64_t
3889 *
3890 * Atomically updates @v to (@v ^ @i) with relaxed ordering.
3891 *
3892 * Safe to use in noinstr code; prefer atomic64_xor() elsewhere.
3893 *
3894 * Return: Nothing.
3895 */
3896static __always_inline void
3897raw_atomic64_xor(s64 i, atomic64_t *v)
3898{
3899 arch_atomic64_xor(i, v);
3900}
3901
3902/**
3903 * raw_atomic64_fetch_xor() - atomic bitwise XOR with full ordering
3904 * @i: s64 value
3905 * @v: pointer to atomic64_t
3906 *
3907 * Atomically updates @v to (@v ^ @i) with full ordering.
3908 *
3909 * Safe to use in noinstr code; prefer atomic64_fetch_xor() elsewhere.
3910 *
3911 * Return: The original value of @v.
3912 */
3913static __always_inline s64
3914raw_atomic64_fetch_xor(s64 i, atomic64_t *v)
3915{
3916#if defined(arch_atomic64_fetch_xor)
3917 return arch_atomic64_fetch_xor(i, v);
3918#elif defined(arch_atomic64_fetch_xor_relaxed)
3919 s64 ret;
3920 __atomic_pre_full_fence();
3921 ret = arch_atomic64_fetch_xor_relaxed(i, v);
3922 __atomic_post_full_fence();
3923 return ret;
3924#else
3925#error "Unable to define raw_atomic64_fetch_xor"
3926#endif
3927}
3928
3929/**
3930 * raw_atomic64_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
3931 * @i: s64 value
3932 * @v: pointer to atomic64_t
3933 *
3934 * Atomically updates @v to (@v ^ @i) with acquire ordering.
3935 *
3936 * Safe to use in noinstr code; prefer atomic64_fetch_xor_acquire() elsewhere.
3937 *
3938 * Return: The original value of @v.
3939 */
3940static __always_inline s64
3941raw_atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
3942{
3943#if defined(arch_atomic64_fetch_xor_acquire)
3944 return arch_atomic64_fetch_xor_acquire(i, v);
3945#elif defined(arch_atomic64_fetch_xor_relaxed)
3946 s64 ret = arch_atomic64_fetch_xor_relaxed(i, v);
3947 __atomic_acquire_fence();
3948 return ret;
3949#elif defined(arch_atomic64_fetch_xor)
3950 return arch_atomic64_fetch_xor(i, v);
3951#else
3952#error "Unable to define raw_atomic64_fetch_xor_acquire"
3953#endif
3954}
3955
3956/**
3957 * raw_atomic64_fetch_xor_release() - atomic bitwise XOR with release ordering
3958 * @i: s64 value
3959 * @v: pointer to atomic64_t
3960 *
3961 * Atomically updates @v to (@v ^ @i) with release ordering.
3962 *
3963 * Safe to use in noinstr code; prefer atomic64_fetch_xor_release() elsewhere.
3964 *
3965 * Return: The original value of @v.
3966 */
3967static __always_inline s64
3968raw_atomic64_fetch_xor_release(s64 i, atomic64_t *v)
3969{
3970#if defined(arch_atomic64_fetch_xor_release)
3971 return arch_atomic64_fetch_xor_release(i, v);
3972#elif defined(arch_atomic64_fetch_xor_relaxed)
3973 __atomic_release_fence();
3974 return arch_atomic64_fetch_xor_relaxed(i, v);
3975#elif defined(arch_atomic64_fetch_xor)
3976 return arch_atomic64_fetch_xor(i, v);
3977#else
3978#error "Unable to define raw_atomic64_fetch_xor_release"
3979#endif
3980}
3981
3982/**
3983 * raw_atomic64_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
3984 * @i: s64 value
3985 * @v: pointer to atomic64_t
3986 *
3987 * Atomically updates @v to (@v ^ @i) with relaxed ordering.
3988 *
3989 * Safe to use in noinstr code; prefer atomic64_fetch_xor_relaxed() elsewhere.
3990 *
3991 * Return: The original value of @v.
3992 */
3993static __always_inline s64
3994raw_atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
3995{
3996#if defined(arch_atomic64_fetch_xor_relaxed)
3997 return arch_atomic64_fetch_xor_relaxed(i, v);
3998#elif defined(arch_atomic64_fetch_xor)
3999 return arch_atomic64_fetch_xor(i, v);
4000#else
4001#error "Unable to define raw_atomic64_fetch_xor_relaxed"
4002#endif
4003}
4004
4005/**
4006 * raw_atomic64_xchg() - atomic exchange with full ordering
4007 * @v: pointer to atomic64_t
4008 * @new: s64 value to assign
4009 *
4010 * Atomically updates @v to @new with full ordering.
4011 *
4012 * Safe to use in noinstr code; prefer atomic64_xchg() elsewhere.
4013 *
4014 * Return: The original value of @v.
4015 */
4016static __always_inline s64
4017raw_atomic64_xchg(atomic64_t *v, s64 new)
4018{
4019#if defined(arch_atomic64_xchg)
4020 return arch_atomic64_xchg(v, new);
4021#elif defined(arch_atomic64_xchg_relaxed)
4022 s64 ret;
4023 __atomic_pre_full_fence();
4024 ret = arch_atomic64_xchg_relaxed(v, new);
4025 __atomic_post_full_fence();
4026 return ret;
4027#else
4028 return raw_xchg(&v->counter, new);
4029#endif
4030}
4031
4032/**
4033 * raw_atomic64_xchg_acquire() - atomic exchange with acquire ordering
4034 * @v: pointer to atomic64_t
4035 * @new: s64 value to assign
4036 *
4037 * Atomically updates @v to @new with acquire ordering.
4038 *
4039 * Safe to use in noinstr code; prefer atomic64_xchg_acquire() elsewhere.
4040 *
4041 * Return: The original value of @v.
4042 */
4043static __always_inline s64
4044raw_atomic64_xchg_acquire(atomic64_t *v, s64 new)
4045{
4046#if defined(arch_atomic64_xchg_acquire)
4047 return arch_atomic64_xchg_acquire(v, new);
4048#elif defined(arch_atomic64_xchg_relaxed)
4049 s64 ret = arch_atomic64_xchg_relaxed(v, new);
4050 __atomic_acquire_fence();
4051 return ret;
4052#elif defined(arch_atomic64_xchg)
4053 return arch_atomic64_xchg(v, new);
4054#else
4055 return raw_xchg_acquire(&v->counter, new);
4056#endif
4057}
4058
4059/**
4060 * raw_atomic64_xchg_release() - atomic exchange with release ordering
4061 * @v: pointer to atomic64_t
4062 * @new: s64 value to assign
4063 *
4064 * Atomically updates @v to @new with release ordering.
4065 *
4066 * Safe to use in noinstr code; prefer atomic64_xchg_release() elsewhere.
4067 *
4068 * Return: The original value of @v.
4069 */
4070static __always_inline s64
4071raw_atomic64_xchg_release(atomic64_t *v, s64 new)
4072{
4073#if defined(arch_atomic64_xchg_release)
4074 return arch_atomic64_xchg_release(v, new);
4075#elif defined(arch_atomic64_xchg_relaxed)
4076 __atomic_release_fence();
4077 return arch_atomic64_xchg_relaxed(v, new);
4078#elif defined(arch_atomic64_xchg)
4079 return arch_atomic64_xchg(v, new);
4080#else
4081 return raw_xchg_release(&v->counter, new);
4082#endif
4083}
4084
4085/**
4086 * raw_atomic64_xchg_relaxed() - atomic exchange with relaxed ordering
4087 * @v: pointer to atomic64_t
4088 * @new: s64 value to assign
4089 *
4090 * Atomically updates @v to @new with relaxed ordering.
4091 *
4092 * Safe to use in noinstr code; prefer atomic64_xchg_relaxed() elsewhere.
4093 *
4094 * Return: The original value of @v.
4095 */
4096static __always_inline s64
4097raw_atomic64_xchg_relaxed(atomic64_t *v, s64 new)
4098{
4099#if defined(arch_atomic64_xchg_relaxed)
4100 return arch_atomic64_xchg_relaxed(v, new);
4101#elif defined(arch_atomic64_xchg)
4102 return arch_atomic64_xchg(v, new);
4103#else
4104 return raw_xchg_relaxed(&v->counter, new);
4105#endif
4106}
4107
4108/**
4109 * raw_atomic64_cmpxchg() - atomic compare and exchange with full ordering
4110 * @v: pointer to atomic64_t
4111 * @old: s64 value to compare with
4112 * @new: s64 value to assign
4113 *
4114 * If (@v == @old), atomically updates @v to @new with full ordering.
4115 *
4116 * Safe to use in noinstr code; prefer atomic64_cmpxchg() elsewhere.
4117 *
4118 * Return: The original value of @v.
4119 */
4120static __always_inline s64
4121raw_atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
4122{
4123#if defined(arch_atomic64_cmpxchg)
4124 return arch_atomic64_cmpxchg(v, old, new);
4125#elif defined(arch_atomic64_cmpxchg_relaxed)
4126 s64 ret;
4127 __atomic_pre_full_fence();
4128 ret = arch_atomic64_cmpxchg_relaxed(v, old, new);
4129 __atomic_post_full_fence();
4130 return ret;
4131#else
4132 return raw_cmpxchg(&v->counter, old, new);
4133#endif
4134}
4135
4136/**
4137 * raw_atomic64_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4138 * @v: pointer to atomic64_t
4139 * @old: s64 value to compare with
4140 * @new: s64 value to assign
4141 *
4142 * If (@v == @old), atomically updates @v to @new with acquire ordering.
4143 *
4144 * Safe to use in noinstr code; prefer atomic64_cmpxchg_acquire() elsewhere.
4145 *
4146 * Return: The original value of @v.
4147 */
4148static __always_inline s64
4149raw_atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
4150{
4151#if defined(arch_atomic64_cmpxchg_acquire)
4152 return arch_atomic64_cmpxchg_acquire(v, old, new);
4153#elif defined(arch_atomic64_cmpxchg_relaxed)
4154 s64 ret = arch_atomic64_cmpxchg_relaxed(v, old, new);
4155 __atomic_acquire_fence();
4156 return ret;
4157#elif defined(arch_atomic64_cmpxchg)
4158 return arch_atomic64_cmpxchg(v, old, new);
4159#else
4160 return raw_cmpxchg_acquire(&v->counter, old, new);
4161#endif
4162}
4163
4164/**
4165 * raw_atomic64_cmpxchg_release() - atomic compare and exchange with release ordering
4166 * @v: pointer to atomic64_t
4167 * @old: s64 value to compare with
4168 * @new: s64 value to assign
4169 *
4170 * If (@v == @old), atomically updates @v to @new with release ordering.
4171 *
4172 * Safe to use in noinstr code; prefer atomic64_cmpxchg_release() elsewhere.
4173 *
4174 * Return: The original value of @v.
4175 */
4176static __always_inline s64
4177raw_atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
4178{
4179#if defined(arch_atomic64_cmpxchg_release)
4180 return arch_atomic64_cmpxchg_release(v, old, new);
4181#elif defined(arch_atomic64_cmpxchg_relaxed)
4182 __atomic_release_fence();
4183 return arch_atomic64_cmpxchg_relaxed(v, old, new);
4184#elif defined(arch_atomic64_cmpxchg)
4185 return arch_atomic64_cmpxchg(v, old, new);
4186#else
4187 return raw_cmpxchg_release(&v->counter, old, new);
4188#endif
4189}
4190
4191/**
4192 * raw_atomic64_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4193 * @v: pointer to atomic64_t
4194 * @old: s64 value to compare with
4195 * @new: s64 value to assign
4196 *
4197 * If (@v == @old), atomically updates @v to @new with relaxed ordering.
4198 *
4199 * Safe to use in noinstr code; prefer atomic64_cmpxchg_relaxed() elsewhere.
4200 *
4201 * Return: The original value of @v.
4202 */
4203static __always_inline s64
4204raw_atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
4205{
4206#if defined(arch_atomic64_cmpxchg_relaxed)
4207 return arch_atomic64_cmpxchg_relaxed(v, old, new);
4208#elif defined(arch_atomic64_cmpxchg)
4209 return arch_atomic64_cmpxchg(v, old, new);
4210#else
4211 return raw_cmpxchg_relaxed(&v->counter, old, new);
4212#endif
4213}
4214
4215/**
4216 * raw_atomic64_try_cmpxchg() - atomic compare and exchange with full ordering
4217 * @v: pointer to atomic64_t
4218 * @old: pointer to s64 value to compare with
4219 * @new: s64 value to assign
4220 *
4221 * If (@v == @old), atomically updates @v to @new with full ordering.
4222 * Otherwise, updates @old to the current value of @v.
4223 *
4224 * Safe to use in noinstr code; prefer atomic64_try_cmpxchg() elsewhere.
4225 *
4226 * Return: @true if the exchange occured, @false otherwise.
4227 */
4228static __always_inline bool
4229raw_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
4230{
4231#if defined(arch_atomic64_try_cmpxchg)
4232 return arch_atomic64_try_cmpxchg(v, old, new);
4233#elif defined(arch_atomic64_try_cmpxchg_relaxed)
4234 bool ret;
4235 __atomic_pre_full_fence();
4236 ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new);
4237 __atomic_post_full_fence();
4238 return ret;
4239#else
4240 s64 r, o = *old;
4241 r = raw_atomic64_cmpxchg(v, o, new);
4242 if (unlikely(r != o))
4243 *old = r;
4244 return likely(r == o);
4245#endif
4246}
4247
4248/**
4249 * raw_atomic64_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4250 * @v: pointer to atomic64_t
4251 * @old: pointer to s64 value to compare with
4252 * @new: s64 value to assign
4253 *
4254 * If (@v == @old), atomically updates @v to @new with acquire ordering.
4255 * Otherwise, updates @old to the current value of @v.
4256 *
4257 * Safe to use in noinstr code; prefer atomic64_try_cmpxchg_acquire() elsewhere.
4258 *
4259 * Return: @true if the exchange occured, @false otherwise.
4260 */
4261static __always_inline bool
4262raw_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
4263{
4264#if defined(arch_atomic64_try_cmpxchg_acquire)
4265 return arch_atomic64_try_cmpxchg_acquire(v, old, new);
4266#elif defined(arch_atomic64_try_cmpxchg_relaxed)
4267 bool ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new);
4268 __atomic_acquire_fence();
4269 return ret;
4270#elif defined(arch_atomic64_try_cmpxchg)
4271 return arch_atomic64_try_cmpxchg(v, old, new);
4272#else
4273 s64 r, o = *old;
4274 r = raw_atomic64_cmpxchg_acquire(v, o, new);
4275 if (unlikely(r != o))
4276 *old = r;
4277 return likely(r == o);
4278#endif
4279}
4280
4281/**
4282 * raw_atomic64_try_cmpxchg_release() - atomic compare and exchange with release ordering
4283 * @v: pointer to atomic64_t
4284 * @old: pointer to s64 value to compare with
4285 * @new: s64 value to assign
4286 *
4287 * If (@v == @old), atomically updates @v to @new with release ordering.
4288 * Otherwise, updates @old to the current value of @v.
4289 *
4290 * Safe to use in noinstr code; prefer atomic64_try_cmpxchg_release() elsewhere.
4291 *
4292 * Return: @true if the exchange occured, @false otherwise.
4293 */
4294static __always_inline bool
4295raw_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
4296{
4297#if defined(arch_atomic64_try_cmpxchg_release)
4298 return arch_atomic64_try_cmpxchg_release(v, old, new);
4299#elif defined(arch_atomic64_try_cmpxchg_relaxed)
4300 __atomic_release_fence();
4301 return arch_atomic64_try_cmpxchg_relaxed(v, old, new);
4302#elif defined(arch_atomic64_try_cmpxchg)
4303 return arch_atomic64_try_cmpxchg(v, old, new);
4304#else
4305 s64 r, o = *old;
4306 r = raw_atomic64_cmpxchg_release(v, o, new);
4307 if (unlikely(r != o))
4308 *old = r;
4309 return likely(r == o);
4310#endif
4311}
4312
4313/**
4314 * raw_atomic64_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4315 * @v: pointer to atomic64_t
4316 * @old: pointer to s64 value to compare with
4317 * @new: s64 value to assign
4318 *
4319 * If (@v == @old), atomically updates @v to @new with relaxed ordering.
4320 * Otherwise, updates @old to the current value of @v.
4321 *
4322 * Safe to use in noinstr code; prefer atomic64_try_cmpxchg_relaxed() elsewhere.
4323 *
4324 * Return: @true if the exchange occured, @false otherwise.
4325 */
4326static __always_inline bool
4327raw_atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
4328{
4329#if defined(arch_atomic64_try_cmpxchg_relaxed)
4330 return arch_atomic64_try_cmpxchg_relaxed(v, old, new);
4331#elif defined(arch_atomic64_try_cmpxchg)
4332 return arch_atomic64_try_cmpxchg(v, old, new);
4333#else
4334 s64 r, o = *old;
4335 r = raw_atomic64_cmpxchg_relaxed(v, o, new);
4336 if (unlikely(r != o))
4337 *old = r;
4338 return likely(r == o);
4339#endif
4340}
4341
4342/**
4343 * raw_atomic64_sub_and_test() - atomic subtract and test if zero with full ordering
4344 * @i: s64 value to add
4345 * @v: pointer to atomic64_t
4346 *
4347 * Atomically updates @v to (@v - @i) with full ordering.
4348 *
4349 * Safe to use in noinstr code; prefer atomic64_sub_and_test() elsewhere.
4350 *
4351 * Return: @true if the resulting value of @v is zero, @false otherwise.
4352 */
4353static __always_inline bool
4354raw_atomic64_sub_and_test(s64 i, atomic64_t *v)
4355{
4356#if defined(arch_atomic64_sub_and_test)
4357 return arch_atomic64_sub_and_test(i, v);
4358#else
4359 return raw_atomic64_sub_return(i, v) == 0;
4360#endif
4361}
4362
4363/**
4364 * raw_atomic64_dec_and_test() - atomic decrement and test if zero with full ordering
4365 * @v: pointer to atomic64_t
4366 *
4367 * Atomically updates @v to (@v - 1) with full ordering.
4368 *
4369 * Safe to use in noinstr code; prefer atomic64_dec_and_test() elsewhere.
4370 *
4371 * Return: @true if the resulting value of @v is zero, @false otherwise.
4372 */
4373static __always_inline bool
4374raw_atomic64_dec_and_test(atomic64_t *v)
4375{
4376#if defined(arch_atomic64_dec_and_test)
4377 return arch_atomic64_dec_and_test(v);
4378#else
4379 return raw_atomic64_dec_return(v) == 0;
4380#endif
4381}
4382
4383/**
4384 * raw_atomic64_inc_and_test() - atomic increment and test if zero with full ordering
4385 * @v: pointer to atomic64_t
4386 *
4387 * Atomically updates @v to (@v + 1) with full ordering.
4388 *
4389 * Safe to use in noinstr code; prefer atomic64_inc_and_test() elsewhere.
4390 *
4391 * Return: @true if the resulting value of @v is zero, @false otherwise.
4392 */
4393static __always_inline bool
4394raw_atomic64_inc_and_test(atomic64_t *v)
4395{
4396#if defined(arch_atomic64_inc_and_test)
4397 return arch_atomic64_inc_and_test(v);
4398#else
4399 return raw_atomic64_inc_return(v) == 0;
4400#endif
4401}
4402
4403/**
4404 * raw_atomic64_add_negative() - atomic add and test if negative with full ordering
4405 * @i: s64 value to add
4406 * @v: pointer to atomic64_t
4407 *
4408 * Atomically updates @v to (@v + @i) with full ordering.
4409 *
4410 * Safe to use in noinstr code; prefer atomic64_add_negative() elsewhere.
4411 *
4412 * Return: @true if the resulting value of @v is negative, @false otherwise.
4413 */
4414static __always_inline bool
4415raw_atomic64_add_negative(s64 i, atomic64_t *v)
4416{
4417#if defined(arch_atomic64_add_negative)
4418 return arch_atomic64_add_negative(i, v);
4419#elif defined(arch_atomic64_add_negative_relaxed)
4420 bool ret;
4421 __atomic_pre_full_fence();
4422 ret = arch_atomic64_add_negative_relaxed(i, v);
4423 __atomic_post_full_fence();
4424 return ret;
4425#else
4426 return raw_atomic64_add_return(i, v) < 0;
4427#endif
4428}
4429
4430/**
4431 * raw_atomic64_add_negative_acquire() - atomic add and test if negative with acquire ordering
4432 * @i: s64 value to add
4433 * @v: pointer to atomic64_t
4434 *
4435 * Atomically updates @v to (@v + @i) with acquire ordering.
4436 *
4437 * Safe to use in noinstr code; prefer atomic64_add_negative_acquire() elsewhere.
4438 *
4439 * Return: @true if the resulting value of @v is negative, @false otherwise.
4440 */
4441static __always_inline bool
4442raw_atomic64_add_negative_acquire(s64 i, atomic64_t *v)
4443{
4444#if defined(arch_atomic64_add_negative_acquire)
4445 return arch_atomic64_add_negative_acquire(i, v);
4446#elif defined(arch_atomic64_add_negative_relaxed)
4447 bool ret = arch_atomic64_add_negative_relaxed(i, v);
4448 __atomic_acquire_fence();
4449 return ret;
4450#elif defined(arch_atomic64_add_negative)
4451 return arch_atomic64_add_negative(i, v);
4452#else
4453 return raw_atomic64_add_return_acquire(i, v) < 0;
4454#endif
4455}
4456
4457/**
4458 * raw_atomic64_add_negative_release() - atomic add and test if negative with release ordering
4459 * @i: s64 value to add
4460 * @v: pointer to atomic64_t
4461 *
4462 * Atomically updates @v to (@v + @i) with release ordering.
4463 *
4464 * Safe to use in noinstr code; prefer atomic64_add_negative_release() elsewhere.
4465 *
4466 * Return: @true if the resulting value of @v is negative, @false otherwise.
4467 */
4468static __always_inline bool
4469raw_atomic64_add_negative_release(s64 i, atomic64_t *v)
4470{
4471#if defined(arch_atomic64_add_negative_release)
4472 return arch_atomic64_add_negative_release(i, v);
4473#elif defined(arch_atomic64_add_negative_relaxed)
4474 __atomic_release_fence();
4475 return arch_atomic64_add_negative_relaxed(i, v);
4476#elif defined(arch_atomic64_add_negative)
4477 return arch_atomic64_add_negative(i, v);
4478#else
4479 return raw_atomic64_add_return_release(i, v) < 0;
4480#endif
4481}
4482
4483/**
4484 * raw_atomic64_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
4485 * @i: s64 value to add
4486 * @v: pointer to atomic64_t
4487 *
4488 * Atomically updates @v to (@v + @i) with relaxed ordering.
4489 *
4490 * Safe to use in noinstr code; prefer atomic64_add_negative_relaxed() elsewhere.
4491 *
4492 * Return: @true if the resulting value of @v is negative, @false otherwise.
4493 */
4494static __always_inline bool
4495raw_atomic64_add_negative_relaxed(s64 i, atomic64_t *v)
4496{
4497#if defined(arch_atomic64_add_negative_relaxed)
4498 return arch_atomic64_add_negative_relaxed(i, v);
4499#elif defined(arch_atomic64_add_negative)
4500 return arch_atomic64_add_negative(i, v);
4501#else
4502 return raw_atomic64_add_return_relaxed(i, v) < 0;
4503#endif
4504}
4505
4506/**
4507 * raw_atomic64_fetch_add_unless() - atomic add unless value with full ordering
4508 * @v: pointer to atomic64_t
4509 * @a: s64 value to add
4510 * @u: s64 value to compare with
4511 *
4512 * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
4513 *
4514 * Safe to use in noinstr code; prefer atomic64_fetch_add_unless() elsewhere.
4515 *
4516 * Return: The original value of @v.
4517 */
4518static __always_inline s64
4519raw_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
4520{
4521#if defined(arch_atomic64_fetch_add_unless)
4522 return arch_atomic64_fetch_add_unless(v, a, u);
4523#else
4524 s64 c = raw_atomic64_read(v);
4525
4526 do {
4527 if (unlikely(c == u))
4528 break;
4529 } while (!raw_atomic64_try_cmpxchg(v, &c, c + a));
4530
4531 return c;
4532#endif
4533}
4534
4535/**
4536 * raw_atomic64_add_unless() - atomic add unless value with full ordering
4537 * @v: pointer to atomic64_t
4538 * @a: s64 value to add
4539 * @u: s64 value to compare with
4540 *
4541 * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
4542 *
4543 * Safe to use in noinstr code; prefer atomic64_add_unless() elsewhere.
4544 *
4545 * Return: @true if @v was updated, @false otherwise.
4546 */
4547static __always_inline bool
4548raw_atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
4549{
4550#if defined(arch_atomic64_add_unless)
4551 return arch_atomic64_add_unless(v, a, u);
4552#else
4553 return raw_atomic64_fetch_add_unless(v, a, u) != u;
4554#endif
4555}
4556
4557/**
4558 * raw_atomic64_inc_not_zero() - atomic increment unless zero with full ordering
4559 * @v: pointer to atomic64_t
4560 *
4561 * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
4562 *
4563 * Safe to use in noinstr code; prefer atomic64_inc_not_zero() elsewhere.
4564 *
4565 * Return: @true if @v was updated, @false otherwise.
4566 */
4567static __always_inline bool
4568raw_atomic64_inc_not_zero(atomic64_t *v)
4569{
4570#if defined(arch_atomic64_inc_not_zero)
4571 return arch_atomic64_inc_not_zero(v);
4572#else
4573 return raw_atomic64_add_unless(v, 1, 0);
4574#endif
4575}
4576
4577/**
4578 * raw_atomic64_inc_unless_negative() - atomic increment unless negative with full ordering
4579 * @v: pointer to atomic64_t
4580 *
4581 * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
4582 *
4583 * Safe to use in noinstr code; prefer atomic64_inc_unless_negative() elsewhere.
4584 *
4585 * Return: @true if @v was updated, @false otherwise.
4586 */
4587static __always_inline bool
4588raw_atomic64_inc_unless_negative(atomic64_t *v)
4589{
4590#if defined(arch_atomic64_inc_unless_negative)
4591 return arch_atomic64_inc_unless_negative(v);
4592#else
4593 s64 c = raw_atomic64_read(v);
4594
4595 do {
4596 if (unlikely(c < 0))
4597 return false;
4598 } while (!raw_atomic64_try_cmpxchg(v, &c, c + 1));
4599
4600 return true;
4601#endif
4602}
4603
4604/**
4605 * raw_atomic64_dec_unless_positive() - atomic decrement unless positive with full ordering
4606 * @v: pointer to atomic64_t
4607 *
4608 * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
4609 *
4610 * Safe to use in noinstr code; prefer atomic64_dec_unless_positive() elsewhere.
4611 *
4612 * Return: @true if @v was updated, @false otherwise.
4613 */
4614static __always_inline bool
4615raw_atomic64_dec_unless_positive(atomic64_t *v)
4616{
4617#if defined(arch_atomic64_dec_unless_positive)
4618 return arch_atomic64_dec_unless_positive(v);
4619#else
4620 s64 c = raw_atomic64_read(v);
4621
4622 do {
4623 if (unlikely(c > 0))
4624 return false;
4625 } while (!raw_atomic64_try_cmpxchg(v, &c, c - 1));
4626
4627 return true;
4628#endif
4629}
4630
4631/**
4632 * raw_atomic64_dec_if_positive() - atomic decrement if positive with full ordering
4633 * @v: pointer to atomic64_t
4634 *
4635 * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
4636 *
4637 * Safe to use in noinstr code; prefer atomic64_dec_if_positive() elsewhere.
4638 *
4639 * Return: The old value of (@v - 1), regardless of whether @v was updated.
4640 */
4641static __always_inline s64
4642raw_atomic64_dec_if_positive(atomic64_t *v)
4643{
4644#if defined(arch_atomic64_dec_if_positive)
4645 return arch_atomic64_dec_if_positive(v);
4646#else
4647 s64 dec, c = raw_atomic64_read(v);
4648
4649 do {
4650 dec = c - 1;
4651 if (unlikely(dec < 0))
4652 break;
4653 } while (!raw_atomic64_try_cmpxchg(v, &c, dec));
4654
4655 return dec;
4656#endif
4657}
4658
4659#endif /* _LINUX_ATOMIC_FALLBACK_H */
4660// 202b45c7db600ce36198eb1f1fc2c2d5268ace2d