percpu: Fix kdump failure if booted with percpu_alloc=page
authorVivek Goyal <vgoyal@redhat.com>
Tue, 24 Nov 2009 06:50:03 +0000 (15:50 +0900)
committerTejun Heo <tj@kernel.org>
Wed, 25 Nov 2009 12:49:22 +0000 (21:49 +0900)
commit3b034b0d084221596bf35c8d893e1d4d5477b9cc
treec3b9f33dc9fc748a9460036ae8647b16541a7547
parent833af8427be4b217b5bc522f61afdbd3f1d282c2
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>
drivers/base/cpu.c
include/linux/percpu.h
mm/percpu.c