linux/include/linux/percpu-defs.h
<<
>>
Prefs
   1#ifndef _LINUX_PERCPU_DEFS_H
   2#define _LINUX_PERCPU_DEFS_H
   3
   4/*
   5 * Determine the real variable name from the name visible in the
   6 * kernel sources.
   7 */
   8#define per_cpu_var(var) per_cpu__##var
   9
  10/*
  11 * Base implementations of per-CPU variable declarations and definitions, where
  12 * the section in which the variable is to be placed is provided by the
  13 * 'section' argument.  This may be used to affect the parameters governing the
  14 * variable's storage.
  15 *
  16 * NOTE!  The sections for the DECLARE and for the DEFINE must match, lest
  17 * linkage errors occur due the compiler generating the wrong code to access
  18 * that section.
  19 */
  20#define DECLARE_PER_CPU_SECTION(type, name, section)                    \
  21        extern                                                          \
  22        __attribute__((__section__(PER_CPU_BASE_SECTION section)))      \
  23        PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
  24
  25#define DEFINE_PER_CPU_SECTION(type, name, section)                     \
  26        __attribute__((__section__(PER_CPU_BASE_SECTION section)))      \
  27        PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
  28
  29/*
  30 * Variant on the per-CPU variable declaration/definition theme used for
  31 * ordinary per-CPU variables.
  32 */
  33#define DECLARE_PER_CPU(type, name)                                     \
  34        DECLARE_PER_CPU_SECTION(type, name, "")
  35
  36#define DEFINE_PER_CPU(type, name)                                      \
  37        DEFINE_PER_CPU_SECTION(type, name, "")
  38
  39/*
  40 * Declaration/definition used for per-CPU variables that must come first in
  41 * the set of variables.
  42 */
  43#define DECLARE_PER_CPU_FIRST(type, name)                               \
  44        DECLARE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
  45
  46#define DEFINE_PER_CPU_FIRST(type, name)                                \
  47        DEFINE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
  48
  49/*
  50 * Declaration/definition used for per-CPU variables that must be cacheline
  51 * aligned under SMP conditions so that, whilst a particular instance of the
  52 * data corresponds to a particular CPU, inefficiencies due to direct access by
  53 * other CPUs are reduced by preventing the data from unnecessarily spanning
  54 * cachelines.
  55 *
  56 * An example of this would be statistical data, where each CPU's set of data
  57 * is updated by that CPU alone, but the data from across all CPUs is collated
  58 * by a CPU processing a read from a proc file.
  59 */
  60#define DECLARE_PER_CPU_SHARED_ALIGNED(type, name)                      \
  61        DECLARE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
  62        ____cacheline_aligned_in_smp
  63
  64#define DEFINE_PER_CPU_SHARED_ALIGNED(type, name)                       \
  65        DEFINE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
  66        ____cacheline_aligned_in_smp
  67
  68/*
  69 * Declaration/definition used for per-CPU variables that must be page aligned.
  70 */
  71#define DECLARE_PER_CPU_PAGE_ALIGNED(type, name)                                \
  72        DECLARE_PER_CPU_SECTION(type, name, ".page_aligned")
  73
  74#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name)                         \
  75        DEFINE_PER_CPU_SECTION(type, name, ".page_aligned")
  76
  77/*
  78 * Intermodule exports for per-CPU variables.
  79 */
  80#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
  81#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
  82
  83
  84#endif /* _LINUX_PERCPU_DEFS_H */
  85
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.