-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PERCPU: Collect the DECLARE/DEFINE declarations together
Collect the DECLARE/DEFINE declarations together in linux/percpu-defs.h so that they're in one place, and give them descriptive comments, particularly the SHARED_ALIGNED variant. It would be nice to collect these in linux/percpu.h, but that's not possible without sorting out the severe #include recursion between the x86 arch headers and the general headers (and possibly other arches too). Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information
David Howells
authored and
Linus Torvalds
committed
Apr 22, 2009
1 parent
9b8de74
commit 5028eaa
Showing
3 changed files
with
86 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
#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))) \ | ||
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | ||
|
||
/* | ||
* 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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters