2009-04-21 23:00:29 +01:00
# ifndef _LINUX_PERCPU_DEFS_H
# define _LINUX_PERCPU_DEFS_H
/*
* Determine the real variable name from the name visible in the
* kernel sources .
*/
# define per_cpu_var(var) per_cpu__##var
/*
* Base implementations of per - CPU variable declarations and definitions , where
* the section in which the variable is to be placed is provided by the
* ' section ' argument . This may be used to affect the parameters governing the
* variable ' s storage .
*
* NOTE ! The sections for the DECLARE and for the DEFINE must match , lest
* linkage errors occur due the compiler generating the wrong code to access
* that section .
*/
# define DECLARE_PER_CPU_SECTION(type, name, section) \
extern \
__attribute__ ( ( __section__ ( PER_CPU_BASE_SECTION section ) ) ) \
PER_CPU_ATTRIBUTES __typeof__ ( type ) per_cpu__ # # name
# define DEFINE_PER_CPU_SECTION(type, name, section) \
__attribute__ ( ( __section__ ( PER_CPU_BASE_SECTION section ) ) ) \
2009-06-30 11:41:18 -07:00
PER_CPU_ATTRIBUTES PER_CPU_DEF_ATTRIBUTES \
__typeof__ ( type ) per_cpu__ # # name
2009-04-21 23:00:29 +01:00
/*
* Variant on the per - CPU variable declaration / definition theme used for
* ordinary per - CPU variables .
*/
# define DECLARE_PER_CPU(type, name) \
DECLARE_PER_CPU_SECTION ( type , name , " " )
# define DEFINE_PER_CPU(type, name) \
DEFINE_PER_CPU_SECTION ( type , name , " " )
/*
* Declaration / definition used for per - CPU variables that must come first in
* the set of variables .
*/
# define DECLARE_PER_CPU_FIRST(type, name) \
DECLARE_PER_CPU_SECTION ( type , name , PER_CPU_FIRST_SECTION )
# define DEFINE_PER_CPU_FIRST(type, name) \
DEFINE_PER_CPU_SECTION ( type , name , PER_CPU_FIRST_SECTION )
/*
* Declaration / definition used for per - CPU variables that must be cacheline
* aligned under SMP conditions so that , whilst a particular instance of the
* data corresponds to a particular CPU , inefficiencies due to direct access by
* other CPUs are reduced by preventing the data from unnecessarily spanning
* cachelines .
*
* An example of this would be statistical data , where each CPU ' s set of data
* is updated by that CPU alone , but the data from across all CPUs is collated
* by a CPU processing a read from a proc file .
*/
# define DECLARE_PER_CPU_SHARED_ALIGNED(type, name) \
DECLARE_PER_CPU_SECTION ( type , name , PER_CPU_SHARED_ALIGNED_SECTION ) \
____cacheline_aligned_in_smp
# define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \
DEFINE_PER_CPU_SECTION ( type , name , PER_CPU_SHARED_ALIGNED_SECTION ) \
____cacheline_aligned_in_smp
/*
* Declaration / definition used for per - CPU variables that must be page aligned .
*/
# define DECLARE_PER_CPU_PAGE_ALIGNED(type, name) \
DECLARE_PER_CPU_SECTION ( type , name , " .page_aligned " )
# define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
DEFINE_PER_CPU_SECTION ( type , name , " .page_aligned " )
/*
* Intermodule exports for per - CPU variables .
*/
# define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
# define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
# endif /* _LINUX_PERCPU_DEFS_H */