linux/include/linux/percpu.h
<<
>>
Prefs
   1#ifndef __LINUX_PERCPU_H
   2#define __LINUX_PERCPU_H
   3
   4#include <linux/preempt.h>
   5#include <linux/smp.h>
   6#include <linux/cpumask.h>
   7#include <linux/pfn.h>
   8#include <linux/init.h>
   9
  10#include <asm/percpu.h>
  11
  12/* enough to cover all DEFINE_PER_CPUs in modules */
  13#ifdef CONFIG_MODULES
  14#define PERCPU_MODULE_RESERVE           (8 << 10)
  15#else
  16#define PERCPU_MODULE_RESERVE           0
  17#endif
  18
  19#ifndef PERCPU_ENOUGH_ROOM
  20#define PERCPU_ENOUGH_ROOM                                              \
  21        (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) +      \
  22         PERCPU_MODULE_RESERVE)
  23#endif
  24
  25/*
  26 * Must be an lvalue. Since @var must be a simple identifier,
  27 * we force a syntax error here if it isn't.
  28 */
  29#define get_cpu_var(var) (*({                           \
  30        preempt_disable();                              \
  31        &__get_cpu_var(var); }))
  32
  33/*
  34 * The weird & is necessary because sparse considers (void)(var) to be
  35 * a direct dereference of percpu variable (var).
  36 */
  37#define put_cpu_var(var) do {                           \
  38        (void)&(var);                                   \
  39        preempt_enable();                               \
  40} while (0)
  41
  42#ifdef CONFIG_SMP
  43
  44/* minimum unit size, also is the maximum supported allocation size */
  45#define PCPU_MIN_UNIT_SIZE              PFN_ALIGN(64 << 10)
  46
  47/*
  48 * PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy
  49 * back on the first chunk for dynamic percpu allocation if arch is
  50 * manually allocating and mapping it for faster access (as a part of
  51 * large page mapping for example).
  52 *
  53 * The following values give between one and two pages of free space
  54 * after typical minimal boot (2-way SMP, single disk and NIC) with
  55 * both defconfig and a distro config on x86_64 and 32.  More
  56 * intelligent way to determine this would be nice.
  57 */
  58#if BITS_PER_LONG > 32
  59#define PERCPU_DYNAMIC_RESERVE          (20 << 10)
  60#else
  61#define PERCPU_DYNAMIC_RESERVE          (12 << 10)
  62#endif
  63
  64extern void *pcpu_base_addr;
  65extern const unsigned long *pcpu_unit_offsets;
  66
  67struct pcpu_group_info {
  68        int                     nr_units;       /* aligned # of units */
  69        unsigned long           base_offset;    /* base address offset */
  70        unsigned int            *cpu_map;       /* unit->cpu map, empty
  71                                                 * entries contain NR_CPUS */
  72};
  73
  74struct pcpu_alloc_info {
  75        size_t                  static_size;
  76        size_t                  reserved_size;
  77        size_t                  dyn_size;
  78        size_t                  unit_size;
  79        size_t                  atom_size;
  80        size_t                  alloc_size;
  81        size_t                  __ai_size;      /* internal, don't use */
  82        int                     nr_groups;      /* 0 if grouping unnecessary */
  83        struct pcpu_group_info  groups[];
  84};
  85
  86enum pcpu_fc {
  87        PCPU_FC_AUTO,
  88        PCPU_FC_EMBED,
  89        PCPU_FC_PAGE,
  90
  91        PCPU_FC_NR,
  92};
  93extern const char *pcpu_fc_names[PCPU_FC_NR];
  94
  95extern enum pcpu_fc pcpu_chosen_fc;
  96
  97typedef void * (*pcpu_fc_alloc_fn_t)(unsigned int cpu, size_t size,
  98                                     size_t align);
  99typedef void (*pcpu_fc_free_fn_t)(void *ptr, size_t size);
 100typedef void (*pcpu_fc_populate_pte_fn_t)(unsigned long addr);
 101typedef int (pcpu_fc_cpu_distance_fn_t)(unsigned int from, unsigned int to);
 102
 103extern struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int nr_groups,
 104                                                             int nr_units);
 105extern void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai);
 106
 107extern struct pcpu_alloc_info * __init pcpu_build_alloc_info(
 108                                size_t reserved_size, ssize_t dyn_size,
 109                                size_t atom_size,
 110                                pcpu_fc_cpu_distance_fn_t cpu_distance_fn);
 111
 112extern int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
 113                                         void *base_addr);
 114
 115#ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK
 116extern int __init pcpu_embed_first_chunk(size_t reserved_size, ssize_t dyn_size,
 117                                size_t atom_size,
 118                                pcpu_fc_cpu_distance_fn_t cpu_distance_fn,
 119                                pcpu_fc_alloc_fn_t alloc_fn,
 120                                pcpu_fc_free_fn_t free_fn);
 121#endif
 122
 123#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK
 124extern int __init pcpu_page_first_chunk(size_t reserved_size,
 125                                pcpu_fc_alloc_fn_t alloc_fn,
 126                                pcpu_fc_free_fn_t free_fn,
 127                                pcpu_fc_populate_pte_fn_t populate_pte_fn);
 128#endif
 129
 130/*
 131 * Use this to get to a cpu's version of the per-cpu object
 132 * dynamically allocated. Non-atomic access to the current CPU's
 133 * version should probably be combined with get_cpu()/put_cpu().
 134 */
 135#define per_cpu_ptr(ptr, cpu)   SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu)))
 136
 137extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align);
 138extern bool is_kernel_percpu_address(unsigned long addr);
 139
 140#ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA
 141extern void __init setup_per_cpu_areas(void);
 142#endif
 143
 144#else /* CONFIG_SMP */
 145
 146#define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); })
 147
 148/* can't distinguish from other static vars, always false */
 149static inline bool is_kernel_percpu_address(unsigned long addr)
 150{
 151        return false;
 152}
 153
 154static inline void __init setup_per_cpu_areas(void) { }
 155
 156static inline void *pcpu_lpage_remapped(void *kaddr)
 157{
 158        return NULL;
 159}
 160
 161#endif /* CONFIG_SMP */
 162
 163extern void __percpu *__alloc_percpu(size_t size, size_t align);
 164extern void free_percpu(void __percpu *__pdata);
 165extern phys_addr_t per_cpu_ptr_to_phys(void *addr);
 166
 167#define alloc_percpu(type)      \
 168        (typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type))
 169
 170/*
 171 * Optional methods for optimized non-lvalue per-cpu variable access.
 172 *
 173 * @var can be a percpu variable or a field of it and its size should
 174 * equal char, int or long.  percpu_read() evaluates to a lvalue and
 175 * all others to void.
 176 *
 177 * These operations are guaranteed to be atomic w.r.t. preemption.
 178 * The generic versions use plain get/put_cpu_var().  Archs are
 179 * encouraged to implement single-instruction alternatives which don't
 180 * require preemption protection.
 181 */
 182#ifndef percpu_read
 183# define percpu_read(var)                                               \
 184  ({                                                                    \
 185        typeof(var) *pr_ptr__ = &(var);                                 \
 186        typeof(var) pr_ret__;                                           \
 187        pr_ret__ = get_cpu_var(*pr_ptr__);                              \
 188        put_cpu_var(*pr_ptr__);                                         \
 189        pr_ret__;                                                       \
 190  })
 191#endif
 192
 193#define __percpu_generic_to_op(var, val, op)                            \
 194do {                                                                    \
 195        typeof(var) *pgto_ptr__ = &(var);                               \
 196        get_cpu_var(*pgto_ptr__) op val;                                \
 197        put_cpu_var(*pgto_ptr__);                                       \
 198} while (0)
 199
 200#ifndef percpu_write
 201# define percpu_write(var, val)         __percpu_generic_to_op(var, (val), =)
 202#endif
 203
 204#ifndef percpu_add
 205# define percpu_add(var, val)           __percpu_generic_to_op(var, (val), +=)
 206#endif
 207
 208#ifndef percpu_sub
 209# define percpu_sub(var, val)           __percpu_generic_to_op(var, (val), -=)
 210#endif
 211
 212#ifndef percpu_and
 213# define percpu_and(var, val)           __percpu_generic_to_op(var, (val), &=)
 214#endif
 215
 216#ifndef percpu_or
 217# define percpu_or(var, val)            __percpu_generic_to_op(var, (val), |=)
 218#endif
 219
 220#ifndef percpu_xor
 221# define percpu_xor(var, val)           __percpu_generic_to_op(var, (val), ^=)
 222#endif
 223
 224/*
 225 * Branching function to split up a function into a set of functions that
 226 * are called for different scalar sizes of the objects handled.
 227 */
 228
 229extern void __bad_size_call_parameter(void);
 230
 231#define __pcpu_size_call_return(stem, variable)                         \
 232({      typeof(variable) pscr_ret__;                                    \
 233        __verify_pcpu_ptr(&(variable));                                 \
 234        switch(sizeof(variable)) {                                      \
 235        case 1: pscr_ret__ = stem##1(variable);break;                   \
 236        case 2: pscr_ret__ = stem##2(variable);break;                   \
 237        case 4: pscr_ret__ = stem##4(variable);break;                   \
 238        case 8: pscr_ret__ = stem##8(variable);break;                   \
 239        default:                                                        \
 240                __bad_size_call_parameter();break;                      \
 241        }                                                               \
 242        pscr_ret__;                                                     \
 243})
 244
 245#define __pcpu_size_call(stem, variable, ...)                           \
 246do {                                                                    \
 247        __verify_pcpu_ptr(&(variable));                                 \
 248        switch(sizeof(variable)) {                                      \
 249                case 1: stem##1(variable, __VA_ARGS__);break;           \
 250                case 2: stem##2(variable, __VA_ARGS__);break;           \
 251                case 4: stem##4(variable, __VA_ARGS__);break;           \
 252                case 8: stem##8(variable, __VA_ARGS__);break;           \
 253                default:                                                \
 254                        __bad_size_call_parameter();break;              \
 255        }                                                               \
 256} while (0)
 257
 258/*
 259 * Optimized manipulation for memory allocated through the per cpu
 260 * allocator or for addresses of per cpu variables.
 261 *
 262 * These operation guarantee exclusivity of access for other operations
 263 * on the *same* processor. The assumption is that per cpu data is only
 264 * accessed by a single processor instance (the current one).
 265 *
 266 * The first group is used for accesses that must be done in a
 267 * preemption safe way since we know that the context is not preempt
 268 * safe. Interrupts may occur. If the interrupt modifies the variable
 269 * too then RMW actions will not be reliable.
 270 *
 271 * The arch code can provide optimized functions in two ways:
 272 *
 273 * 1. Override the function completely. F.e. define this_cpu_add().
 274 *    The arch must then ensure that the various scalar format passed
 275 *    are handled correctly.
 276 *
 277 * 2. Provide functions for certain scalar sizes. F.e. provide
 278 *    this_cpu_add_2() to provide per cpu atomic operations for 2 byte
 279 *    sized RMW actions. If arch code does not provide operations for
 280 *    a scalar size then the fallback in the generic code will be
 281 *    used.
 282 */
 283
 284#define _this_cpu_generic_read(pcp)                                     \
 285({      typeof(pcp) ret__;                                              \
 286        preempt_disable();                                              \
 287        ret__ = *this_cpu_ptr(&(pcp));                                  \
 288        preempt_enable();                                               \
 289        ret__;                                                          \
 290})
 291
 292#ifndef this_cpu_read
 293# ifndef this_cpu_read_1
 294#  define this_cpu_read_1(pcp)  _this_cpu_generic_read(pcp)
 295# endif
 296# ifndef this_cpu_read_2
 297#  define this_cpu_read_2(pcp)  _this_cpu_generic_read(pcp)
 298# endif
 299# ifndef this_cpu_read_4
 300#  define this_cpu_read_4(pcp)  _this_cpu_generic_read(pcp)
 301# endif
 302# ifndef this_cpu_read_8
 303#  define this_cpu_read_8(pcp)  _this_cpu_generic_read(pcp)
 304# endif
 305# define this_cpu_read(pcp)     __pcpu_size_call_return(this_cpu_read_, (pcp))
 306#endif
 307
 308#define _this_cpu_generic_to_op(pcp, val, op)                           \
 309do {                                                                    \
 310        preempt_disable();                                              \
 311        *__this_cpu_ptr(&(pcp)) op val;                                 \
 312        preempt_enable();                                               \
 313} while (0)
 314
 315#ifndef this_cpu_write
 316# ifndef this_cpu_write_1
 317#  define this_cpu_write_1(pcp, val)    _this_cpu_generic_to_op((pcp), (val), =)
 318# endif
 319# ifndef this_cpu_write_2
 320#  define this_cpu_write_2(pcp, val)    _this_cpu_generic_to_op((pcp), (val), =)
 321# endif
 322# ifndef this_cpu_write_4
 323#  define this_cpu_write_4(pcp, val)    _this_cpu_generic_to_op((pcp), (val), =)
 324# endif
 325# ifndef this_cpu_write_8
 326#  define this_cpu_write_8(pcp, val)    _this_cpu_generic_to_op((pcp), (val), =)
 327# endif
 328# define this_cpu_write(pcp, val)       __pcpu_size_call(this_cpu_write_, (pcp), (val))
 329#endif
 330
 331#ifndef this_cpu_add
 332# ifndef this_cpu_add_1
 333#  define this_cpu_add_1(pcp, val)      _this_cpu_generic_to_op((pcp), (val), +=)
 334# endif
 335# ifndef this_cpu_add_2
 336#  define this_cpu_add_2(pcp, val)      _this_cpu_generic_to_op((pcp), (val), +=)
 337# endif
 338# ifndef this_cpu_add_4
 339#  define this_cpu_add_4(pcp, val)      _this_cpu_generic_to_op((pcp), (val), +=)
 340# endif
 341# ifndef this_cpu_add_8
 342#  define this_cpu_add_8(pcp, val)      _this_cpu_generic_to_op((pcp), (val), +=)
 343# endif
 344# define this_cpu_add(pcp, val)         __pcpu_size_call(this_cpu_add_, (pcp), (val))
 345#endif
 346
 347#ifndef this_cpu_sub
 348# define this_cpu_sub(pcp, val)         this_cpu_add((pcp), -(val))
 349#endif
 350
 351#ifndef this_cpu_inc
 352# define this_cpu_inc(pcp)              this_cpu_add((pcp), 1)
 353#endif
 354
 355#ifndef this_cpu_dec
 356# define this_cpu_dec(pcp)              this_cpu_sub((pcp), 1)
 357#endif
 358
 359#ifndef this_cpu_and
 360# ifndef this_cpu_and_1
 361#  define this_cpu_and_1(pcp, val)      _this_cpu_generic_to_op((pcp), (val), &=)
 362# endif
 363# ifndef this_cpu_and_2
 364#  define this_cpu_and_2(pcp, val)      _this_cpu_generic_to_op((pcp), (val), &=)
 365# endif
 366# ifndef this_cpu_and_4
 367#  define this_cpu_and_4(pcp, val)      _this_cpu_generic_to_op((pcp), (val), &=)
 368# endif
 369# ifndef this_cpu_and_8
 370#  define this_cpu_and_8(pcp, val)      _this_cpu_generic_to_op((pcp), (val), &=)
 371# endif
 372# define this_cpu_and(pcp, val)         __pcpu_size_call(this_cpu_and_, (pcp), (val))
 373#endif
 374
 375#ifndef this_cpu_or
 376# ifndef this_cpu_or_1
 377#  define this_cpu_or_1(pcp, val)       _this_cpu_generic_to_op((pcp), (val), |=)
 378# endif
 379# ifndef this_cpu_or_2
 380#  define this_cpu_or_2(pcp, val)       _this_cpu_generic_to_op((pcp), (val), |=)
 381# endif
 382# ifndef this_cpu_or_4
 383#  define this_cpu_or_4(pcp, val)       _this_cpu_generic_to_op((pcp), (val), |=)
 384# endif
 385# ifndef this_cpu_or_8
 386#  define this_cpu_or_8(pcp, val)       _this_cpu_generic_to_op((pcp), (val), |=)
 387# endif
 388# define this_cpu_or(pcp, val)          __pcpu_size_call(this_cpu_or_, (pcp), (val))
 389#endif
 390
 391#ifndef this_cpu_xor
 392# ifndef this_cpu_xor_1
 393#  define this_cpu_xor_1(pcp, val)      _this_cpu_generic_to_op((pcp), (val), ^=)
 394# endif
 395# ifndef this_cpu_xor_2
 396#  define this_cpu_xor_2(pcp, val)      _this_cpu_generic_to_op((pcp), (val), ^=)
 397# endif
 398# ifndef this_cpu_xor_4
 399#  define this_cpu_xor_4(pcp, val)      _this_cpu_generic_to_op((pcp), (val), ^=)
 400# endif
 401# ifndef this_cpu_xor_8
 402#  define this_cpu_xor_8(pcp, val)      _this_cpu_generic_to_op((pcp), (val), ^=)
 403# endif
 404# define this_cpu_xor(pcp, val)         __pcpu_size_call(this_cpu_or_, (pcp), (val))
 405#endif
 406
 407/*
 408 * Generic percpu operations that do not require preemption handling.
 409 * Either we do not care about races or the caller has the
 410 * responsibility of handling preemptions issues. Arch code can still
 411 * override these instructions since the arch per cpu code may be more
 412 * efficient and may actually get race freeness for free (that is the
 413 * case for x86 for example).
 414 *
 415 * If there is no other protection through preempt disable and/or
 416 * disabling interupts then one of these RMW operations can show unexpected
 417 * behavior because the execution thread was rescheduled on another processor
 418 * or an interrupt occurred and the same percpu variable was modified from
 419 * the interrupt context.
 420 */
 421#ifndef __this_cpu_read
 422# ifndef __this_cpu_read_1
 423#  define __this_cpu_read_1(pcp)        (*__this_cpu_ptr(&(pcp)))
 424# endif
 425# ifndef __this_cpu_read_2
 426#  define __this_cpu_read_2(pcp)        (*__this_cpu_ptr(&(pcp)))
 427# endif
 428# ifndef __this_cpu_read_4
 429#  define __this_cpu_read_4(pcp)        (*__this_cpu_ptr(&(pcp)))
 430# endif
 431# ifndef __this_cpu_read_8
 432#  define __this_cpu_read_8(pcp)        (*__this_cpu_ptr(&(pcp)))
 433# endif
 434# define __this_cpu_read(pcp)   __pcpu_size_call_return(__this_cpu_read_, (pcp))
 435#endif
 436
 437#define __this_cpu_generic_to_op(pcp, val, op)                          \
 438do {                                                                    \
 439        *__this_cpu_ptr(&(pcp)) op val;                                 \
 440} while (0)
 441
 442#ifndef __this_cpu_write
 443# ifndef __this_cpu_write_1
 444#  define __this_cpu_write_1(pcp, val)  __this_cpu_generic_to_op((pcp), (val), =)
 445# endif
 446# ifndef __this_cpu_write_2
 447#  define __this_cpu_write_2(pcp, val)  __this_cpu_generic_to_op((pcp), (val), =)
 448# endif
 449# ifndef __this_cpu_write_4
 450#  define __this_cpu_write_4(pcp, val)  __this_cpu_generic_to_op((pcp), (val), =)
 451# endif
 452# ifndef __this_cpu_write_8
 453#  define __this_cpu_write_8(pcp, val)  __this_cpu_generic_to_op((pcp), (val), =)
 454# endif
 455# define __this_cpu_write(pcp, val)     __pcpu_size_call(__this_cpu_write_, (pcp), (val))
 456#endif
 457
 458#ifndef __this_cpu_add
 459# ifndef __this_cpu_add_1
 460#  define __this_cpu_add_1(pcp, val)    __this_cpu_generic_to_op((pcp), (val), +=)
 461# endif
 462# ifndef __this_cpu_add_2
 463#  define __this_cpu_add_2(pcp, val)    __this_cpu_generic_to_op((pcp), (val), +=)
 464# endif
 465# ifndef __this_cpu_add_4
 466#  define __this_cpu_add_4(pcp, val)    __this_cpu_generic_to_op((pcp), (val), +=)
 467# endif
 468# ifndef __this_cpu_add_8
 469#  define __this_cpu_add_8(pcp, val)    __this_cpu_generic_to_op((pcp), (val), +=)
 470# endif
 471# define __this_cpu_add(pcp, val)       __pcpu_size_call(__this_cpu_add_, (pcp), (val))
 472#endif
 473
 474#ifndef __this_cpu_sub
 475# define __this_cpu_sub(pcp, val)       __this_cpu_add((pcp), -(val))
 476#endif
 477
 478#ifndef __this_cpu_inc
 479# define __this_cpu_inc(pcp)            __this_cpu_add((pcp), 1)
 480#endif
 481
 482#ifndef __this_cpu_dec
 483# define __this_cpu_dec(pcp)            __this_cpu_sub((pcp), 1)
 484#endif
 485
 486#ifndef __this_cpu_and
 487# ifndef __this_cpu_and_1
 488#  define __this_cpu_and_1(pcp, val)    __this_cpu_generic_to_op((pcp), (val), &=)
 489# endif
 490# ifndef __this_cpu_and_2
 491#  define __this_cpu_and_2(pcp, val)    __this_cpu_generic_to_op((pcp), (val), &=)
 492# endif
 493# ifndef __this_cpu_and_4
 494#  define __this_cpu_and_4(pcp, val)    __this_cpu_generic_to_op((pcp), (val), &=)
 495# endif
 496# ifndef __this_cpu_and_8
 497#  define __this_cpu_and_8(pcp, val)    __this_cpu_generic_to_op((pcp), (val), &=)
 498# endif
 499# define __this_cpu_and(pcp, val)       __pcpu_size_call(__this_cpu_and_, (pcp), (val))
 500#endif
 501
 502#ifndef __this_cpu_or
 503# ifndef __this_cpu_or_1
 504#  define __this_cpu_or_1(pcp, val)     __this_cpu_generic_to_op((pcp), (val), |=)
 505# endif
 506# ifndef __this_cpu_or_2
 507#  define __this_cpu_or_2(pcp, val)     __this_cpu_generic_to_op((pcp), (val), |=)
 508# endif
 509# ifndef __this_cpu_or_4
 510#  define __this_cpu_or_4(pcp, val)     __this_cpu_generic_to_op((pcp), (val), |=)
 511# endif
 512# ifndef __this_cpu_or_8
 513#  define __this_cpu_or_8(pcp, val)     __this_cpu_generic_to_op((pcp), (val), |=)
 514# endif
 515# define __this_cpu_or(pcp, val)        __pcpu_size_call(__this_cpu_or_, (pcp), (val))
 516#endif
 517
 518#ifndef __this_cpu_xor
 519# ifndef __this_cpu_xor_1
 520#  define __this_cpu_xor_1(pcp, val)    __this_cpu_generic_to_op((pcp), (val), ^=)
 521# endif
 522# ifndef __this_cpu_xor_2
 523#  define __this_cpu_xor_2(pcp, val)    __this_cpu_generic_to_op((pcp), (val), ^=)
 524# endif
 525# ifndef __this_cpu_xor_4
 526#  define __this_cpu_xor_4(pcp, val)    __this_cpu_generic_to_op((pcp), (val), ^=)
 527# endif
 528# ifndef __this_cpu_xor_8
 529#  define __this_cpu_xor_8(pcp, val)    __this_cpu_generic_to_op((pcp), (val), ^=)
 530# endif
 531# define __this_cpu_xor(pcp, val)       __pcpu_size_call(__this_cpu_xor_, (pcp), (val))
 532#endif
 533
 534/*
 535 * IRQ safe versions of the per cpu RMW operations. Note that these operations
 536 * are *not* safe against modification of the same variable from another
 537 * processors (which one gets when using regular atomic operations)
 538 . They are guaranteed to be atomic vs. local interrupts and
 539 * preemption only.
 540 */
 541#define irqsafe_cpu_generic_to_op(pcp, val, op)                         \
 542do {                                                                    \
 543        unsigned long flags;                                            \
 544        local_irq_save(flags);                                          \
 545        *__this_cpu_ptr(&(pcp)) op val;                                 \
 546        local_irq_restore(flags);                                       \
 547} while (0)
 548
 549#ifndef irqsafe_cpu_add
 550# ifndef irqsafe_cpu_add_1
 551#  define irqsafe_cpu_add_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=)
 552# endif
 553# ifndef irqsafe_cpu_add_2
 554#  define irqsafe_cpu_add_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=)
 555# endif
 556# ifndef irqsafe_cpu_add_4
 557#  define irqsafe_cpu_add_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=)
 558# endif
 559# ifndef irqsafe_cpu_add_8
 560#  define irqsafe_cpu_add_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=)
 561# endif
 562# define irqsafe_cpu_add(pcp, val) __pcpu_size_call(irqsafe_cpu_add_, (pcp), (val))
 563#endif
 564
 565#ifndef irqsafe_cpu_sub
 566# define irqsafe_cpu_sub(pcp, val)      irqsafe_cpu_add((pcp), -(val))
 567#endif
 568
 569#ifndef irqsafe_cpu_inc
 570# define irqsafe_cpu_inc(pcp)   irqsafe_cpu_add((pcp), 1)
 571#endif
 572
 573#ifndef irqsafe_cpu_dec
 574# define irqsafe_cpu_dec(pcp)   irqsafe_cpu_sub((pcp), 1)
 575#endif
 576
 577#ifndef irqsafe_cpu_and
 578# ifndef irqsafe_cpu_and_1
 579#  define irqsafe_cpu_and_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=)
 580# endif
 581# ifndef irqsafe_cpu_and_2
 582#  define irqsafe_cpu_and_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=)
 583# endif
 584# ifndef irqsafe_cpu_and_4
 585#  define irqsafe_cpu_and_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=)
 586# endif
 587# ifndef irqsafe_cpu_and_8
 588#  define irqsafe_cpu_and_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=)
 589# endif
 590# define irqsafe_cpu_and(pcp, val) __pcpu_size_call(irqsafe_cpu_and_, (val))
 591#endif
 592
 593#ifndef irqsafe_cpu_or
 594# ifndef irqsafe_cpu_or_1
 595#  define irqsafe_cpu_or_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=)
 596# endif
 597# ifndef irqsafe_cpu_or_2
 598#  define irqsafe_cpu_or_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=)
 599# endif
 600# ifndef irqsafe_cpu_or_4
 601#  define irqsafe_cpu_or_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=)
 602# endif
 603# ifndef irqsafe_cpu_or_8
 604#  define irqsafe_cpu_or_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=)
 605# endif
 606# define irqsafe_cpu_or(pcp, val) __pcpu_size_call(irqsafe_cpu_or_, (val))
 607#endif
 608
 609#ifndef irqsafe_cpu_xor
 610# ifndef irqsafe_cpu_xor_1
 611#  define irqsafe_cpu_xor_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=)
 612# endif
 613# ifndef irqsafe_cpu_xor_2
 614#  define irqsafe_cpu_xor_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=)
 615# endif
 616# ifndef irqsafe_cpu_xor_4
 617#  define irqsafe_cpu_xor_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=)
 618# endif
 619# ifndef irqsafe_cpu_xor_8
 620#  define irqsafe_cpu_xor_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=)
 621# endif
 622# define irqsafe_cpu_xor(pcp, val) __pcpu_size_call(irqsafe_cpu_xor_, (val))
 623#endif
 624
 625#endif /* __LINUX_PERCPU_H */
 626
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.