summaryrefslogtreecommitdiffstats
path: root/mm/percpu.c
diff options
context:
space:
mode:
authorAnton Vorontsov <cbouatmailru@gmail.com>2010-04-26 21:56:19 +0400
committerAnton Vorontsov <cbouatmailru@gmail.com>2010-04-26 21:56:19 +0400
commit8ef1bb539203629f77a61976e4f25415e1083bff (patch)
tree4fee25aca0928f112716fb02d27b1b355d0843b4 /mm/percpu.c
parenta3bcbbee83f55cbaec9b2ad748e7300c7feb2192 (diff)
parentb91ce4d14a21fc04d165be30319541e0f9204f15 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'mm/percpu.c')
-rw-r--r--mm/percpu.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/mm/percpu.c b/mm/percpu.c
index 768419d44ad..6e09741ddc6 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
*