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