1
2#ifndef _LINUX_ATOMIC_H
3#define _LINUX_ATOMIC_H
4#include <asm/atomic.h>
5#include <asm/barrier.h>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef atomic_read_acquire
26#define atomic_read_acquire(v) smp_load_acquire(&(v)->counter)
27#endif
28
29#ifndef atomic_set_release
30#define atomic_set_release(v, i) smp_store_release(&(v)->counter, (i))
31#endif
32
33
34
35
36
37
38
39
40
41
42#ifndef __atomic_op_acquire
43#define __atomic_op_acquire(op, args...) \
44({ \
45 typeof(op##_relaxed(args)) __ret = op##_relaxed(args); \
46 smp_mb__after_atomic(); \
47 __ret; \
48})
49#endif
50
51#ifndef __atomic_op_release
52#define __atomic_op_release(op, args...) \
53({ \
54 smp_mb__before_atomic(); \
55 op##_relaxed(args); \
56})
57#endif
58
59#ifndef __atomic_op_fence
60#define __atomic_op_fence(op, args...) \
61({ \
62 typeof(op##_relaxed(args)) __ret; \
63 smp_mb__before_atomic(); \
64 __ret = op##_relaxed(args); \
65 smp_mb__after_atomic(); \
66 __ret; \
67})
68#endif
69
70
71#ifndef atomic_add_return_relaxed
72#define atomic_add_return_relaxed atomic_add_return
73#define atomic_add_return_acquire atomic_add_return
74#define atomic_add_return_release atomic_add_return
75
76#else
77
78#ifndef atomic_add_return_acquire
79#define atomic_add_return_acquire(...) \
80 __atomic_op_acquire(atomic_add_return, __VA_ARGS__)
81#endif
82
83#ifndef atomic_add_return_release
84#define atomic_add_return_release(...) \
85 __atomic_op_release(atomic_add_return, __VA_ARGS__)
86#endif
87
88#ifndef atomic_add_return
89#define atomic_add_return(...) \
90 __atomic_op_fence(atomic_add_return, __VA_ARGS__)
91#endif
92#endif
93
94
95#ifndef atomic_inc_return_relaxed
96#define atomic_inc_return_relaxed atomic_inc_return
97#define atomic_inc_return_acquire atomic_inc_return
98#define atomic_inc_return_release atomic_inc_return
99
100#else
101
102#ifndef atomic_inc_return_acquire
103#define atomic_inc_return_acquire(...) \
104 __atomic_op_acquire(atomic_inc_return, __VA_ARGS__)
105#endif
106
107#ifndef atomic_inc_return_release
108#define atomic_inc_return_release(...) \
109 __atomic_op_release(atomic_inc_return, __VA_ARGS__)
110#endif
111
112#ifndef atomic_inc_return
113#define atomic_inc_return(...) \
114 __atomic_op_fence(atomic_inc_return, __VA_ARGS__)
115#endif
116#endif
117
118
119#ifndef atomic_sub_return_relaxed
120#define atomic_sub_return_relaxed atomic_sub_return
121#define atomic_sub_return_acquire atomic_sub_return
122#define atomic_sub_return_release atomic_sub_return
123
124#else
125
126#ifndef atomic_sub_return_acquire
127#define atomic_sub_return_acquire(...) \
128 __atomic_op_acquire(atomic_sub_return, __VA_ARGS__)
129#endif
130
131#ifndef atomic_sub_return_release
132#define atomic_sub_return_release(...) \
133 __atomic_op_release(atomic_sub_return, __VA_ARGS__)
134#endif
135
136#ifndef atomic_sub_return
137#define atomic_sub_return(...) \
138 __atomic_op_fence(atomic_sub_return, __VA_ARGS__)
139#endif
140#endif
141
142
143#ifndef atomic_dec_return_relaxed
144#define atomic_dec_return_relaxed atomic_dec_return
145#define atomic_dec_return_acquire atomic_dec_return
146#define atomic_dec_return_release atomic_dec_return
147
148#else
149
150#ifndef atomic_dec_return_acquire
151#define atomic_dec_return_acquire(...) \
152 __atomic_op_acquire(atomic_dec_return, __VA_ARGS__)
153#endif
154
155#ifndef atomic_dec_return_release
156#define atomic_dec_return_release(...) \
157 __atomic_op_release(atomic_dec_return, __VA_ARGS__)
158#endif
159
160#ifndef atomic_dec_return
161#define atomic_dec_return(...) \
162 __atomic_op_fence(atomic_dec_return, __VA_ARGS__)
163#endif
164#endif
165
166
167
168#ifndef atomic_fetch_add_relaxed
169#define atomic_fetch_add_relaxed atomic_fetch_add
170#define atomic_fetch_add_acquire atomic_fetch_add
171#define atomic_fetch_add_release atomic_fetch_add
172
173#else
174
175#ifndef atomic_fetch_add_acquire
176#define atomic_fetch_add_acquire(...) \
177 __atomic_op_acquire(atomic_fetch_add, __VA_ARGS__)
178#endif
179
180#ifndef atomic_fetch_add_release
181#define atomic_fetch_add_release(...) \
182 __atomic_op_release(atomic_fetch_add, __VA_ARGS__)
183#endif
184
185#ifndef atomic_fetch_add
186#define atomic_fetch_add(...) \
187 __atomic_op_fence(atomic_fetch_add, __VA_ARGS__)
188#endif
189#endif
190
191
192#ifndef atomic_fetch_inc_relaxed
193
194#ifndef atomic_fetch_inc
195#define atomic_fetch_inc(v) atomic_fetch_add(1, (v))
196#define atomic_fetch_inc_relaxed(v) atomic_fetch_add_relaxed(1, (v))
197#define atomic_fetch_inc_acquire(v) atomic_fetch_add_acquire(1, (v))
198#define atomic_fetch_inc_release(v) atomic_fetch_add_release(1, (v))
199#else
200#define atomic_fetch_inc_relaxed atomic_fetch_inc
201#define atomic_fetch_inc_acquire atomic_fetch_inc
202#define atomic_fetch_inc_release atomic_fetch_inc
203#endif
204
205#else
206
207#ifndef atomic_fetch_inc_acquire
208#define atomic_fetch_inc_acquire(...) \
209 __atomic_op_acquire(atomic_fetch_inc, __VA_ARGS__)
210#endif
211
212#ifndef atomic_fetch_inc_release
213#define atomic_fetch_inc_release(...) \
214 __atomic_op_release(atomic_fetch_inc, __VA_ARGS__)
215#endif
216
217#ifndef atomic_fetch_inc
218#define atomic_fetch_inc(...) \
219 __atomic_op_fence(atomic_fetch_inc, __VA_ARGS__)
220#endif
221#endif
222
223
224#ifndef atomic_fetch_sub_relaxed
225#define atomic_fetch_sub_relaxed atomic_fetch_sub
226#define atomic_fetch_sub_acquire atomic_fetch_sub
227#define atomic_fetch_sub_release atomic_fetch_sub
228
229#else
230
231#ifndef atomic_fetch_sub_acquire
232#define atomic_fetch_sub_acquire(...) \
233 __atomic_op_acquire(atomic_fetch_sub, __VA_ARGS__)
234#endif
235
236#ifndef atomic_fetch_sub_release
237#define atomic_fetch_sub_release(...) \
238 __atomic_op_release(atomic_fetch_sub, __VA_ARGS__)
239#endif
240
241#ifndef atomic_fetch_sub
242#define atomic_fetch_sub(...) \
243 __atomic_op_fence(atomic_fetch_sub, __VA_ARGS__)
244#endif
245#endif
246
247
248#ifndef atomic_fetch_dec_relaxed
249
250#ifndef atomic_fetch_dec
251#define atomic_fetch_dec(v) atomic_fetch_sub(1, (v))
252#define atomic_fetch_dec_relaxed(v) atomic_fetch_sub_relaxed(1, (v))
253#define atomic_fetch_dec_acquire(v) atomic_fetch_sub_acquire(1, (v))
254#define atomic_fetch_dec_release(v) atomic_fetch_sub_release(1, (v))
255#else
256#define atomic_fetch_dec_relaxed atomic_fetch_dec
257#define atomic_fetch_dec_acquire atomic_fetch_dec
258#define atomic_fetch_dec_release atomic_fetch_dec
259#endif
260
261#else
262
263#ifndef atomic_fetch_dec_acquire
264#define atomic_fetch_dec_acquire(...) \
265 __atomic_op_acquire(atomic_fetch_dec, __VA_ARGS__)
266#endif
267
268#ifndef atomic_fetch_dec_release
269#define atomic_fetch_dec_release(...) \
270 __atomic_op_release(atomic_fetch_dec, __VA_ARGS__)
271#endif
272
273#ifndef atomic_fetch_dec
274#define atomic_fetch_dec(...) \
275 __atomic_op_fence(atomic_fetch_dec, __VA_ARGS__)
276#endif
277#endif
278
279
280#ifndef atomic_fetch_or_relaxed
281#define atomic_fetch_or_relaxed atomic_fetch_or
282#define atomic_fetch_or_acquire atomic_fetch_or
283#define atomic_fetch_or_release atomic_fetch_or
284
285#else
286
287#ifndef atomic_fetch_or_acquire
288#define atomic_fetch_or_acquire(...) \
289 __atomic_op_acquire(atomic_fetch_or, __VA_ARGS__)
290#endif
291
292#ifndef atomic_fetch_or_release
293#define atomic_fetch_or_release(...) \
294 __atomic_op_release(atomic_fetch_or, __VA_ARGS__)
295#endif
296
297#ifndef atomic_fetch_or
298#define atomic_fetch_or(...) \
299 __atomic_op_fence(atomic_fetch_or, __VA_ARGS__)
300#endif
301#endif
302
303
304#ifndef atomic_fetch_and_relaxed
305#define atomic_fetch_and_relaxed atomic_fetch_and
306#define atomic_fetch_and_acquire atomic_fetch_and
307#define atomic_fetch_and_release atomic_fetch_and
308
309#else
310
311#ifndef atomic_fetch_and_acquire
312#define atomic_fetch_and_acquire(...) \
313 __atomic_op_acquire(atomic_fetch_and, __VA_ARGS__)
314#endif
315
316#ifndef atomic_fetch_and_release
317#define atomic_fetch_and_release(...) \
318 __atomic_op_release(atomic_fetch_and, __VA_ARGS__)
319#endif
320
321#ifndef atomic_fetch_and
322#define atomic_fetch_and(...) \
323 __atomic_op_fence(atomic_fetch_and, __VA_ARGS__)
324#endif
325#endif
326
327#ifdef atomic_andnot
328
329#ifndef atomic_fetch_andnot_relaxed
330#define atomic_fetch_andnot_relaxed atomic_fetch_andnot
331#define atomic_fetch_andnot_acquire atomic_fetch_andnot
332#define atomic_fetch_andnot_release atomic_fetch_andnot
333
334#else
335
336#ifndef atomic_fetch_andnot_acquire
337#define atomic_fetch_andnot_acquire(...) \
338 __atomic_op_acquire(atomic_fetch_andnot, __VA_ARGS__)
339#endif
340
341#ifndef atomic_fetch_andnot_release
342#define atomic_fetch_andnot_release(...) \
343 __atomic_op_release(atomic_fetch_andnot, __VA_ARGS__)
344#endif
345
346#ifndef atomic_fetch_andnot
347#define atomic_fetch_andnot(...) \
348 __atomic_op_fence(atomic_fetch_andnot, __VA_ARGS__)
349#endif
350#endif
351#endif
352
353
354#ifndef atomic_fetch_xor_relaxed
355#define atomic_fetch_xor_relaxed atomic_fetch_xor
356#define atomic_fetch_xor_acquire atomic_fetch_xor
357#define atomic_fetch_xor_release atomic_fetch_xor
358
359#else
360
361#ifndef atomic_fetch_xor_acquire
362#define atomic_fetch_xor_acquire(...) \
363 __atomic_op_acquire(atomic_fetch_xor, __VA_ARGS__)
364#endif
365
366#ifndef atomic_fetch_xor_release
367#define atomic_fetch_xor_release(...) \
368 __atomic_op_release(atomic_fetch_xor, __VA_ARGS__)
369#endif
370
371#ifndef atomic_fetch_xor
372#define atomic_fetch_xor(...) \
373 __atomic_op_fence(atomic_fetch_xor, __VA_ARGS__)
374#endif
375#endif
376
377
378
379#ifndef atomic_xchg_relaxed
380#define atomic_xchg_relaxed atomic_xchg
381#define atomic_xchg_acquire atomic_xchg
382#define atomic_xchg_release atomic_xchg
383
384#else
385
386#ifndef atomic_xchg_acquire
387#define atomic_xchg_acquire(...) \
388 __atomic_op_acquire(atomic_xchg, __VA_ARGS__)
389#endif
390
391#ifndef atomic_xchg_release
392#define atomic_xchg_release(...) \
393 __atomic_op_release(atomic_xchg, __VA_ARGS__)
394#endif
395
396#ifndef atomic_xchg
397#define atomic_xchg(...) \
398 __atomic_op_fence(atomic_xchg, __VA_ARGS__)
399#endif
400#endif
401
402
403#ifndef atomic_cmpxchg_relaxed
404#define atomic_cmpxchg_relaxed atomic_cmpxchg
405#define atomic_cmpxchg_acquire atomic_cmpxchg
406#define atomic_cmpxchg_release atomic_cmpxchg
407
408#else
409
410#ifndef atomic_cmpxchg_acquire
411#define atomic_cmpxchg_acquire(...) \
412 __atomic_op_acquire(atomic_cmpxchg, __VA_ARGS__)
413#endif
414
415#ifndef atomic_cmpxchg_release
416#define atomic_cmpxchg_release(...) \
417 __atomic_op_release(atomic_cmpxchg, __VA_ARGS__)
418#endif
419
420#ifndef atomic_cmpxchg
421#define atomic_cmpxchg(...) \
422 __atomic_op_fence(atomic_cmpxchg, __VA_ARGS__)
423#endif
424#endif
425
426
427#ifndef cmpxchg_relaxed
428#define cmpxchg_relaxed cmpxchg
429#define cmpxchg_acquire cmpxchg
430#define cmpxchg_release cmpxchg
431
432#else
433
434#ifndef cmpxchg_acquire
435#define cmpxchg_acquire(...) \
436 __atomic_op_acquire(cmpxchg, __VA_ARGS__)
437#endif
438
439#ifndef cmpxchg_release
440#define cmpxchg_release(...) \
441 __atomic_op_release(cmpxchg, __VA_ARGS__)
442#endif
443
444#ifndef cmpxchg
445#define cmpxchg(...) \
446 __atomic_op_fence(cmpxchg, __VA_ARGS__)
447#endif
448#endif
449
450
451#ifndef cmpxchg64_relaxed
452#define cmpxchg64_relaxed cmpxchg64
453#define cmpxchg64_acquire cmpxchg64
454#define cmpxchg64_release cmpxchg64
455
456#else
457
458#ifndef cmpxchg64_acquire
459#define cmpxchg64_acquire(...) \
460 __atomic_op_acquire(cmpxchg64, __VA_ARGS__)
461#endif
462
463#ifndef cmpxchg64_release
464#define cmpxchg64_release(...) \
465 __atomic_op_release(cmpxchg64, __VA_ARGS__)
466#endif
467
468#ifndef cmpxchg64
469#define cmpxchg64(...) \
470 __atomic_op_fence(cmpxchg64, __VA_ARGS__)
471#endif
472#endif
473
474
475#ifndef xchg_relaxed
476#define xchg_relaxed xchg
477#define xchg_acquire xchg
478#define xchg_release xchg
479
480#else
481
482#ifndef xchg_acquire
483#define xchg_acquire(...) __atomic_op_acquire(xchg, __VA_ARGS__)
484#endif
485
486#ifndef xchg_release
487#define xchg_release(...) __atomic_op_release(xchg, __VA_ARGS__)
488#endif
489
490#ifndef xchg
491#define xchg(...) __atomic_op_fence(xchg, __VA_ARGS__)
492#endif
493#endif
494
495
496
497
498
499
500
501
502
503
504static inline int atomic_add_unless(atomic_t *v, int a, int u)
505{
506 return __atomic_add_unless(v, a, u) != u;
507}
508
509
510
511
512
513
514
515
516#ifndef atomic_inc_not_zero
517#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
518#endif
519
520#ifndef atomic_andnot
521static inline void atomic_andnot(int i, atomic_t *v)
522{
523 atomic_and(~i, v);
524}
525
526static inline int atomic_fetch_andnot(int i, atomic_t *v)
527{
528 return atomic_fetch_and(~i, v);
529}
530
531static inline int atomic_fetch_andnot_relaxed(int i, atomic_t *v)
532{
533 return atomic_fetch_and_relaxed(~i, v);
534}
535
536static inline int atomic_fetch_andnot_acquire(int i, atomic_t *v)
537{
538 return atomic_fetch_and_acquire(~i, v);
539}
540
541static inline int atomic_fetch_andnot_release(int i, atomic_t *v)
542{
543 return atomic_fetch_and_release(~i, v);
544}
545#endif
546
547
548
549
550
551
552
553
554
555
556
557
558
559#ifndef atomic_inc_not_zero_hint
560static inline int atomic_inc_not_zero_hint(atomic_t *v, int hint)
561{
562 int val, c = hint;
563
564
565 if (!hint)
566 return atomic_inc_not_zero(v);
567
568 do {
569 val = atomic_cmpxchg(v, c, c + 1);
570 if (val == c)
571 return 1;
572 c = val;
573 } while (c);
574
575 return 0;
576}
577#endif
578
579#ifndef atomic_inc_unless_negative
580static inline int atomic_inc_unless_negative(atomic_t *p)
581{
582 int v, v1;
583 for (v = 0; v >= 0; v = v1) {
584 v1 = atomic_cmpxchg(p, v, v + 1);
585 if (likely(v1 == v))
586 return 1;
587 }
588 return 0;
589}
590#endif
591
592#ifndef atomic_dec_unless_positive
593static inline int atomic_dec_unless_positive(atomic_t *p)
594{
595 int v, v1;
596 for (v = 0; v <= 0; v = v1) {
597 v1 = atomic_cmpxchg(p, v, v - 1);
598 if (likely(v1 == v))
599 return 1;
600 }
601 return 0;
602}
603#endif
604
605
606
607
608
609
610
611
612#ifndef atomic_dec_if_positive
613static inline int atomic_dec_if_positive(atomic_t *v)
614{
615 int c, old, dec;
616 c = atomic_read(v);
617 for (;;) {
618 dec = c - 1;
619 if (unlikely(dec < 0))
620 break;
621 old = atomic_cmpxchg((v), c, dec);
622 if (likely(old == c))
623 break;
624 c = old;
625 }
626 return dec;
627}
628#endif
629
630#ifdef CONFIG_GENERIC_ATOMIC64
631#include <asm-generic/atomic64.h>
632#endif
633
634#ifndef atomic64_read_acquire
635#define atomic64_read_acquire(v) smp_load_acquire(&(v)->counter)
636#endif
637
638#ifndef atomic64_set_release
639#define atomic64_set_release(v, i) smp_store_release(&(v)->counter, (i))
640#endif
641
642
643#ifndef atomic64_add_return_relaxed
644#define atomic64_add_return_relaxed atomic64_add_return
645#define atomic64_add_return_acquire atomic64_add_return
646#define atomic64_add_return_release atomic64_add_return
647
648#else
649
650#ifndef atomic64_add_return_acquire
651#define atomic64_add_return_acquire(...) \
652 __atomic_op_acquire(atomic64_add_return, __VA_ARGS__)
653#endif
654
655#ifndef atomic64_add_return_release
656#define atomic64_add_return_release(...) \
657 __atomic_op_release(atomic64_add_return, __VA_ARGS__)
658#endif
659
660#ifndef atomic64_add_return
661#define atomic64_add_return(...) \
662 __atomic_op_fence(atomic64_add_return, __VA_ARGS__)
663#endif
664#endif
665
666
667#ifndef atomic64_inc_return_relaxed
668#define atomic64_inc_return_relaxed atomic64_inc_return
669#define atomic64_inc_return_acquire atomic64_inc_return
670#define atomic64_inc_return_release atomic64_inc_return
671
672#else
673
674#ifndef atomic64_inc_return_acquire
675#define atomic64_inc_return_acquire(...) \
676 __atomic_op_acquire(atomic64_inc_return, __VA_ARGS__)
677#endif
678
679#ifndef atomic64_inc_return_release
680#define atomic64_inc_return_release(...) \
681 __atomic_op_release(atomic64_inc_return, __VA_ARGS__)
682#endif
683
684#ifndef atomic64_inc_return
685#define atomic64_inc_return(...) \
686 __atomic_op_fence(atomic64_inc_return, __VA_ARGS__)
687#endif
688#endif
689
690
691
692#ifndef atomic64_sub_return_relaxed
693#define atomic64_sub_return_relaxed atomic64_sub_return
694#define atomic64_sub_return_acquire atomic64_sub_return
695#define atomic64_sub_return_release atomic64_sub_return
696
697#else
698
699#ifndef atomic64_sub_return_acquire
700#define atomic64_sub_return_acquire(...) \
701 __atomic_op_acquire(atomic64_sub_return, __VA_ARGS__)
702#endif
703
704#ifndef atomic64_sub_return_release
705#define atomic64_sub_return_release(...) \
706 __atomic_op_release(atomic64_sub_return, __VA_ARGS__)
707#endif
708
709#ifndef atomic64_sub_return
710#define atomic64_sub_return(...) \
711 __atomic_op_fence(atomic64_sub_return, __VA_ARGS__)
712#endif
713#endif
714
715
716#ifndef atomic64_dec_return_relaxed
717#define atomic64_dec_return_relaxed atomic64_dec_return
718#define atomic64_dec_return_acquire atomic64_dec_return
719#define atomic64_dec_return_release atomic64_dec_return
720
721#else
722
723#ifndef atomic64_dec_return_acquire
724#define atomic64_dec_return_acquire(...) \
725 __atomic_op_acquire(atomic64_dec_return, __VA_ARGS__)
726#endif
727
728#ifndef atomic64_dec_return_release
729#define atomic64_dec_return_release(...) \
730 __atomic_op_release(atomic64_dec_return, __VA_ARGS__)
731#endif
732
733#ifndef atomic64_dec_return
734#define atomic64_dec_return(...) \
735 __atomic_op_fence(atomic64_dec_return, __VA_ARGS__)
736#endif
737#endif
738
739
740
741#ifndef atomic64_fetch_add_relaxed
742#define atomic64_fetch_add_relaxed atomic64_fetch_add
743#define atomic64_fetch_add_acquire atomic64_fetch_add
744#define atomic64_fetch_add_release atomic64_fetch_add
745
746#else
747
748#ifndef atomic64_fetch_add_acquire
749#define atomic64_fetch_add_acquire(...) \
750 __atomic_op_acquire(atomic64_fetch_add, __VA_ARGS__)
751#endif
752
753#ifndef atomic64_fetch_add_release
754#define atomic64_fetch_add_release(...) \
755 __atomic_op_release(atomic64_fetch_add, __VA_ARGS__)
756#endif
757
758#ifndef atomic64_fetch_add
759#define atomic64_fetch_add(...) \
760 __atomic_op_fence(atomic64_fetch_add, __VA_ARGS__)
761#endif
762#endif
763
764
765#ifndef atomic64_fetch_inc_relaxed
766
767#ifndef atomic64_fetch_inc
768#define atomic64_fetch_inc(v) atomic64_fetch_add(1, (v))
769#define atomic64_fetch_inc_relaxed(v) atomic64_fetch_add_relaxed(1, (v))
770#define atomic64_fetch_inc_acquire(v) atomic64_fetch_add_acquire(1, (v))
771#define atomic64_fetch_inc_release(v) atomic64_fetch_add_release(1, (v))
772#else
773#define atomic64_fetch_inc_relaxed atomic64_fetch_inc
774#define atomic64_fetch_inc_acquire atomic64_fetch_inc
775#define atomic64_fetch_inc_release atomic64_fetch_inc
776#endif
777
778#else
779
780#ifndef atomic64_fetch_inc_acquire
781#define atomic64_fetch_inc_acquire(...) \
782 __atomic_op_acquire(atomic64_fetch_inc, __VA_ARGS__)
783#endif
784
785#ifndef atomic64_fetch_inc_release
786#define atomic64_fetch_inc_release(...) \
787 __atomic_op_release(atomic64_fetch_inc, __VA_ARGS__)
788#endif
789
790#ifndef atomic64_fetch_inc
791#define atomic64_fetch_inc(...) \
792 __atomic_op_fence(atomic64_fetch_inc, __VA_ARGS__)
793#endif
794#endif
795
796
797#ifndef atomic64_fetch_sub_relaxed
798#define atomic64_fetch_sub_relaxed atomic64_fetch_sub
799#define atomic64_fetch_sub_acquire atomic64_fetch_sub
800#define atomic64_fetch_sub_release atomic64_fetch_sub
801
802#else
803
804#ifndef atomic64_fetch_sub_acquire
805#define atomic64_fetch_sub_acquire(...) \
806 __atomic_op_acquire(atomic64_fetch_sub, __VA_ARGS__)
807#endif
808
809#ifndef atomic64_fetch_sub_release
810#define atomic64_fetch_sub_release(...) \
811 __atomic_op_release(atomic64_fetch_sub, __VA_ARGS__)
812#endif
813
814#ifndef atomic64_fetch_sub
815#define atomic64_fetch_sub(...) \
816 __atomic_op_fence(atomic64_fetch_sub, __VA_ARGS__)
817#endif
818#endif
819
820
821#ifndef atomic64_fetch_dec_relaxed
822
823#ifndef atomic64_fetch_dec
824#define atomic64_fetch_dec(v) atomic64_fetch_sub(1, (v))
825#define atomic64_fetch_dec_relaxed(v) atomic64_fetch_sub_relaxed(1, (v))
826#define atomic64_fetch_dec_acquire(v) atomic64_fetch_sub_acquire(1, (v))
827#define atomic64_fetch_dec_release(v) atomic64_fetch_sub_release(1, (v))
828#else
829#define atomic64_fetch_dec_relaxed atomic64_fetch_dec
830#define atomic64_fetch_dec_acquire atomic64_fetch_dec
831#define atomic64_fetch_dec_release atomic64_fetch_dec
832#endif
833
834#else
835
836#ifndef atomic64_fetch_dec_acquire
837#define atomic64_fetch_dec_acquire(...) \
838 __atomic_op_acquire(atomic64_fetch_dec, __VA_ARGS__)
839#endif
840
841#ifndef atomic64_fetch_dec_release
842#define atomic64_fetch_dec_release(...) \
843 __atomic_op_release(atomic64_fetch_dec, __VA_ARGS__)
844#endif
845
846#ifndef atomic64_fetch_dec
847#define atomic64_fetch_dec(...) \
848 __atomic_op_fence(atomic64_fetch_dec, __VA_ARGS__)
849#endif
850#endif
851
852
853#ifndef atomic64_fetch_or_relaxed
854#define atomic64_fetch_or_relaxed atomic64_fetch_or
855#define atomic64_fetch_or_acquire atomic64_fetch_or
856#define atomic64_fetch_or_release atomic64_fetch_or
857
858#else
859
860#ifndef atomic64_fetch_or_acquire
861#define atomic64_fetch_or_acquire(...) \
862 __atomic_op_acquire(atomic64_fetch_or, __VA_ARGS__)
863#endif
864
865#ifndef atomic64_fetch_or_release
866#define atomic64_fetch_or_release(...) \
867 __atomic_op_release(atomic64_fetch_or, __VA_ARGS__)
868#endif
869
870#ifndef atomic64_fetch_or
871#define atomic64_fetch_or(...) \
872 __atomic_op_fence(atomic64_fetch_or, __VA_ARGS__)
873#endif
874#endif
875
876
877#ifndef atomic64_fetch_and_relaxed
878#define atomic64_fetch_and_relaxed atomic64_fetch_and
879#define atomic64_fetch_and_acquire atomic64_fetch_and
880#define atomic64_fetch_and_release atomic64_fetch_and
881
882#else
883
884#ifndef atomic64_fetch_and_acquire
885#define atomic64_fetch_and_acquire(...) \
886 __atomic_op_acquire(atomic64_fetch_and, __VA_ARGS__)
887#endif
888
889#ifndef atomic64_fetch_and_release
890#define atomic64_fetch_and_release(...) \
891 __atomic_op_release(atomic64_fetch_and, __VA_ARGS__)
892#endif
893
894#ifndef atomic64_fetch_and
895#define atomic64_fetch_and(...) \
896 __atomic_op_fence(atomic64_fetch_and, __VA_ARGS__)
897#endif
898#endif
899
900#ifdef atomic64_andnot
901
902#ifndef atomic64_fetch_andnot_relaxed
903#define atomic64_fetch_andnot_relaxed atomic64_fetch_andnot
904#define atomic64_fetch_andnot_acquire atomic64_fetch_andnot
905#define atomic64_fetch_andnot_release atomic64_fetch_andnot
906
907#else
908
909#ifndef atomic64_fetch_andnot_acquire
910#define atomic64_fetch_andnot_acquire(...) \
911 __atomic_op_acquire(atomic64_fetch_andnot, __VA_ARGS__)
912#endif
913
914#ifndef atomic64_fetch_andnot_release
915#define atomic64_fetch_andnot_release(...) \
916 __atomic_op_release(atomic64_fetch_andnot, __VA_ARGS__)
917#endif
918
919#ifndef atomic64_fetch_andnot
920#define atomic64_fetch_andnot(...) \
921 __atomic_op_fence(atomic64_fetch_andnot, __VA_ARGS__)
922#endif
923#endif
924#endif
925
926
927#ifndef atomic64_fetch_xor_relaxed
928#define atomic64_fetch_xor_relaxed atomic64_fetch_xor
929#define atomic64_fetch_xor_acquire atomic64_fetch_xor
930#define atomic64_fetch_xor_release atomic64_fetch_xor
931
932#else
933
934#ifndef atomic64_fetch_xor_acquire
935#define atomic64_fetch_xor_acquire(...) \
936 __atomic_op_acquire(atomic64_fetch_xor, __VA_ARGS__)
937#endif
938
939#ifndef atomic64_fetch_xor_release
940#define atomic64_fetch_xor_release(...) \
941 __atomic_op_release(atomic64_fetch_xor, __VA_ARGS__)
942#endif
943
944#ifndef atomic64_fetch_xor
945#define atomic64_fetch_xor(...) \
946 __atomic_op_fence(atomic64_fetch_xor, __VA_ARGS__)
947#endif
948#endif
949
950
951
952#ifndef atomic64_xchg_relaxed
953#define atomic64_xchg_relaxed atomic64_xchg
954#define atomic64_xchg_acquire atomic64_xchg
955#define atomic64_xchg_release atomic64_xchg
956
957#else
958
959#ifndef atomic64_xchg_acquire
960#define atomic64_xchg_acquire(...) \
961 __atomic_op_acquire(atomic64_xchg, __VA_ARGS__)
962#endif
963
964#ifndef atomic64_xchg_release
965#define atomic64_xchg_release(...) \
966 __atomic_op_release(atomic64_xchg, __VA_ARGS__)
967#endif
968
969#ifndef atomic64_xchg
970#define atomic64_xchg(...) \
971 __atomic_op_fence(atomic64_xchg, __VA_ARGS__)
972#endif
973#endif
974
975
976#ifndef atomic64_cmpxchg_relaxed
977#define atomic64_cmpxchg_relaxed atomic64_cmpxchg
978#define atomic64_cmpxchg_acquire atomic64_cmpxchg
979#define atomic64_cmpxchg_release atomic64_cmpxchg
980
981#else
982
983#ifndef atomic64_cmpxchg_acquire
984#define atomic64_cmpxchg_acquire(...) \
985 __atomic_op_acquire(atomic64_cmpxchg, __VA_ARGS__)
986#endif
987
988#ifndef atomic64_cmpxchg_release
989#define atomic64_cmpxchg_release(...) \
990 __atomic_op_release(atomic64_cmpxchg, __VA_ARGS__)
991#endif
992
993#ifndef atomic64_cmpxchg
994#define atomic64_cmpxchg(...) \
995 __atomic_op_fence(atomic64_cmpxchg, __VA_ARGS__)
996#endif
997#endif
998
999#ifndef atomic64_andnot
1000static inline void atomic64_andnot(long long i, atomic64_t *v)
1001{
1002 atomic64_and(~i, v);
1003}
1004
1005static inline long long atomic64_fetch_andnot(long long i, atomic64_t *v)
1006{
1007 return atomic64_fetch_and(~i, v);
1008}
1009
1010static inline long long atomic64_fetch_andnot_relaxed(long long i, atomic64_t *v)
1011{
1012 return atomic64_fetch_and_relaxed(~i, v);
1013}
1014
1015static inline long long atomic64_fetch_andnot_acquire(long long i, atomic64_t *v)
1016{
1017 return atomic64_fetch_and_acquire(~i, v);
1018}
1019
1020static inline long long atomic64_fetch_andnot_release(long long i, atomic64_t *v)
1021{
1022 return atomic64_fetch_and_release(~i, v);
1023}
1024#endif
1025
1026#include <asm-generic/atomic-long.h>
1027
1028#endif
1029