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