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