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#ifndef arch_xchg_relaxed
12#define arch_xchg_acquire arch_xchg
13#define arch_xchg_release arch_xchg
14#define arch_xchg_relaxed arch_xchg
15#else /* arch_xchg_relaxed */
16
17#ifndef arch_xchg_acquire
18#define arch_xchg_acquire(...) \
19 __atomic_op_acquire(arch_xchg, __VA_ARGS__)
20#endif
21
22#ifndef arch_xchg_release
23#define arch_xchg_release(...) \
24 __atomic_op_release(arch_xchg, __VA_ARGS__)
25#endif
26
27#ifndef arch_xchg
28#define arch_xchg(...) \
29 __atomic_op_fence(arch_xchg, __VA_ARGS__)
30#endif
31
32#endif /* arch_xchg_relaxed */
33
34#ifndef arch_cmpxchg_relaxed
35#define arch_cmpxchg_acquire arch_cmpxchg
36#define arch_cmpxchg_release arch_cmpxchg
37#define arch_cmpxchg_relaxed arch_cmpxchg
38#else /* arch_cmpxchg_relaxed */
39
40#ifndef arch_cmpxchg_acquire
41#define arch_cmpxchg_acquire(...) \
42 __atomic_op_acquire(arch_cmpxchg, __VA_ARGS__)
43#endif
44
45#ifndef arch_cmpxchg_release
46#define arch_cmpxchg_release(...) \
47 __atomic_op_release(arch_cmpxchg, __VA_ARGS__)
48#endif
49
50#ifndef arch_cmpxchg
51#define arch_cmpxchg(...) \
52 __atomic_op_fence(arch_cmpxchg, __VA_ARGS__)
53#endif
54
55#endif /* arch_cmpxchg_relaxed */
56
57#ifndef arch_cmpxchg64_relaxed
58#define arch_cmpxchg64_acquire arch_cmpxchg64
59#define arch_cmpxchg64_release arch_cmpxchg64
60#define arch_cmpxchg64_relaxed arch_cmpxchg64
61#else /* arch_cmpxchg64_relaxed */
62
63#ifndef arch_cmpxchg64_acquire
64#define arch_cmpxchg64_acquire(...) \
65 __atomic_op_acquire(arch_cmpxchg64, __VA_ARGS__)
66#endif
67
68#ifndef arch_cmpxchg64_release
69#define arch_cmpxchg64_release(...) \
70 __atomic_op_release(arch_cmpxchg64, __VA_ARGS__)
71#endif
72
73#ifndef arch_cmpxchg64
74#define arch_cmpxchg64(...) \
75 __atomic_op_fence(arch_cmpxchg64, __VA_ARGS__)
76#endif
77
78#endif /* arch_cmpxchg64_relaxed */
79
80#ifndef arch_try_cmpxchg_relaxed
81#ifdef arch_try_cmpxchg
82#define arch_try_cmpxchg_acquire arch_try_cmpxchg
83#define arch_try_cmpxchg_release arch_try_cmpxchg
84#define arch_try_cmpxchg_relaxed arch_try_cmpxchg
85#endif /* arch_try_cmpxchg */
86
87#ifndef arch_try_cmpxchg
88#define arch_try_cmpxchg(_ptr, _oldp, _new) \
89({ \
90 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
91 ___r = arch_cmpxchg((_ptr), ___o, (_new)); \
92 if (unlikely(___r != ___o)) \
93 *___op = ___r; \
94 likely(___r == ___o); \
95})
96#endif /* arch_try_cmpxchg */
97
98#ifndef arch_try_cmpxchg_acquire
99#define arch_try_cmpxchg_acquire(_ptr, _oldp, _new) \
100({ \
101 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
102 ___r = arch_cmpxchg_acquire((_ptr), ___o, (_new)); \
103 if (unlikely(___r != ___o)) \
104 *___op = ___r; \
105 likely(___r == ___o); \
106})
107#endif /* arch_try_cmpxchg_acquire */
108
109#ifndef arch_try_cmpxchg_release
110#define arch_try_cmpxchg_release(_ptr, _oldp, _new) \
111({ \
112 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
113 ___r = arch_cmpxchg_release((_ptr), ___o, (_new)); \
114 if (unlikely(___r != ___o)) \
115 *___op = ___r; \
116 likely(___r == ___o); \
117})
118#endif /* arch_try_cmpxchg_release */
119
120#ifndef arch_try_cmpxchg_relaxed
121#define arch_try_cmpxchg_relaxed(_ptr, _oldp, _new) \
122({ \
123 typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \
124 ___r = arch_cmpxchg_relaxed((_ptr), ___o, (_new)); \
125 if (unlikely(___r != ___o)) \
126 *___op = ___r; \
127 likely(___r == ___o); \
128})
129#endif /* arch_try_cmpxchg_relaxed */
130
131#else /* arch_try_cmpxchg_relaxed */
132
133#ifndef arch_try_cmpxchg_acquire
134#define arch_try_cmpxchg_acquire(...) \
135 __atomic_op_acquire(arch_try_cmpxchg, __VA_ARGS__)
136#endif
137
138#ifndef arch_try_cmpxchg_release
139#define arch_try_cmpxchg_release(...) \
140 __atomic_op_release(arch_try_cmpxchg, __VA_ARGS__)
141#endif
142
143#ifndef arch_try_cmpxchg
144#define arch_try_cmpxchg(...) \
145 __atomic_op_fence(arch_try_cmpxchg, __VA_ARGS__)
146#endif
147
148#endif /* arch_try_cmpxchg_relaxed */
149
150#ifndef arch_atomic_read_acquire
151static __always_inline int
152arch_atomic_read_acquire(const atomic_t *v)
153{
154 int ret;
155
156 if (__native_word(atomic_t)) {
157 ret = smp_load_acquire(&(v)->counter);
158 } else {
159 ret = arch_atomic_read(v);
160 __atomic_acquire_fence();
161 }
162
163 return ret;
164}
165#define arch_atomic_read_acquire arch_atomic_read_acquire
166#endif
167
168#ifndef arch_atomic_set_release
169static __always_inline void
170arch_atomic_set_release(atomic_t *v, int i)
171{
172 if (__native_word(atomic_t)) {
173 smp_store_release(&(v)->counter, i);
174 } else {
175 __atomic_release_fence();
176 arch_atomic_set(v, i);
177 }
178}
179#define arch_atomic_set_release arch_atomic_set_release
180#endif
181
182#ifndef arch_atomic_add_return_relaxed
183#define arch_atomic_add_return_acquire arch_atomic_add_return
184#define arch_atomic_add_return_release arch_atomic_add_return
185#define arch_atomic_add_return_relaxed arch_atomic_add_return
186#else /* arch_atomic_add_return_relaxed */
187
188#ifndef arch_atomic_add_return_acquire
189static __always_inline int
190arch_atomic_add_return_acquire(int i, atomic_t *v)
191{
192 int ret = arch_atomic_add_return_relaxed(i, v);
193 __atomic_acquire_fence();
194 return ret;
195}
196#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire
197#endif
198
199#ifndef arch_atomic_add_return_release
200static __always_inline int
201arch_atomic_add_return_release(int i, atomic_t *v)
202{
203 __atomic_release_fence();
204 return arch_atomic_add_return_relaxed(i, v);
205}
206#define arch_atomic_add_return_release arch_atomic_add_return_release
207#endif
208
209#ifndef arch_atomic_add_return
210static __always_inline int
211arch_atomic_add_return(int i, atomic_t *v)
212{
213 int ret;
214 __atomic_pre_full_fence();
215 ret = arch_atomic_add_return_relaxed(i, v);
216 __atomic_post_full_fence();
217 return ret;
218}
219#define arch_atomic_add_return arch_atomic_add_return
220#endif
221
222#endif /* arch_atomic_add_return_relaxed */
223
224#ifndef arch_atomic_fetch_add_relaxed
225#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add
226#define arch_atomic_fetch_add_release arch_atomic_fetch_add
227#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add
228#else /* arch_atomic_fetch_add_relaxed */
229
230#ifndef arch_atomic_fetch_add_acquire
231static __always_inline int
232arch_atomic_fetch_add_acquire(int i, atomic_t *v)
233{
234 int ret = arch_atomic_fetch_add_relaxed(i, v);
235 __atomic_acquire_fence();
236 return ret;
237}
238#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add_acquire
239#endif
240
241#ifndef arch_atomic_fetch_add_release
242static __always_inline int
243arch_atomic_fetch_add_release(int i, atomic_t *v)
244{
245 __atomic_release_fence();
246 return arch_atomic_fetch_add_relaxed(i, v);
247}
248#define arch_atomic_fetch_add_release arch_atomic_fetch_add_release
249#endif
250
251#ifndef arch_atomic_fetch_add
252static __always_inline int
253arch_atomic_fetch_add(int i, atomic_t *v)
254{
255 int ret;
256 __atomic_pre_full_fence();
257 ret = arch_atomic_fetch_add_relaxed(i, v);
258 __atomic_post_full_fence();
259 return ret;
260}
261#define arch_atomic_fetch_add arch_atomic_fetch_add
262#endif
263
264#endif /* arch_atomic_fetch_add_relaxed */
265
266#ifndef arch_atomic_sub_return_relaxed
267#define arch_atomic_sub_return_acquire arch_atomic_sub_return
268#define arch_atomic_sub_return_release arch_atomic_sub_return
269#define arch_atomic_sub_return_relaxed arch_atomic_sub_return
270#else /* arch_atomic_sub_return_relaxed */
271
272#ifndef arch_atomic_sub_return_acquire
273static __always_inline int
274arch_atomic_sub_return_acquire(int i, atomic_t *v)
275{
276 int ret = arch_atomic_sub_return_relaxed(i, v);
277 __atomic_acquire_fence();
278 return ret;
279}
280#define arch_atomic_sub_return_acquire arch_atomic_sub_return_acquire
281#endif
282
283#ifndef arch_atomic_sub_return_release
284static __always_inline int
285arch_atomic_sub_return_release(int i, atomic_t *v)
286{
287 __atomic_release_fence();
288 return arch_atomic_sub_return_relaxed(i, v);
289}
290#define arch_atomic_sub_return_release arch_atomic_sub_return_release
291#endif
292
293#ifndef arch_atomic_sub_return
294static __always_inline int
295arch_atomic_sub_return(int i, atomic_t *v)
296{
297 int ret;
298 __atomic_pre_full_fence();
299 ret = arch_atomic_sub_return_relaxed(i, v);
300 __atomic_post_full_fence();
301 return ret;
302}
303#define arch_atomic_sub_return arch_atomic_sub_return
304#endif
305
306#endif /* arch_atomic_sub_return_relaxed */
307
308#ifndef arch_atomic_fetch_sub_relaxed
309#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub
310#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub
311#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub
312#else /* arch_atomic_fetch_sub_relaxed */
313
314#ifndef arch_atomic_fetch_sub_acquire
315static __always_inline int
316arch_atomic_fetch_sub_acquire(int i, atomic_t *v)
317{
318 int ret = arch_atomic_fetch_sub_relaxed(i, v);
319 __atomic_acquire_fence();
320 return ret;
321}
322#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub_acquire
323#endif
324
325#ifndef arch_atomic_fetch_sub_release
326static __always_inline int
327arch_atomic_fetch_sub_release(int i, atomic_t *v)
328{
329 __atomic_release_fence();
330 return arch_atomic_fetch_sub_relaxed(i, v);
331}
332#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub_release
333#endif
334
335#ifndef arch_atomic_fetch_sub
336static __always_inline int
337arch_atomic_fetch_sub(int i, atomic_t *v)
338{
339 int ret;
340 __atomic_pre_full_fence();
341 ret = arch_atomic_fetch_sub_relaxed(i, v);
342 __atomic_post_full_fence();
343 return ret;
344}
345#define arch_atomic_fetch_sub arch_atomic_fetch_sub
346#endif
347
348#endif /* arch_atomic_fetch_sub_relaxed */
349
350#ifndef arch_atomic_inc
351static __always_inline void
352arch_atomic_inc(atomic_t *v)
353{
354 arch_atomic_add(1, v);
355}
356#define arch_atomic_inc arch_atomic_inc
357#endif
358
359#ifndef arch_atomic_inc_return_relaxed
360#ifdef arch_atomic_inc_return
361#define arch_atomic_inc_return_acquire arch_atomic_inc_return
362#define arch_atomic_inc_return_release arch_atomic_inc_return
363#define arch_atomic_inc_return_relaxed arch_atomic_inc_return
364#endif /* arch_atomic_inc_return */
365
366#ifndef arch_atomic_inc_return
367static __always_inline int
368arch_atomic_inc_return(atomic_t *v)
369{
370 return arch_atomic_add_return(1, v);
371}
372#define arch_atomic_inc_return arch_atomic_inc_return
373#endif
374
375#ifndef arch_atomic_inc_return_acquire
376static __always_inline int
377arch_atomic_inc_return_acquire(atomic_t *v)
378{
379 return arch_atomic_add_return_acquire(1, v);
380}
381#define arch_atomic_inc_return_acquire arch_atomic_inc_return_acquire
382#endif
383
384#ifndef arch_atomic_inc_return_release
385static __always_inline int
386arch_atomic_inc_return_release(atomic_t *v)
387{
388 return arch_atomic_add_return_release(1, v);
389}
390#define arch_atomic_inc_return_release arch_atomic_inc_return_release
391#endif
392
393#ifndef arch_atomic_inc_return_relaxed
394static __always_inline int
395arch_atomic_inc_return_relaxed(atomic_t *v)
396{
397 return arch_atomic_add_return_relaxed(1, v);
398}
399#define arch_atomic_inc_return_relaxed arch_atomic_inc_return_relaxed
400#endif
401
402#else /* arch_atomic_inc_return_relaxed */
403
404#ifndef arch_atomic_inc_return_acquire
405static __always_inline int
406arch_atomic_inc_return_acquire(atomic_t *v)
407{
408 int ret = arch_atomic_inc_return_relaxed(v);
409 __atomic_acquire_fence();
410 return ret;
411}
412#define arch_atomic_inc_return_acquire arch_atomic_inc_return_acquire
413#endif
414
415#ifndef arch_atomic_inc_return_release
416static __always_inline int
417arch_atomic_inc_return_release(atomic_t *v)
418{
419 __atomic_release_fence();
420 return arch_atomic_inc_return_relaxed(v);
421}
422#define arch_atomic_inc_return_release arch_atomic_inc_return_release
423#endif
424
425#ifndef arch_atomic_inc_return
426static __always_inline int
427arch_atomic_inc_return(atomic_t *v)
428{
429 int ret;
430 __atomic_pre_full_fence();
431 ret = arch_atomic_inc_return_relaxed(v);
432 __atomic_post_full_fence();
433 return ret;
434}
435#define arch_atomic_inc_return arch_atomic_inc_return
436#endif
437
438#endif /* arch_atomic_inc_return_relaxed */
439
440#ifndef arch_atomic_fetch_inc_relaxed
441#ifdef arch_atomic_fetch_inc
442#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc
443#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc
444#define arch_atomic_fetch_inc_relaxed arch_atomic_fetch_inc
445#endif /* arch_atomic_fetch_inc */
446
447#ifndef arch_atomic_fetch_inc
448static __always_inline int
449arch_atomic_fetch_inc(atomic_t *v)
450{
451 return arch_atomic_fetch_add(1, v);
452}
453#define arch_atomic_fetch_inc arch_atomic_fetch_inc
454#endif
455
456#ifndef arch_atomic_fetch_inc_acquire
457static __always_inline int
458arch_atomic_fetch_inc_acquire(atomic_t *v)
459{
460 return arch_atomic_fetch_add_acquire(1, v);
461}
462#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc_acquire
463#endif
464
465#ifndef arch_atomic_fetch_inc_release
466static __always_inline int
467arch_atomic_fetch_inc_release(atomic_t *v)
468{
469 return arch_atomic_fetch_add_release(1, v);
470}
471#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc_release
472#endif
473
474#ifndef arch_atomic_fetch_inc_relaxed
475static __always_inline int
476arch_atomic_fetch_inc_relaxed(atomic_t *v)
477{
478 return arch_atomic_fetch_add_relaxed(1, v);
479}
480#define arch_atomic_fetch_inc_relaxed arch_atomic_fetch_inc_relaxed
481#endif
482
483#else /* arch_atomic_fetch_inc_relaxed */
484
485#ifndef arch_atomic_fetch_inc_acquire
486static __always_inline int
487arch_atomic_fetch_inc_acquire(atomic_t *v)
488{
489 int ret = arch_atomic_fetch_inc_relaxed(v);
490 __atomic_acquire_fence();
491 return ret;
492}
493#define arch_atomic_fetch_inc_acquire arch_atomic_fetch_inc_acquire
494#endif
495
496#ifndef arch_atomic_fetch_inc_release
497static __always_inline int
498arch_atomic_fetch_inc_release(atomic_t *v)
499{
500 __atomic_release_fence();
501 return arch_atomic_fetch_inc_relaxed(v);
502}
503#define arch_atomic_fetch_inc_release arch_atomic_fetch_inc_release
504#endif
505
506#ifndef arch_atomic_fetch_inc
507static __always_inline int
508arch_atomic_fetch_inc(atomic_t *v)
509{
510 int ret;
511 __atomic_pre_full_fence();
512 ret = arch_atomic_fetch_inc_relaxed(v);
513 __atomic_post_full_fence();
514 return ret;
515}
516#define arch_atomic_fetch_inc arch_atomic_fetch_inc
517#endif
518
519#endif /* arch_atomic_fetch_inc_relaxed */
520
521#ifndef arch_atomic_dec
522static __always_inline void
523arch_atomic_dec(atomic_t *v)
524{
525 arch_atomic_sub(1, v);
526}
527#define arch_atomic_dec arch_atomic_dec
528#endif
529
530#ifndef arch_atomic_dec_return_relaxed
531#ifdef arch_atomic_dec_return
532#define arch_atomic_dec_return_acquire arch_atomic_dec_return
533#define arch_atomic_dec_return_release arch_atomic_dec_return
534#define arch_atomic_dec_return_relaxed arch_atomic_dec_return
535#endif /* arch_atomic_dec_return */
536
537#ifndef arch_atomic_dec_return
538static __always_inline int
539arch_atomic_dec_return(atomic_t *v)
540{
541 return arch_atomic_sub_return(1, v);
542}
543#define arch_atomic_dec_return arch_atomic_dec_return
544#endif
545
546#ifndef arch_atomic_dec_return_acquire
547static __always_inline int
548arch_atomic_dec_return_acquire(atomic_t *v)
549{
550 return arch_atomic_sub_return_acquire(1, v);
551}
552#define arch_atomic_dec_return_acquire arch_atomic_dec_return_acquire
553#endif
554
555#ifndef arch_atomic_dec_return_release
556static __always_inline int
557arch_atomic_dec_return_release(atomic_t *v)
558{
559 return arch_atomic_sub_return_release(1, v);
560}
561#define arch_atomic_dec_return_release arch_atomic_dec_return_release
562#endif
563
564#ifndef arch_atomic_dec_return_relaxed
565static __always_inline int
566arch_atomic_dec_return_relaxed(atomic_t *v)
567{
568 return arch_atomic_sub_return_relaxed(1, v);
569}
570#define arch_atomic_dec_return_relaxed arch_atomic_dec_return_relaxed
571#endif
572
573#else /* arch_atomic_dec_return_relaxed */
574
575#ifndef arch_atomic_dec_return_acquire
576static __always_inline int
577arch_atomic_dec_return_acquire(atomic_t *v)
578{
579 int ret = arch_atomic_dec_return_relaxed(v);
580 __atomic_acquire_fence();
581 return ret;
582}
583#define arch_atomic_dec_return_acquire arch_atomic_dec_return_acquire
584#endif
585
586#ifndef arch_atomic_dec_return_release
587static __always_inline int
588arch_atomic_dec_return_release(atomic_t *v)
589{
590 __atomic_release_fence();
591 return arch_atomic_dec_return_relaxed(v);
592}
593#define arch_atomic_dec_return_release arch_atomic_dec_return_release
594#endif
595
596#ifndef arch_atomic_dec_return
597static __always_inline int
598arch_atomic_dec_return(atomic_t *v)
599{
600 int ret;
601 __atomic_pre_full_fence();
602 ret = arch_atomic_dec_return_relaxed(v);
603 __atomic_post_full_fence();
604 return ret;
605}
606#define arch_atomic_dec_return arch_atomic_dec_return
607#endif
608
609#endif /* arch_atomic_dec_return_relaxed */
610
611#ifndef arch_atomic_fetch_dec_relaxed
612#ifdef arch_atomic_fetch_dec
613#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec
614#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec
615#define arch_atomic_fetch_dec_relaxed arch_atomic_fetch_dec
616#endif /* arch_atomic_fetch_dec */
617
618#ifndef arch_atomic_fetch_dec
619static __always_inline int
620arch_atomic_fetch_dec(atomic_t *v)
621{
622 return arch_atomic_fetch_sub(1, v);
623}
624#define arch_atomic_fetch_dec arch_atomic_fetch_dec
625#endif
626
627#ifndef arch_atomic_fetch_dec_acquire
628static __always_inline int
629arch_atomic_fetch_dec_acquire(atomic_t *v)
630{
631 return arch_atomic_fetch_sub_acquire(1, v);
632}
633#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec_acquire
634#endif
635
636#ifndef arch_atomic_fetch_dec_release
637static __always_inline int
638arch_atomic_fetch_dec_release(atomic_t *v)
639{
640 return arch_atomic_fetch_sub_release(1, v);
641}
642#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec_release
643#endif
644
645#ifndef arch_atomic_fetch_dec_relaxed
646static __always_inline int
647arch_atomic_fetch_dec_relaxed(atomic_t *v)
648{
649 return arch_atomic_fetch_sub_relaxed(1, v);
650}
651#define arch_atomic_fetch_dec_relaxed arch_atomic_fetch_dec_relaxed
652#endif
653
654#else /* arch_atomic_fetch_dec_relaxed */
655
656#ifndef arch_atomic_fetch_dec_acquire
657static __always_inline int
658arch_atomic_fetch_dec_acquire(atomic_t *v)
659{
660 int ret = arch_atomic_fetch_dec_relaxed(v);
661 __atomic_acquire_fence();
662 return ret;
663}
664#define arch_atomic_fetch_dec_acquire arch_atomic_fetch_dec_acquire
665#endif
666
667#ifndef arch_atomic_fetch_dec_release
668static __always_inline int
669arch_atomic_fetch_dec_release(atomic_t *v)
670{
671 __atomic_release_fence();
672 return arch_atomic_fetch_dec_relaxed(v);
673}
674#define arch_atomic_fetch_dec_release arch_atomic_fetch_dec_release
675#endif
676
677#ifndef arch_atomic_fetch_dec
678static __always_inline int
679arch_atomic_fetch_dec(atomic_t *v)
680{
681 int ret;
682 __atomic_pre_full_fence();
683 ret = arch_atomic_fetch_dec_relaxed(v);
684 __atomic_post_full_fence();
685 return ret;
686}
687#define arch_atomic_fetch_dec arch_atomic_fetch_dec
688#endif
689
690#endif /* arch_atomic_fetch_dec_relaxed */
691
692#ifndef arch_atomic_fetch_and_relaxed
693#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and
694#define arch_atomic_fetch_and_release arch_atomic_fetch_and
695#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and
696#else /* arch_atomic_fetch_and_relaxed */
697
698#ifndef arch_atomic_fetch_and_acquire
699static __always_inline int
700arch_atomic_fetch_and_acquire(int i, atomic_t *v)
701{
702 int ret = arch_atomic_fetch_and_relaxed(i, v);
703 __atomic_acquire_fence();
704 return ret;
705}
706#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and_acquire
707#endif
708
709#ifndef arch_atomic_fetch_and_release
710static __always_inline int
711arch_atomic_fetch_and_release(int i, atomic_t *v)
712{
713 __atomic_release_fence();
714 return arch_atomic_fetch_and_relaxed(i, v);
715}
716#define arch_atomic_fetch_and_release arch_atomic_fetch_and_release
717#endif
718
719#ifndef arch_atomic_fetch_and
720static __always_inline int
721arch_atomic_fetch_and(int i, atomic_t *v)
722{
723 int ret;
724 __atomic_pre_full_fence();
725 ret = arch_atomic_fetch_and_relaxed(i, v);
726 __atomic_post_full_fence();
727 return ret;
728}
729#define arch_atomic_fetch_and arch_atomic_fetch_and
730#endif
731
732#endif /* arch_atomic_fetch_and_relaxed */
733
734#ifndef arch_atomic_andnot
735static __always_inline void
736arch_atomic_andnot(int i, atomic_t *v)
737{
738 arch_atomic_and(~i, v);
739}
740#define arch_atomic_andnot arch_atomic_andnot
741#endif
742
743#ifndef arch_atomic_fetch_andnot_relaxed
744#ifdef arch_atomic_fetch_andnot
745#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot
746#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot
747#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot
748#endif /* arch_atomic_fetch_andnot */
749
750#ifndef arch_atomic_fetch_andnot
751static __always_inline int
752arch_atomic_fetch_andnot(int i, atomic_t *v)
753{
754 return arch_atomic_fetch_and(~i, v);
755}
756#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot
757#endif
758
759#ifndef arch_atomic_fetch_andnot_acquire
760static __always_inline int
761arch_atomic_fetch_andnot_acquire(int i, atomic_t *v)
762{
763 return arch_atomic_fetch_and_acquire(~i, v);
764}
765#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire
766#endif
767
768#ifndef arch_atomic_fetch_andnot_release
769static __always_inline int
770arch_atomic_fetch_andnot_release(int i, atomic_t *v)
771{
772 return arch_atomic_fetch_and_release(~i, v);
773}
774#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release
775#endif
776
777#ifndef arch_atomic_fetch_andnot_relaxed
778static __always_inline int
779arch_atomic_fetch_andnot_relaxed(int i, atomic_t *v)
780{
781 return arch_atomic_fetch_and_relaxed(~i, v);
782}
783#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed
784#endif
785
786#else /* arch_atomic_fetch_andnot_relaxed */
787
788#ifndef arch_atomic_fetch_andnot_acquire
789static __always_inline int
790arch_atomic_fetch_andnot_acquire(int i, atomic_t *v)
791{
792 int ret = arch_atomic_fetch_andnot_relaxed(i, v);
793 __atomic_acquire_fence();
794 return ret;
795}
796#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire
797#endif
798
799#ifndef arch_atomic_fetch_andnot_release
800static __always_inline int
801arch_atomic_fetch_andnot_release(int i, atomic_t *v)
802{
803 __atomic_release_fence();
804 return arch_atomic_fetch_andnot_relaxed(i, v);
805}
806#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release
807#endif
808
809#ifndef arch_atomic_fetch_andnot
810static __always_inline int
811arch_atomic_fetch_andnot(int i, atomic_t *v)
812{
813 int ret;
814 __atomic_pre_full_fence();
815 ret = arch_atomic_fetch_andnot_relaxed(i, v);
816 __atomic_post_full_fence();
817 return ret;
818}
819#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot
820#endif
821
822#endif /* arch_atomic_fetch_andnot_relaxed */
823
824#ifndef arch_atomic_fetch_or_relaxed
825#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or
826#define arch_atomic_fetch_or_release arch_atomic_fetch_or
827#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or
828#else /* arch_atomic_fetch_or_relaxed */
829
830#ifndef arch_atomic_fetch_or_acquire
831static __always_inline int
832arch_atomic_fetch_or_acquire(int i, atomic_t *v)
833{
834 int ret = arch_atomic_fetch_or_relaxed(i, v);
835 __atomic_acquire_fence();
836 return ret;
837}
838#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or_acquire
839#endif
840
841#ifndef arch_atomic_fetch_or_release
842static __always_inline int
843arch_atomic_fetch_or_release(int i, atomic_t *v)
844{
845 __atomic_release_fence();
846 return arch_atomic_fetch_or_relaxed(i, v);
847}
848#define arch_atomic_fetch_or_release arch_atomic_fetch_or_release
849#endif
850
851#ifndef arch_atomic_fetch_or
852static __always_inline int
853arch_atomic_fetch_or(int i, atomic_t *v)
854{
855 int ret;
856 __atomic_pre_full_fence();
857 ret = arch_atomic_fetch_or_relaxed(i, v);
858 __atomic_post_full_fence();
859 return ret;
860}
861#define arch_atomic_fetch_or arch_atomic_fetch_or
862#endif
863
864#endif /* arch_atomic_fetch_or_relaxed */
865
866#ifndef arch_atomic_fetch_xor_relaxed
867#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor
868#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor
869#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor
870#else /* arch_atomic_fetch_xor_relaxed */
871
872#ifndef arch_atomic_fetch_xor_acquire
873static __always_inline int
874arch_atomic_fetch_xor_acquire(int i, atomic_t *v)
875{
876 int ret = arch_atomic_fetch_xor_relaxed(i, v);
877 __atomic_acquire_fence();
878 return ret;
879}
880#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor_acquire
881#endif
882
883#ifndef arch_atomic_fetch_xor_release
884static __always_inline int
885arch_atomic_fetch_xor_release(int i, atomic_t *v)
886{
887 __atomic_release_fence();
888 return arch_atomic_fetch_xor_relaxed(i, v);
889}
890#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor_release
891#endif
892
893#ifndef arch_atomic_fetch_xor
894static __always_inline int
895arch_atomic_fetch_xor(int i, atomic_t *v)
896{
897 int ret;
898 __atomic_pre_full_fence();
899 ret = arch_atomic_fetch_xor_relaxed(i, v);
900 __atomic_post_full_fence();
901 return ret;
902}
903#define arch_atomic_fetch_xor arch_atomic_fetch_xor
904#endif
905
906#endif /* arch_atomic_fetch_xor_relaxed */
907
908#ifndef arch_atomic_xchg_relaxed
909#define arch_atomic_xchg_acquire arch_atomic_xchg
910#define arch_atomic_xchg_release arch_atomic_xchg
911#define arch_atomic_xchg_relaxed arch_atomic_xchg
912#else /* arch_atomic_xchg_relaxed */
913
914#ifndef arch_atomic_xchg_acquire
915static __always_inline int
916arch_atomic_xchg_acquire(atomic_t *v, int i)
917{
918 int ret = arch_atomic_xchg_relaxed(v, i);
919 __atomic_acquire_fence();
920 return ret;
921}
922#define arch_atomic_xchg_acquire arch_atomic_xchg_acquire
923#endif
924
925#ifndef arch_atomic_xchg_release
926static __always_inline int
927arch_atomic_xchg_release(atomic_t *v, int i)
928{
929 __atomic_release_fence();
930 return arch_atomic_xchg_relaxed(v, i);
931}
932#define arch_atomic_xchg_release arch_atomic_xchg_release
933#endif
934
935#ifndef arch_atomic_xchg
936static __always_inline int
937arch_atomic_xchg(atomic_t *v, int i)
938{
939 int ret;
940 __atomic_pre_full_fence();
941 ret = arch_atomic_xchg_relaxed(v, i);
942 __atomic_post_full_fence();
943 return ret;
944}
945#define arch_atomic_xchg arch_atomic_xchg
946#endif
947
948#endif /* arch_atomic_xchg_relaxed */
949
950#ifndef arch_atomic_cmpxchg_relaxed
951#define arch_atomic_cmpxchg_acquire arch_atomic_cmpxchg
952#define arch_atomic_cmpxchg_release arch_atomic_cmpxchg
953#define arch_atomic_cmpxchg_relaxed arch_atomic_cmpxchg
954#else /* arch_atomic_cmpxchg_relaxed */
955
956#ifndef arch_atomic_cmpxchg_acquire
957static __always_inline int
958arch_atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
959{
960 int ret = arch_atomic_cmpxchg_relaxed(v, old, new);
961 __atomic_acquire_fence();
962 return ret;
963}
964#define arch_atomic_cmpxchg_acquire arch_atomic_cmpxchg_acquire
965#endif
966
967#ifndef arch_atomic_cmpxchg_release
968static __always_inline int
969arch_atomic_cmpxchg_release(atomic_t *v, int old, int new)
970{
971 __atomic_release_fence();
972 return arch_atomic_cmpxchg_relaxed(v, old, new);
973}
974#define arch_atomic_cmpxchg_release arch_atomic_cmpxchg_release
975#endif
976
977#ifndef arch_atomic_cmpxchg
978static __always_inline int
979arch_atomic_cmpxchg(atomic_t *v, int old, int new)
980{
981 int ret;
982 __atomic_pre_full_fence();
983 ret = arch_atomic_cmpxchg_relaxed(v, old, new);
984 __atomic_post_full_fence();
985 return ret;
986}
987#define arch_atomic_cmpxchg arch_atomic_cmpxchg
988#endif
989
990#endif /* arch_atomic_cmpxchg_relaxed */
991
992#ifndef arch_atomic_try_cmpxchg_relaxed
993#ifdef arch_atomic_try_cmpxchg
994#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg
995#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg
996#define arch_atomic_try_cmpxchg_relaxed arch_atomic_try_cmpxchg
997#endif /* arch_atomic_try_cmpxchg */
998
999#ifndef arch_atomic_try_cmpxchg
1000static __always_inline bool
1001arch_atomic_try_cmpxchg(atomic_t *v, int *old, int new)
1002{
1003 int r, o = *old;
1004 r = arch_atomic_cmpxchg(v, o, new);
1005 if (unlikely(r != o))
1006 *old = r;
1007 return likely(r == o);
1008}
1009#define arch_atomic_try_cmpxchg arch_atomic_try_cmpxchg
1010#endif
1011
1012#ifndef arch_atomic_try_cmpxchg_acquire
1013static __always_inline bool
1014arch_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
1015{
1016 int r, o = *old;
1017 r = arch_atomic_cmpxchg_acquire(v, o, new);
1018 if (unlikely(r != o))
1019 *old = r;
1020 return likely(r == o);
1021}
1022#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg_acquire
1023#endif
1024
1025#ifndef arch_atomic_try_cmpxchg_release
1026static __always_inline bool
1027arch_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
1028{
1029 int r, o = *old;
1030 r = arch_atomic_cmpxchg_release(v, o, new);
1031 if (unlikely(r != o))
1032 *old = r;
1033 return likely(r == o);
1034}
1035#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg_release
1036#endif
1037
1038#ifndef arch_atomic_try_cmpxchg_relaxed
1039static __always_inline bool
1040arch_atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
1041{
1042 int r, o = *old;
1043 r = arch_atomic_cmpxchg_relaxed(v, o, new);
1044 if (unlikely(r != o))
1045 *old = r;
1046 return likely(r == o);
1047}
1048#define arch_atomic_try_cmpxchg_relaxed arch_atomic_try_cmpxchg_relaxed
1049#endif
1050
1051#else /* arch_atomic_try_cmpxchg_relaxed */
1052
1053#ifndef arch_atomic_try_cmpxchg_acquire
1054static __always_inline bool
1055arch_atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
1056{
1057 bool ret = arch_atomic_try_cmpxchg_relaxed(v, old, new);
1058 __atomic_acquire_fence();
1059 return ret;
1060}
1061#define arch_atomic_try_cmpxchg_acquire arch_atomic_try_cmpxchg_acquire
1062#endif
1063
1064#ifndef arch_atomic_try_cmpxchg_release
1065static __always_inline bool
1066arch_atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
1067{
1068 __atomic_release_fence();
1069 return arch_atomic_try_cmpxchg_relaxed(v, old, new);
1070}
1071#define arch_atomic_try_cmpxchg_release arch_atomic_try_cmpxchg_release
1072#endif
1073
1074#ifndef arch_atomic_try_cmpxchg
1075static __always_inline bool
1076arch_atomic_try_cmpxchg(atomic_t *v, int *old, int new)
1077{
1078 bool ret;
1079 __atomic_pre_full_fence();
1080 ret = arch_atomic_try_cmpxchg_relaxed(v, old, new);
1081 __atomic_post_full_fence();
1082 return ret;
1083}
1084#define arch_atomic_try_cmpxchg arch_atomic_try_cmpxchg
1085#endif
1086
1087#endif /* arch_atomic_try_cmpxchg_relaxed */
1088
1089#ifndef arch_atomic_sub_and_test
1090/**
1091 * arch_atomic_sub_and_test - subtract value from variable and test result
1092 * @i: integer value to subtract
1093 * @v: pointer of type atomic_t
1094 *
1095 * Atomically subtracts @i from @v and returns
1096 * true if the result is zero, or false for all
1097 * other cases.
1098 */
1099static __always_inline bool
1100arch_atomic_sub_and_test(int i, atomic_t *v)
1101{
1102 return arch_atomic_sub_return(i, v) == 0;
1103}
1104#define arch_atomic_sub_and_test arch_atomic_sub_and_test
1105#endif
1106
1107#ifndef arch_atomic_dec_and_test
1108/**
1109 * arch_atomic_dec_and_test - decrement and test
1110 * @v: pointer of type atomic_t
1111 *
1112 * Atomically decrements @v by 1 and
1113 * returns true if the result is 0, or false for all other
1114 * cases.
1115 */
1116static __always_inline bool
1117arch_atomic_dec_and_test(atomic_t *v)
1118{
1119 return arch_atomic_dec_return(v) == 0;
1120}
1121#define arch_atomic_dec_and_test arch_atomic_dec_and_test
1122#endif
1123
1124#ifndef arch_atomic_inc_and_test
1125/**
1126 * arch_atomic_inc_and_test - increment and test
1127 * @v: pointer of type atomic_t
1128 *
1129 * Atomically increments @v by 1
1130 * and returns true if the result is zero, or false for all
1131 * other cases.
1132 */
1133static __always_inline bool
1134arch_atomic_inc_and_test(atomic_t *v)
1135{
1136 return arch_atomic_inc_return(v) == 0;
1137}
1138#define arch_atomic_inc_and_test arch_atomic_inc_and_test
1139#endif
1140
1141#ifndef arch_atomic_add_negative
1142/**
1143 * arch_atomic_add_negative - add and test if negative
1144 * @i: integer value to add
1145 * @v: pointer of type atomic_t
1146 *
1147 * Atomically adds @i to @v and returns true
1148 * if the result is negative, or false when
1149 * result is greater than or equal to zero.
1150 */
1151static __always_inline bool
1152arch_atomic_add_negative(int i, atomic_t *v)
1153{
1154 return arch_atomic_add_return(i, v) < 0;
1155}
1156#define arch_atomic_add_negative arch_atomic_add_negative
1157#endif
1158
1159#ifndef arch_atomic_fetch_add_unless
1160/**
1161 * arch_atomic_fetch_add_unless - add unless the number is already a given value
1162 * @v: pointer of type atomic_t
1163 * @a: the amount to add to v...
1164 * @u: ...unless v is equal to u.
1165 *
1166 * Atomically adds @a to @v, so long as @v was not already @u.
1167 * Returns original value of @v
1168 */
1169static __always_inline int
1170arch_atomic_fetch_add_unless(atomic_t *v, int a, int u)
1171{
1172 int c = arch_atomic_read(v);
1173
1174 do {
1175 if (unlikely(c == u))
1176 break;
1177 } while (!arch_atomic_try_cmpxchg(v, &c, c + a));
1178
1179 return c;
1180}
1181#define arch_atomic_fetch_add_unless arch_atomic_fetch_add_unless
1182#endif
1183
1184#ifndef arch_atomic_add_unless
1185/**
1186 * arch_atomic_add_unless - add unless the number is already a given value
1187 * @v: pointer of type atomic_t
1188 * @a: the amount to add to v...
1189 * @u: ...unless v is equal to u.
1190 *
1191 * Atomically adds @a to @v, if @v was not already @u.
1192 * Returns true if the addition was done.
1193 */
1194static __always_inline bool
1195arch_atomic_add_unless(atomic_t *v, int a, int u)
1196{
1197 return arch_atomic_fetch_add_unless(v, a, u) != u;
1198}
1199#define arch_atomic_add_unless arch_atomic_add_unless
1200#endif
1201
1202#ifndef arch_atomic_inc_not_zero
1203/**
1204 * arch_atomic_inc_not_zero - increment unless the number is zero
1205 * @v: pointer of type atomic_t
1206 *
1207 * Atomically increments @v by 1, if @v is non-zero.
1208 * Returns true if the increment was done.
1209 */
1210static __always_inline bool
1211arch_atomic_inc_not_zero(atomic_t *v)
1212{
1213 return arch_atomic_add_unless(v, 1, 0);
1214}
1215#define arch_atomic_inc_not_zero arch_atomic_inc_not_zero
1216#endif
1217
1218#ifndef arch_atomic_inc_unless_negative
1219static __always_inline bool
1220arch_atomic_inc_unless_negative(atomic_t *v)
1221{
1222 int c = arch_atomic_read(v);
1223
1224 do {
1225 if (unlikely(c < 0))
1226 return false;
1227 } while (!arch_atomic_try_cmpxchg(v, &c, c + 1));
1228
1229 return true;
1230}
1231#define arch_atomic_inc_unless_negative arch_atomic_inc_unless_negative
1232#endif
1233
1234#ifndef arch_atomic_dec_unless_positive
1235static __always_inline bool
1236arch_atomic_dec_unless_positive(atomic_t *v)
1237{
1238 int c = arch_atomic_read(v);
1239
1240 do {
1241 if (unlikely(c > 0))
1242 return false;
1243 } while (!arch_atomic_try_cmpxchg(v, &c, c - 1));
1244
1245 return true;
1246}
1247#define arch_atomic_dec_unless_positive arch_atomic_dec_unless_positive
1248#endif
1249
1250#ifndef arch_atomic_dec_if_positive
1251static __always_inline int
1252arch_atomic_dec_if_positive(atomic_t *v)
1253{
1254 int dec, c = arch_atomic_read(v);
1255
1256 do {
1257 dec = c - 1;
1258 if (unlikely(dec < 0))
1259 break;
1260 } while (!arch_atomic_try_cmpxchg(v, &c, dec));
1261
1262 return dec;
1263}
1264#define arch_atomic_dec_if_positive arch_atomic_dec_if_positive
1265#endif
1266
1267#ifdef CONFIG_GENERIC_ATOMIC64
1268#include <asm-generic/atomic64.h>
1269#endif
1270
1271#ifndef arch_atomic64_read_acquire
1272static __always_inline s64
1273arch_atomic64_read_acquire(const atomic64_t *v)
1274{
1275 s64 ret;
1276
1277 if (__native_word(atomic64_t)) {
1278 ret = smp_load_acquire(&(v)->counter);
1279 } else {
1280 ret = arch_atomic64_read(v);
1281 __atomic_acquire_fence();
1282 }
1283
1284 return ret;
1285}
1286#define arch_atomic64_read_acquire arch_atomic64_read_acquire
1287#endif
1288
1289#ifndef arch_atomic64_set_release
1290static __always_inline void
1291arch_atomic64_set_release(atomic64_t *v, s64 i)
1292{
1293 if (__native_word(atomic64_t)) {
1294 smp_store_release(&(v)->counter, i);
1295 } else {
1296 __atomic_release_fence();
1297 arch_atomic64_set(v, i);
1298 }
1299}
1300#define arch_atomic64_set_release arch_atomic64_set_release
1301#endif
1302
1303#ifndef arch_atomic64_add_return_relaxed
1304#define arch_atomic64_add_return_acquire arch_atomic64_add_return
1305#define arch_atomic64_add_return_release arch_atomic64_add_return
1306#define arch_atomic64_add_return_relaxed arch_atomic64_add_return
1307#else /* arch_atomic64_add_return_relaxed */
1308
1309#ifndef arch_atomic64_add_return_acquire
1310static __always_inline s64
1311arch_atomic64_add_return_acquire(s64 i, atomic64_t *v)
1312{
1313 s64 ret = arch_atomic64_add_return_relaxed(i, v);
1314 __atomic_acquire_fence();
1315 return ret;
1316}
1317#define arch_atomic64_add_return_acquire arch_atomic64_add_return_acquire
1318#endif
1319
1320#ifndef arch_atomic64_add_return_release
1321static __always_inline s64
1322arch_atomic64_add_return_release(s64 i, atomic64_t *v)
1323{
1324 __atomic_release_fence();
1325 return arch_atomic64_add_return_relaxed(i, v);
1326}
1327#define arch_atomic64_add_return_release arch_atomic64_add_return_release
1328#endif
1329
1330#ifndef arch_atomic64_add_return
1331static __always_inline s64
1332arch_atomic64_add_return(s64 i, atomic64_t *v)
1333{
1334 s64 ret;
1335 __atomic_pre_full_fence();
1336 ret = arch_atomic64_add_return_relaxed(i, v);
1337 __atomic_post_full_fence();
1338 return ret;
1339}
1340#define arch_atomic64_add_return arch_atomic64_add_return
1341#endif
1342
1343#endif /* arch_atomic64_add_return_relaxed */
1344
1345#ifndef arch_atomic64_fetch_add_relaxed
1346#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add
1347#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add
1348#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add
1349#else /* arch_atomic64_fetch_add_relaxed */
1350
1351#ifndef arch_atomic64_fetch_add_acquire
1352static __always_inline s64
1353arch_atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
1354{
1355 s64 ret = arch_atomic64_fetch_add_relaxed(i, v);
1356 __atomic_acquire_fence();
1357 return ret;
1358}
1359#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add_acquire
1360#endif
1361
1362#ifndef arch_atomic64_fetch_add_release
1363static __always_inline s64
1364arch_atomic64_fetch_add_release(s64 i, atomic64_t *v)
1365{
1366 __atomic_release_fence();
1367 return arch_atomic64_fetch_add_relaxed(i, v);
1368}
1369#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add_release
1370#endif
1371
1372#ifndef arch_atomic64_fetch_add
1373static __always_inline s64
1374arch_atomic64_fetch_add(s64 i, atomic64_t *v)
1375{
1376 s64 ret;
1377 __atomic_pre_full_fence();
1378 ret = arch_atomic64_fetch_add_relaxed(i, v);
1379 __atomic_post_full_fence();
1380 return ret;
1381}
1382#define arch_atomic64_fetch_add arch_atomic64_fetch_add
1383#endif
1384
1385#endif /* arch_atomic64_fetch_add_relaxed */
1386
1387#ifndef arch_atomic64_sub_return_relaxed
1388#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return
1389#define arch_atomic64_sub_return_release arch_atomic64_sub_return
1390#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return
1391#else /* arch_atomic64_sub_return_relaxed */
1392
1393#ifndef arch_atomic64_sub_return_acquire
1394static __always_inline s64
1395arch_atomic64_sub_return_acquire(s64 i, atomic64_t *v)
1396{
1397 s64 ret = arch_atomic64_sub_return_relaxed(i, v);
1398 __atomic_acquire_fence();
1399 return ret;
1400}
1401#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return_acquire
1402#endif
1403
1404#ifndef arch_atomic64_sub_return_release
1405static __always_inline s64
1406arch_atomic64_sub_return_release(s64 i, atomic64_t *v)
1407{
1408 __atomic_release_fence();
1409 return arch_atomic64_sub_return_relaxed(i, v);
1410}
1411#define arch_atomic64_sub_return_release arch_atomic64_sub_return_release
1412#endif
1413
1414#ifndef arch_atomic64_sub_return
1415static __always_inline s64
1416arch_atomic64_sub_return(s64 i, atomic64_t *v)
1417{
1418 s64 ret;
1419 __atomic_pre_full_fence();
1420 ret = arch_atomic64_sub_return_relaxed(i, v);
1421 __atomic_post_full_fence();
1422 return ret;
1423}
1424#define arch_atomic64_sub_return arch_atomic64_sub_return
1425#endif
1426
1427#endif /* arch_atomic64_sub_return_relaxed */
1428
1429#ifndef arch_atomic64_fetch_sub_relaxed
1430#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub
1431#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub
1432#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub
1433#else /* arch_atomic64_fetch_sub_relaxed */
1434
1435#ifndef arch_atomic64_fetch_sub_acquire
1436static __always_inline s64
1437arch_atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
1438{
1439 s64 ret = arch_atomic64_fetch_sub_relaxed(i, v);
1440 __atomic_acquire_fence();
1441 return ret;
1442}
1443#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub_acquire
1444#endif
1445
1446#ifndef arch_atomic64_fetch_sub_release
1447static __always_inline s64
1448arch_atomic64_fetch_sub_release(s64 i, atomic64_t *v)
1449{
1450 __atomic_release_fence();
1451 return arch_atomic64_fetch_sub_relaxed(i, v);
1452}
1453#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub_release
1454#endif
1455
1456#ifndef arch_atomic64_fetch_sub
1457static __always_inline s64
1458arch_atomic64_fetch_sub(s64 i, atomic64_t *v)
1459{
1460 s64 ret;
1461 __atomic_pre_full_fence();
1462 ret = arch_atomic64_fetch_sub_relaxed(i, v);
1463 __atomic_post_full_fence();
1464 return ret;
1465}
1466#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub
1467#endif
1468
1469#endif /* arch_atomic64_fetch_sub_relaxed */
1470
1471#ifndef arch_atomic64_inc
1472static __always_inline void
1473arch_atomic64_inc(atomic64_t *v)
1474{
1475 arch_atomic64_add(1, v);
1476}
1477#define arch_atomic64_inc arch_atomic64_inc
1478#endif
1479
1480#ifndef arch_atomic64_inc_return_relaxed
1481#ifdef arch_atomic64_inc_return
1482#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return
1483#define arch_atomic64_inc_return_release arch_atomic64_inc_return
1484#define arch_atomic64_inc_return_relaxed arch_atomic64_inc_return
1485#endif /* arch_atomic64_inc_return */
1486
1487#ifndef arch_atomic64_inc_return
1488static __always_inline s64
1489arch_atomic64_inc_return(atomic64_t *v)
1490{
1491 return arch_atomic64_add_return(1, v);
1492}
1493#define arch_atomic64_inc_return arch_atomic64_inc_return
1494#endif
1495
1496#ifndef arch_atomic64_inc_return_acquire
1497static __always_inline s64
1498arch_atomic64_inc_return_acquire(atomic64_t *v)
1499{
1500 return arch_atomic64_add_return_acquire(1, v);
1501}
1502#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return_acquire
1503#endif
1504
1505#ifndef arch_atomic64_inc_return_release
1506static __always_inline s64
1507arch_atomic64_inc_return_release(atomic64_t *v)
1508{
1509 return arch_atomic64_add_return_release(1, v);
1510}
1511#define arch_atomic64_inc_return_release arch_atomic64_inc_return_release
1512#endif
1513
1514#ifndef arch_atomic64_inc_return_relaxed
1515static __always_inline s64
1516arch_atomic64_inc_return_relaxed(atomic64_t *v)
1517{
1518 return arch_atomic64_add_return_relaxed(1, v);
1519}
1520#define arch_atomic64_inc_return_relaxed arch_atomic64_inc_return_relaxed
1521#endif
1522
1523#else /* arch_atomic64_inc_return_relaxed */
1524
1525#ifndef arch_atomic64_inc_return_acquire
1526static __always_inline s64
1527arch_atomic64_inc_return_acquire(atomic64_t *v)
1528{
1529 s64 ret = arch_atomic64_inc_return_relaxed(v);
1530 __atomic_acquire_fence();
1531 return ret;
1532}
1533#define arch_atomic64_inc_return_acquire arch_atomic64_inc_return_acquire
1534#endif
1535
1536#ifndef arch_atomic64_inc_return_release
1537static __always_inline s64
1538arch_atomic64_inc_return_release(atomic64_t *v)
1539{
1540 __atomic_release_fence();
1541 return arch_atomic64_inc_return_relaxed(v);
1542}
1543#define arch_atomic64_inc_return_release arch_atomic64_inc_return_release
1544#endif
1545
1546#ifndef arch_atomic64_inc_return
1547static __always_inline s64
1548arch_atomic64_inc_return(atomic64_t *v)
1549{
1550 s64 ret;
1551 __atomic_pre_full_fence();
1552 ret = arch_atomic64_inc_return_relaxed(v);
1553 __atomic_post_full_fence();
1554 return ret;
1555}
1556#define arch_atomic64_inc_return arch_atomic64_inc_return
1557#endif
1558
1559#endif /* arch_atomic64_inc_return_relaxed */
1560
1561#ifndef arch_atomic64_fetch_inc_relaxed
1562#ifdef arch_atomic64_fetch_inc
1563#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc
1564#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc
1565#define arch_atomic64_fetch_inc_relaxed arch_atomic64_fetch_inc
1566#endif /* arch_atomic64_fetch_inc */
1567
1568#ifndef arch_atomic64_fetch_inc
1569static __always_inline s64
1570arch_atomic64_fetch_inc(atomic64_t *v)
1571{
1572 return arch_atomic64_fetch_add(1, v);
1573}
1574#define arch_atomic64_fetch_inc arch_atomic64_fetch_inc
1575#endif
1576
1577#ifndef arch_atomic64_fetch_inc_acquire
1578static __always_inline s64
1579arch_atomic64_fetch_inc_acquire(atomic64_t *v)
1580{
1581 return arch_atomic64_fetch_add_acquire(1, v);
1582}
1583#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc_acquire
1584#endif
1585
1586#ifndef arch_atomic64_fetch_inc_release
1587static __always_inline s64
1588arch_atomic64_fetch_inc_release(atomic64_t *v)
1589{
1590 return arch_atomic64_fetch_add_release(1, v);
1591}
1592#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc_release
1593#endif
1594
1595#ifndef arch_atomic64_fetch_inc_relaxed
1596static __always_inline s64
1597arch_atomic64_fetch_inc_relaxed(atomic64_t *v)
1598{
1599 return arch_atomic64_fetch_add_relaxed(1, v);
1600}
1601#define arch_atomic64_fetch_inc_relaxed arch_atomic64_fetch_inc_relaxed
1602#endif
1603
1604#else /* arch_atomic64_fetch_inc_relaxed */
1605
1606#ifndef arch_atomic64_fetch_inc_acquire
1607static __always_inline s64
1608arch_atomic64_fetch_inc_acquire(atomic64_t *v)
1609{
1610 s64 ret = arch_atomic64_fetch_inc_relaxed(v);
1611 __atomic_acquire_fence();
1612 return ret;
1613}
1614#define arch_atomic64_fetch_inc_acquire arch_atomic64_fetch_inc_acquire
1615#endif
1616
1617#ifndef arch_atomic64_fetch_inc_release
1618static __always_inline s64
1619arch_atomic64_fetch_inc_release(atomic64_t *v)
1620{
1621 __atomic_release_fence();
1622 return arch_atomic64_fetch_inc_relaxed(v);
1623}
1624#define arch_atomic64_fetch_inc_release arch_atomic64_fetch_inc_release
1625#endif
1626
1627#ifndef arch_atomic64_fetch_inc
1628static __always_inline s64
1629arch_atomic64_fetch_inc(atomic64_t *v)
1630{
1631 s64 ret;
1632 __atomic_pre_full_fence();
1633 ret = arch_atomic64_fetch_inc_relaxed(v);
1634 __atomic_post_full_fence();
1635 return ret;
1636}
1637#define arch_atomic64_fetch_inc arch_atomic64_fetch_inc
1638#endif
1639
1640#endif /* arch_atomic64_fetch_inc_relaxed */
1641
1642#ifndef arch_atomic64_dec
1643static __always_inline void
1644arch_atomic64_dec(atomic64_t *v)
1645{
1646 arch_atomic64_sub(1, v);
1647}
1648#define arch_atomic64_dec arch_atomic64_dec
1649#endif
1650
1651#ifndef arch_atomic64_dec_return_relaxed
1652#ifdef arch_atomic64_dec_return
1653#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return
1654#define arch_atomic64_dec_return_release arch_atomic64_dec_return
1655#define arch_atomic64_dec_return_relaxed arch_atomic64_dec_return
1656#endif /* arch_atomic64_dec_return */
1657
1658#ifndef arch_atomic64_dec_return
1659static __always_inline s64
1660arch_atomic64_dec_return(atomic64_t *v)
1661{
1662 return arch_atomic64_sub_return(1, v);
1663}
1664#define arch_atomic64_dec_return arch_atomic64_dec_return
1665#endif
1666
1667#ifndef arch_atomic64_dec_return_acquire
1668static __always_inline s64
1669arch_atomic64_dec_return_acquire(atomic64_t *v)
1670{
1671 return arch_atomic64_sub_return_acquire(1, v);
1672}
1673#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return_acquire
1674#endif
1675
1676#ifndef arch_atomic64_dec_return_release
1677static __always_inline s64
1678arch_atomic64_dec_return_release(atomic64_t *v)
1679{
1680 return arch_atomic64_sub_return_release(1, v);
1681}
1682#define arch_atomic64_dec_return_release arch_atomic64_dec_return_release
1683#endif
1684
1685#ifndef arch_atomic64_dec_return_relaxed
1686static __always_inline s64
1687arch_atomic64_dec_return_relaxed(atomic64_t *v)
1688{
1689 return arch_atomic64_sub_return_relaxed(1, v);
1690}
1691#define arch_atomic64_dec_return_relaxed arch_atomic64_dec_return_relaxed
1692#endif
1693
1694#else /* arch_atomic64_dec_return_relaxed */
1695
1696#ifndef arch_atomic64_dec_return_acquire
1697static __always_inline s64
1698arch_atomic64_dec_return_acquire(atomic64_t *v)
1699{
1700 s64 ret = arch_atomic64_dec_return_relaxed(v);
1701 __atomic_acquire_fence();
1702 return ret;
1703}
1704#define arch_atomic64_dec_return_acquire arch_atomic64_dec_return_acquire
1705#endif
1706
1707#ifndef arch_atomic64_dec_return_release
1708static __always_inline s64
1709arch_atomic64_dec_return_release(atomic64_t *v)
1710{
1711 __atomic_release_fence();
1712 return arch_atomic64_dec_return_relaxed(v);
1713}
1714#define arch_atomic64_dec_return_release arch_atomic64_dec_return_release
1715#endif
1716
1717#ifndef arch_atomic64_dec_return
1718static __always_inline s64
1719arch_atomic64_dec_return(atomic64_t *v)
1720{
1721 s64 ret;
1722 __atomic_pre_full_fence();
1723 ret = arch_atomic64_dec_return_relaxed(v);
1724 __atomic_post_full_fence();
1725 return ret;
1726}
1727#define arch_atomic64_dec_return arch_atomic64_dec_return
1728#endif
1729
1730#endif /* arch_atomic64_dec_return_relaxed */
1731
1732#ifndef arch_atomic64_fetch_dec_relaxed
1733#ifdef arch_atomic64_fetch_dec
1734#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec
1735#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec
1736#define arch_atomic64_fetch_dec_relaxed arch_atomic64_fetch_dec
1737#endif /* arch_atomic64_fetch_dec */
1738
1739#ifndef arch_atomic64_fetch_dec
1740static __always_inline s64
1741arch_atomic64_fetch_dec(atomic64_t *v)
1742{
1743 return arch_atomic64_fetch_sub(1, v);
1744}
1745#define arch_atomic64_fetch_dec arch_atomic64_fetch_dec
1746#endif
1747
1748#ifndef arch_atomic64_fetch_dec_acquire
1749static __always_inline s64
1750arch_atomic64_fetch_dec_acquire(atomic64_t *v)
1751{
1752 return arch_atomic64_fetch_sub_acquire(1, v);
1753}
1754#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec_acquire
1755#endif
1756
1757#ifndef arch_atomic64_fetch_dec_release
1758static __always_inline s64
1759arch_atomic64_fetch_dec_release(atomic64_t *v)
1760{
1761 return arch_atomic64_fetch_sub_release(1, v);
1762}
1763#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec_release
1764#endif
1765
1766#ifndef arch_atomic64_fetch_dec_relaxed
1767static __always_inline s64
1768arch_atomic64_fetch_dec_relaxed(atomic64_t *v)
1769{
1770 return arch_atomic64_fetch_sub_relaxed(1, v);
1771}
1772#define arch_atomic64_fetch_dec_relaxed arch_atomic64_fetch_dec_relaxed
1773#endif
1774
1775#else /* arch_atomic64_fetch_dec_relaxed */
1776
1777#ifndef arch_atomic64_fetch_dec_acquire
1778static __always_inline s64
1779arch_atomic64_fetch_dec_acquire(atomic64_t *v)
1780{
1781 s64 ret = arch_atomic64_fetch_dec_relaxed(v);
1782 __atomic_acquire_fence();
1783 return ret;
1784}
1785#define arch_atomic64_fetch_dec_acquire arch_atomic64_fetch_dec_acquire
1786#endif
1787
1788#ifndef arch_atomic64_fetch_dec_release
1789static __always_inline s64
1790arch_atomic64_fetch_dec_release(atomic64_t *v)
1791{
1792 __atomic_release_fence();
1793 return arch_atomic64_fetch_dec_relaxed(v);
1794}
1795#define arch_atomic64_fetch_dec_release arch_atomic64_fetch_dec_release
1796#endif
1797
1798#ifndef arch_atomic64_fetch_dec
1799static __always_inline s64
1800arch_atomic64_fetch_dec(atomic64_t *v)
1801{
1802 s64 ret;
1803 __atomic_pre_full_fence();
1804 ret = arch_atomic64_fetch_dec_relaxed(v);
1805 __atomic_post_full_fence();
1806 return ret;
1807}
1808#define arch_atomic64_fetch_dec arch_atomic64_fetch_dec
1809#endif
1810
1811#endif /* arch_atomic64_fetch_dec_relaxed */
1812
1813#ifndef arch_atomic64_fetch_and_relaxed
1814#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and
1815#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and
1816#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and
1817#else /* arch_atomic64_fetch_and_relaxed */
1818
1819#ifndef arch_atomic64_fetch_and_acquire
1820static __always_inline s64
1821arch_atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
1822{
1823 s64 ret = arch_atomic64_fetch_and_relaxed(i, v);
1824 __atomic_acquire_fence();
1825 return ret;
1826}
1827#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and_acquire
1828#endif
1829
1830#ifndef arch_atomic64_fetch_and_release
1831static __always_inline s64
1832arch_atomic64_fetch_and_release(s64 i, atomic64_t *v)
1833{
1834 __atomic_release_fence();
1835 return arch_atomic64_fetch_and_relaxed(i, v);
1836}
1837#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and_release
1838#endif
1839
1840#ifndef arch_atomic64_fetch_and
1841static __always_inline s64
1842arch_atomic64_fetch_and(s64 i, atomic64_t *v)
1843{
1844 s64 ret;
1845 __atomic_pre_full_fence();
1846 ret = arch_atomic64_fetch_and_relaxed(i, v);
1847 __atomic_post_full_fence();
1848 return ret;
1849}
1850#define arch_atomic64_fetch_and arch_atomic64_fetch_and
1851#endif
1852
1853#endif /* arch_atomic64_fetch_and_relaxed */
1854
1855#ifndef arch_atomic64_andnot
1856static __always_inline void
1857arch_atomic64_andnot(s64 i, atomic64_t *v)
1858{
1859 arch_atomic64_and(~i, v);
1860}
1861#define arch_atomic64_andnot arch_atomic64_andnot
1862#endif
1863
1864#ifndef arch_atomic64_fetch_andnot_relaxed
1865#ifdef arch_atomic64_fetch_andnot
1866#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot
1867#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot
1868#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot
1869#endif /* arch_atomic64_fetch_andnot */
1870
1871#ifndef arch_atomic64_fetch_andnot
1872static __always_inline s64
1873arch_atomic64_fetch_andnot(s64 i, atomic64_t *v)
1874{
1875 return arch_atomic64_fetch_and(~i, v);
1876}
1877#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot
1878#endif
1879
1880#ifndef arch_atomic64_fetch_andnot_acquire
1881static __always_inline s64
1882arch_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
1883{
1884 return arch_atomic64_fetch_and_acquire(~i, v);
1885}
1886#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire
1887#endif
1888
1889#ifndef arch_atomic64_fetch_andnot_release
1890static __always_inline s64
1891arch_atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
1892{
1893 return arch_atomic64_fetch_and_release(~i, v);
1894}
1895#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release
1896#endif
1897
1898#ifndef arch_atomic64_fetch_andnot_relaxed
1899static __always_inline s64
1900arch_atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
1901{
1902 return arch_atomic64_fetch_and_relaxed(~i, v);
1903}
1904#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed
1905#endif
1906
1907#else /* arch_atomic64_fetch_andnot_relaxed */
1908
1909#ifndef arch_atomic64_fetch_andnot_acquire
1910static __always_inline s64
1911arch_atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
1912{
1913 s64 ret = arch_atomic64_fetch_andnot_relaxed(i, v);
1914 __atomic_acquire_fence();
1915 return ret;
1916}
1917#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire
1918#endif
1919
1920#ifndef arch_atomic64_fetch_andnot_release
1921static __always_inline s64
1922arch_atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
1923{
1924 __atomic_release_fence();
1925 return arch_atomic64_fetch_andnot_relaxed(i, v);
1926}
1927#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release
1928#endif
1929
1930#ifndef arch_atomic64_fetch_andnot
1931static __always_inline s64
1932arch_atomic64_fetch_andnot(s64 i, atomic64_t *v)
1933{
1934 s64 ret;
1935 __atomic_pre_full_fence();
1936 ret = arch_atomic64_fetch_andnot_relaxed(i, v);
1937 __atomic_post_full_fence();
1938 return ret;
1939}
1940#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot
1941#endif
1942
1943#endif /* arch_atomic64_fetch_andnot_relaxed */
1944
1945#ifndef arch_atomic64_fetch_or_relaxed
1946#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or
1947#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or
1948#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or
1949#else /* arch_atomic64_fetch_or_relaxed */
1950
1951#ifndef arch_atomic64_fetch_or_acquire
1952static __always_inline s64
1953arch_atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
1954{
1955 s64 ret = arch_atomic64_fetch_or_relaxed(i, v);
1956 __atomic_acquire_fence();
1957 return ret;
1958}
1959#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or_acquire
1960#endif
1961
1962#ifndef arch_atomic64_fetch_or_release
1963static __always_inline s64
1964arch_atomic64_fetch_or_release(s64 i, atomic64_t *v)
1965{
1966 __atomic_release_fence();
1967 return arch_atomic64_fetch_or_relaxed(i, v);
1968}
1969#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or_release
1970#endif
1971
1972#ifndef arch_atomic64_fetch_or
1973static __always_inline s64
1974arch_atomic64_fetch_or(s64 i, atomic64_t *v)
1975{
1976 s64 ret;
1977 __atomic_pre_full_fence();
1978 ret = arch_atomic64_fetch_or_relaxed(i, v);
1979 __atomic_post_full_fence();
1980 return ret;
1981}
1982#define arch_atomic64_fetch_or arch_atomic64_fetch_or
1983#endif
1984
1985#endif /* arch_atomic64_fetch_or_relaxed */
1986
1987#ifndef arch_atomic64_fetch_xor_relaxed
1988#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor
1989#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor
1990#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor
1991#else /* arch_atomic64_fetch_xor_relaxed */
1992
1993#ifndef arch_atomic64_fetch_xor_acquire
1994static __always_inline s64
1995arch_atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
1996{
1997 s64 ret = arch_atomic64_fetch_xor_relaxed(i, v);
1998 __atomic_acquire_fence();
1999 return ret;
2000}
2001#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor_acquire
2002#endif
2003
2004#ifndef arch_atomic64_fetch_xor_release
2005static __always_inline s64
2006arch_atomic64_fetch_xor_release(s64 i, atomic64_t *v)
2007{
2008 __atomic_release_fence();
2009 return arch_atomic64_fetch_xor_relaxed(i, v);
2010}
2011#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor_release
2012#endif
2013
2014#ifndef arch_atomic64_fetch_xor
2015static __always_inline s64
2016arch_atomic64_fetch_xor(s64 i, atomic64_t *v)
2017{
2018 s64 ret;
2019 __atomic_pre_full_fence();
2020 ret = arch_atomic64_fetch_xor_relaxed(i, v);
2021 __atomic_post_full_fence();
2022 return ret;
2023}
2024#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor
2025#endif
2026
2027#endif /* arch_atomic64_fetch_xor_relaxed */
2028
2029#ifndef arch_atomic64_xchg_relaxed
2030#define arch_atomic64_xchg_acquire arch_atomic64_xchg
2031#define arch_atomic64_xchg_release arch_atomic64_xchg
2032#define arch_atomic64_xchg_relaxed arch_atomic64_xchg
2033#else /* arch_atomic64_xchg_relaxed */
2034
2035#ifndef arch_atomic64_xchg_acquire
2036static __always_inline s64
2037arch_atomic64_xchg_acquire(atomic64_t *v, s64 i)
2038{
2039 s64 ret = arch_atomic64_xchg_relaxed(v, i);
2040 __atomic_acquire_fence();
2041 return ret;
2042}
2043#define arch_atomic64_xchg_acquire arch_atomic64_xchg_acquire
2044#endif
2045
2046#ifndef arch_atomic64_xchg_release
2047static __always_inline s64
2048arch_atomic64_xchg_release(atomic64_t *v, s64 i)
2049{
2050 __atomic_release_fence();
2051 return arch_atomic64_xchg_relaxed(v, i);
2052}
2053#define arch_atomic64_xchg_release arch_atomic64_xchg_release
2054#endif
2055
2056#ifndef arch_atomic64_xchg
2057static __always_inline s64
2058arch_atomic64_xchg(atomic64_t *v, s64 i)
2059{
2060 s64 ret;
2061 __atomic_pre_full_fence();
2062 ret = arch_atomic64_xchg_relaxed(v, i);
2063 __atomic_post_full_fence();
2064 return ret;
2065}
2066#define arch_atomic64_xchg arch_atomic64_xchg
2067#endif
2068
2069#endif /* arch_atomic64_xchg_relaxed */
2070
2071#ifndef arch_atomic64_cmpxchg_relaxed
2072#define arch_atomic64_cmpxchg_acquire arch_atomic64_cmpxchg
2073#define arch_atomic64_cmpxchg_release arch_atomic64_cmpxchg
2074#define arch_atomic64_cmpxchg_relaxed arch_atomic64_cmpxchg
2075#else /* arch_atomic64_cmpxchg_relaxed */
2076
2077#ifndef arch_atomic64_cmpxchg_acquire
2078static __always_inline s64
2079arch_atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
2080{
2081 s64 ret = arch_atomic64_cmpxchg_relaxed(v, old, new);
2082 __atomic_acquire_fence();
2083 return ret;
2084}
2085#define arch_atomic64_cmpxchg_acquire arch_atomic64_cmpxchg_acquire
2086#endif
2087
2088#ifndef arch_atomic64_cmpxchg_release
2089static __always_inline s64
2090arch_atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
2091{
2092 __atomic_release_fence();
2093 return arch_atomic64_cmpxchg_relaxed(v, old, new);
2094}
2095#define arch_atomic64_cmpxchg_release arch_atomic64_cmpxchg_release
2096#endif
2097
2098#ifndef arch_atomic64_cmpxchg
2099static __always_inline s64
2100arch_atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
2101{
2102 s64 ret;
2103 __atomic_pre_full_fence();
2104 ret = arch_atomic64_cmpxchg_relaxed(v, old, new);
2105 __atomic_post_full_fence();
2106 return ret;
2107}
2108#define arch_atomic64_cmpxchg arch_atomic64_cmpxchg
2109#endif
2110
2111#endif /* arch_atomic64_cmpxchg_relaxed */
2112
2113#ifndef arch_atomic64_try_cmpxchg_relaxed
2114#ifdef arch_atomic64_try_cmpxchg
2115#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg
2116#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg
2117#define arch_atomic64_try_cmpxchg_relaxed arch_atomic64_try_cmpxchg
2118#endif /* arch_atomic64_try_cmpxchg */
2119
2120#ifndef arch_atomic64_try_cmpxchg
2121static __always_inline bool
2122arch_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
2123{
2124 s64 r, o = *old;
2125 r = arch_atomic64_cmpxchg(v, o, new);
2126 if (unlikely(r != o))
2127 *old = r;
2128 return likely(r == o);
2129}
2130#define arch_atomic64_try_cmpxchg arch_atomic64_try_cmpxchg
2131#endif
2132
2133#ifndef arch_atomic64_try_cmpxchg_acquire
2134static __always_inline bool
2135arch_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
2136{
2137 s64 r, o = *old;
2138 r = arch_atomic64_cmpxchg_acquire(v, o, new);
2139 if (unlikely(r != o))
2140 *old = r;
2141 return likely(r == o);
2142}
2143#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg_acquire
2144#endif
2145
2146#ifndef arch_atomic64_try_cmpxchg_release
2147static __always_inline bool
2148arch_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
2149{
2150 s64 r, o = *old;
2151 r = arch_atomic64_cmpxchg_release(v, o, new);
2152 if (unlikely(r != o))
2153 *old = r;
2154 return likely(r == o);
2155}
2156#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg_release
2157#endif
2158
2159#ifndef arch_atomic64_try_cmpxchg_relaxed
2160static __always_inline bool
2161arch_atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
2162{
2163 s64 r, o = *old;
2164 r = arch_atomic64_cmpxchg_relaxed(v, o, new);
2165 if (unlikely(r != o))
2166 *old = r;
2167 return likely(r == o);
2168}
2169#define arch_atomic64_try_cmpxchg_relaxed arch_atomic64_try_cmpxchg_relaxed
2170#endif
2171
2172#else /* arch_atomic64_try_cmpxchg_relaxed */
2173
2174#ifndef arch_atomic64_try_cmpxchg_acquire
2175static __always_inline bool
2176arch_atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
2177{
2178 bool ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new);
2179 __atomic_acquire_fence();
2180 return ret;
2181}
2182#define arch_atomic64_try_cmpxchg_acquire arch_atomic64_try_cmpxchg_acquire
2183#endif
2184
2185#ifndef arch_atomic64_try_cmpxchg_release
2186static __always_inline bool
2187arch_atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
2188{
2189 __atomic_release_fence();
2190 return arch_atomic64_try_cmpxchg_relaxed(v, old, new);
2191}
2192#define arch_atomic64_try_cmpxchg_release arch_atomic64_try_cmpxchg_release
2193#endif
2194
2195#ifndef arch_atomic64_try_cmpxchg
2196static __always_inline bool
2197arch_atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
2198{
2199 bool ret;
2200 __atomic_pre_full_fence();
2201 ret = arch_atomic64_try_cmpxchg_relaxed(v, old, new);
2202 __atomic_post_full_fence();
2203 return ret;
2204}
2205#define arch_atomic64_try_cmpxchg arch_atomic64_try_cmpxchg
2206#endif
2207
2208#endif /* arch_atomic64_try_cmpxchg_relaxed */
2209
2210#ifndef arch_atomic64_sub_and_test
2211/**
2212 * arch_atomic64_sub_and_test - subtract value from variable and test result
2213 * @i: integer value to subtract
2214 * @v: pointer of type atomic64_t
2215 *
2216 * Atomically subtracts @i from @v and returns
2217 * true if the result is zero, or false for all
2218 * other cases.
2219 */
2220static __always_inline bool
2221arch_atomic64_sub_and_test(s64 i, atomic64_t *v)
2222{
2223 return arch_atomic64_sub_return(i, v) == 0;
2224}
2225#define arch_atomic64_sub_and_test arch_atomic64_sub_and_test
2226#endif
2227
2228#ifndef arch_atomic64_dec_and_test
2229/**
2230 * arch_atomic64_dec_and_test - decrement and test
2231 * @v: pointer of type atomic64_t
2232 *
2233 * Atomically decrements @v by 1 and
2234 * returns true if the result is 0, or false for all other
2235 * cases.
2236 */
2237static __always_inline bool
2238arch_atomic64_dec_and_test(atomic64_t *v)
2239{
2240 return arch_atomic64_dec_return(v) == 0;
2241}
2242#define arch_atomic64_dec_and_test arch_atomic64_dec_and_test
2243#endif
2244
2245#ifndef arch_atomic64_inc_and_test
2246/**
2247 * arch_atomic64_inc_and_test - increment and test
2248 * @v: pointer of type atomic64_t
2249 *
2250 * Atomically increments @v by 1
2251 * and returns true if the result is zero, or false for all
2252 * other cases.
2253 */
2254static __always_inline bool
2255arch_atomic64_inc_and_test(atomic64_t *v)
2256{
2257 return arch_atomic64_inc_return(v) == 0;
2258}
2259#define arch_atomic64_inc_and_test arch_atomic64_inc_and_test
2260#endif
2261
2262#ifndef arch_atomic64_add_negative
2263/**
2264 * arch_atomic64_add_negative - add and test if negative
2265 * @i: integer value to add
2266 * @v: pointer of type atomic64_t
2267 *
2268 * Atomically adds @i to @v and returns true
2269 * if the result is negative, or false when
2270 * result is greater than or equal to zero.
2271 */
2272static __always_inline bool
2273arch_atomic64_add_negative(s64 i, atomic64_t *v)
2274{
2275 return arch_atomic64_add_return(i, v) < 0;
2276}
2277#define arch_atomic64_add_negative arch_atomic64_add_negative
2278#endif
2279
2280#ifndef arch_atomic64_fetch_add_unless
2281/**
2282 * arch_atomic64_fetch_add_unless - add unless the number is already a given value
2283 * @v: pointer of type atomic64_t
2284 * @a: the amount to add to v...
2285 * @u: ...unless v is equal to u.
2286 *
2287 * Atomically adds @a to @v, so long as @v was not already @u.
2288 * Returns original value of @v
2289 */
2290static __always_inline s64
2291arch_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
2292{
2293 s64 c = arch_atomic64_read(v);
2294
2295 do {
2296 if (unlikely(c == u))
2297 break;
2298 } while (!arch_atomic64_try_cmpxchg(v, &c, c + a));
2299
2300 return c;
2301}
2302#define arch_atomic64_fetch_add_unless arch_atomic64_fetch_add_unless
2303#endif
2304
2305#ifndef arch_atomic64_add_unless
2306/**
2307 * arch_atomic64_add_unless - add unless the number is already a given value
2308 * @v: pointer of type atomic64_t
2309 * @a: the amount to add to v...
2310 * @u: ...unless v is equal to u.
2311 *
2312 * Atomically adds @a to @v, if @v was not already @u.
2313 * Returns true if the addition was done.
2314 */
2315static __always_inline bool
2316arch_atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
2317{
2318 return arch_atomic64_fetch_add_unless(v, a, u) != u;
2319}
2320#define arch_atomic64_add_unless arch_atomic64_add_unless
2321#endif
2322
2323#ifndef arch_atomic64_inc_not_zero
2324/**
2325 * arch_atomic64_inc_not_zero - increment unless the number is zero
2326 * @v: pointer of type atomic64_t
2327 *
2328 * Atomically increments @v by 1, if @v is non-zero.
2329 * Returns true if the increment was done.
2330 */
2331static __always_inline bool
2332arch_atomic64_inc_not_zero(atomic64_t *v)
2333{
2334 return arch_atomic64_add_unless(v, 1, 0);
2335}
2336#define arch_atomic64_inc_not_zero arch_atomic64_inc_not_zero
2337#endif
2338
2339#ifndef arch_atomic64_inc_unless_negative
2340static __always_inline bool
2341arch_atomic64_inc_unless_negative(atomic64_t *v)
2342{
2343 s64 c = arch_atomic64_read(v);
2344
2345 do {
2346 if (unlikely(c < 0))
2347 return false;
2348 } while (!arch_atomic64_try_cmpxchg(v, &c, c + 1));
2349
2350 return true;
2351}
2352#define arch_atomic64_inc_unless_negative arch_atomic64_inc_unless_negative
2353#endif
2354
2355#ifndef arch_atomic64_dec_unless_positive
2356static __always_inline bool
2357arch_atomic64_dec_unless_positive(atomic64_t *v)
2358{
2359 s64 c = arch_atomic64_read(v);
2360
2361 do {
2362 if (unlikely(c > 0))
2363 return false;
2364 } while (!arch_atomic64_try_cmpxchg(v, &c, c - 1));
2365
2366 return true;
2367}
2368#define arch_atomic64_dec_unless_positive arch_atomic64_dec_unless_positive
2369#endif
2370
2371#ifndef arch_atomic64_dec_if_positive
2372static __always_inline s64
2373arch_atomic64_dec_if_positive(atomic64_t *v)
2374{
2375 s64 dec, c = arch_atomic64_read(v);
2376
2377 do {
2378 dec = c - 1;
2379 if (unlikely(dec < 0))
2380 break;
2381 } while (!arch_atomic64_try_cmpxchg(v, &c, dec));
2382
2383 return dec;
2384}
2385#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
2386#endif
2387
2388#endif /* _LINUX_ATOMIC_FALLBACK_H */
2389// 8e2cc06bc0d2c0967d2f8424762bd48555ee40ae