hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/include/linux/atomic.h
....@@ -25,13 +25,11 @@
2525 * See Documentation/memory-barriers.txt for ACQUIRE/RELEASE definitions.
2626 */
2727
28
-#ifndef atomic_read_acquire
29
-#define atomic_read_acquire(v) smp_load_acquire(&(v)->counter)
30
-#endif
28
+#define atomic_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c))
29
+#define atomic_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c))
3130
32
-#ifndef atomic_set_release
33
-#define atomic_set_release(v, i) smp_store_release(&(v)->counter, (i))
34
-#endif
31
+#define atomic64_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c))
32
+#define atomic64_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c))
3533
3634 /*
3735 * The idea here is to build acquire/release variants by adding explicit
....@@ -79,1238 +77,12 @@
7977 __ret; \
8078 })
8179
82
-/* atomic_add_return_relaxed */
83
-#ifndef atomic_add_return_relaxed
84
-#define atomic_add_return_relaxed atomic_add_return
85
-#define atomic_add_return_acquire atomic_add_return
86
-#define atomic_add_return_release atomic_add_return
87
-
88
-#else /* atomic_add_return_relaxed */
89
-
90
-#ifndef atomic_add_return_acquire
91
-#define atomic_add_return_acquire(...) \
92
- __atomic_op_acquire(atomic_add_return, __VA_ARGS__)
93
-#endif
94
-
95
-#ifndef atomic_add_return_release
96
-#define atomic_add_return_release(...) \
97
- __atomic_op_release(atomic_add_return, __VA_ARGS__)
98
-#endif
99
-
100
-#ifndef atomic_add_return
101
-#define atomic_add_return(...) \
102
- __atomic_op_fence(atomic_add_return, __VA_ARGS__)
103
-#endif
104
-#endif /* atomic_add_return_relaxed */
105
-
106
-#ifndef atomic_inc
107
-#define atomic_inc(v) atomic_add(1, (v))
108
-#endif
109
-
110
-/* atomic_inc_return_relaxed */
111
-#ifndef atomic_inc_return_relaxed
112
-
113
-#ifndef atomic_inc_return
114
-#define atomic_inc_return(v) atomic_add_return(1, (v))
115
-#define atomic_inc_return_relaxed(v) atomic_add_return_relaxed(1, (v))
116
-#define atomic_inc_return_acquire(v) atomic_add_return_acquire(1, (v))
117
-#define atomic_inc_return_release(v) atomic_add_return_release(1, (v))
118
-#else /* atomic_inc_return */
119
-#define atomic_inc_return_relaxed atomic_inc_return
120
-#define atomic_inc_return_acquire atomic_inc_return
121
-#define atomic_inc_return_release atomic_inc_return
122
-#endif /* atomic_inc_return */
123
-
124
-#else /* atomic_inc_return_relaxed */
125
-
126
-#ifndef atomic_inc_return_acquire
127
-#define atomic_inc_return_acquire(...) \
128
- __atomic_op_acquire(atomic_inc_return, __VA_ARGS__)
129
-#endif
130
-
131
-#ifndef atomic_inc_return_release
132
-#define atomic_inc_return_release(...) \
133
- __atomic_op_release(atomic_inc_return, __VA_ARGS__)
134
-#endif
135
-
136
-#ifndef atomic_inc_return
137
-#define atomic_inc_return(...) \
138
- __atomic_op_fence(atomic_inc_return, __VA_ARGS__)
139
-#endif
140
-#endif /* atomic_inc_return_relaxed */
141
-
142
-/* atomic_sub_return_relaxed */
143
-#ifndef atomic_sub_return_relaxed
144
-#define atomic_sub_return_relaxed atomic_sub_return
145
-#define atomic_sub_return_acquire atomic_sub_return
146
-#define atomic_sub_return_release atomic_sub_return
147
-
148
-#else /* atomic_sub_return_relaxed */
149
-
150
-#ifndef atomic_sub_return_acquire
151
-#define atomic_sub_return_acquire(...) \
152
- __atomic_op_acquire(atomic_sub_return, __VA_ARGS__)
153
-#endif
154
-
155
-#ifndef atomic_sub_return_release
156
-#define atomic_sub_return_release(...) \
157
- __atomic_op_release(atomic_sub_return, __VA_ARGS__)
158
-#endif
159
-
160
-#ifndef atomic_sub_return
161
-#define atomic_sub_return(...) \
162
- __atomic_op_fence(atomic_sub_return, __VA_ARGS__)
163
-#endif
164
-#endif /* atomic_sub_return_relaxed */
165
-
166
-#ifndef atomic_dec
167
-#define atomic_dec(v) atomic_sub(1, (v))
168
-#endif
169
-
170
-/* atomic_dec_return_relaxed */
171
-#ifndef atomic_dec_return_relaxed
172
-
173
-#ifndef atomic_dec_return
174
-#define atomic_dec_return(v) atomic_sub_return(1, (v))
175
-#define atomic_dec_return_relaxed(v) atomic_sub_return_relaxed(1, (v))
176
-#define atomic_dec_return_acquire(v) atomic_sub_return_acquire(1, (v))
177
-#define atomic_dec_return_release(v) atomic_sub_return_release(1, (v))
178
-#else /* atomic_dec_return */
179
-#define atomic_dec_return_relaxed atomic_dec_return
180
-#define atomic_dec_return_acquire atomic_dec_return
181
-#define atomic_dec_return_release atomic_dec_return
182
-#endif /* atomic_dec_return */
183
-
184
-#else /* atomic_dec_return_relaxed */
185
-
186
-#ifndef atomic_dec_return_acquire
187
-#define atomic_dec_return_acquire(...) \
188
- __atomic_op_acquire(atomic_dec_return, __VA_ARGS__)
189
-#endif
190
-
191
-#ifndef atomic_dec_return_release
192
-#define atomic_dec_return_release(...) \
193
- __atomic_op_release(atomic_dec_return, __VA_ARGS__)
194
-#endif
195
-
196
-#ifndef atomic_dec_return
197
-#define atomic_dec_return(...) \
198
- __atomic_op_fence(atomic_dec_return, __VA_ARGS__)
199
-#endif
200
-#endif /* atomic_dec_return_relaxed */
201
-
202
-
203
-/* atomic_fetch_add_relaxed */
204
-#ifndef atomic_fetch_add_relaxed
205
-#define atomic_fetch_add_relaxed atomic_fetch_add
206
-#define atomic_fetch_add_acquire atomic_fetch_add
207
-#define atomic_fetch_add_release atomic_fetch_add
208
-
209
-#else /* atomic_fetch_add_relaxed */
210
-
211
-#ifndef atomic_fetch_add_acquire
212
-#define atomic_fetch_add_acquire(...) \
213
- __atomic_op_acquire(atomic_fetch_add, __VA_ARGS__)
214
-#endif
215
-
216
-#ifndef atomic_fetch_add_release
217
-#define atomic_fetch_add_release(...) \
218
- __atomic_op_release(atomic_fetch_add, __VA_ARGS__)
219
-#endif
220
-
221
-#ifndef atomic_fetch_add
222
-#define atomic_fetch_add(...) \
223
- __atomic_op_fence(atomic_fetch_add, __VA_ARGS__)
224
-#endif
225
-#endif /* atomic_fetch_add_relaxed */
226
-
227
-/* atomic_fetch_inc_relaxed */
228
-#ifndef atomic_fetch_inc_relaxed
229
-
230
-#ifndef atomic_fetch_inc
231
-#define atomic_fetch_inc(v) atomic_fetch_add(1, (v))
232
-#define atomic_fetch_inc_relaxed(v) atomic_fetch_add_relaxed(1, (v))
233
-#define atomic_fetch_inc_acquire(v) atomic_fetch_add_acquire(1, (v))
234
-#define atomic_fetch_inc_release(v) atomic_fetch_add_release(1, (v))
235
-#else /* atomic_fetch_inc */
236
-#define atomic_fetch_inc_relaxed atomic_fetch_inc
237
-#define atomic_fetch_inc_acquire atomic_fetch_inc
238
-#define atomic_fetch_inc_release atomic_fetch_inc
239
-#endif /* atomic_fetch_inc */
240
-
241
-#else /* atomic_fetch_inc_relaxed */
242
-
243
-#ifndef atomic_fetch_inc_acquire
244
-#define atomic_fetch_inc_acquire(...) \
245
- __atomic_op_acquire(atomic_fetch_inc, __VA_ARGS__)
246
-#endif
247
-
248
-#ifndef atomic_fetch_inc_release
249
-#define atomic_fetch_inc_release(...) \
250
- __atomic_op_release(atomic_fetch_inc, __VA_ARGS__)
251
-#endif
252
-
253
-#ifndef atomic_fetch_inc
254
-#define atomic_fetch_inc(...) \
255
- __atomic_op_fence(atomic_fetch_inc, __VA_ARGS__)
256
-#endif
257
-#endif /* atomic_fetch_inc_relaxed */
258
-
259
-/* atomic_fetch_sub_relaxed */
260
-#ifndef atomic_fetch_sub_relaxed
261
-#define atomic_fetch_sub_relaxed atomic_fetch_sub
262
-#define atomic_fetch_sub_acquire atomic_fetch_sub
263
-#define atomic_fetch_sub_release atomic_fetch_sub
264
-
265
-#else /* atomic_fetch_sub_relaxed */
266
-
267
-#ifndef atomic_fetch_sub_acquire
268
-#define atomic_fetch_sub_acquire(...) \
269
- __atomic_op_acquire(atomic_fetch_sub, __VA_ARGS__)
270
-#endif
271
-
272
-#ifndef atomic_fetch_sub_release
273
-#define atomic_fetch_sub_release(...) \
274
- __atomic_op_release(atomic_fetch_sub, __VA_ARGS__)
275
-#endif
276
-
277
-#ifndef atomic_fetch_sub
278
-#define atomic_fetch_sub(...) \
279
- __atomic_op_fence(atomic_fetch_sub, __VA_ARGS__)
280
-#endif
281
-#endif /* atomic_fetch_sub_relaxed */
282
-
283
-/* atomic_fetch_dec_relaxed */
284
-#ifndef atomic_fetch_dec_relaxed
285
-
286
-#ifndef atomic_fetch_dec
287
-#define atomic_fetch_dec(v) atomic_fetch_sub(1, (v))
288
-#define atomic_fetch_dec_relaxed(v) atomic_fetch_sub_relaxed(1, (v))
289
-#define atomic_fetch_dec_acquire(v) atomic_fetch_sub_acquire(1, (v))
290
-#define atomic_fetch_dec_release(v) atomic_fetch_sub_release(1, (v))
291
-#else /* atomic_fetch_dec */
292
-#define atomic_fetch_dec_relaxed atomic_fetch_dec
293
-#define atomic_fetch_dec_acquire atomic_fetch_dec
294
-#define atomic_fetch_dec_release atomic_fetch_dec
295
-#endif /* atomic_fetch_dec */
296
-
297
-#else /* atomic_fetch_dec_relaxed */
298
-
299
-#ifndef atomic_fetch_dec_acquire
300
-#define atomic_fetch_dec_acquire(...) \
301
- __atomic_op_acquire(atomic_fetch_dec, __VA_ARGS__)
302
-#endif
303
-
304
-#ifndef atomic_fetch_dec_release
305
-#define atomic_fetch_dec_release(...) \
306
- __atomic_op_release(atomic_fetch_dec, __VA_ARGS__)
307
-#endif
308
-
309
-#ifndef atomic_fetch_dec
310
-#define atomic_fetch_dec(...) \
311
- __atomic_op_fence(atomic_fetch_dec, __VA_ARGS__)
312
-#endif
313
-#endif /* atomic_fetch_dec_relaxed */
314
-
315
-/* atomic_fetch_or_relaxed */
316
-#ifndef atomic_fetch_or_relaxed
317
-#define atomic_fetch_or_relaxed atomic_fetch_or
318
-#define atomic_fetch_or_acquire atomic_fetch_or
319
-#define atomic_fetch_or_release atomic_fetch_or
320
-
321
-#else /* atomic_fetch_or_relaxed */
322
-
323
-#ifndef atomic_fetch_or_acquire
324
-#define atomic_fetch_or_acquire(...) \
325
- __atomic_op_acquire(atomic_fetch_or, __VA_ARGS__)
326
-#endif
327
-
328
-#ifndef atomic_fetch_or_release
329
-#define atomic_fetch_or_release(...) \
330
- __atomic_op_release(atomic_fetch_or, __VA_ARGS__)
331
-#endif
332
-
333
-#ifndef atomic_fetch_or
334
-#define atomic_fetch_or(...) \
335
- __atomic_op_fence(atomic_fetch_or, __VA_ARGS__)
336
-#endif
337
-#endif /* atomic_fetch_or_relaxed */
338
-
339
-/* atomic_fetch_and_relaxed */
340
-#ifndef atomic_fetch_and_relaxed
341
-#define atomic_fetch_and_relaxed atomic_fetch_and
342
-#define atomic_fetch_and_acquire atomic_fetch_and
343
-#define atomic_fetch_and_release atomic_fetch_and
344
-
345
-#else /* atomic_fetch_and_relaxed */
346
-
347
-#ifndef atomic_fetch_and_acquire
348
-#define atomic_fetch_and_acquire(...) \
349
- __atomic_op_acquire(atomic_fetch_and, __VA_ARGS__)
350
-#endif
351
-
352
-#ifndef atomic_fetch_and_release
353
-#define atomic_fetch_and_release(...) \
354
- __atomic_op_release(atomic_fetch_and, __VA_ARGS__)
355
-#endif
356
-
357
-#ifndef atomic_fetch_and
358
-#define atomic_fetch_and(...) \
359
- __atomic_op_fence(atomic_fetch_and, __VA_ARGS__)
360
-#endif
361
-#endif /* atomic_fetch_and_relaxed */
362
-
363
-#ifndef atomic_andnot
364
-#define atomic_andnot(i, v) atomic_and(~(int)(i), (v))
365
-#endif
366
-
367
-#ifndef atomic_fetch_andnot_relaxed
368
-
369
-#ifndef atomic_fetch_andnot
370
-#define atomic_fetch_andnot(i, v) atomic_fetch_and(~(int)(i), (v))
371
-#define atomic_fetch_andnot_relaxed(i, v) atomic_fetch_and_relaxed(~(int)(i), (v))
372
-#define atomic_fetch_andnot_acquire(i, v) atomic_fetch_and_acquire(~(int)(i), (v))
373
-#define atomic_fetch_andnot_release(i, v) atomic_fetch_and_release(~(int)(i), (v))
374
-#else /* atomic_fetch_andnot */
375
-#define atomic_fetch_andnot_relaxed atomic_fetch_andnot
376
-#define atomic_fetch_andnot_acquire atomic_fetch_andnot
377
-#define atomic_fetch_andnot_release atomic_fetch_andnot
378
-#endif /* atomic_fetch_andnot */
379
-
380
-#else /* atomic_fetch_andnot_relaxed */
381
-
382
-#ifndef atomic_fetch_andnot_acquire
383
-#define atomic_fetch_andnot_acquire(...) \
384
- __atomic_op_acquire(atomic_fetch_andnot, __VA_ARGS__)
385
-#endif
386
-
387
-#ifndef atomic_fetch_andnot_release
388
-#define atomic_fetch_andnot_release(...) \
389
- __atomic_op_release(atomic_fetch_andnot, __VA_ARGS__)
390
-#endif
391
-
392
-#ifndef atomic_fetch_andnot
393
-#define atomic_fetch_andnot(...) \
394
- __atomic_op_fence(atomic_fetch_andnot, __VA_ARGS__)
395
-#endif
396
-#endif /* atomic_fetch_andnot_relaxed */
397
-
398
-/* atomic_fetch_xor_relaxed */
399
-#ifndef atomic_fetch_xor_relaxed
400
-#define atomic_fetch_xor_relaxed atomic_fetch_xor
401
-#define atomic_fetch_xor_acquire atomic_fetch_xor
402
-#define atomic_fetch_xor_release atomic_fetch_xor
403
-
404
-#else /* atomic_fetch_xor_relaxed */
405
-
406
-#ifndef atomic_fetch_xor_acquire
407
-#define atomic_fetch_xor_acquire(...) \
408
- __atomic_op_acquire(atomic_fetch_xor, __VA_ARGS__)
409
-#endif
410
-
411
-#ifndef atomic_fetch_xor_release
412
-#define atomic_fetch_xor_release(...) \
413
- __atomic_op_release(atomic_fetch_xor, __VA_ARGS__)
414
-#endif
415
-
416
-#ifndef atomic_fetch_xor
417
-#define atomic_fetch_xor(...) \
418
- __atomic_op_fence(atomic_fetch_xor, __VA_ARGS__)
419
-#endif
420
-#endif /* atomic_fetch_xor_relaxed */
421
-
422
-
423
-/* atomic_xchg_relaxed */
424
-#ifndef atomic_xchg_relaxed
425
-#define atomic_xchg_relaxed atomic_xchg
426
-#define atomic_xchg_acquire atomic_xchg
427
-#define atomic_xchg_release atomic_xchg
428
-
429
-#else /* atomic_xchg_relaxed */
430
-
431
-#ifndef atomic_xchg_acquire
432
-#define atomic_xchg_acquire(...) \
433
- __atomic_op_acquire(atomic_xchg, __VA_ARGS__)
434
-#endif
435
-
436
-#ifndef atomic_xchg_release
437
-#define atomic_xchg_release(...) \
438
- __atomic_op_release(atomic_xchg, __VA_ARGS__)
439
-#endif
440
-
441
-#ifndef atomic_xchg
442
-#define atomic_xchg(...) \
443
- __atomic_op_fence(atomic_xchg, __VA_ARGS__)
444
-#endif
445
-#endif /* atomic_xchg_relaxed */
446
-
447
-/* atomic_cmpxchg_relaxed */
448
-#ifndef atomic_cmpxchg_relaxed
449
-#define atomic_cmpxchg_relaxed atomic_cmpxchg
450
-#define atomic_cmpxchg_acquire atomic_cmpxchg
451
-#define atomic_cmpxchg_release atomic_cmpxchg
452
-
453
-#else /* atomic_cmpxchg_relaxed */
454
-
455
-#ifndef atomic_cmpxchg_acquire
456
-#define atomic_cmpxchg_acquire(...) \
457
- __atomic_op_acquire(atomic_cmpxchg, __VA_ARGS__)
458
-#endif
459
-
460
-#ifndef atomic_cmpxchg_release
461
-#define atomic_cmpxchg_release(...) \
462
- __atomic_op_release(atomic_cmpxchg, __VA_ARGS__)
463
-#endif
464
-
465
-#ifndef atomic_cmpxchg
466
-#define atomic_cmpxchg(...) \
467
- __atomic_op_fence(atomic_cmpxchg, __VA_ARGS__)
468
-#endif
469
-#endif /* atomic_cmpxchg_relaxed */
470
-
471
-#ifndef atomic_try_cmpxchg
472
-
473
-#define __atomic_try_cmpxchg(type, _p, _po, _n) \
474
-({ \
475
- typeof(_po) __po = (_po); \
476
- typeof(*(_po)) __r, __o = *__po; \
477
- __r = atomic_cmpxchg##type((_p), __o, (_n)); \
478
- if (unlikely(__r != __o)) \
479
- *__po = __r; \
480
- likely(__r == __o); \
481
-})
482
-
483
-#define atomic_try_cmpxchg(_p, _po, _n) __atomic_try_cmpxchg(, _p, _po, _n)
484
-#define atomic_try_cmpxchg_relaxed(_p, _po, _n) __atomic_try_cmpxchg(_relaxed, _p, _po, _n)
485
-#define atomic_try_cmpxchg_acquire(_p, _po, _n) __atomic_try_cmpxchg(_acquire, _p, _po, _n)
486
-#define atomic_try_cmpxchg_release(_p, _po, _n) __atomic_try_cmpxchg(_release, _p, _po, _n)
487
-
488
-#else /* atomic_try_cmpxchg */
489
-#define atomic_try_cmpxchg_relaxed atomic_try_cmpxchg
490
-#define atomic_try_cmpxchg_acquire atomic_try_cmpxchg
491
-#define atomic_try_cmpxchg_release atomic_try_cmpxchg
492
-#endif /* atomic_try_cmpxchg */
493
-
494
-/* cmpxchg_relaxed */
495
-#ifndef cmpxchg_relaxed
496
-#define cmpxchg_relaxed cmpxchg
497
-#define cmpxchg_acquire cmpxchg
498
-#define cmpxchg_release cmpxchg
499
-
500
-#else /* cmpxchg_relaxed */
501
-
502
-#ifndef cmpxchg_acquire
503
-#define cmpxchg_acquire(...) \
504
- __atomic_op_acquire(cmpxchg, __VA_ARGS__)
505
-#endif
506
-
507
-#ifndef cmpxchg_release
508
-#define cmpxchg_release(...) \
509
- __atomic_op_release(cmpxchg, __VA_ARGS__)
510
-#endif
511
-
512
-#ifndef cmpxchg
513
-#define cmpxchg(...) \
514
- __atomic_op_fence(cmpxchg, __VA_ARGS__)
515
-#endif
516
-#endif /* cmpxchg_relaxed */
517
-
518
-/* cmpxchg64_relaxed */
519
-#ifndef cmpxchg64_relaxed
520
-#define cmpxchg64_relaxed cmpxchg64
521
-#define cmpxchg64_acquire cmpxchg64
522
-#define cmpxchg64_release cmpxchg64
523
-
524
-#else /* cmpxchg64_relaxed */
525
-
526
-#ifndef cmpxchg64_acquire
527
-#define cmpxchg64_acquire(...) \
528
- __atomic_op_acquire(cmpxchg64, __VA_ARGS__)
529
-#endif
530
-
531
-#ifndef cmpxchg64_release
532
-#define cmpxchg64_release(...) \
533
- __atomic_op_release(cmpxchg64, __VA_ARGS__)
534
-#endif
535
-
536
-#ifndef cmpxchg64
537
-#define cmpxchg64(...) \
538
- __atomic_op_fence(cmpxchg64, __VA_ARGS__)
539
-#endif
540
-#endif /* cmpxchg64_relaxed */
541
-
542
-/* xchg_relaxed */
543
-#ifndef xchg_relaxed
544
-#define xchg_relaxed xchg
545
-#define xchg_acquire xchg
546
-#define xchg_release xchg
547
-
548
-#else /* xchg_relaxed */
549
-
550
-#ifndef xchg_acquire
551
-#define xchg_acquire(...) __atomic_op_acquire(xchg, __VA_ARGS__)
552
-#endif
553
-
554
-#ifndef xchg_release
555
-#define xchg_release(...) __atomic_op_release(xchg, __VA_ARGS__)
556
-#endif
557
-
558
-#ifndef xchg
559
-#define xchg(...) __atomic_op_fence(xchg, __VA_ARGS__)
560
-#endif
561
-#endif /* xchg_relaxed */
562
-
563
-/**
564
- * atomic_fetch_add_unless - add unless the number is already a given value
565
- * @v: pointer of type atomic_t
566
- * @a: the amount to add to v...
567
- * @u: ...unless v is equal to u.
568
- *
569
- * Atomically adds @a to @v, if @v was not already @u.
570
- * Returns the original value of @v.
571
- */
572
-#ifndef atomic_fetch_add_unless
573
-static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
574
-{
575
- int c = atomic_read(v);
576
-
577
- do {
578
- if (unlikely(c == u))
579
- break;
580
- } while (!atomic_try_cmpxchg(v, &c, c + a));
581
-
582
- return c;
583
-}
584
-#endif
585
-
586
-/**
587
- * atomic_add_unless - add unless the number is already a given value
588
- * @v: pointer of type atomic_t
589
- * @a: the amount to add to v...
590
- * @u: ...unless v is equal to u.
591
- *
592
- * Atomically adds @a to @v, if @v was not already @u.
593
- * Returns true if the addition was done.
594
- */
595
-static inline bool atomic_add_unless(atomic_t *v, int a, int u)
596
-{
597
- return atomic_fetch_add_unless(v, a, u) != u;
598
-}
599
-
600
-/**
601
- * atomic_inc_not_zero - increment unless the number is zero
602
- * @v: pointer of type atomic_t
603
- *
604
- * Atomically increments @v by 1, if @v is non-zero.
605
- * Returns true if the increment was done.
606
- */
607
-#ifndef atomic_inc_not_zero
608
-#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
609
-#endif
610
-
611
-/**
612
- * atomic_inc_and_test - increment and test
613
- * @v: pointer of type atomic_t
614
- *
615
- * Atomically increments @v by 1
616
- * and returns true if the result is zero, or false for all
617
- * other cases.
618
- */
619
-#ifndef atomic_inc_and_test
620
-static inline bool atomic_inc_and_test(atomic_t *v)
621
-{
622
- return atomic_inc_return(v) == 0;
623
-}
624
-#endif
625
-
626
-/**
627
- * atomic_dec_and_test - decrement and test
628
- * @v: pointer of type atomic_t
629
- *
630
- * Atomically decrements @v by 1 and
631
- * returns true if the result is 0, or false for all other
632
- * cases.
633
- */
634
-#ifndef atomic_dec_and_test
635
-static inline bool atomic_dec_and_test(atomic_t *v)
636
-{
637
- return atomic_dec_return(v) == 0;
638
-}
639
-#endif
640
-
641
-/**
642
- * atomic_sub_and_test - subtract value from variable and test result
643
- * @i: integer value to subtract
644
- * @v: pointer of type atomic_t
645
- *
646
- * Atomically subtracts @i from @v and returns
647
- * true if the result is zero, or false for all
648
- * other cases.
649
- */
650
-#ifndef atomic_sub_and_test
651
-static inline bool atomic_sub_and_test(int i, atomic_t *v)
652
-{
653
- return atomic_sub_return(i, v) == 0;
654
-}
655
-#endif
656
-
657
-/**
658
- * atomic_add_negative - add and test if negative
659
- * @i: integer value to add
660
- * @v: pointer of type atomic_t
661
- *
662
- * Atomically adds @i to @v and returns true
663
- * if the result is negative, or false when
664
- * result is greater than or equal to zero.
665
- */
666
-#ifndef atomic_add_negative
667
-static inline bool atomic_add_negative(int i, atomic_t *v)
668
-{
669
- return atomic_add_return(i, v) < 0;
670
-}
671
-#endif
672
-
673
-#ifndef atomic_inc_unless_negative
674
-static inline bool atomic_inc_unless_negative(atomic_t *v)
675
-{
676
- int c = atomic_read(v);
677
-
678
- do {
679
- if (unlikely(c < 0))
680
- return false;
681
- } while (!atomic_try_cmpxchg(v, &c, c + 1));
682
-
683
- return true;
684
-}
685
-#endif
686
-
687
-#ifndef atomic_dec_unless_positive
688
-static inline bool atomic_dec_unless_positive(atomic_t *v)
689
-{
690
- int c = atomic_read(v);
691
-
692
- do {
693
- if (unlikely(c > 0))
694
- return false;
695
- } while (!atomic_try_cmpxchg(v, &c, c - 1));
696
-
697
- return true;
698
-}
699
-#endif
700
-
701
-/*
702
- * atomic_dec_if_positive - decrement by 1 if old value positive
703
- * @v: pointer of type atomic_t
704
- *
705
- * The function returns the old value of *v minus 1, even if
706
- * the atomic variable, v, was not decremented.
707
- */
708
-#ifndef atomic_dec_if_positive
709
-static inline int atomic_dec_if_positive(atomic_t *v)
710
-{
711
- int dec, c = atomic_read(v);
712
-
713
- do {
714
- dec = c - 1;
715
- if (unlikely(dec < 0))
716
- break;
717
- } while (!atomic_try_cmpxchg(v, &c, dec));
718
-
719
- return dec;
720
-}
721
-#endif
722
-
723
-#define atomic_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c))
724
-#define atomic_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c))
725
-
726
-#ifdef CONFIG_GENERIC_ATOMIC64
727
-#include <asm-generic/atomic64.h>
728
-#endif
729
-
730
-#ifndef atomic64_read_acquire
731
-#define atomic64_read_acquire(v) smp_load_acquire(&(v)->counter)
732
-#endif
733
-
734
-#ifndef atomic64_set_release
735
-#define atomic64_set_release(v, i) smp_store_release(&(v)->counter, (i))
736
-#endif
737
-
738
-/* atomic64_add_return_relaxed */
739
-#ifndef atomic64_add_return_relaxed
740
-#define atomic64_add_return_relaxed atomic64_add_return
741
-#define atomic64_add_return_acquire atomic64_add_return
742
-#define atomic64_add_return_release atomic64_add_return
743
-
744
-#else /* atomic64_add_return_relaxed */
745
-
746
-#ifndef atomic64_add_return_acquire
747
-#define atomic64_add_return_acquire(...) \
748
- __atomic_op_acquire(atomic64_add_return, __VA_ARGS__)
749
-#endif
750
-
751
-#ifndef atomic64_add_return_release
752
-#define atomic64_add_return_release(...) \
753
- __atomic_op_release(atomic64_add_return, __VA_ARGS__)
754
-#endif
755
-
756
-#ifndef atomic64_add_return
757
-#define atomic64_add_return(...) \
758
- __atomic_op_fence(atomic64_add_return, __VA_ARGS__)
759
-#endif
760
-#endif /* atomic64_add_return_relaxed */
761
-
762
-#ifndef atomic64_inc
763
-#define atomic64_inc(v) atomic64_add(1, (v))
764
-#endif
765
-
766
-/* atomic64_inc_return_relaxed */
767
-#ifndef atomic64_inc_return_relaxed
768
-
769
-#ifndef atomic64_inc_return
770
-#define atomic64_inc_return(v) atomic64_add_return(1, (v))
771
-#define atomic64_inc_return_relaxed(v) atomic64_add_return_relaxed(1, (v))
772
-#define atomic64_inc_return_acquire(v) atomic64_add_return_acquire(1, (v))
773
-#define atomic64_inc_return_release(v) atomic64_add_return_release(1, (v))
774
-#else /* atomic64_inc_return */
775
-#define atomic64_inc_return_relaxed atomic64_inc_return
776
-#define atomic64_inc_return_acquire atomic64_inc_return
777
-#define atomic64_inc_return_release atomic64_inc_return
778
-#endif /* atomic64_inc_return */
779
-
780
-#else /* atomic64_inc_return_relaxed */
781
-
782
-#ifndef atomic64_inc_return_acquire
783
-#define atomic64_inc_return_acquire(...) \
784
- __atomic_op_acquire(atomic64_inc_return, __VA_ARGS__)
785
-#endif
786
-
787
-#ifndef atomic64_inc_return_release
788
-#define atomic64_inc_return_release(...) \
789
- __atomic_op_release(atomic64_inc_return, __VA_ARGS__)
790
-#endif
791
-
792
-#ifndef atomic64_inc_return
793
-#define atomic64_inc_return(...) \
794
- __atomic_op_fence(atomic64_inc_return, __VA_ARGS__)
795
-#endif
796
-#endif /* atomic64_inc_return_relaxed */
797
-
798
-
799
-/* atomic64_sub_return_relaxed */
800
-#ifndef atomic64_sub_return_relaxed
801
-#define atomic64_sub_return_relaxed atomic64_sub_return
802
-#define atomic64_sub_return_acquire atomic64_sub_return
803
-#define atomic64_sub_return_release atomic64_sub_return
804
-
805
-#else /* atomic64_sub_return_relaxed */
806
-
807
-#ifndef atomic64_sub_return_acquire
808
-#define atomic64_sub_return_acquire(...) \
809
- __atomic_op_acquire(atomic64_sub_return, __VA_ARGS__)
810
-#endif
811
-
812
-#ifndef atomic64_sub_return_release
813
-#define atomic64_sub_return_release(...) \
814
- __atomic_op_release(atomic64_sub_return, __VA_ARGS__)
815
-#endif
816
-
817
-#ifndef atomic64_sub_return
818
-#define atomic64_sub_return(...) \
819
- __atomic_op_fence(atomic64_sub_return, __VA_ARGS__)
820
-#endif
821
-#endif /* atomic64_sub_return_relaxed */
822
-
823
-#ifndef atomic64_dec
824
-#define atomic64_dec(v) atomic64_sub(1, (v))
825
-#endif
826
-
827
-/* atomic64_dec_return_relaxed */
828
-#ifndef atomic64_dec_return_relaxed
829
-
830
-#ifndef atomic64_dec_return
831
-#define atomic64_dec_return(v) atomic64_sub_return(1, (v))
832
-#define atomic64_dec_return_relaxed(v) atomic64_sub_return_relaxed(1, (v))
833
-#define atomic64_dec_return_acquire(v) atomic64_sub_return_acquire(1, (v))
834
-#define atomic64_dec_return_release(v) atomic64_sub_return_release(1, (v))
835
-#else /* atomic64_dec_return */
836
-#define atomic64_dec_return_relaxed atomic64_dec_return
837
-#define atomic64_dec_return_acquire atomic64_dec_return
838
-#define atomic64_dec_return_release atomic64_dec_return
839
-#endif /* atomic64_dec_return */
840
-
841
-#else /* atomic64_dec_return_relaxed */
842
-
843
-#ifndef atomic64_dec_return_acquire
844
-#define atomic64_dec_return_acquire(...) \
845
- __atomic_op_acquire(atomic64_dec_return, __VA_ARGS__)
846
-#endif
847
-
848
-#ifndef atomic64_dec_return_release
849
-#define atomic64_dec_return_release(...) \
850
- __atomic_op_release(atomic64_dec_return, __VA_ARGS__)
851
-#endif
852
-
853
-#ifndef atomic64_dec_return
854
-#define atomic64_dec_return(...) \
855
- __atomic_op_fence(atomic64_dec_return, __VA_ARGS__)
856
-#endif
857
-#endif /* atomic64_dec_return_relaxed */
858
-
859
-
860
-/* atomic64_fetch_add_relaxed */
861
-#ifndef atomic64_fetch_add_relaxed
862
-#define atomic64_fetch_add_relaxed atomic64_fetch_add
863
-#define atomic64_fetch_add_acquire atomic64_fetch_add
864
-#define atomic64_fetch_add_release atomic64_fetch_add
865
-
866
-#else /* atomic64_fetch_add_relaxed */
867
-
868
-#ifndef atomic64_fetch_add_acquire
869
-#define atomic64_fetch_add_acquire(...) \
870
- __atomic_op_acquire(atomic64_fetch_add, __VA_ARGS__)
871
-#endif
872
-
873
-#ifndef atomic64_fetch_add_release
874
-#define atomic64_fetch_add_release(...) \
875
- __atomic_op_release(atomic64_fetch_add, __VA_ARGS__)
876
-#endif
877
-
878
-#ifndef atomic64_fetch_add
879
-#define atomic64_fetch_add(...) \
880
- __atomic_op_fence(atomic64_fetch_add, __VA_ARGS__)
881
-#endif
882
-#endif /* atomic64_fetch_add_relaxed */
883
-
884
-/* atomic64_fetch_inc_relaxed */
885
-#ifndef atomic64_fetch_inc_relaxed
886
-
887
-#ifndef atomic64_fetch_inc
888
-#define atomic64_fetch_inc(v) atomic64_fetch_add(1, (v))
889
-#define atomic64_fetch_inc_relaxed(v) atomic64_fetch_add_relaxed(1, (v))
890
-#define atomic64_fetch_inc_acquire(v) atomic64_fetch_add_acquire(1, (v))
891
-#define atomic64_fetch_inc_release(v) atomic64_fetch_add_release(1, (v))
892
-#else /* atomic64_fetch_inc */
893
-#define atomic64_fetch_inc_relaxed atomic64_fetch_inc
894
-#define atomic64_fetch_inc_acquire atomic64_fetch_inc
895
-#define atomic64_fetch_inc_release atomic64_fetch_inc
896
-#endif /* atomic64_fetch_inc */
897
-
898
-#else /* atomic64_fetch_inc_relaxed */
899
-
900
-#ifndef atomic64_fetch_inc_acquire
901
-#define atomic64_fetch_inc_acquire(...) \
902
- __atomic_op_acquire(atomic64_fetch_inc, __VA_ARGS__)
903
-#endif
904
-
905
-#ifndef atomic64_fetch_inc_release
906
-#define atomic64_fetch_inc_release(...) \
907
- __atomic_op_release(atomic64_fetch_inc, __VA_ARGS__)
908
-#endif
909
-
910
-#ifndef atomic64_fetch_inc
911
-#define atomic64_fetch_inc(...) \
912
- __atomic_op_fence(atomic64_fetch_inc, __VA_ARGS__)
913
-#endif
914
-#endif /* atomic64_fetch_inc_relaxed */
915
-
916
-/* atomic64_fetch_sub_relaxed */
917
-#ifndef atomic64_fetch_sub_relaxed
918
-#define atomic64_fetch_sub_relaxed atomic64_fetch_sub
919
-#define atomic64_fetch_sub_acquire atomic64_fetch_sub
920
-#define atomic64_fetch_sub_release atomic64_fetch_sub
921
-
922
-#else /* atomic64_fetch_sub_relaxed */
923
-
924
-#ifndef atomic64_fetch_sub_acquire
925
-#define atomic64_fetch_sub_acquire(...) \
926
- __atomic_op_acquire(atomic64_fetch_sub, __VA_ARGS__)
927
-#endif
928
-
929
-#ifndef atomic64_fetch_sub_release
930
-#define atomic64_fetch_sub_release(...) \
931
- __atomic_op_release(atomic64_fetch_sub, __VA_ARGS__)
932
-#endif
933
-
934
-#ifndef atomic64_fetch_sub
935
-#define atomic64_fetch_sub(...) \
936
- __atomic_op_fence(atomic64_fetch_sub, __VA_ARGS__)
937
-#endif
938
-#endif /* atomic64_fetch_sub_relaxed */
939
-
940
-/* atomic64_fetch_dec_relaxed */
941
-#ifndef atomic64_fetch_dec_relaxed
942
-
943
-#ifndef atomic64_fetch_dec
944
-#define atomic64_fetch_dec(v) atomic64_fetch_sub(1, (v))
945
-#define atomic64_fetch_dec_relaxed(v) atomic64_fetch_sub_relaxed(1, (v))
946
-#define atomic64_fetch_dec_acquire(v) atomic64_fetch_sub_acquire(1, (v))
947
-#define atomic64_fetch_dec_release(v) atomic64_fetch_sub_release(1, (v))
948
-#else /* atomic64_fetch_dec */
949
-#define atomic64_fetch_dec_relaxed atomic64_fetch_dec
950
-#define atomic64_fetch_dec_acquire atomic64_fetch_dec
951
-#define atomic64_fetch_dec_release atomic64_fetch_dec
952
-#endif /* atomic64_fetch_dec */
953
-
954
-#else /* atomic64_fetch_dec_relaxed */
955
-
956
-#ifndef atomic64_fetch_dec_acquire
957
-#define atomic64_fetch_dec_acquire(...) \
958
- __atomic_op_acquire(atomic64_fetch_dec, __VA_ARGS__)
959
-#endif
960
-
961
-#ifndef atomic64_fetch_dec_release
962
-#define atomic64_fetch_dec_release(...) \
963
- __atomic_op_release(atomic64_fetch_dec, __VA_ARGS__)
964
-#endif
965
-
966
-#ifndef atomic64_fetch_dec
967
-#define atomic64_fetch_dec(...) \
968
- __atomic_op_fence(atomic64_fetch_dec, __VA_ARGS__)
969
-#endif
970
-#endif /* atomic64_fetch_dec_relaxed */
971
-
972
-/* atomic64_fetch_or_relaxed */
973
-#ifndef atomic64_fetch_or_relaxed
974
-#define atomic64_fetch_or_relaxed atomic64_fetch_or
975
-#define atomic64_fetch_or_acquire atomic64_fetch_or
976
-#define atomic64_fetch_or_release atomic64_fetch_or
977
-
978
-#else /* atomic64_fetch_or_relaxed */
979
-
980
-#ifndef atomic64_fetch_or_acquire
981
-#define atomic64_fetch_or_acquire(...) \
982
- __atomic_op_acquire(atomic64_fetch_or, __VA_ARGS__)
983
-#endif
984
-
985
-#ifndef atomic64_fetch_or_release
986
-#define atomic64_fetch_or_release(...) \
987
- __atomic_op_release(atomic64_fetch_or, __VA_ARGS__)
988
-#endif
989
-
990
-#ifndef atomic64_fetch_or
991
-#define atomic64_fetch_or(...) \
992
- __atomic_op_fence(atomic64_fetch_or, __VA_ARGS__)
993
-#endif
994
-#endif /* atomic64_fetch_or_relaxed */
995
-
996
-/* atomic64_fetch_and_relaxed */
997
-#ifndef atomic64_fetch_and_relaxed
998
-#define atomic64_fetch_and_relaxed atomic64_fetch_and
999
-#define atomic64_fetch_and_acquire atomic64_fetch_and
1000
-#define atomic64_fetch_and_release atomic64_fetch_and
1001
-
1002
-#else /* atomic64_fetch_and_relaxed */
1003
-
1004
-#ifndef atomic64_fetch_and_acquire
1005
-#define atomic64_fetch_and_acquire(...) \
1006
- __atomic_op_acquire(atomic64_fetch_and, __VA_ARGS__)
1007
-#endif
1008
-
1009
-#ifndef atomic64_fetch_and_release
1010
-#define atomic64_fetch_and_release(...) \
1011
- __atomic_op_release(atomic64_fetch_and, __VA_ARGS__)
1012
-#endif
1013
-
1014
-#ifndef atomic64_fetch_and
1015
-#define atomic64_fetch_and(...) \
1016
- __atomic_op_fence(atomic64_fetch_and, __VA_ARGS__)
1017
-#endif
1018
-#endif /* atomic64_fetch_and_relaxed */
1019
-
1020
-#ifndef atomic64_andnot
1021
-#define atomic64_andnot(i, v) atomic64_and(~(long long)(i), (v))
1022
-#endif
1023
-
1024
-#ifndef atomic64_fetch_andnot_relaxed
1025
-
1026
-#ifndef atomic64_fetch_andnot
1027
-#define atomic64_fetch_andnot(i, v) atomic64_fetch_and(~(long long)(i), (v))
1028
-#define atomic64_fetch_andnot_relaxed(i, v) atomic64_fetch_and_relaxed(~(long long)(i), (v))
1029
-#define atomic64_fetch_andnot_acquire(i, v) atomic64_fetch_and_acquire(~(long long)(i), (v))
1030
-#define atomic64_fetch_andnot_release(i, v) atomic64_fetch_and_release(~(long long)(i), (v))
1031
-#else /* atomic64_fetch_andnot */
1032
-#define atomic64_fetch_andnot_relaxed atomic64_fetch_andnot
1033
-#define atomic64_fetch_andnot_acquire atomic64_fetch_andnot
1034
-#define atomic64_fetch_andnot_release atomic64_fetch_andnot
1035
-#endif /* atomic64_fetch_andnot */
1036
-
1037
-#else /* atomic64_fetch_andnot_relaxed */
1038
-
1039
-#ifndef atomic64_fetch_andnot_acquire
1040
-#define atomic64_fetch_andnot_acquire(...) \
1041
- __atomic_op_acquire(atomic64_fetch_andnot, __VA_ARGS__)
1042
-#endif
1043
-
1044
-#ifndef atomic64_fetch_andnot_release
1045
-#define atomic64_fetch_andnot_release(...) \
1046
- __atomic_op_release(atomic64_fetch_andnot, __VA_ARGS__)
1047
-#endif
1048
-
1049
-#ifndef atomic64_fetch_andnot
1050
-#define atomic64_fetch_andnot(...) \
1051
- __atomic_op_fence(atomic64_fetch_andnot, __VA_ARGS__)
1052
-#endif
1053
-#endif /* atomic64_fetch_andnot_relaxed */
1054
-
1055
-/* atomic64_fetch_xor_relaxed */
1056
-#ifndef atomic64_fetch_xor_relaxed
1057
-#define atomic64_fetch_xor_relaxed atomic64_fetch_xor
1058
-#define atomic64_fetch_xor_acquire atomic64_fetch_xor
1059
-#define atomic64_fetch_xor_release atomic64_fetch_xor
1060
-
1061
-#else /* atomic64_fetch_xor_relaxed */
1062
-
1063
-#ifndef atomic64_fetch_xor_acquire
1064
-#define atomic64_fetch_xor_acquire(...) \
1065
- __atomic_op_acquire(atomic64_fetch_xor, __VA_ARGS__)
1066
-#endif
1067
-
1068
-#ifndef atomic64_fetch_xor_release
1069
-#define atomic64_fetch_xor_release(...) \
1070
- __atomic_op_release(atomic64_fetch_xor, __VA_ARGS__)
1071
-#endif
1072
-
1073
-#ifndef atomic64_fetch_xor
1074
-#define atomic64_fetch_xor(...) \
1075
- __atomic_op_fence(atomic64_fetch_xor, __VA_ARGS__)
1076
-#endif
1077
-#endif /* atomic64_fetch_xor_relaxed */
1078
-
1079
-
1080
-/* atomic64_xchg_relaxed */
1081
-#ifndef atomic64_xchg_relaxed
1082
-#define atomic64_xchg_relaxed atomic64_xchg
1083
-#define atomic64_xchg_acquire atomic64_xchg
1084
-#define atomic64_xchg_release atomic64_xchg
1085
-
1086
-#else /* atomic64_xchg_relaxed */
1087
-
1088
-#ifndef atomic64_xchg_acquire
1089
-#define atomic64_xchg_acquire(...) \
1090
- __atomic_op_acquire(atomic64_xchg, __VA_ARGS__)
1091
-#endif
1092
-
1093
-#ifndef atomic64_xchg_release
1094
-#define atomic64_xchg_release(...) \
1095
- __atomic_op_release(atomic64_xchg, __VA_ARGS__)
1096
-#endif
1097
-
1098
-#ifndef atomic64_xchg
1099
-#define atomic64_xchg(...) \
1100
- __atomic_op_fence(atomic64_xchg, __VA_ARGS__)
1101
-#endif
1102
-#endif /* atomic64_xchg_relaxed */
1103
-
1104
-/* atomic64_cmpxchg_relaxed */
1105
-#ifndef atomic64_cmpxchg_relaxed
1106
-#define atomic64_cmpxchg_relaxed atomic64_cmpxchg
1107
-#define atomic64_cmpxchg_acquire atomic64_cmpxchg
1108
-#define atomic64_cmpxchg_release atomic64_cmpxchg
1109
-
1110
-#else /* atomic64_cmpxchg_relaxed */
1111
-
1112
-#ifndef atomic64_cmpxchg_acquire
1113
-#define atomic64_cmpxchg_acquire(...) \
1114
- __atomic_op_acquire(atomic64_cmpxchg, __VA_ARGS__)
1115
-#endif
1116
-
1117
-#ifndef atomic64_cmpxchg_release
1118
-#define atomic64_cmpxchg_release(...) \
1119
- __atomic_op_release(atomic64_cmpxchg, __VA_ARGS__)
1120
-#endif
1121
-
1122
-#ifndef atomic64_cmpxchg
1123
-#define atomic64_cmpxchg(...) \
1124
- __atomic_op_fence(atomic64_cmpxchg, __VA_ARGS__)
1125
-#endif
1126
-#endif /* atomic64_cmpxchg_relaxed */
1127
-
1128
-#ifndef atomic64_try_cmpxchg
1129
-
1130
-#define __atomic64_try_cmpxchg(type, _p, _po, _n) \
1131
-({ \
1132
- typeof(_po) __po = (_po); \
1133
- typeof(*(_po)) __r, __o = *__po; \
1134
- __r = atomic64_cmpxchg##type((_p), __o, (_n)); \
1135
- if (unlikely(__r != __o)) \
1136
- *__po = __r; \
1137
- likely(__r == __o); \
1138
-})
1139
-
1140
-#define atomic64_try_cmpxchg(_p, _po, _n) __atomic64_try_cmpxchg(, _p, _po, _n)
1141
-#define atomic64_try_cmpxchg_relaxed(_p, _po, _n) __atomic64_try_cmpxchg(_relaxed, _p, _po, _n)
1142
-#define atomic64_try_cmpxchg_acquire(_p, _po, _n) __atomic64_try_cmpxchg(_acquire, _p, _po, _n)
1143
-#define atomic64_try_cmpxchg_release(_p, _po, _n) __atomic64_try_cmpxchg(_release, _p, _po, _n)
1144
-
1145
-#else /* atomic64_try_cmpxchg */
1146
-#define atomic64_try_cmpxchg_relaxed atomic64_try_cmpxchg
1147
-#define atomic64_try_cmpxchg_acquire atomic64_try_cmpxchg
1148
-#define atomic64_try_cmpxchg_release atomic64_try_cmpxchg
1149
-#endif /* atomic64_try_cmpxchg */
1150
-
1151
-/**
1152
- * atomic64_fetch_add_unless - add unless the number is already a given value
1153
- * @v: pointer of type atomic64_t
1154
- * @a: the amount to add to v...
1155
- * @u: ...unless v is equal to u.
1156
- *
1157
- * Atomically adds @a to @v, if @v was not already @u.
1158
- * Returns the original value of @v.
1159
- */
1160
-#ifndef atomic64_fetch_add_unless
1161
-static inline long long atomic64_fetch_add_unless(atomic64_t *v, long long a,
1162
- long long u)
1163
-{
1164
- long long c = atomic64_read(v);
1165
-
1166
- do {
1167
- if (unlikely(c == u))
1168
- break;
1169
- } while (!atomic64_try_cmpxchg(v, &c, c + a));
1170
-
1171
- return c;
1172
-}
1173
-#endif
1174
-
1175
-/**
1176
- * atomic64_add_unless - add unless the number is already a given value
1177
- * @v: pointer of type atomic_t
1178
- * @a: the amount to add to v...
1179
- * @u: ...unless v is equal to u.
1180
- *
1181
- * Atomically adds @a to @v, if @v was not already @u.
1182
- * Returns true if the addition was done.
1183
- */
1184
-static inline bool atomic64_add_unless(atomic64_t *v, long long a, long long u)
1185
-{
1186
- return atomic64_fetch_add_unless(v, a, u) != u;
1187
-}
1188
-
1189
-/**
1190
- * atomic64_inc_not_zero - increment unless the number is zero
1191
- * @v: pointer of type atomic64_t
1192
- *
1193
- * Atomically increments @v by 1, if @v is non-zero.
1194
- * Returns true if the increment was done.
1195
- */
1196
-#ifndef atomic64_inc_not_zero
1197
-#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
1198
-#endif
1199
-
1200
-/**
1201
- * atomic64_inc_and_test - increment and test
1202
- * @v: pointer of type atomic64_t
1203
- *
1204
- * Atomically increments @v by 1
1205
- * and returns true if the result is zero, or false for all
1206
- * other cases.
1207
- */
1208
-#ifndef atomic64_inc_and_test
1209
-static inline bool atomic64_inc_and_test(atomic64_t *v)
1210
-{
1211
- return atomic64_inc_return(v) == 0;
1212
-}
1213
-#endif
1214
-
1215
-/**
1216
- * atomic64_dec_and_test - decrement and test
1217
- * @v: pointer of type atomic64_t
1218
- *
1219
- * Atomically decrements @v by 1 and
1220
- * returns true if the result is 0, or false for all other
1221
- * cases.
1222
- */
1223
-#ifndef atomic64_dec_and_test
1224
-static inline bool atomic64_dec_and_test(atomic64_t *v)
1225
-{
1226
- return atomic64_dec_return(v) == 0;
1227
-}
1228
-#endif
1229
-
1230
-/**
1231
- * atomic64_sub_and_test - subtract value from variable and test result
1232
- * @i: integer value to subtract
1233
- * @v: pointer of type atomic64_t
1234
- *
1235
- * Atomically subtracts @i from @v and returns
1236
- * true if the result is zero, or false for all
1237
- * other cases.
1238
- */
1239
-#ifndef atomic64_sub_and_test
1240
-static inline bool atomic64_sub_and_test(long long i, atomic64_t *v)
1241
-{
1242
- return atomic64_sub_return(i, v) == 0;
1243
-}
1244
-#endif
1245
-
1246
-/**
1247
- * atomic64_add_negative - add and test if negative
1248
- * @i: integer value to add
1249
- * @v: pointer of type atomic64_t
1250
- *
1251
- * Atomically adds @i to @v and returns true
1252
- * if the result is negative, or false when
1253
- * result is greater than or equal to zero.
1254
- */
1255
-#ifndef atomic64_add_negative
1256
-static inline bool atomic64_add_negative(long long i, atomic64_t *v)
1257
-{
1258
- return atomic64_add_return(i, v) < 0;
1259
-}
1260
-#endif
1261
-
1262
-#ifndef atomic64_inc_unless_negative
1263
-static inline bool atomic64_inc_unless_negative(atomic64_t *v)
1264
-{
1265
- long long c = atomic64_read(v);
1266
-
1267
- do {
1268
- if (unlikely(c < 0))
1269
- return false;
1270
- } while (!atomic64_try_cmpxchg(v, &c, c + 1));
1271
-
1272
- return true;
1273
-}
1274
-#endif
1275
-
1276
-#ifndef atomic64_dec_unless_positive
1277
-static inline bool atomic64_dec_unless_positive(atomic64_t *v)
1278
-{
1279
- long long c = atomic64_read(v);
1280
-
1281
- do {
1282
- if (unlikely(c > 0))
1283
- return false;
1284
- } while (!atomic64_try_cmpxchg(v, &c, c - 1));
1285
-
1286
- return true;
1287
-}
1288
-#endif
1289
-
1290
-/*
1291
- * atomic64_dec_if_positive - decrement by 1 if old value positive
1292
- * @v: pointer of type atomic64_t
1293
- *
1294
- * The function returns the old value of *v minus 1, even if
1295
- * the atomic64 variable, v, was not decremented.
1296
- */
1297
-#ifndef atomic64_dec_if_positive
1298
-static inline long long atomic64_dec_if_positive(atomic64_t *v)
1299
-{
1300
- long long dec, c = atomic64_read(v);
1301
-
1302
- do {
1303
- dec = c - 1;
1304
- if (unlikely(dec < 0))
1305
- break;
1306
- } while (!atomic64_try_cmpxchg(v, &c, dec));
1307
-
1308
- return dec;
1309
-}
80
+#ifdef ARCH_ATOMIC
81
+#include <linux/atomic-arch-fallback.h>
82
+#include <asm-generic/atomic-instrumented.h>
83
+#else
84
+#include <linux/atomic-fallback.h>
131085 #endif
1311
-
1312
-#define atomic64_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c))
1313
-#define atomic64_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c))
131486
131587 #include <asm-generic/atomic-long.h>
131688