Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_GENERIC_PERCPU_H_
3#define _ASM_GENERIC_PERCPU_H_
4
5#ifndef __ASSEMBLER__
6
7#include <linux/compiler.h>
8#include <linux/threads.h>
9#include <linux/percpu-defs.h>
10
11/*
12 * __percpu_qual is the qualifier for the percpu named address space.
13 *
14 * Most arches use generic named address space for percpu variables but
15 * some arches define percpu variables in different named address space
16 * (on the x86 arch, percpu variable may be declared as being relative
17 * to the %fs or %gs segments using __seg_fs or __seg_gs named address
18 * space qualifier).
19 */
20#ifndef __percpu_qual
21# define __percpu_qual
22#endif
23
24#ifdef CONFIG_SMP
25
26/*
27 * per_cpu_offset() is the offset that has to be added to a
28 * percpu variable to get to the instance for a certain processor.
29 *
30 * Most arches use the __per_cpu_offset array for those offsets but
31 * some arches have their own ways of determining the offset (x86_64, s390).
32 */
33#ifndef __per_cpu_offset
34extern unsigned long __per_cpu_offset[NR_CPUS];
35
36#define per_cpu_offset(x) (__per_cpu_offset[x])
37#endif
38
39/*
40 * Determine the offset for the currently active processor.
41 * An arch may define __my_cpu_offset to provide a more effective
42 * means of obtaining the offset to the per cpu variables of the
43 * current processor.
44 */
45#ifndef __my_cpu_offset
46#define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
47#endif
48#ifdef CONFIG_DEBUG_PREEMPT
49#define my_cpu_offset per_cpu_offset(smp_processor_id())
50#else
51#define my_cpu_offset __my_cpu_offset
52#endif
53
54/*
55 * Arch may define arch_raw_cpu_ptr() to provide more efficient address
56 * translations for raw_cpu_ptr().
57 */
58#ifndef arch_raw_cpu_ptr
59#define arch_raw_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
60#endif
61
62#ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
63extern void setup_per_cpu_areas(void);
64#endif
65
66#endif /* SMP */
67
68#ifndef PER_CPU_BASE_SECTION
69#ifdef CONFIG_SMP
70#define PER_CPU_BASE_SECTION ".data..percpu"
71#else
72#define PER_CPU_BASE_SECTION ".data"
73#endif
74#endif
75
76#ifndef PER_CPU_ATTRIBUTES
77#define PER_CPU_ATTRIBUTES
78#endif
79
80#define raw_cpu_generic_read(pcp) \
81({ \
82 *raw_cpu_ptr(&(pcp)); \
83})
84
85#define raw_cpu_generic_to_op(pcp, val, op) \
86do { \
87 *raw_cpu_ptr(&(pcp)) op val; \
88} while (0)
89
90#define raw_cpu_generic_add_return(pcp, val) \
91({ \
92 TYPEOF_UNQUAL(pcp) *__p = raw_cpu_ptr(&(pcp)); \
93 \
94 *__p += val; \
95 *__p; \
96})
97
98#define raw_cpu_generic_xchg(pcp, nval) \
99({ \
100 TYPEOF_UNQUAL(pcp) *__p = raw_cpu_ptr(&(pcp)); \
101 TYPEOF_UNQUAL(pcp) __ret; \
102 __ret = *__p; \
103 *__p = nval; \
104 __ret; \
105})
106
107#define __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, _cmpxchg) \
108({ \
109 TYPEOF_UNQUAL(pcp) __val, __old = *(ovalp); \
110 __val = _cmpxchg(pcp, __old, nval); \
111 if (__val != __old) \
112 *(ovalp) = __val; \
113 __val == __old; \
114})
115
116#define raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval) \
117({ \
118 TYPEOF_UNQUAL(pcp) *__p = raw_cpu_ptr(&(pcp)); \
119 TYPEOF_UNQUAL(pcp) __val = *__p, ___old = *(ovalp); \
120 bool __ret; \
121 if (__val == ___old) { \
122 *__p = nval; \
123 __ret = true; \
124 } else { \
125 *(ovalp) = __val; \
126 __ret = false; \
127 } \
128 __ret; \
129})
130
131#define raw_cpu_generic_cmpxchg(pcp, oval, nval) \
132({ \
133 TYPEOF_UNQUAL(pcp) __old = (oval); \
134 raw_cpu_generic_try_cmpxchg(pcp, &__old, nval); \
135 __old; \
136})
137
138#define __this_cpu_generic_read_nopreempt(pcp) \
139({ \
140 TYPEOF_UNQUAL(pcp) ___ret; \
141 preempt_disable_notrace(); \
142 ___ret = READ_ONCE(*raw_cpu_ptr(&(pcp))); \
143 preempt_enable_notrace(); \
144 ___ret; \
145})
146
147#define __this_cpu_generic_read_noirq(pcp) \
148({ \
149 TYPEOF_UNQUAL(pcp) ___ret; \
150 unsigned long ___flags; \
151 raw_local_irq_save(___flags); \
152 ___ret = raw_cpu_generic_read(pcp); \
153 raw_local_irq_restore(___flags); \
154 ___ret; \
155})
156
157#define this_cpu_generic_read(pcp) \
158({ \
159 TYPEOF_UNQUAL(pcp) __ret; \
160 if (__native_word(pcp)) \
161 __ret = __this_cpu_generic_read_nopreempt(pcp); \
162 else \
163 __ret = __this_cpu_generic_read_noirq(pcp); \
164 __ret; \
165})
166
167#define this_cpu_generic_to_op(pcp, val, op) \
168do { \
169 unsigned long __flags; \
170 raw_local_irq_save(__flags); \
171 raw_cpu_generic_to_op(pcp, val, op); \
172 raw_local_irq_restore(__flags); \
173} while (0)
174
175
176#define this_cpu_generic_add_return(pcp, val) \
177({ \
178 TYPEOF_UNQUAL(pcp) __ret; \
179 unsigned long __flags; \
180 raw_local_irq_save(__flags); \
181 __ret = raw_cpu_generic_add_return(pcp, val); \
182 raw_local_irq_restore(__flags); \
183 __ret; \
184})
185
186#define this_cpu_generic_xchg(pcp, nval) \
187({ \
188 TYPEOF_UNQUAL(pcp) __ret; \
189 unsigned long __flags; \
190 raw_local_irq_save(__flags); \
191 __ret = raw_cpu_generic_xchg(pcp, nval); \
192 raw_local_irq_restore(__flags); \
193 __ret; \
194})
195
196#define this_cpu_generic_try_cmpxchg(pcp, ovalp, nval) \
197({ \
198 bool __ret; \
199 unsigned long __flags; \
200 raw_local_irq_save(__flags); \
201 __ret = raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval); \
202 raw_local_irq_restore(__flags); \
203 __ret; \
204})
205
206#define this_cpu_generic_cmpxchg(pcp, oval, nval) \
207({ \
208 TYPEOF_UNQUAL(pcp) __ret; \
209 unsigned long __flags; \
210 raw_local_irq_save(__flags); \
211 __ret = raw_cpu_generic_cmpxchg(pcp, oval, nval); \
212 raw_local_irq_restore(__flags); \
213 __ret; \
214})
215
216#ifndef raw_cpu_read_1
217#define raw_cpu_read_1(pcp) raw_cpu_generic_read(pcp)
218#endif
219#ifndef raw_cpu_read_2
220#define raw_cpu_read_2(pcp) raw_cpu_generic_read(pcp)
221#endif
222#ifndef raw_cpu_read_4
223#define raw_cpu_read_4(pcp) raw_cpu_generic_read(pcp)
224#endif
225#ifndef raw_cpu_read_8
226#define raw_cpu_read_8(pcp) raw_cpu_generic_read(pcp)
227#endif
228
229#ifndef raw_cpu_write_1
230#define raw_cpu_write_1(pcp, val) raw_cpu_generic_to_op(pcp, val, =)
231#endif
232#ifndef raw_cpu_write_2
233#define raw_cpu_write_2(pcp, val) raw_cpu_generic_to_op(pcp, val, =)
234#endif
235#ifndef raw_cpu_write_4
236#define raw_cpu_write_4(pcp, val) raw_cpu_generic_to_op(pcp, val, =)
237#endif
238#ifndef raw_cpu_write_8
239#define raw_cpu_write_8(pcp, val) raw_cpu_generic_to_op(pcp, val, =)
240#endif
241
242#ifndef raw_cpu_add_1
243#define raw_cpu_add_1(pcp, val) raw_cpu_generic_to_op(pcp, val, +=)
244#endif
245#ifndef raw_cpu_add_2
246#define raw_cpu_add_2(pcp, val) raw_cpu_generic_to_op(pcp, val, +=)
247#endif
248#ifndef raw_cpu_add_4
249#define raw_cpu_add_4(pcp, val) raw_cpu_generic_to_op(pcp, val, +=)
250#endif
251#ifndef raw_cpu_add_8
252#define raw_cpu_add_8(pcp, val) raw_cpu_generic_to_op(pcp, val, +=)
253#endif
254
255#ifndef raw_cpu_and_1
256#define raw_cpu_and_1(pcp, val) raw_cpu_generic_to_op(pcp, val, &=)
257#endif
258#ifndef raw_cpu_and_2
259#define raw_cpu_and_2(pcp, val) raw_cpu_generic_to_op(pcp, val, &=)
260#endif
261#ifndef raw_cpu_and_4
262#define raw_cpu_and_4(pcp, val) raw_cpu_generic_to_op(pcp, val, &=)
263#endif
264#ifndef raw_cpu_and_8
265#define raw_cpu_and_8(pcp, val) raw_cpu_generic_to_op(pcp, val, &=)
266#endif
267
268#ifndef raw_cpu_or_1
269#define raw_cpu_or_1(pcp, val) raw_cpu_generic_to_op(pcp, val, |=)
270#endif
271#ifndef raw_cpu_or_2
272#define raw_cpu_or_2(pcp, val) raw_cpu_generic_to_op(pcp, val, |=)
273#endif
274#ifndef raw_cpu_or_4
275#define raw_cpu_or_4(pcp, val) raw_cpu_generic_to_op(pcp, val, |=)
276#endif
277#ifndef raw_cpu_or_8
278#define raw_cpu_or_8(pcp, val) raw_cpu_generic_to_op(pcp, val, |=)
279#endif
280
281#ifndef raw_cpu_add_return_1
282#define raw_cpu_add_return_1(pcp, val) raw_cpu_generic_add_return(pcp, val)
283#endif
284#ifndef raw_cpu_add_return_2
285#define raw_cpu_add_return_2(pcp, val) raw_cpu_generic_add_return(pcp, val)
286#endif
287#ifndef raw_cpu_add_return_4
288#define raw_cpu_add_return_4(pcp, val) raw_cpu_generic_add_return(pcp, val)
289#endif
290#ifndef raw_cpu_add_return_8
291#define raw_cpu_add_return_8(pcp, val) raw_cpu_generic_add_return(pcp, val)
292#endif
293
294#ifndef raw_cpu_xchg_1
295#define raw_cpu_xchg_1(pcp, nval) raw_cpu_generic_xchg(pcp, nval)
296#endif
297#ifndef raw_cpu_xchg_2
298#define raw_cpu_xchg_2(pcp, nval) raw_cpu_generic_xchg(pcp, nval)
299#endif
300#ifndef raw_cpu_xchg_4
301#define raw_cpu_xchg_4(pcp, nval) raw_cpu_generic_xchg(pcp, nval)
302#endif
303#ifndef raw_cpu_xchg_8
304#define raw_cpu_xchg_8(pcp, nval) raw_cpu_generic_xchg(pcp, nval)
305#endif
306
307#ifndef raw_cpu_try_cmpxchg_1
308#ifdef raw_cpu_cmpxchg_1
309#define raw_cpu_try_cmpxchg_1(pcp, ovalp, nval) \
310 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg_1)
311#else
312#define raw_cpu_try_cmpxchg_1(pcp, ovalp, nval) \
313 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
314#endif
315#endif
316#ifndef raw_cpu_try_cmpxchg_2
317#ifdef raw_cpu_cmpxchg_2
318#define raw_cpu_try_cmpxchg_2(pcp, ovalp, nval) \
319 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg_2)
320#else
321#define raw_cpu_try_cmpxchg_2(pcp, ovalp, nval) \
322 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
323#endif
324#endif
325#ifndef raw_cpu_try_cmpxchg_4
326#ifdef raw_cpu_cmpxchg_4
327#define raw_cpu_try_cmpxchg_4(pcp, ovalp, nval) \
328 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg_4)
329#else
330#define raw_cpu_try_cmpxchg_4(pcp, ovalp, nval) \
331 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
332#endif
333#endif
334#ifndef raw_cpu_try_cmpxchg_8
335#ifdef raw_cpu_cmpxchg_8
336#define raw_cpu_try_cmpxchg_8(pcp, ovalp, nval) \
337 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg_8)
338#else
339#define raw_cpu_try_cmpxchg_8(pcp, ovalp, nval) \
340 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
341#endif
342#endif
343
344#ifndef raw_cpu_try_cmpxchg64
345#ifdef raw_cpu_cmpxchg64
346#define raw_cpu_try_cmpxchg64(pcp, ovalp, nval) \
347 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg64)
348#else
349#define raw_cpu_try_cmpxchg64(pcp, ovalp, nval) \
350 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
351#endif
352#endif
353#ifndef raw_cpu_try_cmpxchg128
354#ifdef raw_cpu_cmpxchg128
355#define raw_cpu_try_cmpxchg128(pcp, ovalp, nval) \
356 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, raw_cpu_cmpxchg128)
357#else
358#define raw_cpu_try_cmpxchg128(pcp, ovalp, nval) \
359 raw_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
360#endif
361#endif
362
363#ifndef raw_cpu_cmpxchg_1
364#define raw_cpu_cmpxchg_1(pcp, oval, nval) \
365 raw_cpu_generic_cmpxchg(pcp, oval, nval)
366#endif
367#ifndef raw_cpu_cmpxchg_2
368#define raw_cpu_cmpxchg_2(pcp, oval, nval) \
369 raw_cpu_generic_cmpxchg(pcp, oval, nval)
370#endif
371#ifndef raw_cpu_cmpxchg_4
372#define raw_cpu_cmpxchg_4(pcp, oval, nval) \
373 raw_cpu_generic_cmpxchg(pcp, oval, nval)
374#endif
375#ifndef raw_cpu_cmpxchg_8
376#define raw_cpu_cmpxchg_8(pcp, oval, nval) \
377 raw_cpu_generic_cmpxchg(pcp, oval, nval)
378#endif
379
380#ifndef raw_cpu_cmpxchg64
381#define raw_cpu_cmpxchg64(pcp, oval, nval) \
382 raw_cpu_generic_cmpxchg(pcp, oval, nval)
383#endif
384#ifndef raw_cpu_cmpxchg128
385#define raw_cpu_cmpxchg128(pcp, oval, nval) \
386 raw_cpu_generic_cmpxchg(pcp, oval, nval)
387#endif
388
389#ifndef this_cpu_read_1
390#define this_cpu_read_1(pcp) this_cpu_generic_read(pcp)
391#endif
392#ifndef this_cpu_read_2
393#define this_cpu_read_2(pcp) this_cpu_generic_read(pcp)
394#endif
395#ifndef this_cpu_read_4
396#define this_cpu_read_4(pcp) this_cpu_generic_read(pcp)
397#endif
398#ifndef this_cpu_read_8
399#define this_cpu_read_8(pcp) this_cpu_generic_read(pcp)
400#endif
401
402#ifndef this_cpu_write_1
403#define this_cpu_write_1(pcp, val) this_cpu_generic_to_op(pcp, val, =)
404#endif
405#ifndef this_cpu_write_2
406#define this_cpu_write_2(pcp, val) this_cpu_generic_to_op(pcp, val, =)
407#endif
408#ifndef this_cpu_write_4
409#define this_cpu_write_4(pcp, val) this_cpu_generic_to_op(pcp, val, =)
410#endif
411#ifndef this_cpu_write_8
412#define this_cpu_write_8(pcp, val) this_cpu_generic_to_op(pcp, val, =)
413#endif
414
415#ifndef this_cpu_add_1
416#define this_cpu_add_1(pcp, val) this_cpu_generic_to_op(pcp, val, +=)
417#endif
418#ifndef this_cpu_add_2
419#define this_cpu_add_2(pcp, val) this_cpu_generic_to_op(pcp, val, +=)
420#endif
421#ifndef this_cpu_add_4
422#define this_cpu_add_4(pcp, val) this_cpu_generic_to_op(pcp, val, +=)
423#endif
424#ifndef this_cpu_add_8
425#define this_cpu_add_8(pcp, val) this_cpu_generic_to_op(pcp, val, +=)
426#endif
427
428#ifndef this_cpu_and_1
429#define this_cpu_and_1(pcp, val) this_cpu_generic_to_op(pcp, val, &=)
430#endif
431#ifndef this_cpu_and_2
432#define this_cpu_and_2(pcp, val) this_cpu_generic_to_op(pcp, val, &=)
433#endif
434#ifndef this_cpu_and_4
435#define this_cpu_and_4(pcp, val) this_cpu_generic_to_op(pcp, val, &=)
436#endif
437#ifndef this_cpu_and_8
438#define this_cpu_and_8(pcp, val) this_cpu_generic_to_op(pcp, val, &=)
439#endif
440
441#ifndef this_cpu_or_1
442#define this_cpu_or_1(pcp, val) this_cpu_generic_to_op(pcp, val, |=)
443#endif
444#ifndef this_cpu_or_2
445#define this_cpu_or_2(pcp, val) this_cpu_generic_to_op(pcp, val, |=)
446#endif
447#ifndef this_cpu_or_4
448#define this_cpu_or_4(pcp, val) this_cpu_generic_to_op(pcp, val, |=)
449#endif
450#ifndef this_cpu_or_8
451#define this_cpu_or_8(pcp, val) this_cpu_generic_to_op(pcp, val, |=)
452#endif
453
454#ifndef this_cpu_add_return_1
455#define this_cpu_add_return_1(pcp, val) this_cpu_generic_add_return(pcp, val)
456#endif
457#ifndef this_cpu_add_return_2
458#define this_cpu_add_return_2(pcp, val) this_cpu_generic_add_return(pcp, val)
459#endif
460#ifndef this_cpu_add_return_4
461#define this_cpu_add_return_4(pcp, val) this_cpu_generic_add_return(pcp, val)
462#endif
463#ifndef this_cpu_add_return_8
464#define this_cpu_add_return_8(pcp, val) this_cpu_generic_add_return(pcp, val)
465#endif
466
467#ifndef this_cpu_xchg_1
468#define this_cpu_xchg_1(pcp, nval) this_cpu_generic_xchg(pcp, nval)
469#endif
470#ifndef this_cpu_xchg_2
471#define this_cpu_xchg_2(pcp, nval) this_cpu_generic_xchg(pcp, nval)
472#endif
473#ifndef this_cpu_xchg_4
474#define this_cpu_xchg_4(pcp, nval) this_cpu_generic_xchg(pcp, nval)
475#endif
476#ifndef this_cpu_xchg_8
477#define this_cpu_xchg_8(pcp, nval) this_cpu_generic_xchg(pcp, nval)
478#endif
479
480#ifndef this_cpu_try_cmpxchg_1
481#ifdef this_cpu_cmpxchg_1
482#define this_cpu_try_cmpxchg_1(pcp, ovalp, nval) \
483 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg_1)
484#else
485#define this_cpu_try_cmpxchg_1(pcp, ovalp, nval) \
486 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
487#endif
488#endif
489#ifndef this_cpu_try_cmpxchg_2
490#ifdef this_cpu_cmpxchg_2
491#define this_cpu_try_cmpxchg_2(pcp, ovalp, nval) \
492 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg_2)
493#else
494#define this_cpu_try_cmpxchg_2(pcp, ovalp, nval) \
495 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
496#endif
497#endif
498#ifndef this_cpu_try_cmpxchg_4
499#ifdef this_cpu_cmpxchg_4
500#define this_cpu_try_cmpxchg_4(pcp, ovalp, nval) \
501 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg_4)
502#else
503#define this_cpu_try_cmpxchg_4(pcp, ovalp, nval) \
504 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
505#endif
506#endif
507#ifndef this_cpu_try_cmpxchg_8
508#ifdef this_cpu_cmpxchg_8
509#define this_cpu_try_cmpxchg_8(pcp, ovalp, nval) \
510 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg_8)
511#else
512#define this_cpu_try_cmpxchg_8(pcp, ovalp, nval) \
513 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
514#endif
515#endif
516
517#ifndef this_cpu_try_cmpxchg64
518#ifdef this_cpu_cmpxchg64
519#define this_cpu_try_cmpxchg64(pcp, ovalp, nval) \
520 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg64)
521#else
522#define this_cpu_try_cmpxchg64(pcp, ovalp, nval) \
523 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
524#endif
525#endif
526#ifndef this_cpu_try_cmpxchg128
527#ifdef this_cpu_cmpxchg128
528#define this_cpu_try_cmpxchg128(pcp, ovalp, nval) \
529 __cpu_fallback_try_cmpxchg(pcp, ovalp, nval, this_cpu_cmpxchg128)
530#else
531#define this_cpu_try_cmpxchg128(pcp, ovalp, nval) \
532 this_cpu_generic_try_cmpxchg(pcp, ovalp, nval)
533#endif
534#endif
535
536#ifndef this_cpu_cmpxchg_1
537#define this_cpu_cmpxchg_1(pcp, oval, nval) \
538 this_cpu_generic_cmpxchg(pcp, oval, nval)
539#endif
540#ifndef this_cpu_cmpxchg_2
541#define this_cpu_cmpxchg_2(pcp, oval, nval) \
542 this_cpu_generic_cmpxchg(pcp, oval, nval)
543#endif
544#ifndef this_cpu_cmpxchg_4
545#define this_cpu_cmpxchg_4(pcp, oval, nval) \
546 this_cpu_generic_cmpxchg(pcp, oval, nval)
547#endif
548#ifndef this_cpu_cmpxchg_8
549#define this_cpu_cmpxchg_8(pcp, oval, nval) \
550 this_cpu_generic_cmpxchg(pcp, oval, nval)
551#endif
552
553#ifndef this_cpu_cmpxchg64
554#define this_cpu_cmpxchg64(pcp, oval, nval) \
555 this_cpu_generic_cmpxchg(pcp, oval, nval)
556#endif
557#ifndef this_cpu_cmpxchg128
558#define this_cpu_cmpxchg128(pcp, oval, nval) \
559 this_cpu_generic_cmpxchg(pcp, oval, nval)
560#endif
561
562#endif /* __ASSEMBLER__ */
563#endif /* _ASM_GENERIC_PERCPU_H_ */