Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
1#ifndef _ASM_X8664_PERCPU_H_
2#define _ASM_X8664_PERCPU_H_
3#include <linux/compiler.h>
4
5/* Same as asm-generic/percpu.h, except that we store the per cpu offset
6 in the PDA. Longer term the PDA and every per cpu variable
7 should be just put into a single section and referenced directly
8 from %gs */
9
10#ifdef CONFIG_SMP
11
12#include <asm/pda.h>
13
14#ifdef CONFIG_MODULES
15# define PERCPU_MODULE_RESERVE 8192
16#else
17# define PERCPU_MODULE_RESERVE 0
18#endif
19
20#define PERCPU_ENOUGH_ROOM \
21 (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \
22 PERCPU_MODULE_RESERVE)
23
24#define __per_cpu_offset(cpu) (cpu_pda(cpu)->data_offset)
25#define __my_cpu_offset() read_pda(data_offset)
26
27#define per_cpu_offset(x) (__per_cpu_offset(x))
28
29/* Separate out the type, so (int[3], foo) works. */
30#define DEFINE_PER_CPU(type, name) \
31 __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name
32
33/* var is in discarded region: offset to particular copy we want */
34#define per_cpu(var, cpu) (*({ \
35 extern int simple_identifier_##var(void); \
36 RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)); }))
37#define __get_cpu_var(var) (*({ \
38 extern int simple_identifier_##var(void); \
39 RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()); }))
40#define __raw_get_cpu_var(var) (*({ \
41 extern int simple_identifier_##var(void); \
42 RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()); }))
43
44/* A macro to avoid #include hell... */
45#define percpu_modcopy(pcpudst, src, size) \
46do { \
47 unsigned int __i; \
48 for_each_possible_cpu(__i) \
49 memcpy((pcpudst)+__per_cpu_offset(__i), \
50 (src), (size)); \
51} while (0)
52
53extern void setup_per_cpu_areas(void);
54
55#else /* ! SMP */
56
57#define DEFINE_PER_CPU(type, name) \
58 __typeof__(type) per_cpu__##name
59
60#define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
61#define __get_cpu_var(var) per_cpu__##var
62#define __raw_get_cpu_var(var) per_cpu__##var
63
64#endif /* SMP */
65
66#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
67
68#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
69#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
70
71#endif /* _ASM_X8664_PERCPU_H_ */