diff options
| author | Tejun Heo <tj@kernel.org> | 2010-03-10 18:57:54 +0900 | 
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2010-03-29 23:07:12 +0900 | 
| commit | 10fad5e46f6c7bdfb01b1a012380a38e3c6ab346 (patch) | |
| tree | 9ec6e3955e7f879f64ea79812cf5ecd41baa6939 /mm | |
| parent | 259354deaaf03d49a02dbb9975d6ec2a54675672 (diff) | |
| download | linux-10fad5e46f6c7bdfb01b1a012380a38e3c6ab346.tar.bz2 | |
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 'mm')
| -rw-r--r-- | mm/percpu.c | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/mm/percpu.c b/mm/percpu.c index 768419d44ad7..6e09741ddc62 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -1304,6 +1304,32 @@ void free_percpu(void __percpu *ptr)  EXPORT_SYMBOL_GPL(free_percpu);  /** + * is_kernel_percpu_address - test whether address is from static percpu area + * @addr: address to test + * + * Test whether @addr belongs to in-kernel static percpu area.  Module + * static percpu areas are not considered.  For those, use + * is_module_percpu_address(). + * + * RETURNS: + * %true if @addr is from in-kernel static percpu area, %false otherwise. + */ +bool is_kernel_percpu_address(unsigned long addr) +{ +	const size_t static_size = __per_cpu_end - __per_cpu_start; +	void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr); +	unsigned int cpu; + +	for_each_possible_cpu(cpu) { +		void *start = per_cpu_ptr(base, cpu); + +		if ((void *)addr >= start && (void *)addr < start + static_size) +			return true; +        } +	return false; +} + +/**   * per_cpu_ptr_to_phys - convert translated percpu address to physical address   * @addr: the address to be converted to physical address   *  |