diff options
author | Vivek Goyal <vgoyal@redhat.com> | 2009-11-24 01:50:03 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2009-11-25 07:49:22 -0500 |
commit | 3b034b0d084221596bf35c8d893e1d4d5477b9cc (patch) | |
tree | c3b9f33dc9fc748a9460036ae8647b16541a7547 /include/linux/percpu.h | |
parent | 833af8427be4b217b5bc522f61afdbd3f1d282c2 (diff) |
percpu: Fix kdump failure if booted with percpu_alloc=page
o kdump functionality reserves a per cpu area at boot time and exports the
physical address of that area to user space through sys interface. This
area stores some dump related information like cpu register states etc
at the time of crash.
o We were assuming that per cpu area always come from linearly mapped meory
region and using __pa() to determine physical address.
With percpu_alloc=page, per cpu area can come from vmalloc region also and
__pa() breaks.
o This patch implments a new function to convert per cpu address to
physical address.
Before the patch, crash_notes addresses looked as follows.
cpu0 60fffff49800
cpu1 60fffff60800
cpu2 60fffff77800
These are bogus phsyical addresses.
After the patch, address are following.
cpu0 13eb44000
cpu1 13eb43000
cpu2 13eb42000
cpu3 13eb41000
These look fine. I got 4G of memory and /proc/iomem tell me following.
100000000-13fffffff : System RAM
tj: * added missing asm/io.h include reported by Stephen Rothwell
* repositioned per_cpu_ptr_phys() in percpu.c and added comment.
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Diffstat (limited to 'include/linux/percpu.h')
-rw-r--r-- | include/linux/percpu.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 878836ca999c..6ac984fa34f8 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -154,6 +154,7 @@ struct percpu_data { | |||
154 | 154 | ||
155 | extern void *__alloc_percpu(size_t size, size_t align); | 155 | extern void *__alloc_percpu(size_t size, size_t align); |
156 | extern void free_percpu(void *__pdata); | 156 | extern void free_percpu(void *__pdata); |
157 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); | ||
157 | 158 | ||
158 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA | 159 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA |
159 | extern void __init setup_per_cpu_areas(void); | 160 | extern void __init setup_per_cpu_areas(void); |