diff options
Diffstat (limited to 'include/linux/percpu.h')
-rw-r--r-- | include/linux/percpu.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/include/linux/percpu.h b/include/linux/percpu.h new file mode 100644 index 000000000000..5451eb1e781d --- /dev/null +++ b/include/linux/percpu.h | |||
@@ -0,0 +1,61 @@ | |||
1 | #ifndef __LINUX_PERCPU_H | ||
2 | #define __LINUX_PERCPU_H | ||
3 | #include <linux/spinlock.h> /* For preempt_disable() */ | ||
4 | #include <linux/slab.h> /* For kmalloc() */ | ||
5 | #include <linux/smp.h> | ||
6 | #include <linux/string.h> /* For memset() */ | ||
7 | #include <asm/percpu.h> | ||
8 | |||
9 | /* Enough to cover all DEFINE_PER_CPUs in kernel, including modules. */ | ||
10 | #ifndef PERCPU_ENOUGH_ROOM | ||
11 | #define PERCPU_ENOUGH_ROOM 32768 | ||
12 | #endif | ||
13 | |||
14 | /* Must be an lvalue. */ | ||
15 | #define get_cpu_var(var) (*({ preempt_disable(); &__get_cpu_var(var); })) | ||
16 | #define put_cpu_var(var) preempt_enable() | ||
17 | |||
18 | #ifdef CONFIG_SMP | ||
19 | |||
20 | struct percpu_data { | ||
21 | void *ptrs[NR_CPUS]; | ||
22 | void *blkp; | ||
23 | }; | ||
24 | |||
25 | /* | ||
26 | * Use this to get to a cpu's version of the per-cpu object allocated using | ||
27 | * alloc_percpu. Non-atomic access to the current CPU's version should | ||
28 | * probably be combined with get_cpu()/put_cpu(). | ||
29 | */ | ||
30 | #define per_cpu_ptr(ptr, cpu) \ | ||
31 | ({ \ | ||
32 | struct percpu_data *__p = (struct percpu_data *)~(unsigned long)(ptr); \ | ||
33 | (__typeof__(ptr))__p->ptrs[(cpu)]; \ | ||
34 | }) | ||
35 | |||
36 | extern void *__alloc_percpu(size_t size, size_t align); | ||
37 | extern void free_percpu(const void *); | ||
38 | |||
39 | #else /* CONFIG_SMP */ | ||
40 | |||
41 | #define per_cpu_ptr(ptr, cpu) (ptr) | ||
42 | |||
43 | static inline void *__alloc_percpu(size_t size, size_t align) | ||
44 | { | ||
45 | void *ret = kmalloc(size, GFP_KERNEL); | ||
46 | if (ret) | ||
47 | memset(ret, 0, size); | ||
48 | return ret; | ||
49 | } | ||
50 | static inline void free_percpu(const void *ptr) | ||
51 | { | ||
52 | kfree(ptr); | ||
53 | } | ||
54 | |||
55 | #endif /* CONFIG_SMP */ | ||
56 | |||
57 | /* Simple wrapper for the common case: zeros memory. */ | ||
58 | #define alloc_percpu(type) \ | ||
59 | ((type *)(__alloc_percpu(sizeof(type), __alignof__(type)))) | ||
60 | |||
61 | #endif /* __LINUX_PERCPU_H */ | ||