1e3d18ceeSMark Rutland // SPDX-License-Identifier: GPL-2.0
2e3d18ceeSMark Rutland
3e3d18ceeSMark Rutland // Generated by scripts/atomic/gen-atomic-instrumented.sh
4e3d18ceeSMark Rutland // DO NOT MODIFY THIS FILE DIRECTLY
5e3d18ceeSMark Rutland
6e3d18ceeSMark Rutland /*
7c9268ac6SMark Rutland * This file provoides atomic operations with explicit instrumentation (e.g.
8c9268ac6SMark Rutland * KASAN, KCSAN), which should be used unless it is necessary to avoid
9c9268ac6SMark Rutland * instrumentation. Where it is necessary to aovid instrumenation, the
10c9268ac6SMark Rutland * raw_atomic*() operations should be used.
11e3d18ceeSMark Rutland */
12e3d18ceeSMark Rutland #ifndef _LINUX_ATOMIC_INSTRUMENTED_H
13e3d18ceeSMark Rutland #define _LINUX_ATOMIC_INSTRUMENTED_H
14e3d18ceeSMark Rutland
15e3d18ceeSMark Rutland #include <linux/build_bug.h>
16e3d18ceeSMark Rutland #include <linux/compiler.h>
17e3d18ceeSMark Rutland #include <linux/instrumented.h>
18e3d18ceeSMark Rutland
19ad811070SMark Rutland /**
20ad811070SMark Rutland * atomic_read() - atomic load with relaxed ordering
21ad811070SMark Rutland * @v: pointer to atomic_t
22ad811070SMark Rutland *
23ad811070SMark Rutland * Atomically loads the value of @v with relaxed ordering.
24ad811070SMark Rutland *
25ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_read() there.
26ad811070SMark Rutland *
27ad811070SMark Rutland * Return: The value loaded from @v.
28ad811070SMark Rutland */
29e3d18ceeSMark Rutland static __always_inline int
atomic_read(const atomic_t * v)30e3d18ceeSMark Rutland atomic_read(const atomic_t *v)
31e3d18ceeSMark Rutland {
32e3d18ceeSMark Rutland instrument_atomic_read(v, sizeof(*v));
33c9268ac6SMark Rutland return raw_atomic_read(v);
34e3d18ceeSMark Rutland }
35e3d18ceeSMark Rutland
36ad811070SMark Rutland /**
37ad811070SMark Rutland * atomic_read_acquire() - atomic load with acquire ordering
38ad811070SMark Rutland * @v: pointer to atomic_t
39ad811070SMark Rutland *
40ad811070SMark Rutland * Atomically loads the value of @v with acquire ordering.
41ad811070SMark Rutland *
42ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_read_acquire() there.
43ad811070SMark Rutland *
44ad811070SMark Rutland * Return: The value loaded from @v.
45ad811070SMark Rutland */
46e3d18ceeSMark Rutland static __always_inline int
atomic_read_acquire(const atomic_t * v)47e3d18ceeSMark Rutland atomic_read_acquire(const atomic_t *v)
48e3d18ceeSMark Rutland {
49e3d18ceeSMark Rutland instrument_atomic_read(v, sizeof(*v));
50c9268ac6SMark Rutland return raw_atomic_read_acquire(v);
51e3d18ceeSMark Rutland }
52e3d18ceeSMark Rutland
53ad811070SMark Rutland /**
54ad811070SMark Rutland * atomic_set() - atomic set with relaxed ordering
55ad811070SMark Rutland * @v: pointer to atomic_t
56ad811070SMark Rutland * @i: int value to assign
57ad811070SMark Rutland *
58ad811070SMark Rutland * Atomically sets @v to @i with relaxed ordering.
59ad811070SMark Rutland *
60ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_set() there.
61ad811070SMark Rutland *
62ad811070SMark Rutland * Return: Nothing.
63ad811070SMark Rutland */
64e3d18ceeSMark Rutland static __always_inline void
atomic_set(atomic_t * v,int i)65e3d18ceeSMark Rutland atomic_set(atomic_t *v, int i)
66e3d18ceeSMark Rutland {
67e3d18ceeSMark Rutland instrument_atomic_write(v, sizeof(*v));
68c9268ac6SMark Rutland raw_atomic_set(v, i);
69e3d18ceeSMark Rutland }
70e3d18ceeSMark Rutland
71ad811070SMark Rutland /**
72ad811070SMark Rutland * atomic_set_release() - atomic set with release ordering
73ad811070SMark Rutland * @v: pointer to atomic_t
74ad811070SMark Rutland * @i: int value to assign
75ad811070SMark Rutland *
76ad811070SMark Rutland * Atomically sets @v to @i with release ordering.
77ad811070SMark Rutland *
78ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_set_release() there.
79ad811070SMark Rutland *
80ad811070SMark Rutland * Return: Nothing.
81ad811070SMark Rutland */
82e3d18ceeSMark Rutland static __always_inline void
atomic_set_release(atomic_t * v,int i)83e3d18ceeSMark Rutland atomic_set_release(atomic_t *v, int i)
84e3d18ceeSMark Rutland {
85e87c4f66SMarco Elver kcsan_release();
86e3d18ceeSMark Rutland instrument_atomic_write(v, sizeof(*v));
87c9268ac6SMark Rutland raw_atomic_set_release(v, i);
88e3d18ceeSMark Rutland }
89e3d18ceeSMark Rutland
90ad811070SMark Rutland /**
91ad811070SMark Rutland * atomic_add() - atomic add with relaxed ordering
92ad811070SMark Rutland * @i: int value to add
93ad811070SMark Rutland * @v: pointer to atomic_t
94ad811070SMark Rutland *
95ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
96ad811070SMark Rutland *
97ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add() there.
98ad811070SMark Rutland *
99ad811070SMark Rutland * Return: Nothing.
100ad811070SMark Rutland */
101e3d18ceeSMark Rutland static __always_inline void
atomic_add(int i,atomic_t * v)102e3d18ceeSMark Rutland atomic_add(int i, atomic_t *v)
103e3d18ceeSMark Rutland {
104e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
105c9268ac6SMark Rutland raw_atomic_add(i, v);
106e3d18ceeSMark Rutland }
107e3d18ceeSMark Rutland
108ad811070SMark Rutland /**
109ad811070SMark Rutland * atomic_add_return() - atomic add with full ordering
110ad811070SMark Rutland * @i: int value to add
111ad811070SMark Rutland * @v: pointer to atomic_t
112ad811070SMark Rutland *
113ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
114ad811070SMark Rutland *
115ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_return() there.
116ad811070SMark Rutland *
117ad811070SMark Rutland * Return: The updated value of @v.
118ad811070SMark Rutland */
119e3d18ceeSMark Rutland static __always_inline int
atomic_add_return(int i,atomic_t * v)120e3d18ceeSMark Rutland atomic_add_return(int i, atomic_t *v)
121e3d18ceeSMark Rutland {
122e87c4f66SMarco Elver kcsan_mb();
123e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
124c9268ac6SMark Rutland return raw_atomic_add_return(i, v);
125e3d18ceeSMark Rutland }
126e3d18ceeSMark Rutland
127ad811070SMark Rutland /**
128ad811070SMark Rutland * atomic_add_return_acquire() - atomic add with acquire ordering
129ad811070SMark Rutland * @i: int value to add
130ad811070SMark Rutland * @v: pointer to atomic_t
131ad811070SMark Rutland *
132ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
133ad811070SMark Rutland *
134ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_return_acquire() there.
135ad811070SMark Rutland *
136ad811070SMark Rutland * Return: The updated value of @v.
137ad811070SMark Rutland */
138e3d18ceeSMark Rutland static __always_inline int
atomic_add_return_acquire(int i,atomic_t * v)139e3d18ceeSMark Rutland atomic_add_return_acquire(int i, atomic_t *v)
140e3d18ceeSMark Rutland {
141e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
142c9268ac6SMark Rutland return raw_atomic_add_return_acquire(i, v);
143e3d18ceeSMark Rutland }
144e3d18ceeSMark Rutland
145ad811070SMark Rutland /**
146ad811070SMark Rutland * atomic_add_return_release() - atomic add with release ordering
147ad811070SMark Rutland * @i: int value to add
148ad811070SMark Rutland * @v: pointer to atomic_t
149ad811070SMark Rutland *
150ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
151ad811070SMark Rutland *
152ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_return_release() there.
153ad811070SMark Rutland *
154ad811070SMark Rutland * Return: The updated value of @v.
155ad811070SMark Rutland */
156e3d18ceeSMark Rutland static __always_inline int
atomic_add_return_release(int i,atomic_t * v)157e3d18ceeSMark Rutland atomic_add_return_release(int i, atomic_t *v)
158e3d18ceeSMark Rutland {
159e87c4f66SMarco Elver kcsan_release();
160e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
161c9268ac6SMark Rutland return raw_atomic_add_return_release(i, v);
162e3d18ceeSMark Rutland }
163e3d18ceeSMark Rutland
164ad811070SMark Rutland /**
165ad811070SMark Rutland * atomic_add_return_relaxed() - atomic add with relaxed ordering
166ad811070SMark Rutland * @i: int value to add
167ad811070SMark Rutland * @v: pointer to atomic_t
168ad811070SMark Rutland *
169ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
170ad811070SMark Rutland *
171ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_return_relaxed() there.
172ad811070SMark Rutland *
173ad811070SMark Rutland * Return: The updated value of @v.
174ad811070SMark Rutland */
175e3d18ceeSMark Rutland static __always_inline int
atomic_add_return_relaxed(int i,atomic_t * v)176e3d18ceeSMark Rutland atomic_add_return_relaxed(int i, atomic_t *v)
177e3d18ceeSMark Rutland {
178e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
179c9268ac6SMark Rutland return raw_atomic_add_return_relaxed(i, v);
180e3d18ceeSMark Rutland }
181e3d18ceeSMark Rutland
182ad811070SMark Rutland /**
183ad811070SMark Rutland * atomic_fetch_add() - atomic add with full ordering
184ad811070SMark Rutland * @i: int value to add
185ad811070SMark Rutland * @v: pointer to atomic_t
186ad811070SMark Rutland *
187ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
188ad811070SMark Rutland *
189ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_add() there.
190ad811070SMark Rutland *
191ad811070SMark Rutland * Return: The original value of @v.
192ad811070SMark Rutland */
193e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_add(int i,atomic_t * v)194e3d18ceeSMark Rutland atomic_fetch_add(int i, atomic_t *v)
195e3d18ceeSMark Rutland {
196e87c4f66SMarco Elver kcsan_mb();
197e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
198c9268ac6SMark Rutland return raw_atomic_fetch_add(i, v);
199e3d18ceeSMark Rutland }
200e3d18ceeSMark Rutland
201ad811070SMark Rutland /**
202ad811070SMark Rutland * atomic_fetch_add_acquire() - atomic add with acquire ordering
203ad811070SMark Rutland * @i: int value to add
204ad811070SMark Rutland * @v: pointer to atomic_t
205ad811070SMark Rutland *
206ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
207ad811070SMark Rutland *
208ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_add_acquire() there.
209ad811070SMark Rutland *
210ad811070SMark Rutland * Return: The original value of @v.
211ad811070SMark Rutland */
212e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_add_acquire(int i,atomic_t * v)213e3d18ceeSMark Rutland atomic_fetch_add_acquire(int i, atomic_t *v)
214e3d18ceeSMark Rutland {
215e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
216c9268ac6SMark Rutland return raw_atomic_fetch_add_acquire(i, v);
217e3d18ceeSMark Rutland }
218e3d18ceeSMark Rutland
219ad811070SMark Rutland /**
220ad811070SMark Rutland * atomic_fetch_add_release() - atomic add with release ordering
221ad811070SMark Rutland * @i: int value to add
222ad811070SMark Rutland * @v: pointer to atomic_t
223ad811070SMark Rutland *
224ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
225ad811070SMark Rutland *
226ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_add_release() there.
227ad811070SMark Rutland *
228ad811070SMark Rutland * Return: The original value of @v.
229ad811070SMark Rutland */
230e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_add_release(int i,atomic_t * v)231e3d18ceeSMark Rutland atomic_fetch_add_release(int i, atomic_t *v)
232e3d18ceeSMark Rutland {
233e87c4f66SMarco Elver kcsan_release();
234e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
235c9268ac6SMark Rutland return raw_atomic_fetch_add_release(i, v);
236e3d18ceeSMark Rutland }
237e3d18ceeSMark Rutland
238ad811070SMark Rutland /**
239ad811070SMark Rutland * atomic_fetch_add_relaxed() - atomic add with relaxed ordering
240ad811070SMark Rutland * @i: int value to add
241ad811070SMark Rutland * @v: pointer to atomic_t
242ad811070SMark Rutland *
243ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
244ad811070SMark Rutland *
245ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_add_relaxed() there.
246ad811070SMark Rutland *
247ad811070SMark Rutland * Return: The original value of @v.
248ad811070SMark Rutland */
249e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_add_relaxed(int i,atomic_t * v)250e3d18ceeSMark Rutland atomic_fetch_add_relaxed(int i, atomic_t *v)
251e3d18ceeSMark Rutland {
252e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
253c9268ac6SMark Rutland return raw_atomic_fetch_add_relaxed(i, v);
254e3d18ceeSMark Rutland }
255e3d18ceeSMark Rutland
256ad811070SMark Rutland /**
257ad811070SMark Rutland * atomic_sub() - atomic subtract with relaxed ordering
258ad811070SMark Rutland * @i: int value to subtract
259ad811070SMark Rutland * @v: pointer to atomic_t
260ad811070SMark Rutland *
261ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
262ad811070SMark Rutland *
263ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub() there.
264ad811070SMark Rutland *
265ad811070SMark Rutland * Return: Nothing.
266ad811070SMark Rutland */
267e3d18ceeSMark Rutland static __always_inline void
atomic_sub(int i,atomic_t * v)268e3d18ceeSMark Rutland atomic_sub(int i, atomic_t *v)
269e3d18ceeSMark Rutland {
270e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
271c9268ac6SMark Rutland raw_atomic_sub(i, v);
272e3d18ceeSMark Rutland }
273e3d18ceeSMark Rutland
274ad811070SMark Rutland /**
275ad811070SMark Rutland * atomic_sub_return() - atomic subtract with full ordering
276ad811070SMark Rutland * @i: int value to subtract
277ad811070SMark Rutland * @v: pointer to atomic_t
278ad811070SMark Rutland *
279ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
280ad811070SMark Rutland *
281ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub_return() there.
282ad811070SMark Rutland *
283ad811070SMark Rutland * Return: The updated value of @v.
284ad811070SMark Rutland */
285e3d18ceeSMark Rutland static __always_inline int
atomic_sub_return(int i,atomic_t * v)286e3d18ceeSMark Rutland atomic_sub_return(int i, atomic_t *v)
287e3d18ceeSMark Rutland {
288e87c4f66SMarco Elver kcsan_mb();
289e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
290c9268ac6SMark Rutland return raw_atomic_sub_return(i, v);
291e3d18ceeSMark Rutland }
292e3d18ceeSMark Rutland
293ad811070SMark Rutland /**
294ad811070SMark Rutland * atomic_sub_return_acquire() - atomic subtract with acquire ordering
295ad811070SMark Rutland * @i: int value to subtract
296ad811070SMark Rutland * @v: pointer to atomic_t
297ad811070SMark Rutland *
298ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
299ad811070SMark Rutland *
300ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub_return_acquire() there.
301ad811070SMark Rutland *
302ad811070SMark Rutland * Return: The updated value of @v.
303ad811070SMark Rutland */
304e3d18ceeSMark Rutland static __always_inline int
atomic_sub_return_acquire(int i,atomic_t * v)305e3d18ceeSMark Rutland atomic_sub_return_acquire(int i, atomic_t *v)
306e3d18ceeSMark Rutland {
307e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
308c9268ac6SMark Rutland return raw_atomic_sub_return_acquire(i, v);
309e3d18ceeSMark Rutland }
310e3d18ceeSMark Rutland
311ad811070SMark Rutland /**
312ad811070SMark Rutland * atomic_sub_return_release() - atomic subtract with release ordering
313ad811070SMark Rutland * @i: int value to subtract
314ad811070SMark Rutland * @v: pointer to atomic_t
315ad811070SMark Rutland *
316ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
317ad811070SMark Rutland *
318ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub_return_release() there.
319ad811070SMark Rutland *
320ad811070SMark Rutland * Return: The updated value of @v.
321ad811070SMark Rutland */
322e3d18ceeSMark Rutland static __always_inline int
atomic_sub_return_release(int i,atomic_t * v)323e3d18ceeSMark Rutland atomic_sub_return_release(int i, atomic_t *v)
324e3d18ceeSMark Rutland {
325e87c4f66SMarco Elver kcsan_release();
326e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
327c9268ac6SMark Rutland return raw_atomic_sub_return_release(i, v);
328e3d18ceeSMark Rutland }
329e3d18ceeSMark Rutland
330ad811070SMark Rutland /**
331ad811070SMark Rutland * atomic_sub_return_relaxed() - atomic subtract with relaxed ordering
332ad811070SMark Rutland * @i: int value to subtract
333ad811070SMark Rutland * @v: pointer to atomic_t
334ad811070SMark Rutland *
335ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
336ad811070SMark Rutland *
337ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub_return_relaxed() there.
338ad811070SMark Rutland *
339ad811070SMark Rutland * Return: The updated value of @v.
340ad811070SMark Rutland */
341e3d18ceeSMark Rutland static __always_inline int
atomic_sub_return_relaxed(int i,atomic_t * v)342e3d18ceeSMark Rutland atomic_sub_return_relaxed(int i, atomic_t *v)
343e3d18ceeSMark Rutland {
344e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
345c9268ac6SMark Rutland return raw_atomic_sub_return_relaxed(i, v);
346e3d18ceeSMark Rutland }
347e3d18ceeSMark Rutland
348ad811070SMark Rutland /**
349ad811070SMark Rutland * atomic_fetch_sub() - atomic subtract with full ordering
350ad811070SMark Rutland * @i: int value to subtract
351ad811070SMark Rutland * @v: pointer to atomic_t
352ad811070SMark Rutland *
353ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
354ad811070SMark Rutland *
355ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_sub() there.
356ad811070SMark Rutland *
357ad811070SMark Rutland * Return: The original value of @v.
358ad811070SMark Rutland */
359e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_sub(int i,atomic_t * v)360e3d18ceeSMark Rutland atomic_fetch_sub(int i, atomic_t *v)
361e3d18ceeSMark Rutland {
362e87c4f66SMarco Elver kcsan_mb();
363e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
364c9268ac6SMark Rutland return raw_atomic_fetch_sub(i, v);
365e3d18ceeSMark Rutland }
366e3d18ceeSMark Rutland
367ad811070SMark Rutland /**
368ad811070SMark Rutland * atomic_fetch_sub_acquire() - atomic subtract with acquire ordering
369ad811070SMark Rutland * @i: int value to subtract
370ad811070SMark Rutland * @v: pointer to atomic_t
371ad811070SMark Rutland *
372ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
373ad811070SMark Rutland *
374ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_acquire() there.
375ad811070SMark Rutland *
376ad811070SMark Rutland * Return: The original value of @v.
377ad811070SMark Rutland */
378e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_sub_acquire(int i,atomic_t * v)379e3d18ceeSMark Rutland atomic_fetch_sub_acquire(int i, atomic_t *v)
380e3d18ceeSMark Rutland {
381e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
382c9268ac6SMark Rutland return raw_atomic_fetch_sub_acquire(i, v);
383e3d18ceeSMark Rutland }
384e3d18ceeSMark Rutland
385ad811070SMark Rutland /**
386ad811070SMark Rutland * atomic_fetch_sub_release() - atomic subtract with release ordering
387ad811070SMark Rutland * @i: int value to subtract
388ad811070SMark Rutland * @v: pointer to atomic_t
389ad811070SMark Rutland *
390ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
391ad811070SMark Rutland *
392ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_release() there.
393ad811070SMark Rutland *
394ad811070SMark Rutland * Return: The original value of @v.
395ad811070SMark Rutland */
396e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_sub_release(int i,atomic_t * v)397e3d18ceeSMark Rutland atomic_fetch_sub_release(int i, atomic_t *v)
398e3d18ceeSMark Rutland {
399e87c4f66SMarco Elver kcsan_release();
400e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
401c9268ac6SMark Rutland return raw_atomic_fetch_sub_release(i, v);
402e3d18ceeSMark Rutland }
403e3d18ceeSMark Rutland
404ad811070SMark Rutland /**
405ad811070SMark Rutland * atomic_fetch_sub_relaxed() - atomic subtract with relaxed ordering
406ad811070SMark Rutland * @i: int value to subtract
407ad811070SMark Rutland * @v: pointer to atomic_t
408ad811070SMark Rutland *
409ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
410ad811070SMark Rutland *
411ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_sub_relaxed() there.
412ad811070SMark Rutland *
413ad811070SMark Rutland * Return: The original value of @v.
414ad811070SMark Rutland */
415e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_sub_relaxed(int i,atomic_t * v)416e3d18ceeSMark Rutland atomic_fetch_sub_relaxed(int i, atomic_t *v)
417e3d18ceeSMark Rutland {
418e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
419c9268ac6SMark Rutland return raw_atomic_fetch_sub_relaxed(i, v);
420e3d18ceeSMark Rutland }
421e3d18ceeSMark Rutland
422ad811070SMark Rutland /**
423ad811070SMark Rutland * atomic_inc() - atomic increment with relaxed ordering
424ad811070SMark Rutland * @v: pointer to atomic_t
425ad811070SMark Rutland *
426ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
427ad811070SMark Rutland *
428ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc() there.
429ad811070SMark Rutland *
430ad811070SMark Rutland * Return: Nothing.
431ad811070SMark Rutland */
432e3d18ceeSMark Rutland static __always_inline void
atomic_inc(atomic_t * v)433e3d18ceeSMark Rutland atomic_inc(atomic_t *v)
434e3d18ceeSMark Rutland {
435e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
436c9268ac6SMark Rutland raw_atomic_inc(v);
437e3d18ceeSMark Rutland }
438e3d18ceeSMark Rutland
439ad811070SMark Rutland /**
440ad811070SMark Rutland * atomic_inc_return() - atomic increment with full ordering
441ad811070SMark Rutland * @v: pointer to atomic_t
442ad811070SMark Rutland *
443ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
444ad811070SMark Rutland *
445ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_return() there.
446ad811070SMark Rutland *
447ad811070SMark Rutland * Return: The updated value of @v.
448ad811070SMark Rutland */
449e3d18ceeSMark Rutland static __always_inline int
atomic_inc_return(atomic_t * v)450e3d18ceeSMark Rutland atomic_inc_return(atomic_t *v)
451e3d18ceeSMark Rutland {
452e87c4f66SMarco Elver kcsan_mb();
453e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
454c9268ac6SMark Rutland return raw_atomic_inc_return(v);
455e3d18ceeSMark Rutland }
456e3d18ceeSMark Rutland
457ad811070SMark Rutland /**
458ad811070SMark Rutland * atomic_inc_return_acquire() - atomic increment with acquire ordering
459ad811070SMark Rutland * @v: pointer to atomic_t
460ad811070SMark Rutland *
461ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
462ad811070SMark Rutland *
463ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_return_acquire() there.
464ad811070SMark Rutland *
465ad811070SMark Rutland * Return: The updated value of @v.
466ad811070SMark Rutland */
467e3d18ceeSMark Rutland static __always_inline int
atomic_inc_return_acquire(atomic_t * v)468e3d18ceeSMark Rutland atomic_inc_return_acquire(atomic_t *v)
469e3d18ceeSMark Rutland {
470e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
471c9268ac6SMark Rutland return raw_atomic_inc_return_acquire(v);
472e3d18ceeSMark Rutland }
473e3d18ceeSMark Rutland
474ad811070SMark Rutland /**
475ad811070SMark Rutland * atomic_inc_return_release() - atomic increment with release ordering
476ad811070SMark Rutland * @v: pointer to atomic_t
477ad811070SMark Rutland *
478ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
479ad811070SMark Rutland *
480ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_return_release() there.
481ad811070SMark Rutland *
482ad811070SMark Rutland * Return: The updated value of @v.
483ad811070SMark Rutland */
484e3d18ceeSMark Rutland static __always_inline int
atomic_inc_return_release(atomic_t * v)485e3d18ceeSMark Rutland atomic_inc_return_release(atomic_t *v)
486e3d18ceeSMark Rutland {
487e87c4f66SMarco Elver kcsan_release();
488e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
489c9268ac6SMark Rutland return raw_atomic_inc_return_release(v);
490e3d18ceeSMark Rutland }
491e3d18ceeSMark Rutland
492ad811070SMark Rutland /**
493ad811070SMark Rutland * atomic_inc_return_relaxed() - atomic increment with relaxed ordering
494ad811070SMark Rutland * @v: pointer to atomic_t
495ad811070SMark Rutland *
496ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
497ad811070SMark Rutland *
498ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_return_relaxed() there.
499ad811070SMark Rutland *
500ad811070SMark Rutland * Return: The updated value of @v.
501ad811070SMark Rutland */
502e3d18ceeSMark Rutland static __always_inline int
atomic_inc_return_relaxed(atomic_t * v)503e3d18ceeSMark Rutland atomic_inc_return_relaxed(atomic_t *v)
504e3d18ceeSMark Rutland {
505e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
506c9268ac6SMark Rutland return raw_atomic_inc_return_relaxed(v);
507e3d18ceeSMark Rutland }
508e3d18ceeSMark Rutland
509ad811070SMark Rutland /**
510ad811070SMark Rutland * atomic_fetch_inc() - atomic increment with full ordering
511ad811070SMark Rutland * @v: pointer to atomic_t
512ad811070SMark Rutland *
513ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
514ad811070SMark Rutland *
515ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_inc() there.
516ad811070SMark Rutland *
517ad811070SMark Rutland * Return: The original value of @v.
518ad811070SMark Rutland */
519e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_inc(atomic_t * v)520e3d18ceeSMark Rutland atomic_fetch_inc(atomic_t *v)
521e3d18ceeSMark Rutland {
522e87c4f66SMarco Elver kcsan_mb();
523e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
524c9268ac6SMark Rutland return raw_atomic_fetch_inc(v);
525e3d18ceeSMark Rutland }
526e3d18ceeSMark Rutland
527ad811070SMark Rutland /**
528ad811070SMark Rutland * atomic_fetch_inc_acquire() - atomic increment with acquire ordering
529ad811070SMark Rutland * @v: pointer to atomic_t
530ad811070SMark Rutland *
531ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
532ad811070SMark Rutland *
533ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_acquire() there.
534ad811070SMark Rutland *
535ad811070SMark Rutland * Return: The original value of @v.
536ad811070SMark Rutland */
537e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_inc_acquire(atomic_t * v)538e3d18ceeSMark Rutland atomic_fetch_inc_acquire(atomic_t *v)
539e3d18ceeSMark Rutland {
540e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
541c9268ac6SMark Rutland return raw_atomic_fetch_inc_acquire(v);
542e3d18ceeSMark Rutland }
543e3d18ceeSMark Rutland
544ad811070SMark Rutland /**
545ad811070SMark Rutland * atomic_fetch_inc_release() - atomic increment with release ordering
546ad811070SMark Rutland * @v: pointer to atomic_t
547ad811070SMark Rutland *
548ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
549ad811070SMark Rutland *
550ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_release() there.
551ad811070SMark Rutland *
552ad811070SMark Rutland * Return: The original value of @v.
553ad811070SMark Rutland */
554e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_inc_release(atomic_t * v)555e3d18ceeSMark Rutland atomic_fetch_inc_release(atomic_t *v)
556e3d18ceeSMark Rutland {
557e87c4f66SMarco Elver kcsan_release();
558e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
559c9268ac6SMark Rutland return raw_atomic_fetch_inc_release(v);
560e3d18ceeSMark Rutland }
561e3d18ceeSMark Rutland
562ad811070SMark Rutland /**
563ad811070SMark Rutland * atomic_fetch_inc_relaxed() - atomic increment with relaxed ordering
564ad811070SMark Rutland * @v: pointer to atomic_t
565ad811070SMark Rutland *
566ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
567ad811070SMark Rutland *
568ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_inc_relaxed() there.
569ad811070SMark Rutland *
570ad811070SMark Rutland * Return: The original value of @v.
571ad811070SMark Rutland */
572e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_inc_relaxed(atomic_t * v)573e3d18ceeSMark Rutland atomic_fetch_inc_relaxed(atomic_t *v)
574e3d18ceeSMark Rutland {
575e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
576c9268ac6SMark Rutland return raw_atomic_fetch_inc_relaxed(v);
577e3d18ceeSMark Rutland }
578e3d18ceeSMark Rutland
579ad811070SMark Rutland /**
580ad811070SMark Rutland * atomic_dec() - atomic decrement with relaxed ordering
581ad811070SMark Rutland * @v: pointer to atomic_t
582ad811070SMark Rutland *
583ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
584ad811070SMark Rutland *
585ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec() there.
586ad811070SMark Rutland *
587ad811070SMark Rutland * Return: Nothing.
588ad811070SMark Rutland */
589e3d18ceeSMark Rutland static __always_inline void
atomic_dec(atomic_t * v)590e3d18ceeSMark Rutland atomic_dec(atomic_t *v)
591e3d18ceeSMark Rutland {
592e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
593c9268ac6SMark Rutland raw_atomic_dec(v);
594e3d18ceeSMark Rutland }
595e3d18ceeSMark Rutland
596ad811070SMark Rutland /**
597ad811070SMark Rutland * atomic_dec_return() - atomic decrement with full ordering
598ad811070SMark Rutland * @v: pointer to atomic_t
599ad811070SMark Rutland *
600ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
601ad811070SMark Rutland *
602ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_return() there.
603ad811070SMark Rutland *
604ad811070SMark Rutland * Return: The updated value of @v.
605ad811070SMark Rutland */
606e3d18ceeSMark Rutland static __always_inline int
atomic_dec_return(atomic_t * v)607e3d18ceeSMark Rutland atomic_dec_return(atomic_t *v)
608e3d18ceeSMark Rutland {
609e87c4f66SMarco Elver kcsan_mb();
610e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
611c9268ac6SMark Rutland return raw_atomic_dec_return(v);
612e3d18ceeSMark Rutland }
613e3d18ceeSMark Rutland
614ad811070SMark Rutland /**
615ad811070SMark Rutland * atomic_dec_return_acquire() - atomic decrement with acquire ordering
616ad811070SMark Rutland * @v: pointer to atomic_t
617ad811070SMark Rutland *
618ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
619ad811070SMark Rutland *
620ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_return_acquire() there.
621ad811070SMark Rutland *
622ad811070SMark Rutland * Return: The updated value of @v.
623ad811070SMark Rutland */
624e3d18ceeSMark Rutland static __always_inline int
atomic_dec_return_acquire(atomic_t * v)625e3d18ceeSMark Rutland atomic_dec_return_acquire(atomic_t *v)
626e3d18ceeSMark Rutland {
627e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
628c9268ac6SMark Rutland return raw_atomic_dec_return_acquire(v);
629e3d18ceeSMark Rutland }
630e3d18ceeSMark Rutland
631ad811070SMark Rutland /**
632ad811070SMark Rutland * atomic_dec_return_release() - atomic decrement with release ordering
633ad811070SMark Rutland * @v: pointer to atomic_t
634ad811070SMark Rutland *
635ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
636ad811070SMark Rutland *
637ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_return_release() there.
638ad811070SMark Rutland *
639ad811070SMark Rutland * Return: The updated value of @v.
640ad811070SMark Rutland */
641e3d18ceeSMark Rutland static __always_inline int
atomic_dec_return_release(atomic_t * v)642e3d18ceeSMark Rutland atomic_dec_return_release(atomic_t *v)
643e3d18ceeSMark Rutland {
644e87c4f66SMarco Elver kcsan_release();
645e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
646c9268ac6SMark Rutland return raw_atomic_dec_return_release(v);
647e3d18ceeSMark Rutland }
648e3d18ceeSMark Rutland
649ad811070SMark Rutland /**
650ad811070SMark Rutland * atomic_dec_return_relaxed() - atomic decrement with relaxed ordering
651ad811070SMark Rutland * @v: pointer to atomic_t
652ad811070SMark Rutland *
653ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
654ad811070SMark Rutland *
655ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_return_relaxed() there.
656ad811070SMark Rutland *
657ad811070SMark Rutland * Return: The updated value of @v.
658ad811070SMark Rutland */
659e3d18ceeSMark Rutland static __always_inline int
atomic_dec_return_relaxed(atomic_t * v)660e3d18ceeSMark Rutland atomic_dec_return_relaxed(atomic_t *v)
661e3d18ceeSMark Rutland {
662e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
663c9268ac6SMark Rutland return raw_atomic_dec_return_relaxed(v);
664e3d18ceeSMark Rutland }
665e3d18ceeSMark Rutland
666ad811070SMark Rutland /**
667ad811070SMark Rutland * atomic_fetch_dec() - atomic decrement with full ordering
668ad811070SMark Rutland * @v: pointer to atomic_t
669ad811070SMark Rutland *
670ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
671ad811070SMark Rutland *
672ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_dec() there.
673ad811070SMark Rutland *
674ad811070SMark Rutland * Return: The original value of @v.
675ad811070SMark Rutland */
676e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_dec(atomic_t * v)677e3d18ceeSMark Rutland atomic_fetch_dec(atomic_t *v)
678e3d18ceeSMark Rutland {
679e87c4f66SMarco Elver kcsan_mb();
680e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
681c9268ac6SMark Rutland return raw_atomic_fetch_dec(v);
682e3d18ceeSMark Rutland }
683e3d18ceeSMark Rutland
684ad811070SMark Rutland /**
685ad811070SMark Rutland * atomic_fetch_dec_acquire() - atomic decrement with acquire ordering
686ad811070SMark Rutland * @v: pointer to atomic_t
687ad811070SMark Rutland *
688ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
689ad811070SMark Rutland *
690ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_acquire() there.
691ad811070SMark Rutland *
692ad811070SMark Rutland * Return: The original value of @v.
693ad811070SMark Rutland */
694e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_dec_acquire(atomic_t * v)695e3d18ceeSMark Rutland atomic_fetch_dec_acquire(atomic_t *v)
696e3d18ceeSMark Rutland {
697e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
698c9268ac6SMark Rutland return raw_atomic_fetch_dec_acquire(v);
699e3d18ceeSMark Rutland }
700e3d18ceeSMark Rutland
701ad811070SMark Rutland /**
702ad811070SMark Rutland * atomic_fetch_dec_release() - atomic decrement with release ordering
703ad811070SMark Rutland * @v: pointer to atomic_t
704ad811070SMark Rutland *
705ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
706ad811070SMark Rutland *
707ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_release() there.
708ad811070SMark Rutland *
709ad811070SMark Rutland * Return: The original value of @v.
710ad811070SMark Rutland */
711e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_dec_release(atomic_t * v)712e3d18ceeSMark Rutland atomic_fetch_dec_release(atomic_t *v)
713e3d18ceeSMark Rutland {
714e87c4f66SMarco Elver kcsan_release();
715e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
716c9268ac6SMark Rutland return raw_atomic_fetch_dec_release(v);
717e3d18ceeSMark Rutland }
718e3d18ceeSMark Rutland
719ad811070SMark Rutland /**
720ad811070SMark Rutland * atomic_fetch_dec_relaxed() - atomic decrement with relaxed ordering
721ad811070SMark Rutland * @v: pointer to atomic_t
722ad811070SMark Rutland *
723ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
724ad811070SMark Rutland *
725ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_dec_relaxed() there.
726ad811070SMark Rutland *
727ad811070SMark Rutland * Return: The original value of @v.
728ad811070SMark Rutland */
729e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_dec_relaxed(atomic_t * v)730e3d18ceeSMark Rutland atomic_fetch_dec_relaxed(atomic_t *v)
731e3d18ceeSMark Rutland {
732e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
733c9268ac6SMark Rutland return raw_atomic_fetch_dec_relaxed(v);
734e3d18ceeSMark Rutland }
735e3d18ceeSMark Rutland
736ad811070SMark Rutland /**
737ad811070SMark Rutland * atomic_and() - atomic bitwise AND with relaxed ordering
738ad811070SMark Rutland * @i: int value
739ad811070SMark Rutland * @v: pointer to atomic_t
740ad811070SMark Rutland *
741ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
742ad811070SMark Rutland *
743ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_and() there.
744ad811070SMark Rutland *
745ad811070SMark Rutland * Return: Nothing.
746ad811070SMark Rutland */
747e3d18ceeSMark Rutland static __always_inline void
atomic_and(int i,atomic_t * v)748e3d18ceeSMark Rutland atomic_and(int i, atomic_t *v)
749e3d18ceeSMark Rutland {
750e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
751c9268ac6SMark Rutland raw_atomic_and(i, v);
752e3d18ceeSMark Rutland }
753e3d18ceeSMark Rutland
754ad811070SMark Rutland /**
755ad811070SMark Rutland * atomic_fetch_and() - atomic bitwise AND with full ordering
756ad811070SMark Rutland * @i: int value
757ad811070SMark Rutland * @v: pointer to atomic_t
758ad811070SMark Rutland *
759ad811070SMark Rutland * Atomically updates @v to (@v & @i) with full ordering.
760ad811070SMark Rutland *
761ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_and() there.
762ad811070SMark Rutland *
763ad811070SMark Rutland * Return: The original value of @v.
764ad811070SMark Rutland */
765e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_and(int i,atomic_t * v)766e3d18ceeSMark Rutland atomic_fetch_and(int i, atomic_t *v)
767e3d18ceeSMark Rutland {
768e87c4f66SMarco Elver kcsan_mb();
769e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
770c9268ac6SMark Rutland return raw_atomic_fetch_and(i, v);
771e3d18ceeSMark Rutland }
772e3d18ceeSMark Rutland
773ad811070SMark Rutland /**
774ad811070SMark Rutland * atomic_fetch_and_acquire() - atomic bitwise AND with acquire ordering
775ad811070SMark Rutland * @i: int value
776ad811070SMark Rutland * @v: pointer to atomic_t
777ad811070SMark Rutland *
778ad811070SMark Rutland * Atomically updates @v to (@v & @i) with acquire ordering.
779ad811070SMark Rutland *
780ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_and_acquire() there.
781ad811070SMark Rutland *
782ad811070SMark Rutland * Return: The original value of @v.
783ad811070SMark Rutland */
784e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_and_acquire(int i,atomic_t * v)785e3d18ceeSMark Rutland atomic_fetch_and_acquire(int i, atomic_t *v)
786e3d18ceeSMark Rutland {
787e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
788c9268ac6SMark Rutland return raw_atomic_fetch_and_acquire(i, v);
789e3d18ceeSMark Rutland }
790e3d18ceeSMark Rutland
791ad811070SMark Rutland /**
792ad811070SMark Rutland * atomic_fetch_and_release() - atomic bitwise AND with release ordering
793ad811070SMark Rutland * @i: int value
794ad811070SMark Rutland * @v: pointer to atomic_t
795ad811070SMark Rutland *
796ad811070SMark Rutland * Atomically updates @v to (@v & @i) with release ordering.
797ad811070SMark Rutland *
798ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_and_release() there.
799ad811070SMark Rutland *
800ad811070SMark Rutland * Return: The original value of @v.
801ad811070SMark Rutland */
802e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_and_release(int i,atomic_t * v)803e3d18ceeSMark Rutland atomic_fetch_and_release(int i, atomic_t *v)
804e3d18ceeSMark Rutland {
805e87c4f66SMarco Elver kcsan_release();
806e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
807c9268ac6SMark Rutland return raw_atomic_fetch_and_release(i, v);
808e3d18ceeSMark Rutland }
809e3d18ceeSMark Rutland
810ad811070SMark Rutland /**
811ad811070SMark Rutland * atomic_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
812ad811070SMark Rutland * @i: int value
813ad811070SMark Rutland * @v: pointer to atomic_t
814ad811070SMark Rutland *
815ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
816ad811070SMark Rutland *
817ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_and_relaxed() there.
818ad811070SMark Rutland *
819ad811070SMark Rutland * Return: The original value of @v.
820ad811070SMark Rutland */
821e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_and_relaxed(int i,atomic_t * v)822e3d18ceeSMark Rutland atomic_fetch_and_relaxed(int i, atomic_t *v)
823e3d18ceeSMark Rutland {
824e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
825c9268ac6SMark Rutland return raw_atomic_fetch_and_relaxed(i, v);
826e3d18ceeSMark Rutland }
827e3d18ceeSMark Rutland
828ad811070SMark Rutland /**
829ad811070SMark Rutland * atomic_andnot() - atomic bitwise AND NOT with relaxed ordering
830ad811070SMark Rutland * @i: int value
831ad811070SMark Rutland * @v: pointer to atomic_t
832ad811070SMark Rutland *
833ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
834ad811070SMark Rutland *
835ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_andnot() there.
836ad811070SMark Rutland *
837ad811070SMark Rutland * Return: Nothing.
838ad811070SMark Rutland */
839e3d18ceeSMark Rutland static __always_inline void
atomic_andnot(int i,atomic_t * v)840e3d18ceeSMark Rutland atomic_andnot(int i, atomic_t *v)
841e3d18ceeSMark Rutland {
842e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
843c9268ac6SMark Rutland raw_atomic_andnot(i, v);
844e3d18ceeSMark Rutland }
845e3d18ceeSMark Rutland
846ad811070SMark Rutland /**
847ad811070SMark Rutland * atomic_fetch_andnot() - atomic bitwise AND NOT with full ordering
848ad811070SMark Rutland * @i: int value
849ad811070SMark Rutland * @v: pointer to atomic_t
850ad811070SMark Rutland *
851ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with full ordering.
852ad811070SMark Rutland *
853ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot() there.
854ad811070SMark Rutland *
855ad811070SMark Rutland * Return: The original value of @v.
856ad811070SMark Rutland */
857e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_andnot(int i,atomic_t * v)858e3d18ceeSMark Rutland atomic_fetch_andnot(int i, atomic_t *v)
859e3d18ceeSMark Rutland {
860e87c4f66SMarco Elver kcsan_mb();
861e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
862c9268ac6SMark Rutland return raw_atomic_fetch_andnot(i, v);
863e3d18ceeSMark Rutland }
864e3d18ceeSMark Rutland
865ad811070SMark Rutland /**
866ad811070SMark Rutland * atomic_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
867ad811070SMark Rutland * @i: int value
868ad811070SMark Rutland * @v: pointer to atomic_t
869ad811070SMark Rutland *
870ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with acquire ordering.
871ad811070SMark Rutland *
872ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_acquire() there.
873ad811070SMark Rutland *
874ad811070SMark Rutland * Return: The original value of @v.
875ad811070SMark Rutland */
876e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_andnot_acquire(int i,atomic_t * v)877e3d18ceeSMark Rutland atomic_fetch_andnot_acquire(int i, atomic_t *v)
878e3d18ceeSMark Rutland {
879e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
880c9268ac6SMark Rutland return raw_atomic_fetch_andnot_acquire(i, v);
881e3d18ceeSMark Rutland }
882e3d18ceeSMark Rutland
883ad811070SMark Rutland /**
884ad811070SMark Rutland * atomic_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
885ad811070SMark Rutland * @i: int value
886ad811070SMark Rutland * @v: pointer to atomic_t
887ad811070SMark Rutland *
888ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with release ordering.
889ad811070SMark Rutland *
890ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_release() there.
891ad811070SMark Rutland *
892ad811070SMark Rutland * Return: The original value of @v.
893ad811070SMark Rutland */
894e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_andnot_release(int i,atomic_t * v)895e3d18ceeSMark Rutland atomic_fetch_andnot_release(int i, atomic_t *v)
896e3d18ceeSMark Rutland {
897e87c4f66SMarco Elver kcsan_release();
898e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
899c9268ac6SMark Rutland return raw_atomic_fetch_andnot_release(i, v);
900e3d18ceeSMark Rutland }
901e3d18ceeSMark Rutland
902ad811070SMark Rutland /**
903ad811070SMark Rutland * atomic_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
904ad811070SMark Rutland * @i: int value
905ad811070SMark Rutland * @v: pointer to atomic_t
906ad811070SMark Rutland *
907ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
908ad811070SMark Rutland *
909ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_andnot_relaxed() there.
910ad811070SMark Rutland *
911ad811070SMark Rutland * Return: The original value of @v.
912ad811070SMark Rutland */
913e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_andnot_relaxed(int i,atomic_t * v)914e3d18ceeSMark Rutland atomic_fetch_andnot_relaxed(int i, atomic_t *v)
915e3d18ceeSMark Rutland {
916e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
917c9268ac6SMark Rutland return raw_atomic_fetch_andnot_relaxed(i, v);
918e3d18ceeSMark Rutland }
919e3d18ceeSMark Rutland
920ad811070SMark Rutland /**
921ad811070SMark Rutland * atomic_or() - atomic bitwise OR with relaxed ordering
922ad811070SMark Rutland * @i: int value
923ad811070SMark Rutland * @v: pointer to atomic_t
924ad811070SMark Rutland *
925ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
926ad811070SMark Rutland *
927ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_or() there.
928ad811070SMark Rutland *
929ad811070SMark Rutland * Return: Nothing.
930ad811070SMark Rutland */
931e3d18ceeSMark Rutland static __always_inline void
atomic_or(int i,atomic_t * v)932e3d18ceeSMark Rutland atomic_or(int i, atomic_t *v)
933e3d18ceeSMark Rutland {
934e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
935c9268ac6SMark Rutland raw_atomic_or(i, v);
936e3d18ceeSMark Rutland }
937e3d18ceeSMark Rutland
938ad811070SMark Rutland /**
939ad811070SMark Rutland * atomic_fetch_or() - atomic bitwise OR with full ordering
940ad811070SMark Rutland * @i: int value
941ad811070SMark Rutland * @v: pointer to atomic_t
942ad811070SMark Rutland *
943ad811070SMark Rutland * Atomically updates @v to (@v | @i) with full ordering.
944ad811070SMark Rutland *
945ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_or() there.
946ad811070SMark Rutland *
947ad811070SMark Rutland * Return: The original value of @v.
948ad811070SMark Rutland */
949e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_or(int i,atomic_t * v)950e3d18ceeSMark Rutland atomic_fetch_or(int i, atomic_t *v)
951e3d18ceeSMark Rutland {
952e87c4f66SMarco Elver kcsan_mb();
953e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
954c9268ac6SMark Rutland return raw_atomic_fetch_or(i, v);
955e3d18ceeSMark Rutland }
956e3d18ceeSMark Rutland
957ad811070SMark Rutland /**
958ad811070SMark Rutland * atomic_fetch_or_acquire() - atomic bitwise OR with acquire ordering
959ad811070SMark Rutland * @i: int value
960ad811070SMark Rutland * @v: pointer to atomic_t
961ad811070SMark Rutland *
962ad811070SMark Rutland * Atomically updates @v to (@v | @i) with acquire ordering.
963ad811070SMark Rutland *
964ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_or_acquire() there.
965ad811070SMark Rutland *
966ad811070SMark Rutland * Return: The original value of @v.
967ad811070SMark Rutland */
968e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_or_acquire(int i,atomic_t * v)969e3d18ceeSMark Rutland atomic_fetch_or_acquire(int i, atomic_t *v)
970e3d18ceeSMark Rutland {
971e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
972c9268ac6SMark Rutland return raw_atomic_fetch_or_acquire(i, v);
973e3d18ceeSMark Rutland }
974e3d18ceeSMark Rutland
975ad811070SMark Rutland /**
976ad811070SMark Rutland * atomic_fetch_or_release() - atomic bitwise OR with release ordering
977ad811070SMark Rutland * @i: int value
978ad811070SMark Rutland * @v: pointer to atomic_t
979ad811070SMark Rutland *
980ad811070SMark Rutland * Atomically updates @v to (@v | @i) with release ordering.
981ad811070SMark Rutland *
982ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_or_release() there.
983ad811070SMark Rutland *
984ad811070SMark Rutland * Return: The original value of @v.
985ad811070SMark Rutland */
986e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_or_release(int i,atomic_t * v)987e3d18ceeSMark Rutland atomic_fetch_or_release(int i, atomic_t *v)
988e3d18ceeSMark Rutland {
989e87c4f66SMarco Elver kcsan_release();
990e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
991c9268ac6SMark Rutland return raw_atomic_fetch_or_release(i, v);
992e3d18ceeSMark Rutland }
993e3d18ceeSMark Rutland
994ad811070SMark Rutland /**
995ad811070SMark Rutland * atomic_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
996ad811070SMark Rutland * @i: int value
997ad811070SMark Rutland * @v: pointer to atomic_t
998ad811070SMark Rutland *
999ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
1000ad811070SMark Rutland *
1001ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_or_relaxed() there.
1002ad811070SMark Rutland *
1003ad811070SMark Rutland * Return: The original value of @v.
1004ad811070SMark Rutland */
1005e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_or_relaxed(int i,atomic_t * v)1006e3d18ceeSMark Rutland atomic_fetch_or_relaxed(int i, atomic_t *v)
1007e3d18ceeSMark Rutland {
1008e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1009c9268ac6SMark Rutland return raw_atomic_fetch_or_relaxed(i, v);
1010e3d18ceeSMark Rutland }
1011e3d18ceeSMark Rutland
1012ad811070SMark Rutland /**
1013ad811070SMark Rutland * atomic_xor() - atomic bitwise XOR with relaxed ordering
1014ad811070SMark Rutland * @i: int value
1015ad811070SMark Rutland * @v: pointer to atomic_t
1016ad811070SMark Rutland *
1017ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1018ad811070SMark Rutland *
1019ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_xor() there.
1020ad811070SMark Rutland *
1021ad811070SMark Rutland * Return: Nothing.
1022ad811070SMark Rutland */
1023e3d18ceeSMark Rutland static __always_inline void
atomic_xor(int i,atomic_t * v)1024e3d18ceeSMark Rutland atomic_xor(int i, atomic_t *v)
1025e3d18ceeSMark Rutland {
1026e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1027c9268ac6SMark Rutland raw_atomic_xor(i, v);
1028e3d18ceeSMark Rutland }
1029e3d18ceeSMark Rutland
1030ad811070SMark Rutland /**
1031ad811070SMark Rutland * atomic_fetch_xor() - atomic bitwise XOR with full ordering
1032ad811070SMark Rutland * @i: int value
1033ad811070SMark Rutland * @v: pointer to atomic_t
1034ad811070SMark Rutland *
1035ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with full ordering.
1036ad811070SMark Rutland *
1037ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_xor() there.
1038ad811070SMark Rutland *
1039ad811070SMark Rutland * Return: The original value of @v.
1040ad811070SMark Rutland */
1041e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_xor(int i,atomic_t * v)1042e3d18ceeSMark Rutland atomic_fetch_xor(int i, atomic_t *v)
1043e3d18ceeSMark Rutland {
1044e87c4f66SMarco Elver kcsan_mb();
1045e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1046c9268ac6SMark Rutland return raw_atomic_fetch_xor(i, v);
1047e3d18ceeSMark Rutland }
1048e3d18ceeSMark Rutland
1049ad811070SMark Rutland /**
1050ad811070SMark Rutland * atomic_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
1051ad811070SMark Rutland * @i: int value
1052ad811070SMark Rutland * @v: pointer to atomic_t
1053ad811070SMark Rutland *
1054ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with acquire ordering.
1055ad811070SMark Rutland *
1056ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_acquire() there.
1057ad811070SMark Rutland *
1058ad811070SMark Rutland * Return: The original value of @v.
1059ad811070SMark Rutland */
1060e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_xor_acquire(int i,atomic_t * v)1061e3d18ceeSMark Rutland atomic_fetch_xor_acquire(int i, atomic_t *v)
1062e3d18ceeSMark Rutland {
1063e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1064c9268ac6SMark Rutland return raw_atomic_fetch_xor_acquire(i, v);
1065e3d18ceeSMark Rutland }
1066e3d18ceeSMark Rutland
1067ad811070SMark Rutland /**
1068ad811070SMark Rutland * atomic_fetch_xor_release() - atomic bitwise XOR with release ordering
1069ad811070SMark Rutland * @i: int value
1070ad811070SMark Rutland * @v: pointer to atomic_t
1071ad811070SMark Rutland *
1072ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with release ordering.
1073ad811070SMark Rutland *
1074ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_release() there.
1075ad811070SMark Rutland *
1076ad811070SMark Rutland * Return: The original value of @v.
1077ad811070SMark Rutland */
1078e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_xor_release(int i,atomic_t * v)1079e3d18ceeSMark Rutland atomic_fetch_xor_release(int i, atomic_t *v)
1080e3d18ceeSMark Rutland {
1081e87c4f66SMarco Elver kcsan_release();
1082e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1083c9268ac6SMark Rutland return raw_atomic_fetch_xor_release(i, v);
1084e3d18ceeSMark Rutland }
1085e3d18ceeSMark Rutland
1086ad811070SMark Rutland /**
1087ad811070SMark Rutland * atomic_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
1088ad811070SMark Rutland * @i: int value
1089ad811070SMark Rutland * @v: pointer to atomic_t
1090ad811070SMark Rutland *
1091ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
1092ad811070SMark Rutland *
1093ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_xor_relaxed() there.
1094ad811070SMark Rutland *
1095ad811070SMark Rutland * Return: The original value of @v.
1096ad811070SMark Rutland */
1097e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_xor_relaxed(int i,atomic_t * v)1098e3d18ceeSMark Rutland atomic_fetch_xor_relaxed(int i, atomic_t *v)
1099e3d18ceeSMark Rutland {
1100e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1101c9268ac6SMark Rutland return raw_atomic_fetch_xor_relaxed(i, v);
1102e3d18ceeSMark Rutland }
1103e3d18ceeSMark Rutland
1104ad811070SMark Rutland /**
1105ad811070SMark Rutland * atomic_xchg() - atomic exchange with full ordering
1106ad811070SMark Rutland * @v: pointer to atomic_t
1107ad811070SMark Rutland * @new: int value to assign
1108ad811070SMark Rutland *
1109ad811070SMark Rutland * Atomically updates @v to @new with full ordering.
1110ad811070SMark Rutland *
1111ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_xchg() there.
1112ad811070SMark Rutland *
1113ad811070SMark Rutland * Return: The original value of @v.
1114ad811070SMark Rutland */
1115e3d18ceeSMark Rutland static __always_inline int
atomic_xchg(atomic_t * v,int new)11161d78814dSMark Rutland atomic_xchg(atomic_t *v, int new)
1117e3d18ceeSMark Rutland {
1118e87c4f66SMarco Elver kcsan_mb();
1119e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
11201d78814dSMark Rutland return raw_atomic_xchg(v, new);
1121e3d18ceeSMark Rutland }
1122e3d18ceeSMark Rutland
1123ad811070SMark Rutland /**
1124ad811070SMark Rutland * atomic_xchg_acquire() - atomic exchange with acquire ordering
1125ad811070SMark Rutland * @v: pointer to atomic_t
1126ad811070SMark Rutland * @new: int value to assign
1127ad811070SMark Rutland *
1128ad811070SMark Rutland * Atomically updates @v to @new with acquire ordering.
1129ad811070SMark Rutland *
1130ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_xchg_acquire() there.
1131ad811070SMark Rutland *
1132ad811070SMark Rutland * Return: The original value of @v.
1133ad811070SMark Rutland */
1134e3d18ceeSMark Rutland static __always_inline int
atomic_xchg_acquire(atomic_t * v,int new)11351d78814dSMark Rutland atomic_xchg_acquire(atomic_t *v, int new)
1136e3d18ceeSMark Rutland {
1137e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
11381d78814dSMark Rutland return raw_atomic_xchg_acquire(v, new);
1139e3d18ceeSMark Rutland }
1140e3d18ceeSMark Rutland
1141ad811070SMark Rutland /**
1142ad811070SMark Rutland * atomic_xchg_release() - atomic exchange with release ordering
1143ad811070SMark Rutland * @v: pointer to atomic_t
1144ad811070SMark Rutland * @new: int value to assign
1145ad811070SMark Rutland *
1146ad811070SMark Rutland * Atomically updates @v to @new with release ordering.
1147ad811070SMark Rutland *
1148ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_xchg_release() there.
1149ad811070SMark Rutland *
1150ad811070SMark Rutland * Return: The original value of @v.
1151ad811070SMark Rutland */
1152e3d18ceeSMark Rutland static __always_inline int
atomic_xchg_release(atomic_t * v,int new)11531d78814dSMark Rutland atomic_xchg_release(atomic_t *v, int new)
1154e3d18ceeSMark Rutland {
1155e87c4f66SMarco Elver kcsan_release();
1156e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
11571d78814dSMark Rutland return raw_atomic_xchg_release(v, new);
1158e3d18ceeSMark Rutland }
1159e3d18ceeSMark Rutland
1160ad811070SMark Rutland /**
1161ad811070SMark Rutland * atomic_xchg_relaxed() - atomic exchange with relaxed ordering
1162ad811070SMark Rutland * @v: pointer to atomic_t
1163ad811070SMark Rutland * @new: int value to assign
1164ad811070SMark Rutland *
1165ad811070SMark Rutland * Atomically updates @v to @new with relaxed ordering.
1166ad811070SMark Rutland *
1167ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_xchg_relaxed() there.
1168ad811070SMark Rutland *
1169ad811070SMark Rutland * Return: The original value of @v.
1170ad811070SMark Rutland */
1171e3d18ceeSMark Rutland static __always_inline int
atomic_xchg_relaxed(atomic_t * v,int new)11721d78814dSMark Rutland atomic_xchg_relaxed(atomic_t *v, int new)
1173e3d18ceeSMark Rutland {
1174e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
11751d78814dSMark Rutland return raw_atomic_xchg_relaxed(v, new);
1176e3d18ceeSMark Rutland }
1177e3d18ceeSMark Rutland
1178ad811070SMark Rutland /**
1179ad811070SMark Rutland * atomic_cmpxchg() - atomic compare and exchange with full ordering
1180ad811070SMark Rutland * @v: pointer to atomic_t
1181ad811070SMark Rutland * @old: int value to compare with
1182ad811070SMark Rutland * @new: int value to assign
1183ad811070SMark Rutland *
1184ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
11856dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1186ad811070SMark Rutland *
1187ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_cmpxchg() there.
1188ad811070SMark Rutland *
1189ad811070SMark Rutland * Return: The original value of @v.
1190ad811070SMark Rutland */
1191e3d18ceeSMark Rutland static __always_inline int
atomic_cmpxchg(atomic_t * v,int old,int new)1192e3d18ceeSMark Rutland atomic_cmpxchg(atomic_t *v, int old, int new)
1193e3d18ceeSMark Rutland {
1194e87c4f66SMarco Elver kcsan_mb();
1195e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1196c9268ac6SMark Rutland return raw_atomic_cmpxchg(v, old, new);
1197e3d18ceeSMark Rutland }
1198e3d18ceeSMark Rutland
1199ad811070SMark Rutland /**
1200ad811070SMark Rutland * atomic_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
1201ad811070SMark Rutland * @v: pointer to atomic_t
1202ad811070SMark Rutland * @old: int value to compare with
1203ad811070SMark Rutland * @new: int value to assign
1204ad811070SMark Rutland *
1205ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
12066dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1207ad811070SMark Rutland *
1208ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_acquire() there.
1209ad811070SMark Rutland *
1210ad811070SMark Rutland * Return: The original value of @v.
1211ad811070SMark Rutland */
1212e3d18ceeSMark Rutland static __always_inline int
atomic_cmpxchg_acquire(atomic_t * v,int old,int new)1213e3d18ceeSMark Rutland atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
1214e3d18ceeSMark Rutland {
1215e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1216c9268ac6SMark Rutland return raw_atomic_cmpxchg_acquire(v, old, new);
1217e3d18ceeSMark Rutland }
1218e3d18ceeSMark Rutland
1219ad811070SMark Rutland /**
1220ad811070SMark Rutland * atomic_cmpxchg_release() - atomic compare and exchange with release ordering
1221ad811070SMark Rutland * @v: pointer to atomic_t
1222ad811070SMark Rutland * @old: int value to compare with
1223ad811070SMark Rutland * @new: int value to assign
1224ad811070SMark Rutland *
1225ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
12266dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1227ad811070SMark Rutland *
1228ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_release() there.
1229ad811070SMark Rutland *
1230ad811070SMark Rutland * Return: The original value of @v.
1231ad811070SMark Rutland */
1232e3d18ceeSMark Rutland static __always_inline int
atomic_cmpxchg_release(atomic_t * v,int old,int new)1233e3d18ceeSMark Rutland atomic_cmpxchg_release(atomic_t *v, int old, int new)
1234e3d18ceeSMark Rutland {
1235e87c4f66SMarco Elver kcsan_release();
1236e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1237c9268ac6SMark Rutland return raw_atomic_cmpxchg_release(v, old, new);
1238e3d18ceeSMark Rutland }
1239e3d18ceeSMark Rutland
1240ad811070SMark Rutland /**
1241ad811070SMark Rutland * atomic_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
1242ad811070SMark Rutland * @v: pointer to atomic_t
1243ad811070SMark Rutland * @old: int value to compare with
1244ad811070SMark Rutland * @new: int value to assign
1245ad811070SMark Rutland *
1246ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
12476dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1248ad811070SMark Rutland *
1249ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_cmpxchg_relaxed() there.
1250ad811070SMark Rutland *
1251ad811070SMark Rutland * Return: The original value of @v.
1252ad811070SMark Rutland */
1253e3d18ceeSMark Rutland static __always_inline int
atomic_cmpxchg_relaxed(atomic_t * v,int old,int new)1254e3d18ceeSMark Rutland atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
1255e3d18ceeSMark Rutland {
1256e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1257c9268ac6SMark Rutland return raw_atomic_cmpxchg_relaxed(v, old, new);
1258e3d18ceeSMark Rutland }
1259e3d18ceeSMark Rutland
1260ad811070SMark Rutland /**
1261ad811070SMark Rutland * atomic_try_cmpxchg() - atomic compare and exchange with full ordering
1262ad811070SMark Rutland * @v: pointer to atomic_t
1263ad811070SMark Rutland * @old: pointer to int value to compare with
1264ad811070SMark Rutland * @new: int value to assign
1265ad811070SMark Rutland *
1266ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
12676dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
12686dfee110SMark Rutland * and relaxed ordering is provided.
1269ad811070SMark Rutland *
1270ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg() there.
1271ad811070SMark Rutland *
1272ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
1273ad811070SMark Rutland */
1274e3d18ceeSMark Rutland static __always_inline bool
atomic_try_cmpxchg(atomic_t * v,int * old,int new)1275e3d18ceeSMark Rutland atomic_try_cmpxchg(atomic_t *v, int *old, int new)
1276e3d18ceeSMark Rutland {
1277e87c4f66SMarco Elver kcsan_mb();
1278e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1279e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
1280c9268ac6SMark Rutland return raw_atomic_try_cmpxchg(v, old, new);
1281e3d18ceeSMark Rutland }
1282e3d18ceeSMark Rutland
1283ad811070SMark Rutland /**
1284ad811070SMark Rutland * atomic_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
1285ad811070SMark Rutland * @v: pointer to atomic_t
1286ad811070SMark Rutland * @old: pointer to int value to compare with
1287ad811070SMark Rutland * @new: int value to assign
1288ad811070SMark Rutland *
1289ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
12906dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
12916dfee110SMark Rutland * and relaxed ordering is provided.
1292ad811070SMark Rutland *
1293ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_acquire() there.
1294ad811070SMark Rutland *
1295ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
1296ad811070SMark Rutland */
1297e3d18ceeSMark Rutland static __always_inline bool
atomic_try_cmpxchg_acquire(atomic_t * v,int * old,int new)1298e3d18ceeSMark Rutland atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
1299e3d18ceeSMark Rutland {
1300e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1301e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
1302c9268ac6SMark Rutland return raw_atomic_try_cmpxchg_acquire(v, old, new);
1303e3d18ceeSMark Rutland }
1304e3d18ceeSMark Rutland
1305ad811070SMark Rutland /**
1306ad811070SMark Rutland * atomic_try_cmpxchg_release() - atomic compare and exchange with release ordering
1307ad811070SMark Rutland * @v: pointer to atomic_t
1308ad811070SMark Rutland * @old: pointer to int value to compare with
1309ad811070SMark Rutland * @new: int value to assign
1310ad811070SMark Rutland *
1311ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
13126dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
13136dfee110SMark Rutland * and relaxed ordering is provided.
1314ad811070SMark Rutland *
1315ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_release() there.
1316ad811070SMark Rutland *
1317ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
1318ad811070SMark Rutland */
1319e3d18ceeSMark Rutland static __always_inline bool
atomic_try_cmpxchg_release(atomic_t * v,int * old,int new)1320e3d18ceeSMark Rutland atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
1321e3d18ceeSMark Rutland {
1322e87c4f66SMarco Elver kcsan_release();
1323e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1324e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
1325c9268ac6SMark Rutland return raw_atomic_try_cmpxchg_release(v, old, new);
1326e3d18ceeSMark Rutland }
1327e3d18ceeSMark Rutland
1328ad811070SMark Rutland /**
1329ad811070SMark Rutland * atomic_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
1330ad811070SMark Rutland * @v: pointer to atomic_t
1331ad811070SMark Rutland * @old: pointer to int value to compare with
1332ad811070SMark Rutland * @new: int value to assign
1333ad811070SMark Rutland *
1334ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
13356dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
13366dfee110SMark Rutland * and relaxed ordering is provided.
1337ad811070SMark Rutland *
1338ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_try_cmpxchg_relaxed() there.
1339ad811070SMark Rutland *
1340ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
1341ad811070SMark Rutland */
1342e3d18ceeSMark Rutland static __always_inline bool
atomic_try_cmpxchg_relaxed(atomic_t * v,int * old,int new)1343e3d18ceeSMark Rutland atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
1344e3d18ceeSMark Rutland {
1345e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1346e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
1347c9268ac6SMark Rutland return raw_atomic_try_cmpxchg_relaxed(v, old, new);
1348e3d18ceeSMark Rutland }
1349e3d18ceeSMark Rutland
1350ad811070SMark Rutland /**
1351ad811070SMark Rutland * atomic_sub_and_test() - atomic subtract and test if zero with full ordering
1352*f92a59f6SCarlos Llamas * @i: int value to subtract
1353ad811070SMark Rutland * @v: pointer to atomic_t
1354ad811070SMark Rutland *
1355ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
1356ad811070SMark Rutland *
1357ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_sub_and_test() there.
1358ad811070SMark Rutland *
1359ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
1360ad811070SMark Rutland */
1361e3d18ceeSMark Rutland static __always_inline bool
atomic_sub_and_test(int i,atomic_t * v)1362e3d18ceeSMark Rutland atomic_sub_and_test(int i, atomic_t *v)
1363e3d18ceeSMark Rutland {
1364e87c4f66SMarco Elver kcsan_mb();
1365e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1366c9268ac6SMark Rutland return raw_atomic_sub_and_test(i, v);
1367e3d18ceeSMark Rutland }
1368e3d18ceeSMark Rutland
1369ad811070SMark Rutland /**
1370ad811070SMark Rutland * atomic_dec_and_test() - atomic decrement and test if zero with full ordering
1371ad811070SMark Rutland * @v: pointer to atomic_t
1372ad811070SMark Rutland *
1373ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
1374ad811070SMark Rutland *
1375ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_and_test() there.
1376ad811070SMark Rutland *
1377ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
1378ad811070SMark Rutland */
1379e3d18ceeSMark Rutland static __always_inline bool
atomic_dec_and_test(atomic_t * v)1380e3d18ceeSMark Rutland atomic_dec_and_test(atomic_t *v)
1381e3d18ceeSMark Rutland {
1382e87c4f66SMarco Elver kcsan_mb();
1383e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1384c9268ac6SMark Rutland return raw_atomic_dec_and_test(v);
1385e3d18ceeSMark Rutland }
1386e3d18ceeSMark Rutland
1387ad811070SMark Rutland /**
1388ad811070SMark Rutland * atomic_inc_and_test() - atomic increment and test if zero with full ordering
1389ad811070SMark Rutland * @v: pointer to atomic_t
1390ad811070SMark Rutland *
1391ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
1392ad811070SMark Rutland *
1393ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_and_test() there.
1394ad811070SMark Rutland *
1395ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
1396ad811070SMark Rutland */
1397e3d18ceeSMark Rutland static __always_inline bool
atomic_inc_and_test(atomic_t * v)1398e3d18ceeSMark Rutland atomic_inc_and_test(atomic_t *v)
1399e3d18ceeSMark Rutland {
1400e87c4f66SMarco Elver kcsan_mb();
1401e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1402c9268ac6SMark Rutland return raw_atomic_inc_and_test(v);
1403e3d18ceeSMark Rutland }
1404e3d18ceeSMark Rutland
1405ad811070SMark Rutland /**
1406ad811070SMark Rutland * atomic_add_negative() - atomic add and test if negative with full ordering
1407ad811070SMark Rutland * @i: int value to add
1408ad811070SMark Rutland * @v: pointer to atomic_t
1409ad811070SMark Rutland *
1410ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
1411ad811070SMark Rutland *
1412ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_negative() there.
1413ad811070SMark Rutland *
1414ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
1415ad811070SMark Rutland */
1416e3d18ceeSMark Rutland static __always_inline bool
atomic_add_negative(int i,atomic_t * v)1417e3d18ceeSMark Rutland atomic_add_negative(int i, atomic_t *v)
1418e3d18ceeSMark Rutland {
1419e87c4f66SMarco Elver kcsan_mb();
1420e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1421c9268ac6SMark Rutland return raw_atomic_add_negative(i, v);
1422e3d18ceeSMark Rutland }
1423e3d18ceeSMark Rutland
1424ad811070SMark Rutland /**
1425ad811070SMark Rutland * atomic_add_negative_acquire() - atomic add and test if negative with acquire ordering
1426ad811070SMark Rutland * @i: int value to add
1427ad811070SMark Rutland * @v: pointer to atomic_t
1428ad811070SMark Rutland *
1429ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
1430ad811070SMark Rutland *
1431ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_negative_acquire() there.
1432ad811070SMark Rutland *
1433ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
1434ad811070SMark Rutland */
1435e5ab9effSThomas Gleixner static __always_inline bool
atomic_add_negative_acquire(int i,atomic_t * v)1436e5ab9effSThomas Gleixner atomic_add_negative_acquire(int i, atomic_t *v)
1437e5ab9effSThomas Gleixner {
1438e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
1439c9268ac6SMark Rutland return raw_atomic_add_negative_acquire(i, v);
1440e5ab9effSThomas Gleixner }
1441e5ab9effSThomas Gleixner
1442ad811070SMark Rutland /**
1443ad811070SMark Rutland * atomic_add_negative_release() - atomic add and test if negative with release ordering
1444ad811070SMark Rutland * @i: int value to add
1445ad811070SMark Rutland * @v: pointer to atomic_t
1446ad811070SMark Rutland *
1447ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
1448ad811070SMark Rutland *
1449ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_negative_release() there.
1450ad811070SMark Rutland *
1451ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
1452ad811070SMark Rutland */
1453e5ab9effSThomas Gleixner static __always_inline bool
atomic_add_negative_release(int i,atomic_t * v)1454e5ab9effSThomas Gleixner atomic_add_negative_release(int i, atomic_t *v)
1455e5ab9effSThomas Gleixner {
1456e5ab9effSThomas Gleixner kcsan_release();
1457e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
1458c9268ac6SMark Rutland return raw_atomic_add_negative_release(i, v);
1459e5ab9effSThomas Gleixner }
1460e5ab9effSThomas Gleixner
1461ad811070SMark Rutland /**
1462ad811070SMark Rutland * atomic_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
1463ad811070SMark Rutland * @i: int value to add
1464ad811070SMark Rutland * @v: pointer to atomic_t
1465ad811070SMark Rutland *
1466ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
1467ad811070SMark Rutland *
1468ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_negative_relaxed() there.
1469ad811070SMark Rutland *
1470ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
1471ad811070SMark Rutland */
1472e5ab9effSThomas Gleixner static __always_inline bool
atomic_add_negative_relaxed(int i,atomic_t * v)1473e5ab9effSThomas Gleixner atomic_add_negative_relaxed(int i, atomic_t *v)
1474e5ab9effSThomas Gleixner {
1475e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
1476c9268ac6SMark Rutland return raw_atomic_add_negative_relaxed(i, v);
1477e5ab9effSThomas Gleixner }
1478e5ab9effSThomas Gleixner
1479ad811070SMark Rutland /**
1480ad811070SMark Rutland * atomic_fetch_add_unless() - atomic add unless value with full ordering
1481ad811070SMark Rutland * @v: pointer to atomic_t
1482ad811070SMark Rutland * @a: int value to add
1483ad811070SMark Rutland * @u: int value to compare with
1484ad811070SMark Rutland *
1485ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
14866dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1487ad811070SMark Rutland *
1488ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_fetch_add_unless() there.
1489ad811070SMark Rutland *
1490ad811070SMark Rutland * Return: The original value of @v.
1491ad811070SMark Rutland */
1492e3d18ceeSMark Rutland static __always_inline int
atomic_fetch_add_unless(atomic_t * v,int a,int u)1493e3d18ceeSMark Rutland atomic_fetch_add_unless(atomic_t *v, int a, int u)
1494e3d18ceeSMark Rutland {
1495e87c4f66SMarco Elver kcsan_mb();
1496e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1497c9268ac6SMark Rutland return raw_atomic_fetch_add_unless(v, a, u);
1498e3d18ceeSMark Rutland }
1499e3d18ceeSMark Rutland
1500ad811070SMark Rutland /**
1501ad811070SMark Rutland * atomic_add_unless() - atomic add unless value with full ordering
1502ad811070SMark Rutland * @v: pointer to atomic_t
1503ad811070SMark Rutland * @a: int value to add
1504ad811070SMark Rutland * @u: int value to compare with
1505ad811070SMark Rutland *
1506ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
15076dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1508ad811070SMark Rutland *
1509ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_add_unless() there.
1510ad811070SMark Rutland *
1511ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
1512ad811070SMark Rutland */
1513e3d18ceeSMark Rutland static __always_inline bool
atomic_add_unless(atomic_t * v,int a,int u)1514e3d18ceeSMark Rutland atomic_add_unless(atomic_t *v, int a, int u)
1515e3d18ceeSMark Rutland {
1516e87c4f66SMarco Elver kcsan_mb();
1517e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1518c9268ac6SMark Rutland return raw_atomic_add_unless(v, a, u);
1519e3d18ceeSMark Rutland }
1520e3d18ceeSMark Rutland
1521ad811070SMark Rutland /**
1522ad811070SMark Rutland * atomic_inc_not_zero() - atomic increment unless zero with full ordering
1523ad811070SMark Rutland * @v: pointer to atomic_t
1524ad811070SMark Rutland *
1525ad811070SMark Rutland * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
15266dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1527ad811070SMark Rutland *
1528ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_not_zero() there.
1529ad811070SMark Rutland *
1530ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
1531ad811070SMark Rutland */
1532e3d18ceeSMark Rutland static __always_inline bool
atomic_inc_not_zero(atomic_t * v)1533e3d18ceeSMark Rutland atomic_inc_not_zero(atomic_t *v)
1534e3d18ceeSMark Rutland {
1535e87c4f66SMarco Elver kcsan_mb();
1536e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1537c9268ac6SMark Rutland return raw_atomic_inc_not_zero(v);
1538e3d18ceeSMark Rutland }
1539e3d18ceeSMark Rutland
1540ad811070SMark Rutland /**
1541ad811070SMark Rutland * atomic_inc_unless_negative() - atomic increment unless negative with full ordering
1542ad811070SMark Rutland * @v: pointer to atomic_t
1543ad811070SMark Rutland *
1544ad811070SMark Rutland * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
15456dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1546ad811070SMark Rutland *
1547ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_inc_unless_negative() there.
1548ad811070SMark Rutland *
1549ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
1550ad811070SMark Rutland */
1551e3d18ceeSMark Rutland static __always_inline bool
atomic_inc_unless_negative(atomic_t * v)1552e3d18ceeSMark Rutland atomic_inc_unless_negative(atomic_t *v)
1553e3d18ceeSMark Rutland {
1554e87c4f66SMarco Elver kcsan_mb();
1555e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1556c9268ac6SMark Rutland return raw_atomic_inc_unless_negative(v);
1557e3d18ceeSMark Rutland }
1558e3d18ceeSMark Rutland
1559ad811070SMark Rutland /**
1560ad811070SMark Rutland * atomic_dec_unless_positive() - atomic decrement unless positive with full ordering
1561ad811070SMark Rutland * @v: pointer to atomic_t
1562ad811070SMark Rutland *
1563ad811070SMark Rutland * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
15646dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1565ad811070SMark Rutland *
1566ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_unless_positive() there.
1567ad811070SMark Rutland *
1568ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
1569ad811070SMark Rutland */
1570e3d18ceeSMark Rutland static __always_inline bool
atomic_dec_unless_positive(atomic_t * v)1571e3d18ceeSMark Rutland atomic_dec_unless_positive(atomic_t *v)
1572e3d18ceeSMark Rutland {
1573e87c4f66SMarco Elver kcsan_mb();
1574e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1575c9268ac6SMark Rutland return raw_atomic_dec_unless_positive(v);
1576e3d18ceeSMark Rutland }
1577e3d18ceeSMark Rutland
1578ad811070SMark Rutland /**
1579ad811070SMark Rutland * atomic_dec_if_positive() - atomic decrement if positive with full ordering
1580ad811070SMark Rutland * @v: pointer to atomic_t
1581ad811070SMark Rutland *
1582ad811070SMark Rutland * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
15836dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
1584ad811070SMark Rutland *
1585ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_dec_if_positive() there.
1586ad811070SMark Rutland *
1587b33eb50aSMark Rutland * Return: The old value of (@v - 1), regardless of whether @v was updated.
1588ad811070SMark Rutland */
1589e3d18ceeSMark Rutland static __always_inline int
atomic_dec_if_positive(atomic_t * v)1590e3d18ceeSMark Rutland atomic_dec_if_positive(atomic_t *v)
1591e3d18ceeSMark Rutland {
1592e87c4f66SMarco Elver kcsan_mb();
1593e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1594c9268ac6SMark Rutland return raw_atomic_dec_if_positive(v);
1595e3d18ceeSMark Rutland }
1596e3d18ceeSMark Rutland
1597ad811070SMark Rutland /**
1598ad811070SMark Rutland * atomic64_read() - atomic load with relaxed ordering
1599ad811070SMark Rutland * @v: pointer to atomic64_t
1600ad811070SMark Rutland *
1601ad811070SMark Rutland * Atomically loads the value of @v with relaxed ordering.
1602ad811070SMark Rutland *
1603ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_read() there.
1604ad811070SMark Rutland *
1605ad811070SMark Rutland * Return: The value loaded from @v.
1606ad811070SMark Rutland */
1607e3d18ceeSMark Rutland static __always_inline s64
atomic64_read(const atomic64_t * v)1608e3d18ceeSMark Rutland atomic64_read(const atomic64_t *v)
1609e3d18ceeSMark Rutland {
1610e3d18ceeSMark Rutland instrument_atomic_read(v, sizeof(*v));
1611c9268ac6SMark Rutland return raw_atomic64_read(v);
1612e3d18ceeSMark Rutland }
1613e3d18ceeSMark Rutland
1614ad811070SMark Rutland /**
1615ad811070SMark Rutland * atomic64_read_acquire() - atomic load with acquire ordering
1616ad811070SMark Rutland * @v: pointer to atomic64_t
1617ad811070SMark Rutland *
1618ad811070SMark Rutland * Atomically loads the value of @v with acquire ordering.
1619ad811070SMark Rutland *
1620ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_read_acquire() there.
1621ad811070SMark Rutland *
1622ad811070SMark Rutland * Return: The value loaded from @v.
1623ad811070SMark Rutland */
1624e3d18ceeSMark Rutland static __always_inline s64
atomic64_read_acquire(const atomic64_t * v)1625e3d18ceeSMark Rutland atomic64_read_acquire(const atomic64_t *v)
1626e3d18ceeSMark Rutland {
1627e3d18ceeSMark Rutland instrument_atomic_read(v, sizeof(*v));
1628c9268ac6SMark Rutland return raw_atomic64_read_acquire(v);
1629e3d18ceeSMark Rutland }
1630e3d18ceeSMark Rutland
1631ad811070SMark Rutland /**
1632ad811070SMark Rutland * atomic64_set() - atomic set with relaxed ordering
1633ad811070SMark Rutland * @v: pointer to atomic64_t
1634ad811070SMark Rutland * @i: s64 value to assign
1635ad811070SMark Rutland *
1636ad811070SMark Rutland * Atomically sets @v to @i with relaxed ordering.
1637ad811070SMark Rutland *
1638ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_set() there.
1639ad811070SMark Rutland *
1640ad811070SMark Rutland * Return: Nothing.
1641ad811070SMark Rutland */
1642e3d18ceeSMark Rutland static __always_inline void
atomic64_set(atomic64_t * v,s64 i)1643e3d18ceeSMark Rutland atomic64_set(atomic64_t *v, s64 i)
1644e3d18ceeSMark Rutland {
1645e3d18ceeSMark Rutland instrument_atomic_write(v, sizeof(*v));
1646c9268ac6SMark Rutland raw_atomic64_set(v, i);
1647e3d18ceeSMark Rutland }
1648e3d18ceeSMark Rutland
1649ad811070SMark Rutland /**
1650ad811070SMark Rutland * atomic64_set_release() - atomic set with release ordering
1651ad811070SMark Rutland * @v: pointer to atomic64_t
1652ad811070SMark Rutland * @i: s64 value to assign
1653ad811070SMark Rutland *
1654ad811070SMark Rutland * Atomically sets @v to @i with release ordering.
1655ad811070SMark Rutland *
1656ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_set_release() there.
1657ad811070SMark Rutland *
1658ad811070SMark Rutland * Return: Nothing.
1659ad811070SMark Rutland */
1660e3d18ceeSMark Rutland static __always_inline void
atomic64_set_release(atomic64_t * v,s64 i)1661e3d18ceeSMark Rutland atomic64_set_release(atomic64_t *v, s64 i)
1662e3d18ceeSMark Rutland {
1663e87c4f66SMarco Elver kcsan_release();
1664e3d18ceeSMark Rutland instrument_atomic_write(v, sizeof(*v));
1665c9268ac6SMark Rutland raw_atomic64_set_release(v, i);
1666e3d18ceeSMark Rutland }
1667e3d18ceeSMark Rutland
1668ad811070SMark Rutland /**
1669ad811070SMark Rutland * atomic64_add() - atomic add with relaxed ordering
1670ad811070SMark Rutland * @i: s64 value to add
1671ad811070SMark Rutland * @v: pointer to atomic64_t
1672ad811070SMark Rutland *
1673ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
1674ad811070SMark Rutland *
1675ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add() there.
1676ad811070SMark Rutland *
1677ad811070SMark Rutland * Return: Nothing.
1678ad811070SMark Rutland */
1679e3d18ceeSMark Rutland static __always_inline void
atomic64_add(s64 i,atomic64_t * v)1680e3d18ceeSMark Rutland atomic64_add(s64 i, atomic64_t *v)
1681e3d18ceeSMark Rutland {
1682e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1683c9268ac6SMark Rutland raw_atomic64_add(i, v);
1684e3d18ceeSMark Rutland }
1685e3d18ceeSMark Rutland
1686ad811070SMark Rutland /**
1687ad811070SMark Rutland * atomic64_add_return() - atomic add with full ordering
1688ad811070SMark Rutland * @i: s64 value to add
1689ad811070SMark Rutland * @v: pointer to atomic64_t
1690ad811070SMark Rutland *
1691ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
1692ad811070SMark Rutland *
1693ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_return() there.
1694ad811070SMark Rutland *
1695ad811070SMark Rutland * Return: The updated value of @v.
1696ad811070SMark Rutland */
1697e3d18ceeSMark Rutland static __always_inline s64
atomic64_add_return(s64 i,atomic64_t * v)1698e3d18ceeSMark Rutland atomic64_add_return(s64 i, atomic64_t *v)
1699e3d18ceeSMark Rutland {
1700e87c4f66SMarco Elver kcsan_mb();
1701e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1702c9268ac6SMark Rutland return raw_atomic64_add_return(i, v);
1703e3d18ceeSMark Rutland }
1704e3d18ceeSMark Rutland
1705ad811070SMark Rutland /**
1706ad811070SMark Rutland * atomic64_add_return_acquire() - atomic add with acquire ordering
1707ad811070SMark Rutland * @i: s64 value to add
1708ad811070SMark Rutland * @v: pointer to atomic64_t
1709ad811070SMark Rutland *
1710ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
1711ad811070SMark Rutland *
1712ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_return_acquire() there.
1713ad811070SMark Rutland *
1714ad811070SMark Rutland * Return: The updated value of @v.
1715ad811070SMark Rutland */
1716e3d18ceeSMark Rutland static __always_inline s64
atomic64_add_return_acquire(s64 i,atomic64_t * v)1717e3d18ceeSMark Rutland atomic64_add_return_acquire(s64 i, atomic64_t *v)
1718e3d18ceeSMark Rutland {
1719e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1720c9268ac6SMark Rutland return raw_atomic64_add_return_acquire(i, v);
1721e3d18ceeSMark Rutland }
1722e3d18ceeSMark Rutland
1723ad811070SMark Rutland /**
1724ad811070SMark Rutland * atomic64_add_return_release() - atomic add with release ordering
1725ad811070SMark Rutland * @i: s64 value to add
1726ad811070SMark Rutland * @v: pointer to atomic64_t
1727ad811070SMark Rutland *
1728ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
1729ad811070SMark Rutland *
1730ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_return_release() there.
1731ad811070SMark Rutland *
1732ad811070SMark Rutland * Return: The updated value of @v.
1733ad811070SMark Rutland */
1734e3d18ceeSMark Rutland static __always_inline s64
atomic64_add_return_release(s64 i,atomic64_t * v)1735e3d18ceeSMark Rutland atomic64_add_return_release(s64 i, atomic64_t *v)
1736e3d18ceeSMark Rutland {
1737e87c4f66SMarco Elver kcsan_release();
1738e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1739c9268ac6SMark Rutland return raw_atomic64_add_return_release(i, v);
1740e3d18ceeSMark Rutland }
1741e3d18ceeSMark Rutland
1742ad811070SMark Rutland /**
1743ad811070SMark Rutland * atomic64_add_return_relaxed() - atomic add with relaxed ordering
1744ad811070SMark Rutland * @i: s64 value to add
1745ad811070SMark Rutland * @v: pointer to atomic64_t
1746ad811070SMark Rutland *
1747ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
1748ad811070SMark Rutland *
1749ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_return_relaxed() there.
1750ad811070SMark Rutland *
1751ad811070SMark Rutland * Return: The updated value of @v.
1752ad811070SMark Rutland */
1753e3d18ceeSMark Rutland static __always_inline s64
atomic64_add_return_relaxed(s64 i,atomic64_t * v)1754e3d18ceeSMark Rutland atomic64_add_return_relaxed(s64 i, atomic64_t *v)
1755e3d18ceeSMark Rutland {
1756e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1757c9268ac6SMark Rutland return raw_atomic64_add_return_relaxed(i, v);
1758e3d18ceeSMark Rutland }
1759e3d18ceeSMark Rutland
1760ad811070SMark Rutland /**
1761ad811070SMark Rutland * atomic64_fetch_add() - atomic add with full ordering
1762ad811070SMark Rutland * @i: s64 value to add
1763ad811070SMark Rutland * @v: pointer to atomic64_t
1764ad811070SMark Rutland *
1765ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
1766ad811070SMark Rutland *
1767ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_add() there.
1768ad811070SMark Rutland *
1769ad811070SMark Rutland * Return: The original value of @v.
1770ad811070SMark Rutland */
1771e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_add(s64 i,atomic64_t * v)1772e3d18ceeSMark Rutland atomic64_fetch_add(s64 i, atomic64_t *v)
1773e3d18ceeSMark Rutland {
1774e87c4f66SMarco Elver kcsan_mb();
1775e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1776c9268ac6SMark Rutland return raw_atomic64_fetch_add(i, v);
1777e3d18ceeSMark Rutland }
1778e3d18ceeSMark Rutland
1779ad811070SMark Rutland /**
1780ad811070SMark Rutland * atomic64_fetch_add_acquire() - atomic add with acquire ordering
1781ad811070SMark Rutland * @i: s64 value to add
1782ad811070SMark Rutland * @v: pointer to atomic64_t
1783ad811070SMark Rutland *
1784ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
1785ad811070SMark Rutland *
1786ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_acquire() there.
1787ad811070SMark Rutland *
1788ad811070SMark Rutland * Return: The original value of @v.
1789ad811070SMark Rutland */
1790e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_add_acquire(s64 i,atomic64_t * v)1791e3d18ceeSMark Rutland atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
1792e3d18ceeSMark Rutland {
1793e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1794c9268ac6SMark Rutland return raw_atomic64_fetch_add_acquire(i, v);
1795e3d18ceeSMark Rutland }
1796e3d18ceeSMark Rutland
1797ad811070SMark Rutland /**
1798ad811070SMark Rutland * atomic64_fetch_add_release() - atomic add with release ordering
1799ad811070SMark Rutland * @i: s64 value to add
1800ad811070SMark Rutland * @v: pointer to atomic64_t
1801ad811070SMark Rutland *
1802ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
1803ad811070SMark Rutland *
1804ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_release() there.
1805ad811070SMark Rutland *
1806ad811070SMark Rutland * Return: The original value of @v.
1807ad811070SMark Rutland */
1808e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_add_release(s64 i,atomic64_t * v)1809e3d18ceeSMark Rutland atomic64_fetch_add_release(s64 i, atomic64_t *v)
1810e3d18ceeSMark Rutland {
1811e87c4f66SMarco Elver kcsan_release();
1812e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1813c9268ac6SMark Rutland return raw_atomic64_fetch_add_release(i, v);
1814e3d18ceeSMark Rutland }
1815e3d18ceeSMark Rutland
1816ad811070SMark Rutland /**
1817ad811070SMark Rutland * atomic64_fetch_add_relaxed() - atomic add with relaxed ordering
1818ad811070SMark Rutland * @i: s64 value to add
1819ad811070SMark Rutland * @v: pointer to atomic64_t
1820ad811070SMark Rutland *
1821ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
1822ad811070SMark Rutland *
1823ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_relaxed() there.
1824ad811070SMark Rutland *
1825ad811070SMark Rutland * Return: The original value of @v.
1826ad811070SMark Rutland */
1827e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_add_relaxed(s64 i,atomic64_t * v)1828e3d18ceeSMark Rutland atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
1829e3d18ceeSMark Rutland {
1830e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1831c9268ac6SMark Rutland return raw_atomic64_fetch_add_relaxed(i, v);
1832e3d18ceeSMark Rutland }
1833e3d18ceeSMark Rutland
1834ad811070SMark Rutland /**
1835ad811070SMark Rutland * atomic64_sub() - atomic subtract with relaxed ordering
1836ad811070SMark Rutland * @i: s64 value to subtract
1837ad811070SMark Rutland * @v: pointer to atomic64_t
1838ad811070SMark Rutland *
1839ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
1840ad811070SMark Rutland *
1841ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub() there.
1842ad811070SMark Rutland *
1843ad811070SMark Rutland * Return: Nothing.
1844ad811070SMark Rutland */
1845e3d18ceeSMark Rutland static __always_inline void
atomic64_sub(s64 i,atomic64_t * v)1846e3d18ceeSMark Rutland atomic64_sub(s64 i, atomic64_t *v)
1847e3d18ceeSMark Rutland {
1848e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1849c9268ac6SMark Rutland raw_atomic64_sub(i, v);
1850e3d18ceeSMark Rutland }
1851e3d18ceeSMark Rutland
1852ad811070SMark Rutland /**
1853ad811070SMark Rutland * atomic64_sub_return() - atomic subtract with full ordering
1854ad811070SMark Rutland * @i: s64 value to subtract
1855ad811070SMark Rutland * @v: pointer to atomic64_t
1856ad811070SMark Rutland *
1857ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
1858ad811070SMark Rutland *
1859ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub_return() there.
1860ad811070SMark Rutland *
1861ad811070SMark Rutland * Return: The updated value of @v.
1862ad811070SMark Rutland */
1863e3d18ceeSMark Rutland static __always_inline s64
atomic64_sub_return(s64 i,atomic64_t * v)1864e3d18ceeSMark Rutland atomic64_sub_return(s64 i, atomic64_t *v)
1865e3d18ceeSMark Rutland {
1866e87c4f66SMarco Elver kcsan_mb();
1867e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1868c9268ac6SMark Rutland return raw_atomic64_sub_return(i, v);
1869e3d18ceeSMark Rutland }
1870e3d18ceeSMark Rutland
1871ad811070SMark Rutland /**
1872ad811070SMark Rutland * atomic64_sub_return_acquire() - atomic subtract with acquire ordering
1873ad811070SMark Rutland * @i: s64 value to subtract
1874ad811070SMark Rutland * @v: pointer to atomic64_t
1875ad811070SMark Rutland *
1876ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
1877ad811070SMark Rutland *
1878ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub_return_acquire() there.
1879ad811070SMark Rutland *
1880ad811070SMark Rutland * Return: The updated value of @v.
1881ad811070SMark Rutland */
1882e3d18ceeSMark Rutland static __always_inline s64
atomic64_sub_return_acquire(s64 i,atomic64_t * v)1883e3d18ceeSMark Rutland atomic64_sub_return_acquire(s64 i, atomic64_t *v)
1884e3d18ceeSMark Rutland {
1885e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1886c9268ac6SMark Rutland return raw_atomic64_sub_return_acquire(i, v);
1887e3d18ceeSMark Rutland }
1888e3d18ceeSMark Rutland
1889ad811070SMark Rutland /**
1890ad811070SMark Rutland * atomic64_sub_return_release() - atomic subtract with release ordering
1891ad811070SMark Rutland * @i: s64 value to subtract
1892ad811070SMark Rutland * @v: pointer to atomic64_t
1893ad811070SMark Rutland *
1894ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
1895ad811070SMark Rutland *
1896ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub_return_release() there.
1897ad811070SMark Rutland *
1898ad811070SMark Rutland * Return: The updated value of @v.
1899ad811070SMark Rutland */
1900e3d18ceeSMark Rutland static __always_inline s64
atomic64_sub_return_release(s64 i,atomic64_t * v)1901e3d18ceeSMark Rutland atomic64_sub_return_release(s64 i, atomic64_t *v)
1902e3d18ceeSMark Rutland {
1903e87c4f66SMarco Elver kcsan_release();
1904e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1905c9268ac6SMark Rutland return raw_atomic64_sub_return_release(i, v);
1906e3d18ceeSMark Rutland }
1907e3d18ceeSMark Rutland
1908ad811070SMark Rutland /**
1909ad811070SMark Rutland * atomic64_sub_return_relaxed() - atomic subtract with relaxed ordering
1910ad811070SMark Rutland * @i: s64 value to subtract
1911ad811070SMark Rutland * @v: pointer to atomic64_t
1912ad811070SMark Rutland *
1913ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
1914ad811070SMark Rutland *
1915ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub_return_relaxed() there.
1916ad811070SMark Rutland *
1917ad811070SMark Rutland * Return: The updated value of @v.
1918ad811070SMark Rutland */
1919e3d18ceeSMark Rutland static __always_inline s64
atomic64_sub_return_relaxed(s64 i,atomic64_t * v)1920e3d18ceeSMark Rutland atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
1921e3d18ceeSMark Rutland {
1922e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1923c9268ac6SMark Rutland return raw_atomic64_sub_return_relaxed(i, v);
1924e3d18ceeSMark Rutland }
1925e3d18ceeSMark Rutland
1926ad811070SMark Rutland /**
1927ad811070SMark Rutland * atomic64_fetch_sub() - atomic subtract with full ordering
1928ad811070SMark Rutland * @i: s64 value to subtract
1929ad811070SMark Rutland * @v: pointer to atomic64_t
1930ad811070SMark Rutland *
1931ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
1932ad811070SMark Rutland *
1933ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub() there.
1934ad811070SMark Rutland *
1935ad811070SMark Rutland * Return: The original value of @v.
1936ad811070SMark Rutland */
1937e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_sub(s64 i,atomic64_t * v)1938e3d18ceeSMark Rutland atomic64_fetch_sub(s64 i, atomic64_t *v)
1939e3d18ceeSMark Rutland {
1940e87c4f66SMarco Elver kcsan_mb();
1941e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1942c9268ac6SMark Rutland return raw_atomic64_fetch_sub(i, v);
1943e3d18ceeSMark Rutland }
1944e3d18ceeSMark Rutland
1945ad811070SMark Rutland /**
1946ad811070SMark Rutland * atomic64_fetch_sub_acquire() - atomic subtract with acquire ordering
1947ad811070SMark Rutland * @i: s64 value to subtract
1948ad811070SMark Rutland * @v: pointer to atomic64_t
1949ad811070SMark Rutland *
1950ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
1951ad811070SMark Rutland *
1952ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_acquire() there.
1953ad811070SMark Rutland *
1954ad811070SMark Rutland * Return: The original value of @v.
1955ad811070SMark Rutland */
1956e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_sub_acquire(s64 i,atomic64_t * v)1957e3d18ceeSMark Rutland atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
1958e3d18ceeSMark Rutland {
1959e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1960c9268ac6SMark Rutland return raw_atomic64_fetch_sub_acquire(i, v);
1961e3d18ceeSMark Rutland }
1962e3d18ceeSMark Rutland
1963ad811070SMark Rutland /**
1964ad811070SMark Rutland * atomic64_fetch_sub_release() - atomic subtract with release ordering
1965ad811070SMark Rutland * @i: s64 value to subtract
1966ad811070SMark Rutland * @v: pointer to atomic64_t
1967ad811070SMark Rutland *
1968ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
1969ad811070SMark Rutland *
1970ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_release() there.
1971ad811070SMark Rutland *
1972ad811070SMark Rutland * Return: The original value of @v.
1973ad811070SMark Rutland */
1974e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_sub_release(s64 i,atomic64_t * v)1975e3d18ceeSMark Rutland atomic64_fetch_sub_release(s64 i, atomic64_t *v)
1976e3d18ceeSMark Rutland {
1977e87c4f66SMarco Elver kcsan_release();
1978e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1979c9268ac6SMark Rutland return raw_atomic64_fetch_sub_release(i, v);
1980e3d18ceeSMark Rutland }
1981e3d18ceeSMark Rutland
1982ad811070SMark Rutland /**
1983ad811070SMark Rutland * atomic64_fetch_sub_relaxed() - atomic subtract with relaxed ordering
1984ad811070SMark Rutland * @i: s64 value to subtract
1985ad811070SMark Rutland * @v: pointer to atomic64_t
1986ad811070SMark Rutland *
1987ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
1988ad811070SMark Rutland *
1989ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_sub_relaxed() there.
1990ad811070SMark Rutland *
1991ad811070SMark Rutland * Return: The original value of @v.
1992ad811070SMark Rutland */
1993e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_sub_relaxed(s64 i,atomic64_t * v)1994e3d18ceeSMark Rutland atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
1995e3d18ceeSMark Rutland {
1996e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
1997c9268ac6SMark Rutland return raw_atomic64_fetch_sub_relaxed(i, v);
1998e3d18ceeSMark Rutland }
1999e3d18ceeSMark Rutland
2000ad811070SMark Rutland /**
2001ad811070SMark Rutland * atomic64_inc() - atomic increment with relaxed ordering
2002ad811070SMark Rutland * @v: pointer to atomic64_t
2003ad811070SMark Rutland *
2004ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
2005ad811070SMark Rutland *
2006ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc() there.
2007ad811070SMark Rutland *
2008ad811070SMark Rutland * Return: Nothing.
2009ad811070SMark Rutland */
2010e3d18ceeSMark Rutland static __always_inline void
atomic64_inc(atomic64_t * v)2011e3d18ceeSMark Rutland atomic64_inc(atomic64_t *v)
2012e3d18ceeSMark Rutland {
2013e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2014c9268ac6SMark Rutland raw_atomic64_inc(v);
2015e3d18ceeSMark Rutland }
2016e3d18ceeSMark Rutland
2017ad811070SMark Rutland /**
2018ad811070SMark Rutland * atomic64_inc_return() - atomic increment with full ordering
2019ad811070SMark Rutland * @v: pointer to atomic64_t
2020ad811070SMark Rutland *
2021ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
2022ad811070SMark Rutland *
2023ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_return() there.
2024ad811070SMark Rutland *
2025ad811070SMark Rutland * Return: The updated value of @v.
2026ad811070SMark Rutland */
2027e3d18ceeSMark Rutland static __always_inline s64
atomic64_inc_return(atomic64_t * v)2028e3d18ceeSMark Rutland atomic64_inc_return(atomic64_t *v)
2029e3d18ceeSMark Rutland {
2030e87c4f66SMarco Elver kcsan_mb();
2031e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2032c9268ac6SMark Rutland return raw_atomic64_inc_return(v);
2033e3d18ceeSMark Rutland }
2034e3d18ceeSMark Rutland
2035ad811070SMark Rutland /**
2036ad811070SMark Rutland * atomic64_inc_return_acquire() - atomic increment with acquire ordering
2037ad811070SMark Rutland * @v: pointer to atomic64_t
2038ad811070SMark Rutland *
2039ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
2040ad811070SMark Rutland *
2041ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_return_acquire() there.
2042ad811070SMark Rutland *
2043ad811070SMark Rutland * Return: The updated value of @v.
2044ad811070SMark Rutland */
2045e3d18ceeSMark Rutland static __always_inline s64
atomic64_inc_return_acquire(atomic64_t * v)2046e3d18ceeSMark Rutland atomic64_inc_return_acquire(atomic64_t *v)
2047e3d18ceeSMark Rutland {
2048e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2049c9268ac6SMark Rutland return raw_atomic64_inc_return_acquire(v);
2050e3d18ceeSMark Rutland }
2051e3d18ceeSMark Rutland
2052ad811070SMark Rutland /**
2053ad811070SMark Rutland * atomic64_inc_return_release() - atomic increment with release ordering
2054ad811070SMark Rutland * @v: pointer to atomic64_t
2055ad811070SMark Rutland *
2056ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
2057ad811070SMark Rutland *
2058ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_return_release() there.
2059ad811070SMark Rutland *
2060ad811070SMark Rutland * Return: The updated value of @v.
2061ad811070SMark Rutland */
2062e3d18ceeSMark Rutland static __always_inline s64
atomic64_inc_return_release(atomic64_t * v)2063e3d18ceeSMark Rutland atomic64_inc_return_release(atomic64_t *v)
2064e3d18ceeSMark Rutland {
2065e87c4f66SMarco Elver kcsan_release();
2066e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2067c9268ac6SMark Rutland return raw_atomic64_inc_return_release(v);
2068e3d18ceeSMark Rutland }
2069e3d18ceeSMark Rutland
2070ad811070SMark Rutland /**
2071ad811070SMark Rutland * atomic64_inc_return_relaxed() - atomic increment with relaxed ordering
2072ad811070SMark Rutland * @v: pointer to atomic64_t
2073ad811070SMark Rutland *
2074ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
2075ad811070SMark Rutland *
2076ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_return_relaxed() there.
2077ad811070SMark Rutland *
2078ad811070SMark Rutland * Return: The updated value of @v.
2079ad811070SMark Rutland */
2080e3d18ceeSMark Rutland static __always_inline s64
atomic64_inc_return_relaxed(atomic64_t * v)2081e3d18ceeSMark Rutland atomic64_inc_return_relaxed(atomic64_t *v)
2082e3d18ceeSMark Rutland {
2083e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2084c9268ac6SMark Rutland return raw_atomic64_inc_return_relaxed(v);
2085e3d18ceeSMark Rutland }
2086e3d18ceeSMark Rutland
2087ad811070SMark Rutland /**
2088ad811070SMark Rutland * atomic64_fetch_inc() - atomic increment with full ordering
2089ad811070SMark Rutland * @v: pointer to atomic64_t
2090ad811070SMark Rutland *
2091ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
2092ad811070SMark Rutland *
2093ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc() there.
2094ad811070SMark Rutland *
2095ad811070SMark Rutland * Return: The original value of @v.
2096ad811070SMark Rutland */
2097e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_inc(atomic64_t * v)2098e3d18ceeSMark Rutland atomic64_fetch_inc(atomic64_t *v)
2099e3d18ceeSMark Rutland {
2100e87c4f66SMarco Elver kcsan_mb();
2101e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2102c9268ac6SMark Rutland return raw_atomic64_fetch_inc(v);
2103e3d18ceeSMark Rutland }
2104e3d18ceeSMark Rutland
2105ad811070SMark Rutland /**
2106ad811070SMark Rutland * atomic64_fetch_inc_acquire() - atomic increment with acquire ordering
2107ad811070SMark Rutland * @v: pointer to atomic64_t
2108ad811070SMark Rutland *
2109ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
2110ad811070SMark Rutland *
2111ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_acquire() there.
2112ad811070SMark Rutland *
2113ad811070SMark Rutland * Return: The original value of @v.
2114ad811070SMark Rutland */
2115e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_inc_acquire(atomic64_t * v)2116e3d18ceeSMark Rutland atomic64_fetch_inc_acquire(atomic64_t *v)
2117e3d18ceeSMark Rutland {
2118e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2119c9268ac6SMark Rutland return raw_atomic64_fetch_inc_acquire(v);
2120e3d18ceeSMark Rutland }
2121e3d18ceeSMark Rutland
2122ad811070SMark Rutland /**
2123ad811070SMark Rutland * atomic64_fetch_inc_release() - atomic increment with release ordering
2124ad811070SMark Rutland * @v: pointer to atomic64_t
2125ad811070SMark Rutland *
2126ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
2127ad811070SMark Rutland *
2128ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_release() there.
2129ad811070SMark Rutland *
2130ad811070SMark Rutland * Return: The original value of @v.
2131ad811070SMark Rutland */
2132e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_inc_release(atomic64_t * v)2133e3d18ceeSMark Rutland atomic64_fetch_inc_release(atomic64_t *v)
2134e3d18ceeSMark Rutland {
2135e87c4f66SMarco Elver kcsan_release();
2136e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2137c9268ac6SMark Rutland return raw_atomic64_fetch_inc_release(v);
2138e3d18ceeSMark Rutland }
2139e3d18ceeSMark Rutland
2140ad811070SMark Rutland /**
2141ad811070SMark Rutland * atomic64_fetch_inc_relaxed() - atomic increment with relaxed ordering
2142ad811070SMark Rutland * @v: pointer to atomic64_t
2143ad811070SMark Rutland *
2144ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
2145ad811070SMark Rutland *
2146ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_inc_relaxed() there.
2147ad811070SMark Rutland *
2148ad811070SMark Rutland * Return: The original value of @v.
2149ad811070SMark Rutland */
2150e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_inc_relaxed(atomic64_t * v)2151e3d18ceeSMark Rutland atomic64_fetch_inc_relaxed(atomic64_t *v)
2152e3d18ceeSMark Rutland {
2153e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2154c9268ac6SMark Rutland return raw_atomic64_fetch_inc_relaxed(v);
2155e3d18ceeSMark Rutland }
2156e3d18ceeSMark Rutland
2157ad811070SMark Rutland /**
2158ad811070SMark Rutland * atomic64_dec() - atomic decrement with relaxed ordering
2159ad811070SMark Rutland * @v: pointer to atomic64_t
2160ad811070SMark Rutland *
2161ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
2162ad811070SMark Rutland *
2163ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec() there.
2164ad811070SMark Rutland *
2165ad811070SMark Rutland * Return: Nothing.
2166ad811070SMark Rutland */
2167e3d18ceeSMark Rutland static __always_inline void
atomic64_dec(atomic64_t * v)2168e3d18ceeSMark Rutland atomic64_dec(atomic64_t *v)
2169e3d18ceeSMark Rutland {
2170e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2171c9268ac6SMark Rutland raw_atomic64_dec(v);
2172e3d18ceeSMark Rutland }
2173e3d18ceeSMark Rutland
2174ad811070SMark Rutland /**
2175ad811070SMark Rutland * atomic64_dec_return() - atomic decrement with full ordering
2176ad811070SMark Rutland * @v: pointer to atomic64_t
2177ad811070SMark Rutland *
2178ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
2179ad811070SMark Rutland *
2180ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_return() there.
2181ad811070SMark Rutland *
2182ad811070SMark Rutland * Return: The updated value of @v.
2183ad811070SMark Rutland */
2184e3d18ceeSMark Rutland static __always_inline s64
atomic64_dec_return(atomic64_t * v)2185e3d18ceeSMark Rutland atomic64_dec_return(atomic64_t *v)
2186e3d18ceeSMark Rutland {
2187e87c4f66SMarco Elver kcsan_mb();
2188e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2189c9268ac6SMark Rutland return raw_atomic64_dec_return(v);
2190e3d18ceeSMark Rutland }
2191e3d18ceeSMark Rutland
2192ad811070SMark Rutland /**
2193ad811070SMark Rutland * atomic64_dec_return_acquire() - atomic decrement with acquire ordering
2194ad811070SMark Rutland * @v: pointer to atomic64_t
2195ad811070SMark Rutland *
2196ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
2197ad811070SMark Rutland *
2198ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_return_acquire() there.
2199ad811070SMark Rutland *
2200ad811070SMark Rutland * Return: The updated value of @v.
2201ad811070SMark Rutland */
2202e3d18ceeSMark Rutland static __always_inline s64
atomic64_dec_return_acquire(atomic64_t * v)2203e3d18ceeSMark Rutland atomic64_dec_return_acquire(atomic64_t *v)
2204e3d18ceeSMark Rutland {
2205e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2206c9268ac6SMark Rutland return raw_atomic64_dec_return_acquire(v);
2207e3d18ceeSMark Rutland }
2208e3d18ceeSMark Rutland
2209ad811070SMark Rutland /**
2210ad811070SMark Rutland * atomic64_dec_return_release() - atomic decrement with release ordering
2211ad811070SMark Rutland * @v: pointer to atomic64_t
2212ad811070SMark Rutland *
2213ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
2214ad811070SMark Rutland *
2215ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_return_release() there.
2216ad811070SMark Rutland *
2217ad811070SMark Rutland * Return: The updated value of @v.
2218ad811070SMark Rutland */
2219e3d18ceeSMark Rutland static __always_inline s64
atomic64_dec_return_release(atomic64_t * v)2220e3d18ceeSMark Rutland atomic64_dec_return_release(atomic64_t *v)
2221e3d18ceeSMark Rutland {
2222e87c4f66SMarco Elver kcsan_release();
2223e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2224c9268ac6SMark Rutland return raw_atomic64_dec_return_release(v);
2225e3d18ceeSMark Rutland }
2226e3d18ceeSMark Rutland
2227ad811070SMark Rutland /**
2228ad811070SMark Rutland * atomic64_dec_return_relaxed() - atomic decrement with relaxed ordering
2229ad811070SMark Rutland * @v: pointer to atomic64_t
2230ad811070SMark Rutland *
2231ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
2232ad811070SMark Rutland *
2233ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_return_relaxed() there.
2234ad811070SMark Rutland *
2235ad811070SMark Rutland * Return: The updated value of @v.
2236ad811070SMark Rutland */
2237e3d18ceeSMark Rutland static __always_inline s64
atomic64_dec_return_relaxed(atomic64_t * v)2238e3d18ceeSMark Rutland atomic64_dec_return_relaxed(atomic64_t *v)
2239e3d18ceeSMark Rutland {
2240e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2241c9268ac6SMark Rutland return raw_atomic64_dec_return_relaxed(v);
2242e3d18ceeSMark Rutland }
2243e3d18ceeSMark Rutland
2244ad811070SMark Rutland /**
2245ad811070SMark Rutland * atomic64_fetch_dec() - atomic decrement with full ordering
2246ad811070SMark Rutland * @v: pointer to atomic64_t
2247ad811070SMark Rutland *
2248ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
2249ad811070SMark Rutland *
2250ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec() there.
2251ad811070SMark Rutland *
2252ad811070SMark Rutland * Return: The original value of @v.
2253ad811070SMark Rutland */
2254e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_dec(atomic64_t * v)2255e3d18ceeSMark Rutland atomic64_fetch_dec(atomic64_t *v)
2256e3d18ceeSMark Rutland {
2257e87c4f66SMarco Elver kcsan_mb();
2258e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2259c9268ac6SMark Rutland return raw_atomic64_fetch_dec(v);
2260e3d18ceeSMark Rutland }
2261e3d18ceeSMark Rutland
2262ad811070SMark Rutland /**
2263ad811070SMark Rutland * atomic64_fetch_dec_acquire() - atomic decrement with acquire ordering
2264ad811070SMark Rutland * @v: pointer to atomic64_t
2265ad811070SMark Rutland *
2266ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
2267ad811070SMark Rutland *
2268ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_acquire() there.
2269ad811070SMark Rutland *
2270ad811070SMark Rutland * Return: The original value of @v.
2271ad811070SMark Rutland */
2272e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_dec_acquire(atomic64_t * v)2273e3d18ceeSMark Rutland atomic64_fetch_dec_acquire(atomic64_t *v)
2274e3d18ceeSMark Rutland {
2275e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2276c9268ac6SMark Rutland return raw_atomic64_fetch_dec_acquire(v);
2277e3d18ceeSMark Rutland }
2278e3d18ceeSMark Rutland
2279ad811070SMark Rutland /**
2280ad811070SMark Rutland * atomic64_fetch_dec_release() - atomic decrement with release ordering
2281ad811070SMark Rutland * @v: pointer to atomic64_t
2282ad811070SMark Rutland *
2283ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
2284ad811070SMark Rutland *
2285ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_release() there.
2286ad811070SMark Rutland *
2287ad811070SMark Rutland * Return: The original value of @v.
2288ad811070SMark Rutland */
2289e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_dec_release(atomic64_t * v)2290e3d18ceeSMark Rutland atomic64_fetch_dec_release(atomic64_t *v)
2291e3d18ceeSMark Rutland {
2292e87c4f66SMarco Elver kcsan_release();
2293e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2294c9268ac6SMark Rutland return raw_atomic64_fetch_dec_release(v);
2295e3d18ceeSMark Rutland }
2296e3d18ceeSMark Rutland
2297ad811070SMark Rutland /**
2298ad811070SMark Rutland * atomic64_fetch_dec_relaxed() - atomic decrement with relaxed ordering
2299ad811070SMark Rutland * @v: pointer to atomic64_t
2300ad811070SMark Rutland *
2301ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
2302ad811070SMark Rutland *
2303ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_dec_relaxed() there.
2304ad811070SMark Rutland *
2305ad811070SMark Rutland * Return: The original value of @v.
2306ad811070SMark Rutland */
2307e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_dec_relaxed(atomic64_t * v)2308e3d18ceeSMark Rutland atomic64_fetch_dec_relaxed(atomic64_t *v)
2309e3d18ceeSMark Rutland {
2310e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2311c9268ac6SMark Rutland return raw_atomic64_fetch_dec_relaxed(v);
2312e3d18ceeSMark Rutland }
2313e3d18ceeSMark Rutland
2314ad811070SMark Rutland /**
2315ad811070SMark Rutland * atomic64_and() - atomic bitwise AND with relaxed ordering
2316ad811070SMark Rutland * @i: s64 value
2317ad811070SMark Rutland * @v: pointer to atomic64_t
2318ad811070SMark Rutland *
2319ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
2320ad811070SMark Rutland *
2321ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_and() there.
2322ad811070SMark Rutland *
2323ad811070SMark Rutland * Return: Nothing.
2324ad811070SMark Rutland */
2325e3d18ceeSMark Rutland static __always_inline void
atomic64_and(s64 i,atomic64_t * v)2326e3d18ceeSMark Rutland atomic64_and(s64 i, atomic64_t *v)
2327e3d18ceeSMark Rutland {
2328e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2329c9268ac6SMark Rutland raw_atomic64_and(i, v);
2330e3d18ceeSMark Rutland }
2331e3d18ceeSMark Rutland
2332ad811070SMark Rutland /**
2333ad811070SMark Rutland * atomic64_fetch_and() - atomic bitwise AND with full ordering
2334ad811070SMark Rutland * @i: s64 value
2335ad811070SMark Rutland * @v: pointer to atomic64_t
2336ad811070SMark Rutland *
2337ad811070SMark Rutland * Atomically updates @v to (@v & @i) with full ordering.
2338ad811070SMark Rutland *
2339ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_and() there.
2340ad811070SMark Rutland *
2341ad811070SMark Rutland * Return: The original value of @v.
2342ad811070SMark Rutland */
2343e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_and(s64 i,atomic64_t * v)2344e3d18ceeSMark Rutland atomic64_fetch_and(s64 i, atomic64_t *v)
2345e3d18ceeSMark Rutland {
2346e87c4f66SMarco Elver kcsan_mb();
2347e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2348c9268ac6SMark Rutland return raw_atomic64_fetch_and(i, v);
2349e3d18ceeSMark Rutland }
2350e3d18ceeSMark Rutland
2351ad811070SMark Rutland /**
2352ad811070SMark Rutland * atomic64_fetch_and_acquire() - atomic bitwise AND with acquire ordering
2353ad811070SMark Rutland * @i: s64 value
2354ad811070SMark Rutland * @v: pointer to atomic64_t
2355ad811070SMark Rutland *
2356ad811070SMark Rutland * Atomically updates @v to (@v & @i) with acquire ordering.
2357ad811070SMark Rutland *
2358ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_acquire() there.
2359ad811070SMark Rutland *
2360ad811070SMark Rutland * Return: The original value of @v.
2361ad811070SMark Rutland */
2362e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_and_acquire(s64 i,atomic64_t * v)2363e3d18ceeSMark Rutland atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
2364e3d18ceeSMark Rutland {
2365e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2366c9268ac6SMark Rutland return raw_atomic64_fetch_and_acquire(i, v);
2367e3d18ceeSMark Rutland }
2368e3d18ceeSMark Rutland
2369ad811070SMark Rutland /**
2370ad811070SMark Rutland * atomic64_fetch_and_release() - atomic bitwise AND with release ordering
2371ad811070SMark Rutland * @i: s64 value
2372ad811070SMark Rutland * @v: pointer to atomic64_t
2373ad811070SMark Rutland *
2374ad811070SMark Rutland * Atomically updates @v to (@v & @i) with release ordering.
2375ad811070SMark Rutland *
2376ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_release() there.
2377ad811070SMark Rutland *
2378ad811070SMark Rutland * Return: The original value of @v.
2379ad811070SMark Rutland */
2380e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_and_release(s64 i,atomic64_t * v)2381e3d18ceeSMark Rutland atomic64_fetch_and_release(s64 i, atomic64_t *v)
2382e3d18ceeSMark Rutland {
2383e87c4f66SMarco Elver kcsan_release();
2384e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2385c9268ac6SMark Rutland return raw_atomic64_fetch_and_release(i, v);
2386e3d18ceeSMark Rutland }
2387e3d18ceeSMark Rutland
2388ad811070SMark Rutland /**
2389ad811070SMark Rutland * atomic64_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
2390ad811070SMark Rutland * @i: s64 value
2391ad811070SMark Rutland * @v: pointer to atomic64_t
2392ad811070SMark Rutland *
2393ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
2394ad811070SMark Rutland *
2395ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_and_relaxed() there.
2396ad811070SMark Rutland *
2397ad811070SMark Rutland * Return: The original value of @v.
2398ad811070SMark Rutland */
2399e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_and_relaxed(s64 i,atomic64_t * v)2400e3d18ceeSMark Rutland atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
2401e3d18ceeSMark Rutland {
2402e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2403c9268ac6SMark Rutland return raw_atomic64_fetch_and_relaxed(i, v);
2404e3d18ceeSMark Rutland }
2405e3d18ceeSMark Rutland
2406ad811070SMark Rutland /**
2407ad811070SMark Rutland * atomic64_andnot() - atomic bitwise AND NOT with relaxed ordering
2408ad811070SMark Rutland * @i: s64 value
2409ad811070SMark Rutland * @v: pointer to atomic64_t
2410ad811070SMark Rutland *
2411ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
2412ad811070SMark Rutland *
2413ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_andnot() there.
2414ad811070SMark Rutland *
2415ad811070SMark Rutland * Return: Nothing.
2416ad811070SMark Rutland */
2417e3d18ceeSMark Rutland static __always_inline void
atomic64_andnot(s64 i,atomic64_t * v)2418e3d18ceeSMark Rutland atomic64_andnot(s64 i, atomic64_t *v)
2419e3d18ceeSMark Rutland {
2420e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2421c9268ac6SMark Rutland raw_atomic64_andnot(i, v);
2422e3d18ceeSMark Rutland }
2423e3d18ceeSMark Rutland
2424ad811070SMark Rutland /**
2425ad811070SMark Rutland * atomic64_fetch_andnot() - atomic bitwise AND NOT with full ordering
2426ad811070SMark Rutland * @i: s64 value
2427ad811070SMark Rutland * @v: pointer to atomic64_t
2428ad811070SMark Rutland *
2429ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with full ordering.
2430ad811070SMark Rutland *
2431ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot() there.
2432ad811070SMark Rutland *
2433ad811070SMark Rutland * Return: The original value of @v.
2434ad811070SMark Rutland */
2435e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_andnot(s64 i,atomic64_t * v)2436e3d18ceeSMark Rutland atomic64_fetch_andnot(s64 i, atomic64_t *v)
2437e3d18ceeSMark Rutland {
2438e87c4f66SMarco Elver kcsan_mb();
2439e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2440c9268ac6SMark Rutland return raw_atomic64_fetch_andnot(i, v);
2441e3d18ceeSMark Rutland }
2442e3d18ceeSMark Rutland
2443ad811070SMark Rutland /**
2444ad811070SMark Rutland * atomic64_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
2445ad811070SMark Rutland * @i: s64 value
2446ad811070SMark Rutland * @v: pointer to atomic64_t
2447ad811070SMark Rutland *
2448ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with acquire ordering.
2449ad811070SMark Rutland *
2450ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_acquire() there.
2451ad811070SMark Rutland *
2452ad811070SMark Rutland * Return: The original value of @v.
2453ad811070SMark Rutland */
2454e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_andnot_acquire(s64 i,atomic64_t * v)2455e3d18ceeSMark Rutland atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
2456e3d18ceeSMark Rutland {
2457e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2458c9268ac6SMark Rutland return raw_atomic64_fetch_andnot_acquire(i, v);
2459e3d18ceeSMark Rutland }
2460e3d18ceeSMark Rutland
2461ad811070SMark Rutland /**
2462ad811070SMark Rutland * atomic64_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
2463ad811070SMark Rutland * @i: s64 value
2464ad811070SMark Rutland * @v: pointer to atomic64_t
2465ad811070SMark Rutland *
2466ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with release ordering.
2467ad811070SMark Rutland *
2468ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_release() there.
2469ad811070SMark Rutland *
2470ad811070SMark Rutland * Return: The original value of @v.
2471ad811070SMark Rutland */
2472e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_andnot_release(s64 i,atomic64_t * v)2473e3d18ceeSMark Rutland atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
2474e3d18ceeSMark Rutland {
2475e87c4f66SMarco Elver kcsan_release();
2476e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2477c9268ac6SMark Rutland return raw_atomic64_fetch_andnot_release(i, v);
2478e3d18ceeSMark Rutland }
2479e3d18ceeSMark Rutland
2480ad811070SMark Rutland /**
2481ad811070SMark Rutland * atomic64_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
2482ad811070SMark Rutland * @i: s64 value
2483ad811070SMark Rutland * @v: pointer to atomic64_t
2484ad811070SMark Rutland *
2485ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
2486ad811070SMark Rutland *
2487ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_andnot_relaxed() there.
2488ad811070SMark Rutland *
2489ad811070SMark Rutland * Return: The original value of @v.
2490ad811070SMark Rutland */
2491e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_andnot_relaxed(s64 i,atomic64_t * v)2492e3d18ceeSMark Rutland atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
2493e3d18ceeSMark Rutland {
2494e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2495c9268ac6SMark Rutland return raw_atomic64_fetch_andnot_relaxed(i, v);
2496e3d18ceeSMark Rutland }
2497e3d18ceeSMark Rutland
2498ad811070SMark Rutland /**
2499ad811070SMark Rutland * atomic64_or() - atomic bitwise OR with relaxed ordering
2500ad811070SMark Rutland * @i: s64 value
2501ad811070SMark Rutland * @v: pointer to atomic64_t
2502ad811070SMark Rutland *
2503ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
2504ad811070SMark Rutland *
2505ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_or() there.
2506ad811070SMark Rutland *
2507ad811070SMark Rutland * Return: Nothing.
2508ad811070SMark Rutland */
2509e3d18ceeSMark Rutland static __always_inline void
atomic64_or(s64 i,atomic64_t * v)2510e3d18ceeSMark Rutland atomic64_or(s64 i, atomic64_t *v)
2511e3d18ceeSMark Rutland {
2512e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2513c9268ac6SMark Rutland raw_atomic64_or(i, v);
2514e3d18ceeSMark Rutland }
2515e3d18ceeSMark Rutland
2516ad811070SMark Rutland /**
2517ad811070SMark Rutland * atomic64_fetch_or() - atomic bitwise OR with full ordering
2518ad811070SMark Rutland * @i: s64 value
2519ad811070SMark Rutland * @v: pointer to atomic64_t
2520ad811070SMark Rutland *
2521ad811070SMark Rutland * Atomically updates @v to (@v | @i) with full ordering.
2522ad811070SMark Rutland *
2523ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_or() there.
2524ad811070SMark Rutland *
2525ad811070SMark Rutland * Return: The original value of @v.
2526ad811070SMark Rutland */
2527e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_or(s64 i,atomic64_t * v)2528e3d18ceeSMark Rutland atomic64_fetch_or(s64 i, atomic64_t *v)
2529e3d18ceeSMark Rutland {
2530e87c4f66SMarco Elver kcsan_mb();
2531e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2532c9268ac6SMark Rutland return raw_atomic64_fetch_or(i, v);
2533e3d18ceeSMark Rutland }
2534e3d18ceeSMark Rutland
2535ad811070SMark Rutland /**
2536ad811070SMark Rutland * atomic64_fetch_or_acquire() - atomic bitwise OR with acquire ordering
2537ad811070SMark Rutland * @i: s64 value
2538ad811070SMark Rutland * @v: pointer to atomic64_t
2539ad811070SMark Rutland *
2540ad811070SMark Rutland * Atomically updates @v to (@v | @i) with acquire ordering.
2541ad811070SMark Rutland *
2542ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_acquire() there.
2543ad811070SMark Rutland *
2544ad811070SMark Rutland * Return: The original value of @v.
2545ad811070SMark Rutland */
2546e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_or_acquire(s64 i,atomic64_t * v)2547e3d18ceeSMark Rutland atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
2548e3d18ceeSMark Rutland {
2549e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2550c9268ac6SMark Rutland return raw_atomic64_fetch_or_acquire(i, v);
2551e3d18ceeSMark Rutland }
2552e3d18ceeSMark Rutland
2553ad811070SMark Rutland /**
2554ad811070SMark Rutland * atomic64_fetch_or_release() - atomic bitwise OR with release ordering
2555ad811070SMark Rutland * @i: s64 value
2556ad811070SMark Rutland * @v: pointer to atomic64_t
2557ad811070SMark Rutland *
2558ad811070SMark Rutland * Atomically updates @v to (@v | @i) with release ordering.
2559ad811070SMark Rutland *
2560ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_release() there.
2561ad811070SMark Rutland *
2562ad811070SMark Rutland * Return: The original value of @v.
2563ad811070SMark Rutland */
2564e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_or_release(s64 i,atomic64_t * v)2565e3d18ceeSMark Rutland atomic64_fetch_or_release(s64 i, atomic64_t *v)
2566e3d18ceeSMark Rutland {
2567e87c4f66SMarco Elver kcsan_release();
2568e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2569c9268ac6SMark Rutland return raw_atomic64_fetch_or_release(i, v);
2570e3d18ceeSMark Rutland }
2571e3d18ceeSMark Rutland
2572ad811070SMark Rutland /**
2573ad811070SMark Rutland * atomic64_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
2574ad811070SMark Rutland * @i: s64 value
2575ad811070SMark Rutland * @v: pointer to atomic64_t
2576ad811070SMark Rutland *
2577ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
2578ad811070SMark Rutland *
2579ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_or_relaxed() there.
2580ad811070SMark Rutland *
2581ad811070SMark Rutland * Return: The original value of @v.
2582ad811070SMark Rutland */
2583e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_or_relaxed(s64 i,atomic64_t * v)2584e3d18ceeSMark Rutland atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
2585e3d18ceeSMark Rutland {
2586e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2587c9268ac6SMark Rutland return raw_atomic64_fetch_or_relaxed(i, v);
2588e3d18ceeSMark Rutland }
2589e3d18ceeSMark Rutland
2590ad811070SMark Rutland /**
2591ad811070SMark Rutland * atomic64_xor() - atomic bitwise XOR with relaxed ordering
2592ad811070SMark Rutland * @i: s64 value
2593ad811070SMark Rutland * @v: pointer to atomic64_t
2594ad811070SMark Rutland *
2595ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
2596ad811070SMark Rutland *
2597ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_xor() there.
2598ad811070SMark Rutland *
2599ad811070SMark Rutland * Return: Nothing.
2600ad811070SMark Rutland */
2601e3d18ceeSMark Rutland static __always_inline void
atomic64_xor(s64 i,atomic64_t * v)2602e3d18ceeSMark Rutland atomic64_xor(s64 i, atomic64_t *v)
2603e3d18ceeSMark Rutland {
2604e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2605c9268ac6SMark Rutland raw_atomic64_xor(i, v);
2606e3d18ceeSMark Rutland }
2607e3d18ceeSMark Rutland
2608ad811070SMark Rutland /**
2609ad811070SMark Rutland * atomic64_fetch_xor() - atomic bitwise XOR with full ordering
2610ad811070SMark Rutland * @i: s64 value
2611ad811070SMark Rutland * @v: pointer to atomic64_t
2612ad811070SMark Rutland *
2613ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with full ordering.
2614ad811070SMark Rutland *
2615ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor() there.
2616ad811070SMark Rutland *
2617ad811070SMark Rutland * Return: The original value of @v.
2618ad811070SMark Rutland */
2619e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_xor(s64 i,atomic64_t * v)2620e3d18ceeSMark Rutland atomic64_fetch_xor(s64 i, atomic64_t *v)
2621e3d18ceeSMark Rutland {
2622e87c4f66SMarco Elver kcsan_mb();
2623e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2624c9268ac6SMark Rutland return raw_atomic64_fetch_xor(i, v);
2625e3d18ceeSMark Rutland }
2626e3d18ceeSMark Rutland
2627ad811070SMark Rutland /**
2628ad811070SMark Rutland * atomic64_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
2629ad811070SMark Rutland * @i: s64 value
2630ad811070SMark Rutland * @v: pointer to atomic64_t
2631ad811070SMark Rutland *
2632ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with acquire ordering.
2633ad811070SMark Rutland *
2634ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_acquire() there.
2635ad811070SMark Rutland *
2636ad811070SMark Rutland * Return: The original value of @v.
2637ad811070SMark Rutland */
2638e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_xor_acquire(s64 i,atomic64_t * v)2639e3d18ceeSMark Rutland atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
2640e3d18ceeSMark Rutland {
2641e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2642c9268ac6SMark Rutland return raw_atomic64_fetch_xor_acquire(i, v);
2643e3d18ceeSMark Rutland }
2644e3d18ceeSMark Rutland
2645ad811070SMark Rutland /**
2646ad811070SMark Rutland * atomic64_fetch_xor_release() - atomic bitwise XOR with release ordering
2647ad811070SMark Rutland * @i: s64 value
2648ad811070SMark Rutland * @v: pointer to atomic64_t
2649ad811070SMark Rutland *
2650ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with release ordering.
2651ad811070SMark Rutland *
2652ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_release() there.
2653ad811070SMark Rutland *
2654ad811070SMark Rutland * Return: The original value of @v.
2655ad811070SMark Rutland */
2656e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_xor_release(s64 i,atomic64_t * v)2657e3d18ceeSMark Rutland atomic64_fetch_xor_release(s64 i, atomic64_t *v)
2658e3d18ceeSMark Rutland {
2659e87c4f66SMarco Elver kcsan_release();
2660e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2661c9268ac6SMark Rutland return raw_atomic64_fetch_xor_release(i, v);
2662e3d18ceeSMark Rutland }
2663e3d18ceeSMark Rutland
2664ad811070SMark Rutland /**
2665ad811070SMark Rutland * atomic64_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
2666ad811070SMark Rutland * @i: s64 value
2667ad811070SMark Rutland * @v: pointer to atomic64_t
2668ad811070SMark Rutland *
2669ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
2670ad811070SMark Rutland *
2671ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_xor_relaxed() there.
2672ad811070SMark Rutland *
2673ad811070SMark Rutland * Return: The original value of @v.
2674ad811070SMark Rutland */
2675e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_xor_relaxed(s64 i,atomic64_t * v)2676e3d18ceeSMark Rutland atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
2677e3d18ceeSMark Rutland {
2678e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2679c9268ac6SMark Rutland return raw_atomic64_fetch_xor_relaxed(i, v);
2680e3d18ceeSMark Rutland }
2681e3d18ceeSMark Rutland
2682ad811070SMark Rutland /**
2683ad811070SMark Rutland * atomic64_xchg() - atomic exchange with full ordering
2684ad811070SMark Rutland * @v: pointer to atomic64_t
2685ad811070SMark Rutland * @new: s64 value to assign
2686ad811070SMark Rutland *
2687ad811070SMark Rutland * Atomically updates @v to @new with full ordering.
2688ad811070SMark Rutland *
2689ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_xchg() there.
2690ad811070SMark Rutland *
2691ad811070SMark Rutland * Return: The original value of @v.
2692ad811070SMark Rutland */
2693e3d18ceeSMark Rutland static __always_inline s64
atomic64_xchg(atomic64_t * v,s64 new)26941d78814dSMark Rutland atomic64_xchg(atomic64_t *v, s64 new)
2695e3d18ceeSMark Rutland {
2696e87c4f66SMarco Elver kcsan_mb();
2697e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
26981d78814dSMark Rutland return raw_atomic64_xchg(v, new);
2699e3d18ceeSMark Rutland }
2700e3d18ceeSMark Rutland
2701ad811070SMark Rutland /**
2702ad811070SMark Rutland * atomic64_xchg_acquire() - atomic exchange with acquire ordering
2703ad811070SMark Rutland * @v: pointer to atomic64_t
2704ad811070SMark Rutland * @new: s64 value to assign
2705ad811070SMark Rutland *
2706ad811070SMark Rutland * Atomically updates @v to @new with acquire ordering.
2707ad811070SMark Rutland *
2708ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_xchg_acquire() there.
2709ad811070SMark Rutland *
2710ad811070SMark Rutland * Return: The original value of @v.
2711ad811070SMark Rutland */
2712e3d18ceeSMark Rutland static __always_inline s64
atomic64_xchg_acquire(atomic64_t * v,s64 new)27131d78814dSMark Rutland atomic64_xchg_acquire(atomic64_t *v, s64 new)
2714e3d18ceeSMark Rutland {
2715e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
27161d78814dSMark Rutland return raw_atomic64_xchg_acquire(v, new);
2717e3d18ceeSMark Rutland }
2718e3d18ceeSMark Rutland
2719ad811070SMark Rutland /**
2720ad811070SMark Rutland * atomic64_xchg_release() - atomic exchange with release ordering
2721ad811070SMark Rutland * @v: pointer to atomic64_t
2722ad811070SMark Rutland * @new: s64 value to assign
2723ad811070SMark Rutland *
2724ad811070SMark Rutland * Atomically updates @v to @new with release ordering.
2725ad811070SMark Rutland *
2726ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_xchg_release() there.
2727ad811070SMark Rutland *
2728ad811070SMark Rutland * Return: The original value of @v.
2729ad811070SMark Rutland */
2730e3d18ceeSMark Rutland static __always_inline s64
atomic64_xchg_release(atomic64_t * v,s64 new)27311d78814dSMark Rutland atomic64_xchg_release(atomic64_t *v, s64 new)
2732e3d18ceeSMark Rutland {
2733e87c4f66SMarco Elver kcsan_release();
2734e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
27351d78814dSMark Rutland return raw_atomic64_xchg_release(v, new);
2736e3d18ceeSMark Rutland }
2737e3d18ceeSMark Rutland
2738ad811070SMark Rutland /**
2739ad811070SMark Rutland * atomic64_xchg_relaxed() - atomic exchange with relaxed ordering
2740ad811070SMark Rutland * @v: pointer to atomic64_t
2741ad811070SMark Rutland * @new: s64 value to assign
2742ad811070SMark Rutland *
2743ad811070SMark Rutland * Atomically updates @v to @new with relaxed ordering.
2744ad811070SMark Rutland *
2745ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_xchg_relaxed() there.
2746ad811070SMark Rutland *
2747ad811070SMark Rutland * Return: The original value of @v.
2748ad811070SMark Rutland */
2749e3d18ceeSMark Rutland static __always_inline s64
atomic64_xchg_relaxed(atomic64_t * v,s64 new)27501d78814dSMark Rutland atomic64_xchg_relaxed(atomic64_t *v, s64 new)
2751e3d18ceeSMark Rutland {
2752e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
27531d78814dSMark Rutland return raw_atomic64_xchg_relaxed(v, new);
2754e3d18ceeSMark Rutland }
2755e3d18ceeSMark Rutland
2756ad811070SMark Rutland /**
2757ad811070SMark Rutland * atomic64_cmpxchg() - atomic compare and exchange with full ordering
2758ad811070SMark Rutland * @v: pointer to atomic64_t
2759ad811070SMark Rutland * @old: s64 value to compare with
2760ad811070SMark Rutland * @new: s64 value to assign
2761ad811070SMark Rutland *
2762ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
27636dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
2764ad811070SMark Rutland *
2765ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg() there.
2766ad811070SMark Rutland *
2767ad811070SMark Rutland * Return: The original value of @v.
2768ad811070SMark Rutland */
2769e3d18ceeSMark Rutland static __always_inline s64
atomic64_cmpxchg(atomic64_t * v,s64 old,s64 new)2770e3d18ceeSMark Rutland atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
2771e3d18ceeSMark Rutland {
2772e87c4f66SMarco Elver kcsan_mb();
2773e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2774c9268ac6SMark Rutland return raw_atomic64_cmpxchg(v, old, new);
2775e3d18ceeSMark Rutland }
2776e3d18ceeSMark Rutland
2777ad811070SMark Rutland /**
2778ad811070SMark Rutland * atomic64_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2779ad811070SMark Rutland * @v: pointer to atomic64_t
2780ad811070SMark Rutland * @old: s64 value to compare with
2781ad811070SMark Rutland * @new: s64 value to assign
2782ad811070SMark Rutland *
2783ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
27846dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
2785ad811070SMark Rutland *
2786ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_acquire() there.
2787ad811070SMark Rutland *
2788ad811070SMark Rutland * Return: The original value of @v.
2789ad811070SMark Rutland */
2790e3d18ceeSMark Rutland static __always_inline s64
atomic64_cmpxchg_acquire(atomic64_t * v,s64 old,s64 new)2791e3d18ceeSMark Rutland atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
2792e3d18ceeSMark Rutland {
2793e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2794c9268ac6SMark Rutland return raw_atomic64_cmpxchg_acquire(v, old, new);
2795e3d18ceeSMark Rutland }
2796e3d18ceeSMark Rutland
2797ad811070SMark Rutland /**
2798ad811070SMark Rutland * atomic64_cmpxchg_release() - atomic compare and exchange with release ordering
2799ad811070SMark Rutland * @v: pointer to atomic64_t
2800ad811070SMark Rutland * @old: s64 value to compare with
2801ad811070SMark Rutland * @new: s64 value to assign
2802ad811070SMark Rutland *
2803ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
28046dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
2805ad811070SMark Rutland *
2806ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_release() there.
2807ad811070SMark Rutland *
2808ad811070SMark Rutland * Return: The original value of @v.
2809ad811070SMark Rutland */
2810e3d18ceeSMark Rutland static __always_inline s64
atomic64_cmpxchg_release(atomic64_t * v,s64 old,s64 new)2811e3d18ceeSMark Rutland atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
2812e3d18ceeSMark Rutland {
2813e87c4f66SMarco Elver kcsan_release();
2814e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2815c9268ac6SMark Rutland return raw_atomic64_cmpxchg_release(v, old, new);
2816e3d18ceeSMark Rutland }
2817e3d18ceeSMark Rutland
2818ad811070SMark Rutland /**
2819ad811070SMark Rutland * atomic64_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2820ad811070SMark Rutland * @v: pointer to atomic64_t
2821ad811070SMark Rutland * @old: s64 value to compare with
2822ad811070SMark Rutland * @new: s64 value to assign
2823ad811070SMark Rutland *
2824ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
28256dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
2826ad811070SMark Rutland *
2827ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_cmpxchg_relaxed() there.
2828ad811070SMark Rutland *
2829ad811070SMark Rutland * Return: The original value of @v.
2830ad811070SMark Rutland */
2831e3d18ceeSMark Rutland static __always_inline s64
atomic64_cmpxchg_relaxed(atomic64_t * v,s64 old,s64 new)2832e3d18ceeSMark Rutland atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
2833e3d18ceeSMark Rutland {
2834e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2835c9268ac6SMark Rutland return raw_atomic64_cmpxchg_relaxed(v, old, new);
2836e3d18ceeSMark Rutland }
2837e3d18ceeSMark Rutland
2838ad811070SMark Rutland /**
2839ad811070SMark Rutland * atomic64_try_cmpxchg() - atomic compare and exchange with full ordering
2840ad811070SMark Rutland * @v: pointer to atomic64_t
2841ad811070SMark Rutland * @old: pointer to s64 value to compare with
2842ad811070SMark Rutland * @new: s64 value to assign
2843ad811070SMark Rutland *
2844ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
28456dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
28466dfee110SMark Rutland * and relaxed ordering is provided.
2847ad811070SMark Rutland *
2848ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg() there.
2849ad811070SMark Rutland *
2850ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
2851ad811070SMark Rutland */
2852e3d18ceeSMark Rutland static __always_inline bool
atomic64_try_cmpxchg(atomic64_t * v,s64 * old,s64 new)2853e3d18ceeSMark Rutland atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
2854e3d18ceeSMark Rutland {
2855e87c4f66SMarco Elver kcsan_mb();
2856e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2857e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
2858c9268ac6SMark Rutland return raw_atomic64_try_cmpxchg(v, old, new);
2859e3d18ceeSMark Rutland }
2860e3d18ceeSMark Rutland
2861ad811070SMark Rutland /**
2862ad811070SMark Rutland * atomic64_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
2863ad811070SMark Rutland * @v: pointer to atomic64_t
2864ad811070SMark Rutland * @old: pointer to s64 value to compare with
2865ad811070SMark Rutland * @new: s64 value to assign
2866ad811070SMark Rutland *
2867ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
28686dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
28696dfee110SMark Rutland * and relaxed ordering is provided.
2870ad811070SMark Rutland *
2871ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_acquire() there.
2872ad811070SMark Rutland *
2873ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
2874ad811070SMark Rutland */
2875e3d18ceeSMark Rutland static __always_inline bool
atomic64_try_cmpxchg_acquire(atomic64_t * v,s64 * old,s64 new)2876e3d18ceeSMark Rutland atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
2877e3d18ceeSMark Rutland {
2878e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2879e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
2880c9268ac6SMark Rutland return raw_atomic64_try_cmpxchg_acquire(v, old, new);
2881e3d18ceeSMark Rutland }
2882e3d18ceeSMark Rutland
2883ad811070SMark Rutland /**
2884ad811070SMark Rutland * atomic64_try_cmpxchg_release() - atomic compare and exchange with release ordering
2885ad811070SMark Rutland * @v: pointer to atomic64_t
2886ad811070SMark Rutland * @old: pointer to s64 value to compare with
2887ad811070SMark Rutland * @new: s64 value to assign
2888ad811070SMark Rutland *
2889ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
28906dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
28916dfee110SMark Rutland * and relaxed ordering is provided.
2892ad811070SMark Rutland *
2893ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_release() there.
2894ad811070SMark Rutland *
2895ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
2896ad811070SMark Rutland */
2897e3d18ceeSMark Rutland static __always_inline bool
atomic64_try_cmpxchg_release(atomic64_t * v,s64 * old,s64 new)2898e3d18ceeSMark Rutland atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
2899e3d18ceeSMark Rutland {
2900e87c4f66SMarco Elver kcsan_release();
2901e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2902e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
2903c9268ac6SMark Rutland return raw_atomic64_try_cmpxchg_release(v, old, new);
2904e3d18ceeSMark Rutland }
2905e3d18ceeSMark Rutland
2906ad811070SMark Rutland /**
2907ad811070SMark Rutland * atomic64_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
2908ad811070SMark Rutland * @v: pointer to atomic64_t
2909ad811070SMark Rutland * @old: pointer to s64 value to compare with
2910ad811070SMark Rutland * @new: s64 value to assign
2911ad811070SMark Rutland *
2912ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
29136dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
29146dfee110SMark Rutland * and relaxed ordering is provided.
2915ad811070SMark Rutland *
2916ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_try_cmpxchg_relaxed() there.
2917ad811070SMark Rutland *
2918ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
2919ad811070SMark Rutland */
2920e3d18ceeSMark Rutland static __always_inline bool
atomic64_try_cmpxchg_relaxed(atomic64_t * v,s64 * old,s64 new)2921e3d18ceeSMark Rutland atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
2922e3d18ceeSMark Rutland {
2923e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2924e3d18ceeSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
2925c9268ac6SMark Rutland return raw_atomic64_try_cmpxchg_relaxed(v, old, new);
2926e3d18ceeSMark Rutland }
2927e3d18ceeSMark Rutland
2928ad811070SMark Rutland /**
2929ad811070SMark Rutland * atomic64_sub_and_test() - atomic subtract and test if zero with full ordering
2930*f92a59f6SCarlos Llamas * @i: s64 value to subtract
2931ad811070SMark Rutland * @v: pointer to atomic64_t
2932ad811070SMark Rutland *
2933ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
2934ad811070SMark Rutland *
2935ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_sub_and_test() there.
2936ad811070SMark Rutland *
2937ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
2938ad811070SMark Rutland */
2939e3d18ceeSMark Rutland static __always_inline bool
atomic64_sub_and_test(s64 i,atomic64_t * v)2940e3d18ceeSMark Rutland atomic64_sub_and_test(s64 i, atomic64_t *v)
2941e3d18ceeSMark Rutland {
2942e87c4f66SMarco Elver kcsan_mb();
2943e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2944c9268ac6SMark Rutland return raw_atomic64_sub_and_test(i, v);
2945e3d18ceeSMark Rutland }
2946e3d18ceeSMark Rutland
2947ad811070SMark Rutland /**
2948ad811070SMark Rutland * atomic64_dec_and_test() - atomic decrement and test if zero with full ordering
2949ad811070SMark Rutland * @v: pointer to atomic64_t
2950ad811070SMark Rutland *
2951ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
2952ad811070SMark Rutland *
2953ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_and_test() there.
2954ad811070SMark Rutland *
2955ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
2956ad811070SMark Rutland */
2957e3d18ceeSMark Rutland static __always_inline bool
atomic64_dec_and_test(atomic64_t * v)2958e3d18ceeSMark Rutland atomic64_dec_and_test(atomic64_t *v)
2959e3d18ceeSMark Rutland {
2960e87c4f66SMarco Elver kcsan_mb();
2961e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2962c9268ac6SMark Rutland return raw_atomic64_dec_and_test(v);
2963e3d18ceeSMark Rutland }
2964e3d18ceeSMark Rutland
2965ad811070SMark Rutland /**
2966ad811070SMark Rutland * atomic64_inc_and_test() - atomic increment and test if zero with full ordering
2967ad811070SMark Rutland * @v: pointer to atomic64_t
2968ad811070SMark Rutland *
2969ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
2970ad811070SMark Rutland *
2971ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_and_test() there.
2972ad811070SMark Rutland *
2973ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
2974ad811070SMark Rutland */
2975e3d18ceeSMark Rutland static __always_inline bool
atomic64_inc_and_test(atomic64_t * v)2976e3d18ceeSMark Rutland atomic64_inc_and_test(atomic64_t *v)
2977e3d18ceeSMark Rutland {
2978e87c4f66SMarco Elver kcsan_mb();
2979e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2980c9268ac6SMark Rutland return raw_atomic64_inc_and_test(v);
2981e3d18ceeSMark Rutland }
2982e3d18ceeSMark Rutland
2983ad811070SMark Rutland /**
2984ad811070SMark Rutland * atomic64_add_negative() - atomic add and test if negative with full ordering
2985ad811070SMark Rutland * @i: s64 value to add
2986ad811070SMark Rutland * @v: pointer to atomic64_t
2987ad811070SMark Rutland *
2988ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
2989ad811070SMark Rutland *
2990ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_negative() there.
2991ad811070SMark Rutland *
2992ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
2993ad811070SMark Rutland */
2994e3d18ceeSMark Rutland static __always_inline bool
atomic64_add_negative(s64 i,atomic64_t * v)2995e3d18ceeSMark Rutland atomic64_add_negative(s64 i, atomic64_t *v)
2996e3d18ceeSMark Rutland {
2997e87c4f66SMarco Elver kcsan_mb();
2998e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
2999c9268ac6SMark Rutland return raw_atomic64_add_negative(i, v);
3000e3d18ceeSMark Rutland }
3001e3d18ceeSMark Rutland
3002ad811070SMark Rutland /**
3003ad811070SMark Rutland * atomic64_add_negative_acquire() - atomic add and test if negative with acquire ordering
3004ad811070SMark Rutland * @i: s64 value to add
3005ad811070SMark Rutland * @v: pointer to atomic64_t
3006ad811070SMark Rutland *
3007ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
3008ad811070SMark Rutland *
3009ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_negative_acquire() there.
3010ad811070SMark Rutland *
3011ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
3012ad811070SMark Rutland */
3013e5ab9effSThomas Gleixner static __always_inline bool
atomic64_add_negative_acquire(s64 i,atomic64_t * v)3014e5ab9effSThomas Gleixner atomic64_add_negative_acquire(s64 i, atomic64_t *v)
3015e5ab9effSThomas Gleixner {
3016e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
3017c9268ac6SMark Rutland return raw_atomic64_add_negative_acquire(i, v);
3018e5ab9effSThomas Gleixner }
3019e5ab9effSThomas Gleixner
3020ad811070SMark Rutland /**
3021ad811070SMark Rutland * atomic64_add_negative_release() - atomic add and test if negative with release ordering
3022ad811070SMark Rutland * @i: s64 value to add
3023ad811070SMark Rutland * @v: pointer to atomic64_t
3024ad811070SMark Rutland *
3025ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
3026ad811070SMark Rutland *
3027ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_negative_release() there.
3028ad811070SMark Rutland *
3029ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
3030ad811070SMark Rutland */
3031e5ab9effSThomas Gleixner static __always_inline bool
atomic64_add_negative_release(s64 i,atomic64_t * v)3032e5ab9effSThomas Gleixner atomic64_add_negative_release(s64 i, atomic64_t *v)
3033e5ab9effSThomas Gleixner {
3034e5ab9effSThomas Gleixner kcsan_release();
3035e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
3036c9268ac6SMark Rutland return raw_atomic64_add_negative_release(i, v);
3037e5ab9effSThomas Gleixner }
3038e5ab9effSThomas Gleixner
3039ad811070SMark Rutland /**
3040ad811070SMark Rutland * atomic64_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
3041ad811070SMark Rutland * @i: s64 value to add
3042ad811070SMark Rutland * @v: pointer to atomic64_t
3043ad811070SMark Rutland *
3044ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
3045ad811070SMark Rutland *
3046ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_negative_relaxed() there.
3047ad811070SMark Rutland *
3048ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
3049ad811070SMark Rutland */
3050e5ab9effSThomas Gleixner static __always_inline bool
atomic64_add_negative_relaxed(s64 i,atomic64_t * v)3051e5ab9effSThomas Gleixner atomic64_add_negative_relaxed(s64 i, atomic64_t *v)
3052e5ab9effSThomas Gleixner {
3053e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
3054c9268ac6SMark Rutland return raw_atomic64_add_negative_relaxed(i, v);
3055e5ab9effSThomas Gleixner }
3056e5ab9effSThomas Gleixner
3057ad811070SMark Rutland /**
3058ad811070SMark Rutland * atomic64_fetch_add_unless() - atomic add unless value with full ordering
3059ad811070SMark Rutland * @v: pointer to atomic64_t
3060ad811070SMark Rutland * @a: s64 value to add
3061ad811070SMark Rutland * @u: s64 value to compare with
3062ad811070SMark Rutland *
3063ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
30646dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3065ad811070SMark Rutland *
3066ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_fetch_add_unless() there.
3067ad811070SMark Rutland *
3068ad811070SMark Rutland * Return: The original value of @v.
3069ad811070SMark Rutland */
3070e3d18ceeSMark Rutland static __always_inline s64
atomic64_fetch_add_unless(atomic64_t * v,s64 a,s64 u)3071e3d18ceeSMark Rutland atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
3072e3d18ceeSMark Rutland {
3073e87c4f66SMarco Elver kcsan_mb();
3074e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3075c9268ac6SMark Rutland return raw_atomic64_fetch_add_unless(v, a, u);
3076e3d18ceeSMark Rutland }
3077e3d18ceeSMark Rutland
3078ad811070SMark Rutland /**
3079ad811070SMark Rutland * atomic64_add_unless() - atomic add unless value with full ordering
3080ad811070SMark Rutland * @v: pointer to atomic64_t
3081ad811070SMark Rutland * @a: s64 value to add
3082ad811070SMark Rutland * @u: s64 value to compare with
3083ad811070SMark Rutland *
3084ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
30856dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3086ad811070SMark Rutland *
3087ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_add_unless() there.
3088ad811070SMark Rutland *
3089ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
3090ad811070SMark Rutland */
3091e3d18ceeSMark Rutland static __always_inline bool
atomic64_add_unless(atomic64_t * v,s64 a,s64 u)3092e3d18ceeSMark Rutland atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
3093e3d18ceeSMark Rutland {
3094e87c4f66SMarco Elver kcsan_mb();
3095e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3096c9268ac6SMark Rutland return raw_atomic64_add_unless(v, a, u);
3097e3d18ceeSMark Rutland }
3098e3d18ceeSMark Rutland
3099ad811070SMark Rutland /**
3100ad811070SMark Rutland * atomic64_inc_not_zero() - atomic increment unless zero with full ordering
3101ad811070SMark Rutland * @v: pointer to atomic64_t
3102ad811070SMark Rutland *
3103ad811070SMark Rutland * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
31046dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3105ad811070SMark Rutland *
3106ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_not_zero() there.
3107ad811070SMark Rutland *
3108ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
3109ad811070SMark Rutland */
3110e3d18ceeSMark Rutland static __always_inline bool
atomic64_inc_not_zero(atomic64_t * v)3111e3d18ceeSMark Rutland atomic64_inc_not_zero(atomic64_t *v)
3112e3d18ceeSMark Rutland {
3113e87c4f66SMarco Elver kcsan_mb();
3114e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3115c9268ac6SMark Rutland return raw_atomic64_inc_not_zero(v);
3116e3d18ceeSMark Rutland }
3117e3d18ceeSMark Rutland
3118ad811070SMark Rutland /**
3119ad811070SMark Rutland * atomic64_inc_unless_negative() - atomic increment unless negative with full ordering
3120ad811070SMark Rutland * @v: pointer to atomic64_t
3121ad811070SMark Rutland *
3122ad811070SMark Rutland * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
31236dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3124ad811070SMark Rutland *
3125ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_inc_unless_negative() there.
3126ad811070SMark Rutland *
3127ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
3128ad811070SMark Rutland */
3129e3d18ceeSMark Rutland static __always_inline bool
atomic64_inc_unless_negative(atomic64_t * v)3130e3d18ceeSMark Rutland atomic64_inc_unless_negative(atomic64_t *v)
3131e3d18ceeSMark Rutland {
3132e87c4f66SMarco Elver kcsan_mb();
3133e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3134c9268ac6SMark Rutland return raw_atomic64_inc_unless_negative(v);
3135e3d18ceeSMark Rutland }
3136e3d18ceeSMark Rutland
3137ad811070SMark Rutland /**
3138ad811070SMark Rutland * atomic64_dec_unless_positive() - atomic decrement unless positive with full ordering
3139ad811070SMark Rutland * @v: pointer to atomic64_t
3140ad811070SMark Rutland *
3141ad811070SMark Rutland * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
31426dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3143ad811070SMark Rutland *
3144ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_unless_positive() there.
3145ad811070SMark Rutland *
3146ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
3147ad811070SMark Rutland */
3148e3d18ceeSMark Rutland static __always_inline bool
atomic64_dec_unless_positive(atomic64_t * v)3149e3d18ceeSMark Rutland atomic64_dec_unless_positive(atomic64_t *v)
3150e3d18ceeSMark Rutland {
3151e87c4f66SMarco Elver kcsan_mb();
3152e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3153c9268ac6SMark Rutland return raw_atomic64_dec_unless_positive(v);
3154e3d18ceeSMark Rutland }
3155e3d18ceeSMark Rutland
3156ad811070SMark Rutland /**
3157ad811070SMark Rutland * atomic64_dec_if_positive() - atomic decrement if positive with full ordering
3158ad811070SMark Rutland * @v: pointer to atomic64_t
3159ad811070SMark Rutland *
3160ad811070SMark Rutland * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
31616dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
3162ad811070SMark Rutland *
3163ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic64_dec_if_positive() there.
3164ad811070SMark Rutland *
3165b33eb50aSMark Rutland * Return: The old value of (@v - 1), regardless of whether @v was updated.
3166ad811070SMark Rutland */
3167e3d18ceeSMark Rutland static __always_inline s64
atomic64_dec_if_positive(atomic64_t * v)3168e3d18ceeSMark Rutland atomic64_dec_if_positive(atomic64_t *v)
3169e3d18ceeSMark Rutland {
3170e87c4f66SMarco Elver kcsan_mb();
3171e3d18ceeSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3172c9268ac6SMark Rutland return raw_atomic64_dec_if_positive(v);
3173e3d18ceeSMark Rutland }
3174e3d18ceeSMark Rutland
3175ad811070SMark Rutland /**
3176ad811070SMark Rutland * atomic_long_read() - atomic load with relaxed ordering
3177ad811070SMark Rutland * @v: pointer to atomic_long_t
3178ad811070SMark Rutland *
3179ad811070SMark Rutland * Atomically loads the value of @v with relaxed ordering.
3180ad811070SMark Rutland *
3181ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_read() there.
3182ad811070SMark Rutland *
3183ad811070SMark Rutland * Return: The value loaded from @v.
3184ad811070SMark Rutland */
318567d1b0deSMark Rutland static __always_inline long
atomic_long_read(const atomic_long_t * v)318667d1b0deSMark Rutland atomic_long_read(const atomic_long_t *v)
318767d1b0deSMark Rutland {
318867d1b0deSMark Rutland instrument_atomic_read(v, sizeof(*v));
3189c9268ac6SMark Rutland return raw_atomic_long_read(v);
319067d1b0deSMark Rutland }
319167d1b0deSMark Rutland
3192ad811070SMark Rutland /**
3193ad811070SMark Rutland * atomic_long_read_acquire() - atomic load with acquire ordering
3194ad811070SMark Rutland * @v: pointer to atomic_long_t
3195ad811070SMark Rutland *
3196ad811070SMark Rutland * Atomically loads the value of @v with acquire ordering.
3197ad811070SMark Rutland *
3198ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_read_acquire() there.
3199ad811070SMark Rutland *
3200ad811070SMark Rutland * Return: The value loaded from @v.
3201ad811070SMark Rutland */
320267d1b0deSMark Rutland static __always_inline long
atomic_long_read_acquire(const atomic_long_t * v)320367d1b0deSMark Rutland atomic_long_read_acquire(const atomic_long_t *v)
320467d1b0deSMark Rutland {
320567d1b0deSMark Rutland instrument_atomic_read(v, sizeof(*v));
3206c9268ac6SMark Rutland return raw_atomic_long_read_acquire(v);
320767d1b0deSMark Rutland }
320867d1b0deSMark Rutland
3209ad811070SMark Rutland /**
3210ad811070SMark Rutland * atomic_long_set() - atomic set with relaxed ordering
3211ad811070SMark Rutland * @v: pointer to atomic_long_t
3212ad811070SMark Rutland * @i: long value to assign
3213ad811070SMark Rutland *
3214ad811070SMark Rutland * Atomically sets @v to @i with relaxed ordering.
3215ad811070SMark Rutland *
3216ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_set() there.
3217ad811070SMark Rutland *
3218ad811070SMark Rutland * Return: Nothing.
3219ad811070SMark Rutland */
322067d1b0deSMark Rutland static __always_inline void
atomic_long_set(atomic_long_t * v,long i)322167d1b0deSMark Rutland atomic_long_set(atomic_long_t *v, long i)
322267d1b0deSMark Rutland {
322367d1b0deSMark Rutland instrument_atomic_write(v, sizeof(*v));
3224c9268ac6SMark Rutland raw_atomic_long_set(v, i);
322567d1b0deSMark Rutland }
322667d1b0deSMark Rutland
3227ad811070SMark Rutland /**
3228ad811070SMark Rutland * atomic_long_set_release() - atomic set with release ordering
3229ad811070SMark Rutland * @v: pointer to atomic_long_t
3230ad811070SMark Rutland * @i: long value to assign
3231ad811070SMark Rutland *
3232ad811070SMark Rutland * Atomically sets @v to @i with release ordering.
3233ad811070SMark Rutland *
3234ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_set_release() there.
3235ad811070SMark Rutland *
3236ad811070SMark Rutland * Return: Nothing.
3237ad811070SMark Rutland */
323867d1b0deSMark Rutland static __always_inline void
atomic_long_set_release(atomic_long_t * v,long i)323967d1b0deSMark Rutland atomic_long_set_release(atomic_long_t *v, long i)
324067d1b0deSMark Rutland {
3241e87c4f66SMarco Elver kcsan_release();
324267d1b0deSMark Rutland instrument_atomic_write(v, sizeof(*v));
3243c9268ac6SMark Rutland raw_atomic_long_set_release(v, i);
324467d1b0deSMark Rutland }
324567d1b0deSMark Rutland
3246ad811070SMark Rutland /**
3247ad811070SMark Rutland * atomic_long_add() - atomic add with relaxed ordering
3248ad811070SMark Rutland * @i: long value to add
3249ad811070SMark Rutland * @v: pointer to atomic_long_t
3250ad811070SMark Rutland *
3251ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
3252ad811070SMark Rutland *
3253ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add() there.
3254ad811070SMark Rutland *
3255ad811070SMark Rutland * Return: Nothing.
3256ad811070SMark Rutland */
325767d1b0deSMark Rutland static __always_inline void
atomic_long_add(long i,atomic_long_t * v)325867d1b0deSMark Rutland atomic_long_add(long i, atomic_long_t *v)
325967d1b0deSMark Rutland {
326067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3261c9268ac6SMark Rutland raw_atomic_long_add(i, v);
326267d1b0deSMark Rutland }
326367d1b0deSMark Rutland
3264ad811070SMark Rutland /**
3265ad811070SMark Rutland * atomic_long_add_return() - atomic add with full ordering
3266ad811070SMark Rutland * @i: long value to add
3267ad811070SMark Rutland * @v: pointer to atomic_long_t
3268ad811070SMark Rutland *
3269ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
3270ad811070SMark Rutland *
3271ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_return() there.
3272ad811070SMark Rutland *
3273ad811070SMark Rutland * Return: The updated value of @v.
3274ad811070SMark Rutland */
327567d1b0deSMark Rutland static __always_inline long
atomic_long_add_return(long i,atomic_long_t * v)327667d1b0deSMark Rutland atomic_long_add_return(long i, atomic_long_t *v)
327767d1b0deSMark Rutland {
3278e87c4f66SMarco Elver kcsan_mb();
327967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3280c9268ac6SMark Rutland return raw_atomic_long_add_return(i, v);
328167d1b0deSMark Rutland }
328267d1b0deSMark Rutland
3283ad811070SMark Rutland /**
3284ad811070SMark Rutland * atomic_long_add_return_acquire() - atomic add with acquire ordering
3285ad811070SMark Rutland * @i: long value to add
3286ad811070SMark Rutland * @v: pointer to atomic_long_t
3287ad811070SMark Rutland *
3288ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
3289ad811070SMark Rutland *
3290ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_return_acquire() there.
3291ad811070SMark Rutland *
3292ad811070SMark Rutland * Return: The updated value of @v.
3293ad811070SMark Rutland */
329467d1b0deSMark Rutland static __always_inline long
atomic_long_add_return_acquire(long i,atomic_long_t * v)329567d1b0deSMark Rutland atomic_long_add_return_acquire(long i, atomic_long_t *v)
329667d1b0deSMark Rutland {
329767d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3298c9268ac6SMark Rutland return raw_atomic_long_add_return_acquire(i, v);
329967d1b0deSMark Rutland }
330067d1b0deSMark Rutland
3301ad811070SMark Rutland /**
3302ad811070SMark Rutland * atomic_long_add_return_release() - atomic add with release ordering
3303ad811070SMark Rutland * @i: long value to add
3304ad811070SMark Rutland * @v: pointer to atomic_long_t
3305ad811070SMark Rutland *
3306ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
3307ad811070SMark Rutland *
3308ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_return_release() there.
3309ad811070SMark Rutland *
3310ad811070SMark Rutland * Return: The updated value of @v.
3311ad811070SMark Rutland */
331267d1b0deSMark Rutland static __always_inline long
atomic_long_add_return_release(long i,atomic_long_t * v)331367d1b0deSMark Rutland atomic_long_add_return_release(long i, atomic_long_t *v)
331467d1b0deSMark Rutland {
3315e87c4f66SMarco Elver kcsan_release();
331667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3317c9268ac6SMark Rutland return raw_atomic_long_add_return_release(i, v);
331867d1b0deSMark Rutland }
331967d1b0deSMark Rutland
3320ad811070SMark Rutland /**
3321ad811070SMark Rutland * atomic_long_add_return_relaxed() - atomic add with relaxed ordering
3322ad811070SMark Rutland * @i: long value to add
3323ad811070SMark Rutland * @v: pointer to atomic_long_t
3324ad811070SMark Rutland *
3325ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
3326ad811070SMark Rutland *
3327ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_return_relaxed() there.
3328ad811070SMark Rutland *
3329ad811070SMark Rutland * Return: The updated value of @v.
3330ad811070SMark Rutland */
333167d1b0deSMark Rutland static __always_inline long
atomic_long_add_return_relaxed(long i,atomic_long_t * v)333267d1b0deSMark Rutland atomic_long_add_return_relaxed(long i, atomic_long_t *v)
333367d1b0deSMark Rutland {
333467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3335c9268ac6SMark Rutland return raw_atomic_long_add_return_relaxed(i, v);
333667d1b0deSMark Rutland }
333767d1b0deSMark Rutland
3338ad811070SMark Rutland /**
3339ad811070SMark Rutland * atomic_long_fetch_add() - atomic add with full ordering
3340ad811070SMark Rutland * @i: long value to add
3341ad811070SMark Rutland * @v: pointer to atomic_long_t
3342ad811070SMark Rutland *
3343ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
3344ad811070SMark Rutland *
3345ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add() there.
3346ad811070SMark Rutland *
3347ad811070SMark Rutland * Return: The original value of @v.
3348ad811070SMark Rutland */
334967d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_add(long i,atomic_long_t * v)335067d1b0deSMark Rutland atomic_long_fetch_add(long i, atomic_long_t *v)
335167d1b0deSMark Rutland {
3352e87c4f66SMarco Elver kcsan_mb();
335367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3354c9268ac6SMark Rutland return raw_atomic_long_fetch_add(i, v);
335567d1b0deSMark Rutland }
335667d1b0deSMark Rutland
3357ad811070SMark Rutland /**
3358ad811070SMark Rutland * atomic_long_fetch_add_acquire() - atomic add with acquire ordering
3359ad811070SMark Rutland * @i: long value to add
3360ad811070SMark Rutland * @v: pointer to atomic_long_t
3361ad811070SMark Rutland *
3362ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
3363ad811070SMark Rutland *
3364ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_acquire() there.
3365ad811070SMark Rutland *
3366ad811070SMark Rutland * Return: The original value of @v.
3367ad811070SMark Rutland */
336867d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_add_acquire(long i,atomic_long_t * v)336967d1b0deSMark Rutland atomic_long_fetch_add_acquire(long i, atomic_long_t *v)
337067d1b0deSMark Rutland {
337167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3372c9268ac6SMark Rutland return raw_atomic_long_fetch_add_acquire(i, v);
337367d1b0deSMark Rutland }
337467d1b0deSMark Rutland
3375ad811070SMark Rutland /**
3376ad811070SMark Rutland * atomic_long_fetch_add_release() - atomic add with release ordering
3377ad811070SMark Rutland * @i: long value to add
3378ad811070SMark Rutland * @v: pointer to atomic_long_t
3379ad811070SMark Rutland *
3380ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
3381ad811070SMark Rutland *
3382ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_release() there.
3383ad811070SMark Rutland *
3384ad811070SMark Rutland * Return: The original value of @v.
3385ad811070SMark Rutland */
338667d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_add_release(long i,atomic_long_t * v)338767d1b0deSMark Rutland atomic_long_fetch_add_release(long i, atomic_long_t *v)
338867d1b0deSMark Rutland {
3389e87c4f66SMarco Elver kcsan_release();
339067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3391c9268ac6SMark Rutland return raw_atomic_long_fetch_add_release(i, v);
339267d1b0deSMark Rutland }
339367d1b0deSMark Rutland
3394ad811070SMark Rutland /**
3395ad811070SMark Rutland * atomic_long_fetch_add_relaxed() - atomic add with relaxed ordering
3396ad811070SMark Rutland * @i: long value to add
3397ad811070SMark Rutland * @v: pointer to atomic_long_t
3398ad811070SMark Rutland *
3399ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
3400ad811070SMark Rutland *
3401ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_relaxed() there.
3402ad811070SMark Rutland *
3403ad811070SMark Rutland * Return: The original value of @v.
3404ad811070SMark Rutland */
340567d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_add_relaxed(long i,atomic_long_t * v)340667d1b0deSMark Rutland atomic_long_fetch_add_relaxed(long i, atomic_long_t *v)
340767d1b0deSMark Rutland {
340867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3409c9268ac6SMark Rutland return raw_atomic_long_fetch_add_relaxed(i, v);
341067d1b0deSMark Rutland }
341167d1b0deSMark Rutland
3412ad811070SMark Rutland /**
3413ad811070SMark Rutland * atomic_long_sub() - atomic subtract with relaxed ordering
3414ad811070SMark Rutland * @i: long value to subtract
3415ad811070SMark Rutland * @v: pointer to atomic_long_t
3416ad811070SMark Rutland *
3417ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
3418ad811070SMark Rutland *
3419ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub() there.
3420ad811070SMark Rutland *
3421ad811070SMark Rutland * Return: Nothing.
3422ad811070SMark Rutland */
342367d1b0deSMark Rutland static __always_inline void
atomic_long_sub(long i,atomic_long_t * v)342467d1b0deSMark Rutland atomic_long_sub(long i, atomic_long_t *v)
342567d1b0deSMark Rutland {
342667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3427c9268ac6SMark Rutland raw_atomic_long_sub(i, v);
342867d1b0deSMark Rutland }
342967d1b0deSMark Rutland
3430ad811070SMark Rutland /**
3431ad811070SMark Rutland * atomic_long_sub_return() - atomic subtract with full ordering
3432ad811070SMark Rutland * @i: long value to subtract
3433ad811070SMark Rutland * @v: pointer to atomic_long_t
3434ad811070SMark Rutland *
3435ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
3436ad811070SMark Rutland *
3437ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub_return() there.
3438ad811070SMark Rutland *
3439ad811070SMark Rutland * Return: The updated value of @v.
3440ad811070SMark Rutland */
344167d1b0deSMark Rutland static __always_inline long
atomic_long_sub_return(long i,atomic_long_t * v)344267d1b0deSMark Rutland atomic_long_sub_return(long i, atomic_long_t *v)
344367d1b0deSMark Rutland {
3444e87c4f66SMarco Elver kcsan_mb();
344567d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3446c9268ac6SMark Rutland return raw_atomic_long_sub_return(i, v);
344767d1b0deSMark Rutland }
344867d1b0deSMark Rutland
3449ad811070SMark Rutland /**
3450ad811070SMark Rutland * atomic_long_sub_return_acquire() - atomic subtract with acquire ordering
3451ad811070SMark Rutland * @i: long value to subtract
3452ad811070SMark Rutland * @v: pointer to atomic_long_t
3453ad811070SMark Rutland *
3454ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
3455ad811070SMark Rutland *
3456ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_acquire() there.
3457ad811070SMark Rutland *
3458ad811070SMark Rutland * Return: The updated value of @v.
3459ad811070SMark Rutland */
346067d1b0deSMark Rutland static __always_inline long
atomic_long_sub_return_acquire(long i,atomic_long_t * v)346167d1b0deSMark Rutland atomic_long_sub_return_acquire(long i, atomic_long_t *v)
346267d1b0deSMark Rutland {
346367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3464c9268ac6SMark Rutland return raw_atomic_long_sub_return_acquire(i, v);
346567d1b0deSMark Rutland }
346667d1b0deSMark Rutland
3467ad811070SMark Rutland /**
3468ad811070SMark Rutland * atomic_long_sub_return_release() - atomic subtract with release ordering
3469ad811070SMark Rutland * @i: long value to subtract
3470ad811070SMark Rutland * @v: pointer to atomic_long_t
3471ad811070SMark Rutland *
3472ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
3473ad811070SMark Rutland *
3474ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_release() there.
3475ad811070SMark Rutland *
3476ad811070SMark Rutland * Return: The updated value of @v.
3477ad811070SMark Rutland */
347867d1b0deSMark Rutland static __always_inline long
atomic_long_sub_return_release(long i,atomic_long_t * v)347967d1b0deSMark Rutland atomic_long_sub_return_release(long i, atomic_long_t *v)
348067d1b0deSMark Rutland {
3481e87c4f66SMarco Elver kcsan_release();
348267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3483c9268ac6SMark Rutland return raw_atomic_long_sub_return_release(i, v);
348467d1b0deSMark Rutland }
348567d1b0deSMark Rutland
3486ad811070SMark Rutland /**
3487ad811070SMark Rutland * atomic_long_sub_return_relaxed() - atomic subtract with relaxed ordering
3488ad811070SMark Rutland * @i: long value to subtract
3489ad811070SMark Rutland * @v: pointer to atomic_long_t
3490ad811070SMark Rutland *
3491ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
3492ad811070SMark Rutland *
3493ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub_return_relaxed() there.
3494ad811070SMark Rutland *
3495ad811070SMark Rutland * Return: The updated value of @v.
3496ad811070SMark Rutland */
349767d1b0deSMark Rutland static __always_inline long
atomic_long_sub_return_relaxed(long i,atomic_long_t * v)349867d1b0deSMark Rutland atomic_long_sub_return_relaxed(long i, atomic_long_t *v)
349967d1b0deSMark Rutland {
350067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3501c9268ac6SMark Rutland return raw_atomic_long_sub_return_relaxed(i, v);
350267d1b0deSMark Rutland }
350367d1b0deSMark Rutland
3504ad811070SMark Rutland /**
3505ad811070SMark Rutland * atomic_long_fetch_sub() - atomic subtract with full ordering
3506ad811070SMark Rutland * @i: long value to subtract
3507ad811070SMark Rutland * @v: pointer to atomic_long_t
3508ad811070SMark Rutland *
3509ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
3510ad811070SMark Rutland *
3511ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub() there.
3512ad811070SMark Rutland *
3513ad811070SMark Rutland * Return: The original value of @v.
3514ad811070SMark Rutland */
351567d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_sub(long i,atomic_long_t * v)351667d1b0deSMark Rutland atomic_long_fetch_sub(long i, atomic_long_t *v)
351767d1b0deSMark Rutland {
3518e87c4f66SMarco Elver kcsan_mb();
351967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3520c9268ac6SMark Rutland return raw_atomic_long_fetch_sub(i, v);
352167d1b0deSMark Rutland }
352267d1b0deSMark Rutland
3523ad811070SMark Rutland /**
3524ad811070SMark Rutland * atomic_long_fetch_sub_acquire() - atomic subtract with acquire ordering
3525ad811070SMark Rutland * @i: long value to subtract
3526ad811070SMark Rutland * @v: pointer to atomic_long_t
3527ad811070SMark Rutland *
3528ad811070SMark Rutland * Atomically updates @v to (@v - @i) with acquire ordering.
3529ad811070SMark Rutland *
3530ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_acquire() there.
3531ad811070SMark Rutland *
3532ad811070SMark Rutland * Return: The original value of @v.
3533ad811070SMark Rutland */
353467d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_sub_acquire(long i,atomic_long_t * v)353567d1b0deSMark Rutland atomic_long_fetch_sub_acquire(long i, atomic_long_t *v)
353667d1b0deSMark Rutland {
353767d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3538c9268ac6SMark Rutland return raw_atomic_long_fetch_sub_acquire(i, v);
353967d1b0deSMark Rutland }
354067d1b0deSMark Rutland
3541ad811070SMark Rutland /**
3542ad811070SMark Rutland * atomic_long_fetch_sub_release() - atomic subtract with release ordering
3543ad811070SMark Rutland * @i: long value to subtract
3544ad811070SMark Rutland * @v: pointer to atomic_long_t
3545ad811070SMark Rutland *
3546ad811070SMark Rutland * Atomically updates @v to (@v - @i) with release ordering.
3547ad811070SMark Rutland *
3548ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_release() there.
3549ad811070SMark Rutland *
3550ad811070SMark Rutland * Return: The original value of @v.
3551ad811070SMark Rutland */
355267d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_sub_release(long i,atomic_long_t * v)355367d1b0deSMark Rutland atomic_long_fetch_sub_release(long i, atomic_long_t *v)
355467d1b0deSMark Rutland {
3555e87c4f66SMarco Elver kcsan_release();
355667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3557c9268ac6SMark Rutland return raw_atomic_long_fetch_sub_release(i, v);
355867d1b0deSMark Rutland }
355967d1b0deSMark Rutland
3560ad811070SMark Rutland /**
3561ad811070SMark Rutland * atomic_long_fetch_sub_relaxed() - atomic subtract with relaxed ordering
3562ad811070SMark Rutland * @i: long value to subtract
3563ad811070SMark Rutland * @v: pointer to atomic_long_t
3564ad811070SMark Rutland *
3565ad811070SMark Rutland * Atomically updates @v to (@v - @i) with relaxed ordering.
3566ad811070SMark Rutland *
3567ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_sub_relaxed() there.
3568ad811070SMark Rutland *
3569ad811070SMark Rutland * Return: The original value of @v.
3570ad811070SMark Rutland */
357167d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_sub_relaxed(long i,atomic_long_t * v)357267d1b0deSMark Rutland atomic_long_fetch_sub_relaxed(long i, atomic_long_t *v)
357367d1b0deSMark Rutland {
357467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3575c9268ac6SMark Rutland return raw_atomic_long_fetch_sub_relaxed(i, v);
357667d1b0deSMark Rutland }
357767d1b0deSMark Rutland
3578ad811070SMark Rutland /**
3579ad811070SMark Rutland * atomic_long_inc() - atomic increment with relaxed ordering
3580ad811070SMark Rutland * @v: pointer to atomic_long_t
3581ad811070SMark Rutland *
3582ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
3583ad811070SMark Rutland *
3584ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc() there.
3585ad811070SMark Rutland *
3586ad811070SMark Rutland * Return: Nothing.
3587ad811070SMark Rutland */
358867d1b0deSMark Rutland static __always_inline void
atomic_long_inc(atomic_long_t * v)358967d1b0deSMark Rutland atomic_long_inc(atomic_long_t *v)
359067d1b0deSMark Rutland {
359167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3592c9268ac6SMark Rutland raw_atomic_long_inc(v);
359367d1b0deSMark Rutland }
359467d1b0deSMark Rutland
3595ad811070SMark Rutland /**
3596ad811070SMark Rutland * atomic_long_inc_return() - atomic increment with full ordering
3597ad811070SMark Rutland * @v: pointer to atomic_long_t
3598ad811070SMark Rutland *
3599ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
3600ad811070SMark Rutland *
3601ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_return() there.
3602ad811070SMark Rutland *
3603ad811070SMark Rutland * Return: The updated value of @v.
3604ad811070SMark Rutland */
360567d1b0deSMark Rutland static __always_inline long
atomic_long_inc_return(atomic_long_t * v)360667d1b0deSMark Rutland atomic_long_inc_return(atomic_long_t *v)
360767d1b0deSMark Rutland {
3608e87c4f66SMarco Elver kcsan_mb();
360967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3610c9268ac6SMark Rutland return raw_atomic_long_inc_return(v);
361167d1b0deSMark Rutland }
361267d1b0deSMark Rutland
3613ad811070SMark Rutland /**
3614ad811070SMark Rutland * atomic_long_inc_return_acquire() - atomic increment with acquire ordering
3615ad811070SMark Rutland * @v: pointer to atomic_long_t
3616ad811070SMark Rutland *
3617ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
3618ad811070SMark Rutland *
3619ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_acquire() there.
3620ad811070SMark Rutland *
3621ad811070SMark Rutland * Return: The updated value of @v.
3622ad811070SMark Rutland */
362367d1b0deSMark Rutland static __always_inline long
atomic_long_inc_return_acquire(atomic_long_t * v)362467d1b0deSMark Rutland atomic_long_inc_return_acquire(atomic_long_t *v)
362567d1b0deSMark Rutland {
362667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3627c9268ac6SMark Rutland return raw_atomic_long_inc_return_acquire(v);
362867d1b0deSMark Rutland }
362967d1b0deSMark Rutland
3630ad811070SMark Rutland /**
3631ad811070SMark Rutland * atomic_long_inc_return_release() - atomic increment with release ordering
3632ad811070SMark Rutland * @v: pointer to atomic_long_t
3633ad811070SMark Rutland *
3634ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
3635ad811070SMark Rutland *
3636ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_release() there.
3637ad811070SMark Rutland *
3638ad811070SMark Rutland * Return: The updated value of @v.
3639ad811070SMark Rutland */
364067d1b0deSMark Rutland static __always_inline long
atomic_long_inc_return_release(atomic_long_t * v)364167d1b0deSMark Rutland atomic_long_inc_return_release(atomic_long_t *v)
364267d1b0deSMark Rutland {
3643e87c4f66SMarco Elver kcsan_release();
364467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3645c9268ac6SMark Rutland return raw_atomic_long_inc_return_release(v);
364667d1b0deSMark Rutland }
364767d1b0deSMark Rutland
3648ad811070SMark Rutland /**
3649ad811070SMark Rutland * atomic_long_inc_return_relaxed() - atomic increment with relaxed ordering
3650ad811070SMark Rutland * @v: pointer to atomic_long_t
3651ad811070SMark Rutland *
3652ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
3653ad811070SMark Rutland *
3654ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_return_relaxed() there.
3655ad811070SMark Rutland *
3656ad811070SMark Rutland * Return: The updated value of @v.
3657ad811070SMark Rutland */
365867d1b0deSMark Rutland static __always_inline long
atomic_long_inc_return_relaxed(atomic_long_t * v)365967d1b0deSMark Rutland atomic_long_inc_return_relaxed(atomic_long_t *v)
366067d1b0deSMark Rutland {
366167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3662c9268ac6SMark Rutland return raw_atomic_long_inc_return_relaxed(v);
366367d1b0deSMark Rutland }
366467d1b0deSMark Rutland
3665ad811070SMark Rutland /**
3666ad811070SMark Rutland * atomic_long_fetch_inc() - atomic increment with full ordering
3667ad811070SMark Rutland * @v: pointer to atomic_long_t
3668ad811070SMark Rutland *
3669ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
3670ad811070SMark Rutland *
3671ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc() there.
3672ad811070SMark Rutland *
3673ad811070SMark Rutland * Return: The original value of @v.
3674ad811070SMark Rutland */
367567d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_inc(atomic_long_t * v)367667d1b0deSMark Rutland atomic_long_fetch_inc(atomic_long_t *v)
367767d1b0deSMark Rutland {
3678e87c4f66SMarco Elver kcsan_mb();
367967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3680c9268ac6SMark Rutland return raw_atomic_long_fetch_inc(v);
368167d1b0deSMark Rutland }
368267d1b0deSMark Rutland
3683ad811070SMark Rutland /**
3684ad811070SMark Rutland * atomic_long_fetch_inc_acquire() - atomic increment with acquire ordering
3685ad811070SMark Rutland * @v: pointer to atomic_long_t
3686ad811070SMark Rutland *
3687ad811070SMark Rutland * Atomically updates @v to (@v + 1) with acquire ordering.
3688ad811070SMark Rutland *
3689ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_acquire() there.
3690ad811070SMark Rutland *
3691ad811070SMark Rutland * Return: The original value of @v.
3692ad811070SMark Rutland */
369367d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_inc_acquire(atomic_long_t * v)369467d1b0deSMark Rutland atomic_long_fetch_inc_acquire(atomic_long_t *v)
369567d1b0deSMark Rutland {
369667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3697c9268ac6SMark Rutland return raw_atomic_long_fetch_inc_acquire(v);
369867d1b0deSMark Rutland }
369967d1b0deSMark Rutland
3700ad811070SMark Rutland /**
3701ad811070SMark Rutland * atomic_long_fetch_inc_release() - atomic increment with release ordering
3702ad811070SMark Rutland * @v: pointer to atomic_long_t
3703ad811070SMark Rutland *
3704ad811070SMark Rutland * Atomically updates @v to (@v + 1) with release ordering.
3705ad811070SMark Rutland *
3706ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_release() there.
3707ad811070SMark Rutland *
3708ad811070SMark Rutland * Return: The original value of @v.
3709ad811070SMark Rutland */
371067d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_inc_release(atomic_long_t * v)371167d1b0deSMark Rutland atomic_long_fetch_inc_release(atomic_long_t *v)
371267d1b0deSMark Rutland {
3713e87c4f66SMarco Elver kcsan_release();
371467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3715c9268ac6SMark Rutland return raw_atomic_long_fetch_inc_release(v);
371667d1b0deSMark Rutland }
371767d1b0deSMark Rutland
3718ad811070SMark Rutland /**
3719ad811070SMark Rutland * atomic_long_fetch_inc_relaxed() - atomic increment with relaxed ordering
3720ad811070SMark Rutland * @v: pointer to atomic_long_t
3721ad811070SMark Rutland *
3722ad811070SMark Rutland * Atomically updates @v to (@v + 1) with relaxed ordering.
3723ad811070SMark Rutland *
3724ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_inc_relaxed() there.
3725ad811070SMark Rutland *
3726ad811070SMark Rutland * Return: The original value of @v.
3727ad811070SMark Rutland */
372867d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_inc_relaxed(atomic_long_t * v)372967d1b0deSMark Rutland atomic_long_fetch_inc_relaxed(atomic_long_t *v)
373067d1b0deSMark Rutland {
373167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3732c9268ac6SMark Rutland return raw_atomic_long_fetch_inc_relaxed(v);
373367d1b0deSMark Rutland }
373467d1b0deSMark Rutland
3735ad811070SMark Rutland /**
3736ad811070SMark Rutland * atomic_long_dec() - atomic decrement with relaxed ordering
3737ad811070SMark Rutland * @v: pointer to atomic_long_t
3738ad811070SMark Rutland *
3739ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
3740ad811070SMark Rutland *
3741ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec() there.
3742ad811070SMark Rutland *
3743ad811070SMark Rutland * Return: Nothing.
3744ad811070SMark Rutland */
374567d1b0deSMark Rutland static __always_inline void
atomic_long_dec(atomic_long_t * v)374667d1b0deSMark Rutland atomic_long_dec(atomic_long_t *v)
374767d1b0deSMark Rutland {
374867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3749c9268ac6SMark Rutland raw_atomic_long_dec(v);
375067d1b0deSMark Rutland }
375167d1b0deSMark Rutland
3752ad811070SMark Rutland /**
3753ad811070SMark Rutland * atomic_long_dec_return() - atomic decrement with full ordering
3754ad811070SMark Rutland * @v: pointer to atomic_long_t
3755ad811070SMark Rutland *
3756ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
3757ad811070SMark Rutland *
3758ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_return() there.
3759ad811070SMark Rutland *
3760ad811070SMark Rutland * Return: The updated value of @v.
3761ad811070SMark Rutland */
376267d1b0deSMark Rutland static __always_inline long
atomic_long_dec_return(atomic_long_t * v)376367d1b0deSMark Rutland atomic_long_dec_return(atomic_long_t *v)
376467d1b0deSMark Rutland {
3765e87c4f66SMarco Elver kcsan_mb();
376667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3767c9268ac6SMark Rutland return raw_atomic_long_dec_return(v);
376867d1b0deSMark Rutland }
376967d1b0deSMark Rutland
3770ad811070SMark Rutland /**
3771ad811070SMark Rutland * atomic_long_dec_return_acquire() - atomic decrement with acquire ordering
3772ad811070SMark Rutland * @v: pointer to atomic_long_t
3773ad811070SMark Rutland *
3774ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
3775ad811070SMark Rutland *
3776ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_acquire() there.
3777ad811070SMark Rutland *
3778ad811070SMark Rutland * Return: The updated value of @v.
3779ad811070SMark Rutland */
378067d1b0deSMark Rutland static __always_inline long
atomic_long_dec_return_acquire(atomic_long_t * v)378167d1b0deSMark Rutland atomic_long_dec_return_acquire(atomic_long_t *v)
378267d1b0deSMark Rutland {
378367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3784c9268ac6SMark Rutland return raw_atomic_long_dec_return_acquire(v);
378567d1b0deSMark Rutland }
378667d1b0deSMark Rutland
3787ad811070SMark Rutland /**
3788ad811070SMark Rutland * atomic_long_dec_return_release() - atomic decrement with release ordering
3789ad811070SMark Rutland * @v: pointer to atomic_long_t
3790ad811070SMark Rutland *
3791ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
3792ad811070SMark Rutland *
3793ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_release() there.
3794ad811070SMark Rutland *
3795ad811070SMark Rutland * Return: The updated value of @v.
3796ad811070SMark Rutland */
379767d1b0deSMark Rutland static __always_inline long
atomic_long_dec_return_release(atomic_long_t * v)379867d1b0deSMark Rutland atomic_long_dec_return_release(atomic_long_t *v)
379967d1b0deSMark Rutland {
3800e87c4f66SMarco Elver kcsan_release();
380167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3802c9268ac6SMark Rutland return raw_atomic_long_dec_return_release(v);
380367d1b0deSMark Rutland }
380467d1b0deSMark Rutland
3805ad811070SMark Rutland /**
3806ad811070SMark Rutland * atomic_long_dec_return_relaxed() - atomic decrement with relaxed ordering
3807ad811070SMark Rutland * @v: pointer to atomic_long_t
3808ad811070SMark Rutland *
3809ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
3810ad811070SMark Rutland *
3811ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_return_relaxed() there.
3812ad811070SMark Rutland *
3813ad811070SMark Rutland * Return: The updated value of @v.
3814ad811070SMark Rutland */
381567d1b0deSMark Rutland static __always_inline long
atomic_long_dec_return_relaxed(atomic_long_t * v)381667d1b0deSMark Rutland atomic_long_dec_return_relaxed(atomic_long_t *v)
381767d1b0deSMark Rutland {
381867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3819c9268ac6SMark Rutland return raw_atomic_long_dec_return_relaxed(v);
382067d1b0deSMark Rutland }
382167d1b0deSMark Rutland
3822ad811070SMark Rutland /**
3823ad811070SMark Rutland * atomic_long_fetch_dec() - atomic decrement with full ordering
3824ad811070SMark Rutland * @v: pointer to atomic_long_t
3825ad811070SMark Rutland *
3826ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
3827ad811070SMark Rutland *
3828ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec() there.
3829ad811070SMark Rutland *
3830ad811070SMark Rutland * Return: The original value of @v.
3831ad811070SMark Rutland */
383267d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_dec(atomic_long_t * v)383367d1b0deSMark Rutland atomic_long_fetch_dec(atomic_long_t *v)
383467d1b0deSMark Rutland {
3835e87c4f66SMarco Elver kcsan_mb();
383667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3837c9268ac6SMark Rutland return raw_atomic_long_fetch_dec(v);
383867d1b0deSMark Rutland }
383967d1b0deSMark Rutland
3840ad811070SMark Rutland /**
3841ad811070SMark Rutland * atomic_long_fetch_dec_acquire() - atomic decrement with acquire ordering
3842ad811070SMark Rutland * @v: pointer to atomic_long_t
3843ad811070SMark Rutland *
3844ad811070SMark Rutland * Atomically updates @v to (@v - 1) with acquire ordering.
3845ad811070SMark Rutland *
3846ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_acquire() there.
3847ad811070SMark Rutland *
3848ad811070SMark Rutland * Return: The original value of @v.
3849ad811070SMark Rutland */
385067d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_dec_acquire(atomic_long_t * v)385167d1b0deSMark Rutland atomic_long_fetch_dec_acquire(atomic_long_t *v)
385267d1b0deSMark Rutland {
385367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3854c9268ac6SMark Rutland return raw_atomic_long_fetch_dec_acquire(v);
385567d1b0deSMark Rutland }
385667d1b0deSMark Rutland
3857ad811070SMark Rutland /**
3858ad811070SMark Rutland * atomic_long_fetch_dec_release() - atomic decrement with release ordering
3859ad811070SMark Rutland * @v: pointer to atomic_long_t
3860ad811070SMark Rutland *
3861ad811070SMark Rutland * Atomically updates @v to (@v - 1) with release ordering.
3862ad811070SMark Rutland *
3863ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_release() there.
3864ad811070SMark Rutland *
3865ad811070SMark Rutland * Return: The original value of @v.
3866ad811070SMark Rutland */
386767d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_dec_release(atomic_long_t * v)386867d1b0deSMark Rutland atomic_long_fetch_dec_release(atomic_long_t *v)
386967d1b0deSMark Rutland {
3870e87c4f66SMarco Elver kcsan_release();
387167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3872c9268ac6SMark Rutland return raw_atomic_long_fetch_dec_release(v);
387367d1b0deSMark Rutland }
387467d1b0deSMark Rutland
3875ad811070SMark Rutland /**
3876ad811070SMark Rutland * atomic_long_fetch_dec_relaxed() - atomic decrement with relaxed ordering
3877ad811070SMark Rutland * @v: pointer to atomic_long_t
3878ad811070SMark Rutland *
3879ad811070SMark Rutland * Atomically updates @v to (@v - 1) with relaxed ordering.
3880ad811070SMark Rutland *
3881ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_dec_relaxed() there.
3882ad811070SMark Rutland *
3883ad811070SMark Rutland * Return: The original value of @v.
3884ad811070SMark Rutland */
388567d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_dec_relaxed(atomic_long_t * v)388667d1b0deSMark Rutland atomic_long_fetch_dec_relaxed(atomic_long_t *v)
388767d1b0deSMark Rutland {
388867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3889c9268ac6SMark Rutland return raw_atomic_long_fetch_dec_relaxed(v);
389067d1b0deSMark Rutland }
389167d1b0deSMark Rutland
3892ad811070SMark Rutland /**
3893ad811070SMark Rutland * atomic_long_and() - atomic bitwise AND with relaxed ordering
3894ad811070SMark Rutland * @i: long value
3895ad811070SMark Rutland * @v: pointer to atomic_long_t
3896ad811070SMark Rutland *
3897ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
3898ad811070SMark Rutland *
3899ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_and() there.
3900ad811070SMark Rutland *
3901ad811070SMark Rutland * Return: Nothing.
3902ad811070SMark Rutland */
390367d1b0deSMark Rutland static __always_inline void
atomic_long_and(long i,atomic_long_t * v)390467d1b0deSMark Rutland atomic_long_and(long i, atomic_long_t *v)
390567d1b0deSMark Rutland {
390667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3907c9268ac6SMark Rutland raw_atomic_long_and(i, v);
390867d1b0deSMark Rutland }
390967d1b0deSMark Rutland
3910ad811070SMark Rutland /**
3911ad811070SMark Rutland * atomic_long_fetch_and() - atomic bitwise AND with full ordering
3912ad811070SMark Rutland * @i: long value
3913ad811070SMark Rutland * @v: pointer to atomic_long_t
3914ad811070SMark Rutland *
3915ad811070SMark Rutland * Atomically updates @v to (@v & @i) with full ordering.
3916ad811070SMark Rutland *
3917ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and() there.
3918ad811070SMark Rutland *
3919ad811070SMark Rutland * Return: The original value of @v.
3920ad811070SMark Rutland */
392167d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_and(long i,atomic_long_t * v)392267d1b0deSMark Rutland atomic_long_fetch_and(long i, atomic_long_t *v)
392367d1b0deSMark Rutland {
3924e87c4f66SMarco Elver kcsan_mb();
392567d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3926c9268ac6SMark Rutland return raw_atomic_long_fetch_and(i, v);
392767d1b0deSMark Rutland }
392867d1b0deSMark Rutland
3929ad811070SMark Rutland /**
3930ad811070SMark Rutland * atomic_long_fetch_and_acquire() - atomic bitwise AND with acquire ordering
3931ad811070SMark Rutland * @i: long value
3932ad811070SMark Rutland * @v: pointer to atomic_long_t
3933ad811070SMark Rutland *
3934ad811070SMark Rutland * Atomically updates @v to (@v & @i) with acquire ordering.
3935ad811070SMark Rutland *
3936ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_acquire() there.
3937ad811070SMark Rutland *
3938ad811070SMark Rutland * Return: The original value of @v.
3939ad811070SMark Rutland */
394067d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_and_acquire(long i,atomic_long_t * v)394167d1b0deSMark Rutland atomic_long_fetch_and_acquire(long i, atomic_long_t *v)
394267d1b0deSMark Rutland {
394367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3944c9268ac6SMark Rutland return raw_atomic_long_fetch_and_acquire(i, v);
394567d1b0deSMark Rutland }
394667d1b0deSMark Rutland
3947ad811070SMark Rutland /**
3948ad811070SMark Rutland * atomic_long_fetch_and_release() - atomic bitwise AND with release ordering
3949ad811070SMark Rutland * @i: long value
3950ad811070SMark Rutland * @v: pointer to atomic_long_t
3951ad811070SMark Rutland *
3952ad811070SMark Rutland * Atomically updates @v to (@v & @i) with release ordering.
3953ad811070SMark Rutland *
3954ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_release() there.
3955ad811070SMark Rutland *
3956ad811070SMark Rutland * Return: The original value of @v.
3957ad811070SMark Rutland */
395867d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_and_release(long i,atomic_long_t * v)395967d1b0deSMark Rutland atomic_long_fetch_and_release(long i, atomic_long_t *v)
396067d1b0deSMark Rutland {
3961e87c4f66SMarco Elver kcsan_release();
396267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3963c9268ac6SMark Rutland return raw_atomic_long_fetch_and_release(i, v);
396467d1b0deSMark Rutland }
396567d1b0deSMark Rutland
3966ad811070SMark Rutland /**
3967ad811070SMark Rutland * atomic_long_fetch_and_relaxed() - atomic bitwise AND with relaxed ordering
3968ad811070SMark Rutland * @i: long value
3969ad811070SMark Rutland * @v: pointer to atomic_long_t
3970ad811070SMark Rutland *
3971ad811070SMark Rutland * Atomically updates @v to (@v & @i) with relaxed ordering.
3972ad811070SMark Rutland *
3973ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_and_relaxed() there.
3974ad811070SMark Rutland *
3975ad811070SMark Rutland * Return: The original value of @v.
3976ad811070SMark Rutland */
397767d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_and_relaxed(long i,atomic_long_t * v)397867d1b0deSMark Rutland atomic_long_fetch_and_relaxed(long i, atomic_long_t *v)
397967d1b0deSMark Rutland {
398067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3981c9268ac6SMark Rutland return raw_atomic_long_fetch_and_relaxed(i, v);
398267d1b0deSMark Rutland }
398367d1b0deSMark Rutland
3984ad811070SMark Rutland /**
3985ad811070SMark Rutland * atomic_long_andnot() - atomic bitwise AND NOT with relaxed ordering
3986ad811070SMark Rutland * @i: long value
3987ad811070SMark Rutland * @v: pointer to atomic_long_t
3988ad811070SMark Rutland *
3989ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
3990ad811070SMark Rutland *
3991ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_andnot() there.
3992ad811070SMark Rutland *
3993ad811070SMark Rutland * Return: Nothing.
3994ad811070SMark Rutland */
399567d1b0deSMark Rutland static __always_inline void
atomic_long_andnot(long i,atomic_long_t * v)399667d1b0deSMark Rutland atomic_long_andnot(long i, atomic_long_t *v)
399767d1b0deSMark Rutland {
399867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
3999c9268ac6SMark Rutland raw_atomic_long_andnot(i, v);
400067d1b0deSMark Rutland }
400167d1b0deSMark Rutland
4002ad811070SMark Rutland /**
4003ad811070SMark Rutland * atomic_long_fetch_andnot() - atomic bitwise AND NOT with full ordering
4004ad811070SMark Rutland * @i: long value
4005ad811070SMark Rutland * @v: pointer to atomic_long_t
4006ad811070SMark Rutland *
4007ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with full ordering.
4008ad811070SMark Rutland *
4009ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot() there.
4010ad811070SMark Rutland *
4011ad811070SMark Rutland * Return: The original value of @v.
4012ad811070SMark Rutland */
401367d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_andnot(long i,atomic_long_t * v)401467d1b0deSMark Rutland atomic_long_fetch_andnot(long i, atomic_long_t *v)
401567d1b0deSMark Rutland {
4016e87c4f66SMarco Elver kcsan_mb();
401767d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4018c9268ac6SMark Rutland return raw_atomic_long_fetch_andnot(i, v);
401967d1b0deSMark Rutland }
402067d1b0deSMark Rutland
4021ad811070SMark Rutland /**
4022ad811070SMark Rutland * atomic_long_fetch_andnot_acquire() - atomic bitwise AND NOT with acquire ordering
4023ad811070SMark Rutland * @i: long value
4024ad811070SMark Rutland * @v: pointer to atomic_long_t
4025ad811070SMark Rutland *
4026ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with acquire ordering.
4027ad811070SMark Rutland *
4028ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_acquire() there.
4029ad811070SMark Rutland *
4030ad811070SMark Rutland * Return: The original value of @v.
4031ad811070SMark Rutland */
403267d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_andnot_acquire(long i,atomic_long_t * v)403367d1b0deSMark Rutland atomic_long_fetch_andnot_acquire(long i, atomic_long_t *v)
403467d1b0deSMark Rutland {
403567d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4036c9268ac6SMark Rutland return raw_atomic_long_fetch_andnot_acquire(i, v);
403767d1b0deSMark Rutland }
403867d1b0deSMark Rutland
4039ad811070SMark Rutland /**
4040ad811070SMark Rutland * atomic_long_fetch_andnot_release() - atomic bitwise AND NOT with release ordering
4041ad811070SMark Rutland * @i: long value
4042ad811070SMark Rutland * @v: pointer to atomic_long_t
4043ad811070SMark Rutland *
4044ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with release ordering.
4045ad811070SMark Rutland *
4046ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_release() there.
4047ad811070SMark Rutland *
4048ad811070SMark Rutland * Return: The original value of @v.
4049ad811070SMark Rutland */
405067d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_andnot_release(long i,atomic_long_t * v)405167d1b0deSMark Rutland atomic_long_fetch_andnot_release(long i, atomic_long_t *v)
405267d1b0deSMark Rutland {
4053e87c4f66SMarco Elver kcsan_release();
405467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4055c9268ac6SMark Rutland return raw_atomic_long_fetch_andnot_release(i, v);
405667d1b0deSMark Rutland }
405767d1b0deSMark Rutland
4058ad811070SMark Rutland /**
4059ad811070SMark Rutland * atomic_long_fetch_andnot_relaxed() - atomic bitwise AND NOT with relaxed ordering
4060ad811070SMark Rutland * @i: long value
4061ad811070SMark Rutland * @v: pointer to atomic_long_t
4062ad811070SMark Rutland *
4063ad811070SMark Rutland * Atomically updates @v to (@v & ~@i) with relaxed ordering.
4064ad811070SMark Rutland *
4065ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_andnot_relaxed() there.
4066ad811070SMark Rutland *
4067ad811070SMark Rutland * Return: The original value of @v.
4068ad811070SMark Rutland */
406967d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_andnot_relaxed(long i,atomic_long_t * v)407067d1b0deSMark Rutland atomic_long_fetch_andnot_relaxed(long i, atomic_long_t *v)
407167d1b0deSMark Rutland {
407267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4073c9268ac6SMark Rutland return raw_atomic_long_fetch_andnot_relaxed(i, v);
407467d1b0deSMark Rutland }
407567d1b0deSMark Rutland
4076ad811070SMark Rutland /**
4077ad811070SMark Rutland * atomic_long_or() - atomic bitwise OR with relaxed ordering
4078ad811070SMark Rutland * @i: long value
4079ad811070SMark Rutland * @v: pointer to atomic_long_t
4080ad811070SMark Rutland *
4081ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
4082ad811070SMark Rutland *
4083ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_or() there.
4084ad811070SMark Rutland *
4085ad811070SMark Rutland * Return: Nothing.
4086ad811070SMark Rutland */
408767d1b0deSMark Rutland static __always_inline void
atomic_long_or(long i,atomic_long_t * v)408867d1b0deSMark Rutland atomic_long_or(long i, atomic_long_t *v)
408967d1b0deSMark Rutland {
409067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4091c9268ac6SMark Rutland raw_atomic_long_or(i, v);
409267d1b0deSMark Rutland }
409367d1b0deSMark Rutland
4094ad811070SMark Rutland /**
4095ad811070SMark Rutland * atomic_long_fetch_or() - atomic bitwise OR with full ordering
4096ad811070SMark Rutland * @i: long value
4097ad811070SMark Rutland * @v: pointer to atomic_long_t
4098ad811070SMark Rutland *
4099ad811070SMark Rutland * Atomically updates @v to (@v | @i) with full ordering.
4100ad811070SMark Rutland *
4101ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or() there.
4102ad811070SMark Rutland *
4103ad811070SMark Rutland * Return: The original value of @v.
4104ad811070SMark Rutland */
410567d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_or(long i,atomic_long_t * v)410667d1b0deSMark Rutland atomic_long_fetch_or(long i, atomic_long_t *v)
410767d1b0deSMark Rutland {
4108e87c4f66SMarco Elver kcsan_mb();
410967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4110c9268ac6SMark Rutland return raw_atomic_long_fetch_or(i, v);
411167d1b0deSMark Rutland }
411267d1b0deSMark Rutland
4113ad811070SMark Rutland /**
4114ad811070SMark Rutland * atomic_long_fetch_or_acquire() - atomic bitwise OR with acquire ordering
4115ad811070SMark Rutland * @i: long value
4116ad811070SMark Rutland * @v: pointer to atomic_long_t
4117ad811070SMark Rutland *
4118ad811070SMark Rutland * Atomically updates @v to (@v | @i) with acquire ordering.
4119ad811070SMark Rutland *
4120ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_acquire() there.
4121ad811070SMark Rutland *
4122ad811070SMark Rutland * Return: The original value of @v.
4123ad811070SMark Rutland */
412467d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_or_acquire(long i,atomic_long_t * v)412567d1b0deSMark Rutland atomic_long_fetch_or_acquire(long i, atomic_long_t *v)
412667d1b0deSMark Rutland {
412767d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4128c9268ac6SMark Rutland return raw_atomic_long_fetch_or_acquire(i, v);
412967d1b0deSMark Rutland }
413067d1b0deSMark Rutland
4131ad811070SMark Rutland /**
4132ad811070SMark Rutland * atomic_long_fetch_or_release() - atomic bitwise OR with release ordering
4133ad811070SMark Rutland * @i: long value
4134ad811070SMark Rutland * @v: pointer to atomic_long_t
4135ad811070SMark Rutland *
4136ad811070SMark Rutland * Atomically updates @v to (@v | @i) with release ordering.
4137ad811070SMark Rutland *
4138ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_release() there.
4139ad811070SMark Rutland *
4140ad811070SMark Rutland * Return: The original value of @v.
4141ad811070SMark Rutland */
414267d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_or_release(long i,atomic_long_t * v)414367d1b0deSMark Rutland atomic_long_fetch_or_release(long i, atomic_long_t *v)
414467d1b0deSMark Rutland {
4145e87c4f66SMarco Elver kcsan_release();
414667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4147c9268ac6SMark Rutland return raw_atomic_long_fetch_or_release(i, v);
414867d1b0deSMark Rutland }
414967d1b0deSMark Rutland
4150ad811070SMark Rutland /**
4151ad811070SMark Rutland * atomic_long_fetch_or_relaxed() - atomic bitwise OR with relaxed ordering
4152ad811070SMark Rutland * @i: long value
4153ad811070SMark Rutland * @v: pointer to atomic_long_t
4154ad811070SMark Rutland *
4155ad811070SMark Rutland * Atomically updates @v to (@v | @i) with relaxed ordering.
4156ad811070SMark Rutland *
4157ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_or_relaxed() there.
4158ad811070SMark Rutland *
4159ad811070SMark Rutland * Return: The original value of @v.
4160ad811070SMark Rutland */
416167d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_or_relaxed(long i,atomic_long_t * v)416267d1b0deSMark Rutland atomic_long_fetch_or_relaxed(long i, atomic_long_t *v)
416367d1b0deSMark Rutland {
416467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4165c9268ac6SMark Rutland return raw_atomic_long_fetch_or_relaxed(i, v);
416667d1b0deSMark Rutland }
416767d1b0deSMark Rutland
4168ad811070SMark Rutland /**
4169ad811070SMark Rutland * atomic_long_xor() - atomic bitwise XOR with relaxed ordering
4170ad811070SMark Rutland * @i: long value
4171ad811070SMark Rutland * @v: pointer to atomic_long_t
4172ad811070SMark Rutland *
4173ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
4174ad811070SMark Rutland *
4175ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_xor() there.
4176ad811070SMark Rutland *
4177ad811070SMark Rutland * Return: Nothing.
4178ad811070SMark Rutland */
417967d1b0deSMark Rutland static __always_inline void
atomic_long_xor(long i,atomic_long_t * v)418067d1b0deSMark Rutland atomic_long_xor(long i, atomic_long_t *v)
418167d1b0deSMark Rutland {
418267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4183c9268ac6SMark Rutland raw_atomic_long_xor(i, v);
418467d1b0deSMark Rutland }
418567d1b0deSMark Rutland
4186ad811070SMark Rutland /**
4187ad811070SMark Rutland * atomic_long_fetch_xor() - atomic bitwise XOR with full ordering
4188ad811070SMark Rutland * @i: long value
4189ad811070SMark Rutland * @v: pointer to atomic_long_t
4190ad811070SMark Rutland *
4191ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with full ordering.
4192ad811070SMark Rutland *
4193ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor() there.
4194ad811070SMark Rutland *
4195ad811070SMark Rutland * Return: The original value of @v.
4196ad811070SMark Rutland */
419767d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_xor(long i,atomic_long_t * v)419867d1b0deSMark Rutland atomic_long_fetch_xor(long i, atomic_long_t *v)
419967d1b0deSMark Rutland {
4200e87c4f66SMarco Elver kcsan_mb();
420167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4202c9268ac6SMark Rutland return raw_atomic_long_fetch_xor(i, v);
420367d1b0deSMark Rutland }
420467d1b0deSMark Rutland
4205ad811070SMark Rutland /**
4206ad811070SMark Rutland * atomic_long_fetch_xor_acquire() - atomic bitwise XOR with acquire ordering
4207ad811070SMark Rutland * @i: long value
4208ad811070SMark Rutland * @v: pointer to atomic_long_t
4209ad811070SMark Rutland *
4210ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with acquire ordering.
4211ad811070SMark Rutland *
4212ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_acquire() there.
4213ad811070SMark Rutland *
4214ad811070SMark Rutland * Return: The original value of @v.
4215ad811070SMark Rutland */
421667d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_xor_acquire(long i,atomic_long_t * v)421767d1b0deSMark Rutland atomic_long_fetch_xor_acquire(long i, atomic_long_t *v)
421867d1b0deSMark Rutland {
421967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4220c9268ac6SMark Rutland return raw_atomic_long_fetch_xor_acquire(i, v);
422167d1b0deSMark Rutland }
422267d1b0deSMark Rutland
4223ad811070SMark Rutland /**
4224ad811070SMark Rutland * atomic_long_fetch_xor_release() - atomic bitwise XOR with release ordering
4225ad811070SMark Rutland * @i: long value
4226ad811070SMark Rutland * @v: pointer to atomic_long_t
4227ad811070SMark Rutland *
4228ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with release ordering.
4229ad811070SMark Rutland *
4230ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_release() there.
4231ad811070SMark Rutland *
4232ad811070SMark Rutland * Return: The original value of @v.
4233ad811070SMark Rutland */
423467d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_xor_release(long i,atomic_long_t * v)423567d1b0deSMark Rutland atomic_long_fetch_xor_release(long i, atomic_long_t *v)
423667d1b0deSMark Rutland {
4237e87c4f66SMarco Elver kcsan_release();
423867d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4239c9268ac6SMark Rutland return raw_atomic_long_fetch_xor_release(i, v);
424067d1b0deSMark Rutland }
424167d1b0deSMark Rutland
4242ad811070SMark Rutland /**
4243ad811070SMark Rutland * atomic_long_fetch_xor_relaxed() - atomic bitwise XOR with relaxed ordering
4244ad811070SMark Rutland * @i: long value
4245ad811070SMark Rutland * @v: pointer to atomic_long_t
4246ad811070SMark Rutland *
4247ad811070SMark Rutland * Atomically updates @v to (@v ^ @i) with relaxed ordering.
4248ad811070SMark Rutland *
4249ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_xor_relaxed() there.
4250ad811070SMark Rutland *
4251ad811070SMark Rutland * Return: The original value of @v.
4252ad811070SMark Rutland */
425367d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_xor_relaxed(long i,atomic_long_t * v)425467d1b0deSMark Rutland atomic_long_fetch_xor_relaxed(long i, atomic_long_t *v)
425567d1b0deSMark Rutland {
425667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4257c9268ac6SMark Rutland return raw_atomic_long_fetch_xor_relaxed(i, v);
425867d1b0deSMark Rutland }
425967d1b0deSMark Rutland
4260ad811070SMark Rutland /**
4261ad811070SMark Rutland * atomic_long_xchg() - atomic exchange with full ordering
4262ad811070SMark Rutland * @v: pointer to atomic_long_t
4263ad811070SMark Rutland * @new: long value to assign
4264ad811070SMark Rutland *
4265ad811070SMark Rutland * Atomically updates @v to @new with full ordering.
4266ad811070SMark Rutland *
4267ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_xchg() there.
4268ad811070SMark Rutland *
4269ad811070SMark Rutland * Return: The original value of @v.
4270ad811070SMark Rutland */
427167d1b0deSMark Rutland static __always_inline long
atomic_long_xchg(atomic_long_t * v,long new)42721d78814dSMark Rutland atomic_long_xchg(atomic_long_t *v, long new)
427367d1b0deSMark Rutland {
4274e87c4f66SMarco Elver kcsan_mb();
427567d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
42761d78814dSMark Rutland return raw_atomic_long_xchg(v, new);
427767d1b0deSMark Rutland }
427867d1b0deSMark Rutland
4279ad811070SMark Rutland /**
4280ad811070SMark Rutland * atomic_long_xchg_acquire() - atomic exchange with acquire ordering
4281ad811070SMark Rutland * @v: pointer to atomic_long_t
4282ad811070SMark Rutland * @new: long value to assign
4283ad811070SMark Rutland *
4284ad811070SMark Rutland * Atomically updates @v to @new with acquire ordering.
4285ad811070SMark Rutland *
4286ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_xchg_acquire() there.
4287ad811070SMark Rutland *
4288ad811070SMark Rutland * Return: The original value of @v.
4289ad811070SMark Rutland */
429067d1b0deSMark Rutland static __always_inline long
atomic_long_xchg_acquire(atomic_long_t * v,long new)42911d78814dSMark Rutland atomic_long_xchg_acquire(atomic_long_t *v, long new)
429267d1b0deSMark Rutland {
429367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
42941d78814dSMark Rutland return raw_atomic_long_xchg_acquire(v, new);
429567d1b0deSMark Rutland }
429667d1b0deSMark Rutland
4297ad811070SMark Rutland /**
4298ad811070SMark Rutland * atomic_long_xchg_release() - atomic exchange with release ordering
4299ad811070SMark Rutland * @v: pointer to atomic_long_t
4300ad811070SMark Rutland * @new: long value to assign
4301ad811070SMark Rutland *
4302ad811070SMark Rutland * Atomically updates @v to @new with release ordering.
4303ad811070SMark Rutland *
4304ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_xchg_release() there.
4305ad811070SMark Rutland *
4306ad811070SMark Rutland * Return: The original value of @v.
4307ad811070SMark Rutland */
430867d1b0deSMark Rutland static __always_inline long
atomic_long_xchg_release(atomic_long_t * v,long new)43091d78814dSMark Rutland atomic_long_xchg_release(atomic_long_t *v, long new)
431067d1b0deSMark Rutland {
4311e87c4f66SMarco Elver kcsan_release();
431267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
43131d78814dSMark Rutland return raw_atomic_long_xchg_release(v, new);
431467d1b0deSMark Rutland }
431567d1b0deSMark Rutland
4316ad811070SMark Rutland /**
4317ad811070SMark Rutland * atomic_long_xchg_relaxed() - atomic exchange with relaxed ordering
4318ad811070SMark Rutland * @v: pointer to atomic_long_t
4319ad811070SMark Rutland * @new: long value to assign
4320ad811070SMark Rutland *
4321ad811070SMark Rutland * Atomically updates @v to @new with relaxed ordering.
4322ad811070SMark Rutland *
4323ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_xchg_relaxed() there.
4324ad811070SMark Rutland *
4325ad811070SMark Rutland * Return: The original value of @v.
4326ad811070SMark Rutland */
432767d1b0deSMark Rutland static __always_inline long
atomic_long_xchg_relaxed(atomic_long_t * v,long new)43281d78814dSMark Rutland atomic_long_xchg_relaxed(atomic_long_t *v, long new)
432967d1b0deSMark Rutland {
433067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
43311d78814dSMark Rutland return raw_atomic_long_xchg_relaxed(v, new);
433267d1b0deSMark Rutland }
433367d1b0deSMark Rutland
4334ad811070SMark Rutland /**
4335ad811070SMark Rutland * atomic_long_cmpxchg() - atomic compare and exchange with full ordering
4336ad811070SMark Rutland * @v: pointer to atomic_long_t
4337ad811070SMark Rutland * @old: long value to compare with
4338ad811070SMark Rutland * @new: long value to assign
4339ad811070SMark Rutland *
4340ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
43416dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4342ad811070SMark Rutland *
4343ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg() there.
4344ad811070SMark Rutland *
4345ad811070SMark Rutland * Return: The original value of @v.
4346ad811070SMark Rutland */
434767d1b0deSMark Rutland static __always_inline long
atomic_long_cmpxchg(atomic_long_t * v,long old,long new)434867d1b0deSMark Rutland atomic_long_cmpxchg(atomic_long_t *v, long old, long new)
434967d1b0deSMark Rutland {
4350e87c4f66SMarco Elver kcsan_mb();
435167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4352c9268ac6SMark Rutland return raw_atomic_long_cmpxchg(v, old, new);
435367d1b0deSMark Rutland }
435467d1b0deSMark Rutland
4355ad811070SMark Rutland /**
4356ad811070SMark Rutland * atomic_long_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4357ad811070SMark Rutland * @v: pointer to atomic_long_t
4358ad811070SMark Rutland * @old: long value to compare with
4359ad811070SMark Rutland * @new: long value to assign
4360ad811070SMark Rutland *
4361ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
43626dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4363ad811070SMark Rutland *
4364ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_acquire() there.
4365ad811070SMark Rutland *
4366ad811070SMark Rutland * Return: The original value of @v.
4367ad811070SMark Rutland */
436867d1b0deSMark Rutland static __always_inline long
atomic_long_cmpxchg_acquire(atomic_long_t * v,long old,long new)436967d1b0deSMark Rutland atomic_long_cmpxchg_acquire(atomic_long_t *v, long old, long new)
437067d1b0deSMark Rutland {
437167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4372c9268ac6SMark Rutland return raw_atomic_long_cmpxchg_acquire(v, old, new);
437367d1b0deSMark Rutland }
437467d1b0deSMark Rutland
4375ad811070SMark Rutland /**
4376ad811070SMark Rutland * atomic_long_cmpxchg_release() - atomic compare and exchange with release ordering
4377ad811070SMark Rutland * @v: pointer to atomic_long_t
4378ad811070SMark Rutland * @old: long value to compare with
4379ad811070SMark Rutland * @new: long value to assign
4380ad811070SMark Rutland *
4381ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
43826dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4383ad811070SMark Rutland *
4384ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_release() there.
4385ad811070SMark Rutland *
4386ad811070SMark Rutland * Return: The original value of @v.
4387ad811070SMark Rutland */
438867d1b0deSMark Rutland static __always_inline long
atomic_long_cmpxchg_release(atomic_long_t * v,long old,long new)438967d1b0deSMark Rutland atomic_long_cmpxchg_release(atomic_long_t *v, long old, long new)
439067d1b0deSMark Rutland {
4391e87c4f66SMarco Elver kcsan_release();
439267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4393c9268ac6SMark Rutland return raw_atomic_long_cmpxchg_release(v, old, new);
439467d1b0deSMark Rutland }
439567d1b0deSMark Rutland
4396ad811070SMark Rutland /**
4397ad811070SMark Rutland * atomic_long_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4398ad811070SMark Rutland * @v: pointer to atomic_long_t
4399ad811070SMark Rutland * @old: long value to compare with
4400ad811070SMark Rutland * @new: long value to assign
4401ad811070SMark Rutland *
4402ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
44036dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4404ad811070SMark Rutland *
4405ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_cmpxchg_relaxed() there.
4406ad811070SMark Rutland *
4407ad811070SMark Rutland * Return: The original value of @v.
4408ad811070SMark Rutland */
440967d1b0deSMark Rutland static __always_inline long
atomic_long_cmpxchg_relaxed(atomic_long_t * v,long old,long new)441067d1b0deSMark Rutland atomic_long_cmpxchg_relaxed(atomic_long_t *v, long old, long new)
441167d1b0deSMark Rutland {
441267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4413c9268ac6SMark Rutland return raw_atomic_long_cmpxchg_relaxed(v, old, new);
441467d1b0deSMark Rutland }
441567d1b0deSMark Rutland
4416ad811070SMark Rutland /**
4417ad811070SMark Rutland * atomic_long_try_cmpxchg() - atomic compare and exchange with full ordering
4418ad811070SMark Rutland * @v: pointer to atomic_long_t
4419ad811070SMark Rutland * @old: pointer to long value to compare with
4420ad811070SMark Rutland * @new: long value to assign
4421ad811070SMark Rutland *
4422ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with full ordering.
44236dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
44246dfee110SMark Rutland * and relaxed ordering is provided.
4425ad811070SMark Rutland *
4426ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg() there.
4427ad811070SMark Rutland *
4428ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
4429ad811070SMark Rutland */
443067d1b0deSMark Rutland static __always_inline bool
atomic_long_try_cmpxchg(atomic_long_t * v,long * old,long new)443167d1b0deSMark Rutland atomic_long_try_cmpxchg(atomic_long_t *v, long *old, long new)
443267d1b0deSMark Rutland {
4433e87c4f66SMarco Elver kcsan_mb();
443467d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
443567d1b0deSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
4436c9268ac6SMark Rutland return raw_atomic_long_try_cmpxchg(v, old, new);
443767d1b0deSMark Rutland }
443867d1b0deSMark Rutland
4439ad811070SMark Rutland /**
4440ad811070SMark Rutland * atomic_long_try_cmpxchg_acquire() - atomic compare and exchange with acquire ordering
4441ad811070SMark Rutland * @v: pointer to atomic_long_t
4442ad811070SMark Rutland * @old: pointer to long value to compare with
4443ad811070SMark Rutland * @new: long value to assign
4444ad811070SMark Rutland *
4445ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with acquire ordering.
44466dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
44476dfee110SMark Rutland * and relaxed ordering is provided.
4448ad811070SMark Rutland *
4449ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_acquire() there.
4450ad811070SMark Rutland *
4451ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
4452ad811070SMark Rutland */
445367d1b0deSMark Rutland static __always_inline bool
atomic_long_try_cmpxchg_acquire(atomic_long_t * v,long * old,long new)445467d1b0deSMark Rutland atomic_long_try_cmpxchg_acquire(atomic_long_t *v, long *old, long new)
445567d1b0deSMark Rutland {
445667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
445767d1b0deSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
4458c9268ac6SMark Rutland return raw_atomic_long_try_cmpxchg_acquire(v, old, new);
445967d1b0deSMark Rutland }
446067d1b0deSMark Rutland
4461ad811070SMark Rutland /**
4462ad811070SMark Rutland * atomic_long_try_cmpxchg_release() - atomic compare and exchange with release ordering
4463ad811070SMark Rutland * @v: pointer to atomic_long_t
4464ad811070SMark Rutland * @old: pointer to long value to compare with
4465ad811070SMark Rutland * @new: long value to assign
4466ad811070SMark Rutland *
4467ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with release ordering.
44686dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
44696dfee110SMark Rutland * and relaxed ordering is provided.
4470ad811070SMark Rutland *
4471ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_release() there.
4472ad811070SMark Rutland *
4473ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
4474ad811070SMark Rutland */
447567d1b0deSMark Rutland static __always_inline bool
atomic_long_try_cmpxchg_release(atomic_long_t * v,long * old,long new)447667d1b0deSMark Rutland atomic_long_try_cmpxchg_release(atomic_long_t *v, long *old, long new)
447767d1b0deSMark Rutland {
4478e87c4f66SMarco Elver kcsan_release();
447967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
448067d1b0deSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
4481c9268ac6SMark Rutland return raw_atomic_long_try_cmpxchg_release(v, old, new);
448267d1b0deSMark Rutland }
448367d1b0deSMark Rutland
4484ad811070SMark Rutland /**
4485ad811070SMark Rutland * atomic_long_try_cmpxchg_relaxed() - atomic compare and exchange with relaxed ordering
4486ad811070SMark Rutland * @v: pointer to atomic_long_t
4487ad811070SMark Rutland * @old: pointer to long value to compare with
4488ad811070SMark Rutland * @new: long value to assign
4489ad811070SMark Rutland *
4490ad811070SMark Rutland * If (@v == @old), atomically updates @v to @new with relaxed ordering.
44916dfee110SMark Rutland * Otherwise, @v is not modified, @old is updated to the current value of @v,
44926dfee110SMark Rutland * and relaxed ordering is provided.
4493ad811070SMark Rutland *
4494ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_try_cmpxchg_relaxed() there.
4495ad811070SMark Rutland *
4496ad811070SMark Rutland * Return: @true if the exchange occured, @false otherwise.
4497ad811070SMark Rutland */
449867d1b0deSMark Rutland static __always_inline bool
atomic_long_try_cmpxchg_relaxed(atomic_long_t * v,long * old,long new)449967d1b0deSMark Rutland atomic_long_try_cmpxchg_relaxed(atomic_long_t *v, long *old, long new)
450067d1b0deSMark Rutland {
450167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
450267d1b0deSMark Rutland instrument_atomic_read_write(old, sizeof(*old));
4503c9268ac6SMark Rutland return raw_atomic_long_try_cmpxchg_relaxed(v, old, new);
450467d1b0deSMark Rutland }
450567d1b0deSMark Rutland
4506ad811070SMark Rutland /**
4507ad811070SMark Rutland * atomic_long_sub_and_test() - atomic subtract and test if zero with full ordering
4508*f92a59f6SCarlos Llamas * @i: long value to subtract
4509ad811070SMark Rutland * @v: pointer to atomic_long_t
4510ad811070SMark Rutland *
4511ad811070SMark Rutland * Atomically updates @v to (@v - @i) with full ordering.
4512ad811070SMark Rutland *
4513ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_sub_and_test() there.
4514ad811070SMark Rutland *
4515ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
4516ad811070SMark Rutland */
451767d1b0deSMark Rutland static __always_inline bool
atomic_long_sub_and_test(long i,atomic_long_t * v)451867d1b0deSMark Rutland atomic_long_sub_and_test(long i, atomic_long_t *v)
451967d1b0deSMark Rutland {
4520e87c4f66SMarco Elver kcsan_mb();
452167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4522c9268ac6SMark Rutland return raw_atomic_long_sub_and_test(i, v);
452367d1b0deSMark Rutland }
452467d1b0deSMark Rutland
4525ad811070SMark Rutland /**
4526ad811070SMark Rutland * atomic_long_dec_and_test() - atomic decrement and test if zero with full ordering
4527ad811070SMark Rutland * @v: pointer to atomic_long_t
4528ad811070SMark Rutland *
4529ad811070SMark Rutland * Atomically updates @v to (@v - 1) with full ordering.
4530ad811070SMark Rutland *
4531ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_and_test() there.
4532ad811070SMark Rutland *
4533ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
4534ad811070SMark Rutland */
453567d1b0deSMark Rutland static __always_inline bool
atomic_long_dec_and_test(atomic_long_t * v)453667d1b0deSMark Rutland atomic_long_dec_and_test(atomic_long_t *v)
453767d1b0deSMark Rutland {
4538e87c4f66SMarco Elver kcsan_mb();
453967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4540c9268ac6SMark Rutland return raw_atomic_long_dec_and_test(v);
454167d1b0deSMark Rutland }
454267d1b0deSMark Rutland
4543ad811070SMark Rutland /**
4544ad811070SMark Rutland * atomic_long_inc_and_test() - atomic increment and test if zero with full ordering
4545ad811070SMark Rutland * @v: pointer to atomic_long_t
4546ad811070SMark Rutland *
4547ad811070SMark Rutland * Atomically updates @v to (@v + 1) with full ordering.
4548ad811070SMark Rutland *
4549ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_and_test() there.
4550ad811070SMark Rutland *
4551ad811070SMark Rutland * Return: @true if the resulting value of @v is zero, @false otherwise.
4552ad811070SMark Rutland */
455367d1b0deSMark Rutland static __always_inline bool
atomic_long_inc_and_test(atomic_long_t * v)455467d1b0deSMark Rutland atomic_long_inc_and_test(atomic_long_t *v)
455567d1b0deSMark Rutland {
4556e87c4f66SMarco Elver kcsan_mb();
455767d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4558c9268ac6SMark Rutland return raw_atomic_long_inc_and_test(v);
455967d1b0deSMark Rutland }
456067d1b0deSMark Rutland
4561ad811070SMark Rutland /**
4562ad811070SMark Rutland * atomic_long_add_negative() - atomic add and test if negative with full ordering
4563ad811070SMark Rutland * @i: long value to add
4564ad811070SMark Rutland * @v: pointer to atomic_long_t
4565ad811070SMark Rutland *
4566ad811070SMark Rutland * Atomically updates @v to (@v + @i) with full ordering.
4567ad811070SMark Rutland *
4568ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_negative() there.
4569ad811070SMark Rutland *
4570ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
4571ad811070SMark Rutland */
457267d1b0deSMark Rutland static __always_inline bool
atomic_long_add_negative(long i,atomic_long_t * v)457367d1b0deSMark Rutland atomic_long_add_negative(long i, atomic_long_t *v)
457467d1b0deSMark Rutland {
4575e87c4f66SMarco Elver kcsan_mb();
457667d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4577c9268ac6SMark Rutland return raw_atomic_long_add_negative(i, v);
457867d1b0deSMark Rutland }
457967d1b0deSMark Rutland
4580ad811070SMark Rutland /**
4581ad811070SMark Rutland * atomic_long_add_negative_acquire() - atomic add and test if negative with acquire ordering
4582ad811070SMark Rutland * @i: long value to add
4583ad811070SMark Rutland * @v: pointer to atomic_long_t
4584ad811070SMark Rutland *
4585ad811070SMark Rutland * Atomically updates @v to (@v + @i) with acquire ordering.
4586ad811070SMark Rutland *
4587ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_acquire() there.
4588ad811070SMark Rutland *
4589ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
4590ad811070SMark Rutland */
4591e5ab9effSThomas Gleixner static __always_inline bool
atomic_long_add_negative_acquire(long i,atomic_long_t * v)4592e5ab9effSThomas Gleixner atomic_long_add_negative_acquire(long i, atomic_long_t *v)
4593e5ab9effSThomas Gleixner {
4594e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
4595c9268ac6SMark Rutland return raw_atomic_long_add_negative_acquire(i, v);
4596e5ab9effSThomas Gleixner }
4597e5ab9effSThomas Gleixner
4598ad811070SMark Rutland /**
4599ad811070SMark Rutland * atomic_long_add_negative_release() - atomic add and test if negative with release ordering
4600ad811070SMark Rutland * @i: long value to add
4601ad811070SMark Rutland * @v: pointer to atomic_long_t
4602ad811070SMark Rutland *
4603ad811070SMark Rutland * Atomically updates @v to (@v + @i) with release ordering.
4604ad811070SMark Rutland *
4605ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_release() there.
4606ad811070SMark Rutland *
4607ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
4608ad811070SMark Rutland */
4609e5ab9effSThomas Gleixner static __always_inline bool
atomic_long_add_negative_release(long i,atomic_long_t * v)4610e5ab9effSThomas Gleixner atomic_long_add_negative_release(long i, atomic_long_t *v)
4611e5ab9effSThomas Gleixner {
4612e5ab9effSThomas Gleixner kcsan_release();
4613e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
4614c9268ac6SMark Rutland return raw_atomic_long_add_negative_release(i, v);
4615e5ab9effSThomas Gleixner }
4616e5ab9effSThomas Gleixner
4617ad811070SMark Rutland /**
4618ad811070SMark Rutland * atomic_long_add_negative_relaxed() - atomic add and test if negative with relaxed ordering
4619ad811070SMark Rutland * @i: long value to add
4620ad811070SMark Rutland * @v: pointer to atomic_long_t
4621ad811070SMark Rutland *
4622ad811070SMark Rutland * Atomically updates @v to (@v + @i) with relaxed ordering.
4623ad811070SMark Rutland *
4624ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_negative_relaxed() there.
4625ad811070SMark Rutland *
4626ad811070SMark Rutland * Return: @true if the resulting value of @v is negative, @false otherwise.
4627ad811070SMark Rutland */
4628e5ab9effSThomas Gleixner static __always_inline bool
atomic_long_add_negative_relaxed(long i,atomic_long_t * v)4629e5ab9effSThomas Gleixner atomic_long_add_negative_relaxed(long i, atomic_long_t *v)
4630e5ab9effSThomas Gleixner {
4631e5ab9effSThomas Gleixner instrument_atomic_read_write(v, sizeof(*v));
4632c9268ac6SMark Rutland return raw_atomic_long_add_negative_relaxed(i, v);
4633e5ab9effSThomas Gleixner }
4634e5ab9effSThomas Gleixner
4635ad811070SMark Rutland /**
4636ad811070SMark Rutland * atomic_long_fetch_add_unless() - atomic add unless value with full ordering
4637ad811070SMark Rutland * @v: pointer to atomic_long_t
4638ad811070SMark Rutland * @a: long value to add
4639ad811070SMark Rutland * @u: long value to compare with
4640ad811070SMark Rutland *
4641ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
46426dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4643ad811070SMark Rutland *
4644ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_fetch_add_unless() there.
4645ad811070SMark Rutland *
4646ad811070SMark Rutland * Return: The original value of @v.
4647ad811070SMark Rutland */
464867d1b0deSMark Rutland static __always_inline long
atomic_long_fetch_add_unless(atomic_long_t * v,long a,long u)464967d1b0deSMark Rutland atomic_long_fetch_add_unless(atomic_long_t *v, long a, long u)
465067d1b0deSMark Rutland {
4651e87c4f66SMarco Elver kcsan_mb();
465267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4653c9268ac6SMark Rutland return raw_atomic_long_fetch_add_unless(v, a, u);
465467d1b0deSMark Rutland }
465567d1b0deSMark Rutland
4656ad811070SMark Rutland /**
4657ad811070SMark Rutland * atomic_long_add_unless() - atomic add unless value with full ordering
4658ad811070SMark Rutland * @v: pointer to atomic_long_t
4659ad811070SMark Rutland * @a: long value to add
4660ad811070SMark Rutland * @u: long value to compare with
4661ad811070SMark Rutland *
4662ad811070SMark Rutland * If (@v != @u), atomically updates @v to (@v + @a) with full ordering.
46636dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4664ad811070SMark Rutland *
4665ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_add_unless() there.
4666ad811070SMark Rutland *
4667ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
4668ad811070SMark Rutland */
466967d1b0deSMark Rutland static __always_inline bool
atomic_long_add_unless(atomic_long_t * v,long a,long u)467067d1b0deSMark Rutland atomic_long_add_unless(atomic_long_t *v, long a, long u)
467167d1b0deSMark Rutland {
4672e87c4f66SMarco Elver kcsan_mb();
467367d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4674c9268ac6SMark Rutland return raw_atomic_long_add_unless(v, a, u);
467567d1b0deSMark Rutland }
467667d1b0deSMark Rutland
4677ad811070SMark Rutland /**
4678ad811070SMark Rutland * atomic_long_inc_not_zero() - atomic increment unless zero with full ordering
4679ad811070SMark Rutland * @v: pointer to atomic_long_t
4680ad811070SMark Rutland *
4681ad811070SMark Rutland * If (@v != 0), atomically updates @v to (@v + 1) with full ordering.
46826dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4683ad811070SMark Rutland *
4684ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_not_zero() there.
4685ad811070SMark Rutland *
4686ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
4687ad811070SMark Rutland */
468867d1b0deSMark Rutland static __always_inline bool
atomic_long_inc_not_zero(atomic_long_t * v)468967d1b0deSMark Rutland atomic_long_inc_not_zero(atomic_long_t *v)
469067d1b0deSMark Rutland {
4691e87c4f66SMarco Elver kcsan_mb();
469267d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4693c9268ac6SMark Rutland return raw_atomic_long_inc_not_zero(v);
469467d1b0deSMark Rutland }
469567d1b0deSMark Rutland
4696ad811070SMark Rutland /**
4697ad811070SMark Rutland * atomic_long_inc_unless_negative() - atomic increment unless negative with full ordering
4698ad811070SMark Rutland * @v: pointer to atomic_long_t
4699ad811070SMark Rutland *
4700ad811070SMark Rutland * If (@v >= 0), atomically updates @v to (@v + 1) with full ordering.
47016dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4702ad811070SMark Rutland *
4703ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_inc_unless_negative() there.
4704ad811070SMark Rutland *
4705ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
4706ad811070SMark Rutland */
470767d1b0deSMark Rutland static __always_inline bool
atomic_long_inc_unless_negative(atomic_long_t * v)470867d1b0deSMark Rutland atomic_long_inc_unless_negative(atomic_long_t *v)
470967d1b0deSMark Rutland {
4710e87c4f66SMarco Elver kcsan_mb();
471167d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4712c9268ac6SMark Rutland return raw_atomic_long_inc_unless_negative(v);
471367d1b0deSMark Rutland }
471467d1b0deSMark Rutland
4715ad811070SMark Rutland /**
4716ad811070SMark Rutland * atomic_long_dec_unless_positive() - atomic decrement unless positive with full ordering
4717ad811070SMark Rutland * @v: pointer to atomic_long_t
4718ad811070SMark Rutland *
4719ad811070SMark Rutland * If (@v <= 0), atomically updates @v to (@v - 1) with full ordering.
47206dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4721ad811070SMark Rutland *
4722ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_unless_positive() there.
4723ad811070SMark Rutland *
4724ad811070SMark Rutland * Return: @true if @v was updated, @false otherwise.
4725ad811070SMark Rutland */
472667d1b0deSMark Rutland static __always_inline bool
atomic_long_dec_unless_positive(atomic_long_t * v)472767d1b0deSMark Rutland atomic_long_dec_unless_positive(atomic_long_t *v)
472867d1b0deSMark Rutland {
4729e87c4f66SMarco Elver kcsan_mb();
473067d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4731c9268ac6SMark Rutland return raw_atomic_long_dec_unless_positive(v);
473267d1b0deSMark Rutland }
473367d1b0deSMark Rutland
4734ad811070SMark Rutland /**
4735ad811070SMark Rutland * atomic_long_dec_if_positive() - atomic decrement if positive with full ordering
4736ad811070SMark Rutland * @v: pointer to atomic_long_t
4737ad811070SMark Rutland *
4738ad811070SMark Rutland * If (@v > 0), atomically updates @v to (@v - 1) with full ordering.
47396dfee110SMark Rutland * Otherwise, @v is not modified and relaxed ordering is provided.
4740ad811070SMark Rutland *
4741ad811070SMark Rutland * Unsafe to use in noinstr code; use raw_atomic_long_dec_if_positive() there.
4742ad811070SMark Rutland *
4743b33eb50aSMark Rutland * Return: The old value of (@v - 1), regardless of whether @v was updated.
4744ad811070SMark Rutland */
474567d1b0deSMark Rutland static __always_inline long
atomic_long_dec_if_positive(atomic_long_t * v)474667d1b0deSMark Rutland atomic_long_dec_if_positive(atomic_long_t *v)
474767d1b0deSMark Rutland {
4748e87c4f66SMarco Elver kcsan_mb();
474967d1b0deSMark Rutland instrument_atomic_read_write(v, sizeof(*v));
4750c9268ac6SMark Rutland return raw_atomic_long_dec_if_positive(v);
475167d1b0deSMark Rutland }
475267d1b0deSMark Rutland
4753e3d18ceeSMark Rutland #define xchg(ptr, ...) \
4754e3d18ceeSMark Rutland ({ \
4755e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4756e87c4f66SMarco Elver kcsan_mb(); \
4757ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4758c9268ac6SMark Rutland raw_xchg(__ai_ptr, __VA_ARGS__); \
4759e3d18ceeSMark Rutland })
4760e3d18ceeSMark Rutland
4761e3d18ceeSMark Rutland #define xchg_acquire(ptr, ...) \
4762e3d18ceeSMark Rutland ({ \
4763e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4764ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4765c9268ac6SMark Rutland raw_xchg_acquire(__ai_ptr, __VA_ARGS__); \
4766e3d18ceeSMark Rutland })
4767e3d18ceeSMark Rutland
4768e3d18ceeSMark Rutland #define xchg_release(ptr, ...) \
4769e3d18ceeSMark Rutland ({ \
4770e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4771e87c4f66SMarco Elver kcsan_release(); \
4772ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4773c9268ac6SMark Rutland raw_xchg_release(__ai_ptr, __VA_ARGS__); \
4774e3d18ceeSMark Rutland })
4775e3d18ceeSMark Rutland
4776e3d18ceeSMark Rutland #define xchg_relaxed(ptr, ...) \
4777e3d18ceeSMark Rutland ({ \
4778e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4779ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4780c9268ac6SMark Rutland raw_xchg_relaxed(__ai_ptr, __VA_ARGS__); \
4781e3d18ceeSMark Rutland })
4782e3d18ceeSMark Rutland
4783e3d18ceeSMark Rutland #define cmpxchg(ptr, ...) \
4784e3d18ceeSMark Rutland ({ \
4785e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4786e87c4f66SMarco Elver kcsan_mb(); \
4787ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4788c9268ac6SMark Rutland raw_cmpxchg(__ai_ptr, __VA_ARGS__); \
4789e3d18ceeSMark Rutland })
4790e3d18ceeSMark Rutland
4791e3d18ceeSMark Rutland #define cmpxchg_acquire(ptr, ...) \
4792e3d18ceeSMark Rutland ({ \
4793e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4794ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4795c9268ac6SMark Rutland raw_cmpxchg_acquire(__ai_ptr, __VA_ARGS__); \
4796e3d18ceeSMark Rutland })
4797e3d18ceeSMark Rutland
4798e3d18ceeSMark Rutland #define cmpxchg_release(ptr, ...) \
4799e3d18ceeSMark Rutland ({ \
4800e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4801e87c4f66SMarco Elver kcsan_release(); \
4802ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4803c9268ac6SMark Rutland raw_cmpxchg_release(__ai_ptr, __VA_ARGS__); \
4804e3d18ceeSMark Rutland })
4805e3d18ceeSMark Rutland
4806e3d18ceeSMark Rutland #define cmpxchg_relaxed(ptr, ...) \
4807e3d18ceeSMark Rutland ({ \
4808e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4809ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4810c9268ac6SMark Rutland raw_cmpxchg_relaxed(__ai_ptr, __VA_ARGS__); \
4811e3d18ceeSMark Rutland })
4812e3d18ceeSMark Rutland
4813e3d18ceeSMark Rutland #define cmpxchg64(ptr, ...) \
4814e3d18ceeSMark Rutland ({ \
4815e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4816e87c4f66SMarco Elver kcsan_mb(); \
4817ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4818c9268ac6SMark Rutland raw_cmpxchg64(__ai_ptr, __VA_ARGS__); \
4819e3d18ceeSMark Rutland })
4820e3d18ceeSMark Rutland
4821e3d18ceeSMark Rutland #define cmpxchg64_acquire(ptr, ...) \
4822e3d18ceeSMark Rutland ({ \
4823e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4824ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4825c9268ac6SMark Rutland raw_cmpxchg64_acquire(__ai_ptr, __VA_ARGS__); \
4826e3d18ceeSMark Rutland })
4827e3d18ceeSMark Rutland
4828e3d18ceeSMark Rutland #define cmpxchg64_release(ptr, ...) \
4829e3d18ceeSMark Rutland ({ \
4830e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4831e87c4f66SMarco Elver kcsan_release(); \
4832ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4833c9268ac6SMark Rutland raw_cmpxchg64_release(__ai_ptr, __VA_ARGS__); \
4834e3d18ceeSMark Rutland })
4835e3d18ceeSMark Rutland
4836e3d18ceeSMark Rutland #define cmpxchg64_relaxed(ptr, ...) \
4837e3d18ceeSMark Rutland ({ \
4838e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4839ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4840c9268ac6SMark Rutland raw_cmpxchg64_relaxed(__ai_ptr, __VA_ARGS__); \
4841e3d18ceeSMark Rutland })
4842e3d18ceeSMark Rutland
48438c8b096aSPeter Zijlstra #define cmpxchg128(ptr, ...) \
48448c8b096aSPeter Zijlstra ({ \
48458c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
48468c8b096aSPeter Zijlstra kcsan_mb(); \
48478c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4848c9268ac6SMark Rutland raw_cmpxchg128(__ai_ptr, __VA_ARGS__); \
48498c8b096aSPeter Zijlstra })
48508c8b096aSPeter Zijlstra
48518c8b096aSPeter Zijlstra #define cmpxchg128_acquire(ptr, ...) \
48528c8b096aSPeter Zijlstra ({ \
48538c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
48548c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4855c9268ac6SMark Rutland raw_cmpxchg128_acquire(__ai_ptr, __VA_ARGS__); \
48568c8b096aSPeter Zijlstra })
48578c8b096aSPeter Zijlstra
48588c8b096aSPeter Zijlstra #define cmpxchg128_release(ptr, ...) \
48598c8b096aSPeter Zijlstra ({ \
48608c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
48618c8b096aSPeter Zijlstra kcsan_release(); \
48628c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4863c9268ac6SMark Rutland raw_cmpxchg128_release(__ai_ptr, __VA_ARGS__); \
48648c8b096aSPeter Zijlstra })
48658c8b096aSPeter Zijlstra
48668c8b096aSPeter Zijlstra #define cmpxchg128_relaxed(ptr, ...) \
48678c8b096aSPeter Zijlstra ({ \
48688c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
48698c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4870c9268ac6SMark Rutland raw_cmpxchg128_relaxed(__ai_ptr, __VA_ARGS__); \
48718c8b096aSPeter Zijlstra })
48728c8b096aSPeter Zijlstra
4873e3d18ceeSMark Rutland #define try_cmpxchg(ptr, oldp, ...) \
4874e3d18ceeSMark Rutland ({ \
4875e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4876e3d18ceeSMark Rutland typeof(oldp) __ai_oldp = (oldp); \
4877e87c4f66SMarco Elver kcsan_mb(); \
4878ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4879ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4880c9268ac6SMark Rutland raw_try_cmpxchg(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4881e3d18ceeSMark Rutland })
4882e3d18ceeSMark Rutland
4883e3d18ceeSMark Rutland #define try_cmpxchg_acquire(ptr, oldp, ...) \
4884e3d18ceeSMark Rutland ({ \
4885e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4886e3d18ceeSMark Rutland typeof(oldp) __ai_oldp = (oldp); \
4887ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4888ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4889c9268ac6SMark Rutland raw_try_cmpxchg_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4890e3d18ceeSMark Rutland })
4891e3d18ceeSMark Rutland
4892e3d18ceeSMark Rutland #define try_cmpxchg_release(ptr, oldp, ...) \
4893e3d18ceeSMark Rutland ({ \
4894e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4895e3d18ceeSMark Rutland typeof(oldp) __ai_oldp = (oldp); \
4896e87c4f66SMarco Elver kcsan_release(); \
4897ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4898ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4899c9268ac6SMark Rutland raw_try_cmpxchg_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4900e3d18ceeSMark Rutland })
4901e3d18ceeSMark Rutland
4902e3d18ceeSMark Rutland #define try_cmpxchg_relaxed(ptr, oldp, ...) \
4903e3d18ceeSMark Rutland ({ \
4904e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4905e3d18ceeSMark Rutland typeof(oldp) __ai_oldp = (oldp); \
4906ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4907ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4908c9268ac6SMark Rutland raw_try_cmpxchg_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
4909e3d18ceeSMark Rutland })
4910e3d18ceeSMark Rutland
49110aa7be05SUros Bizjak #define try_cmpxchg64(ptr, oldp, ...) \
49120aa7be05SUros Bizjak ({ \
49130aa7be05SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
49140aa7be05SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
49150aa7be05SUros Bizjak kcsan_mb(); \
4916ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4917ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4918c9268ac6SMark Rutland raw_try_cmpxchg64(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49190aa7be05SUros Bizjak })
49200aa7be05SUros Bizjak
49210aa7be05SUros Bizjak #define try_cmpxchg64_acquire(ptr, oldp, ...) \
49220aa7be05SUros Bizjak ({ \
49230aa7be05SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
49240aa7be05SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
4925ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4926ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4927c9268ac6SMark Rutland raw_try_cmpxchg64_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49280aa7be05SUros Bizjak })
49290aa7be05SUros Bizjak
49300aa7be05SUros Bizjak #define try_cmpxchg64_release(ptr, oldp, ...) \
49310aa7be05SUros Bizjak ({ \
49320aa7be05SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
49330aa7be05SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
49340aa7be05SUros Bizjak kcsan_release(); \
4935ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4936ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4937c9268ac6SMark Rutland raw_try_cmpxchg64_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49380aa7be05SUros Bizjak })
49390aa7be05SUros Bizjak
49400aa7be05SUros Bizjak #define try_cmpxchg64_relaxed(ptr, oldp, ...) \
49410aa7be05SUros Bizjak ({ \
49420aa7be05SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
49430aa7be05SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
4944ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4945ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4946c9268ac6SMark Rutland raw_try_cmpxchg64_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49470aa7be05SUros Bizjak })
49480aa7be05SUros Bizjak
49498c8b096aSPeter Zijlstra #define try_cmpxchg128(ptr, oldp, ...) \
49508c8b096aSPeter Zijlstra ({ \
49518c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
49528c8b096aSPeter Zijlstra typeof(oldp) __ai_oldp = (oldp); \
49538c8b096aSPeter Zijlstra kcsan_mb(); \
49548c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
49558c8b096aSPeter Zijlstra instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4956c9268ac6SMark Rutland raw_try_cmpxchg128(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49578c8b096aSPeter Zijlstra })
49588c8b096aSPeter Zijlstra
49598c8b096aSPeter Zijlstra #define try_cmpxchg128_acquire(ptr, oldp, ...) \
49608c8b096aSPeter Zijlstra ({ \
49618c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
49628c8b096aSPeter Zijlstra typeof(oldp) __ai_oldp = (oldp); \
49638c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
49648c8b096aSPeter Zijlstra instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4965c9268ac6SMark Rutland raw_try_cmpxchg128_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49668c8b096aSPeter Zijlstra })
49678c8b096aSPeter Zijlstra
49688c8b096aSPeter Zijlstra #define try_cmpxchg128_release(ptr, oldp, ...) \
49698c8b096aSPeter Zijlstra ({ \
49708c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
49718c8b096aSPeter Zijlstra typeof(oldp) __ai_oldp = (oldp); \
49728c8b096aSPeter Zijlstra kcsan_release(); \
49738c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
49748c8b096aSPeter Zijlstra instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4975c9268ac6SMark Rutland raw_try_cmpxchg128_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49768c8b096aSPeter Zijlstra })
49778c8b096aSPeter Zijlstra
49788c8b096aSPeter Zijlstra #define try_cmpxchg128_relaxed(ptr, oldp, ...) \
49798c8b096aSPeter Zijlstra ({ \
49808c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
49818c8b096aSPeter Zijlstra typeof(oldp) __ai_oldp = (oldp); \
49828c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
49838c8b096aSPeter Zijlstra instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
4984c9268ac6SMark Rutland raw_try_cmpxchg128_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
49858c8b096aSPeter Zijlstra })
49868c8b096aSPeter Zijlstra
4987e3d18ceeSMark Rutland #define cmpxchg_local(ptr, ...) \
4988e3d18ceeSMark Rutland ({ \
4989e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4990ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4991c9268ac6SMark Rutland raw_cmpxchg_local(__ai_ptr, __VA_ARGS__); \
4992e3d18ceeSMark Rutland })
4993e3d18ceeSMark Rutland
4994e3d18ceeSMark Rutland #define cmpxchg64_local(ptr, ...) \
4995e3d18ceeSMark Rutland ({ \
4996e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
4997ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
4998c9268ac6SMark Rutland raw_cmpxchg64_local(__ai_ptr, __VA_ARGS__); \
4999e3d18ceeSMark Rutland })
5000e3d18ceeSMark Rutland
50018c8b096aSPeter Zijlstra #define cmpxchg128_local(ptr, ...) \
50028c8b096aSPeter Zijlstra ({ \
50038c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
50048c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5005c9268ac6SMark Rutland raw_cmpxchg128_local(__ai_ptr, __VA_ARGS__); \
50068c8b096aSPeter Zijlstra })
50078c8b096aSPeter Zijlstra
5008e3d18ceeSMark Rutland #define sync_cmpxchg(ptr, ...) \
5009e3d18ceeSMark Rutland ({ \
5010e3d18ceeSMark Rutland typeof(ptr) __ai_ptr = (ptr); \
5011e87c4f66SMarco Elver kcsan_mb(); \
5012ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5013c9268ac6SMark Rutland raw_sync_cmpxchg(__ai_ptr, __VA_ARGS__); \
5014e3d18ceeSMark Rutland })
5015e3d18ceeSMark Rutland
5016e6ce9d74SUros Bizjak #define try_cmpxchg_local(ptr, oldp, ...) \
5017e6ce9d74SUros Bizjak ({ \
5018e6ce9d74SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
5019e6ce9d74SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
5020ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5021ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5022c9268ac6SMark Rutland raw_try_cmpxchg_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
5023e6ce9d74SUros Bizjak })
5024e6ce9d74SUros Bizjak
5025e6ce9d74SUros Bizjak #define try_cmpxchg64_local(ptr, oldp, ...) \
5026e6ce9d74SUros Bizjak ({ \
5027e6ce9d74SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
5028e6ce9d74SUros Bizjak typeof(oldp) __ai_oldp = (oldp); \
5029ec570320SMark Rutland instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5030ec570320SMark Rutland instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5031c9268ac6SMark Rutland raw_try_cmpxchg64_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
5032e6ce9d74SUros Bizjak })
5033e6ce9d74SUros Bizjak
50348c8b096aSPeter Zijlstra #define try_cmpxchg128_local(ptr, oldp, ...) \
50358c8b096aSPeter Zijlstra ({ \
50368c8b096aSPeter Zijlstra typeof(ptr) __ai_ptr = (ptr); \
50378c8b096aSPeter Zijlstra typeof(oldp) __ai_oldp = (oldp); \
50388c8b096aSPeter Zijlstra instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
50398c8b096aSPeter Zijlstra instrument_read_write(__ai_oldp, sizeof(*__ai_oldp)); \
5040c9268ac6SMark Rutland raw_try_cmpxchg128_local(__ai_ptr, __ai_oldp, __VA_ARGS__); \
50418c8b096aSPeter Zijlstra })
50428c8b096aSPeter Zijlstra
5043e01cc1e8SUros Bizjak #define sync_try_cmpxchg(ptr, ...) \
5044e01cc1e8SUros Bizjak ({ \
5045e01cc1e8SUros Bizjak typeof(ptr) __ai_ptr = (ptr); \
5046e01cc1e8SUros Bizjak kcsan_mb(); \
5047e01cc1e8SUros Bizjak instrument_atomic_read_write(__ai_ptr, sizeof(*__ai_ptr)); \
5048e01cc1e8SUros Bizjak raw_sync_try_cmpxchg(__ai_ptr, __VA_ARGS__); \
5049e01cc1e8SUros Bizjak })
5050e01cc1e8SUros Bizjak
5051e3d18ceeSMark Rutland
5052e3d18ceeSMark Rutland #endif /* _LINUX_ATOMIC_INSTRUMENTED_H */
5053*f92a59f6SCarlos Llamas // 8829b337928e9508259079d32581775ececd415b
5054