diff options
author | Tejun Heo <tj@kernel.org> | 2010-03-10 04:57:54 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-03-29 10:07:12 -0400 |
commit | 10fad5e46f6c7bdfb01b1a012380a38e3c6ab346 (patch) | |
tree | 9ec6e3955e7f879f64ea79812cf5ecd41baa6939 /include | |
parent | 259354deaaf03d49a02dbb9975d6ec2a54675672 (diff) |
percpu, module: implement and use is_kernel/module_percpu_address()
lockdep has custom code to check whether a pointer belongs to static
percpu area which is somewhat broken. Implement proper
is_kernel/module_percpu_address() and replace the custom code.
On UP, percpu variables are regular static variables and can't be
distinguished from them. Always return %false on UP.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Ingo Molnar <mingo@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/module.h | 1 | ||||
-rw-r--r-- | include/linux/percpu.h | 7 |
2 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/module.h b/include/linux/module.h index 87d247ac6761..f0e2659f4e3e 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -395,6 +395,7 @@ static inline int module_is_live(struct module *mod) | |||
395 | struct module *__module_text_address(unsigned long addr); | 395 | struct module *__module_text_address(unsigned long addr); |
396 | struct module *__module_address(unsigned long addr); | 396 | struct module *__module_address(unsigned long addr); |
397 | bool is_module_address(unsigned long addr); | 397 | bool is_module_address(unsigned long addr); |
398 | bool is_module_percpu_address(unsigned long addr); | ||
398 | bool is_module_text_address(unsigned long addr); | 399 | bool is_module_text_address(unsigned long addr); |
399 | 400 | ||
400 | static inline int within_module_core(unsigned long addr, struct module *mod) | 401 | static inline int within_module_core(unsigned long addr, struct module *mod) |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index a93e5bfdccb8..11d5f834b54a 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -137,6 +137,7 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size, | |||
137 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); | 137 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); |
138 | extern void __percpu *__alloc_percpu(size_t size, size_t align); | 138 | extern void __percpu *__alloc_percpu(size_t size, size_t align); |
139 | extern void free_percpu(void __percpu *__pdata); | 139 | extern void free_percpu(void __percpu *__pdata); |
140 | extern bool is_kernel_percpu_address(unsigned long addr); | ||
140 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); | 141 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); |
141 | 142 | ||
142 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA | 143 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA |
@@ -163,6 +164,12 @@ static inline void free_percpu(void __percpu *p) | |||
163 | kfree(p); | 164 | kfree(p); |
164 | } | 165 | } |
165 | 166 | ||
167 | /* can't distinguish from other static vars, always false */ | ||
168 | static inline bool is_kernel_percpu_address(unsigned long addr) | ||
169 | { | ||
170 | return false; | ||
171 | } | ||
172 | |||
166 | static inline phys_addr_t per_cpu_ptr_to_phys(void *addr) | 173 | static inline phys_addr_t per_cpu_ptr_to_phys(void *addr) |
167 | { | 174 | { |
168 | return __pa(addr); | 175 | return __pa(addr); |