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