x86, percpu: setup reserved percpu area for x86_64
authorTejun Heo <tj@kernel.org>
Fri, 6 Mar 2009 05:33:59 +0000 (14:33 +0900)
committerTejun Heo <tj@kernel.org>
Fri, 6 Mar 2009 05:33:59 +0000 (14:33 +0900)
commit6b19b0c2400437a3c10059ede0e59b517092e1bd
tree4fc1868fc8fde37315b54c6d416b48000621af9d
parentedcb463997ed7b2ffa3bac76e3e75957318f2e01
x86, percpu: setup reserved percpu area for x86_64

Impact: fix relocation overflow during module load

x86_64 uses 32bit relocations for symbol access and static percpu
symbols whether in core or modules must be inside 2GB of the percpu
segement base which the dynamic percpu allocator doesn't guarantee.
This patch makes x86_64 reserve PERCPU_MODULE_RESERVE bytes in the
first chunk so that module percpu areas are always allocated from the
first chunk which is always inside the relocatable range.

This problem exists for any percpu allocator but is easily triggered
when using the embedding allocator because the second chunk is located
beyond 2GB on it.

This patch also changes the meaning of PERCPU_DYNAMIC_RESERVE such
that it only indicates the size of the area to reserve for dynamic
allocation as static and dynamic areas can be separate.  New
PERCPU_DYNAMIC_RESERVED is increased by 4k for both 32 and 64bits as
the reserved area separation eats away some allocatable space and
having slightly more headroom (currently between 4 and 8k after
minimal boot sans module area) makes sense for common case
performance.

x86_32 can address anywhere from anywhere and doesn't need reserving.

Mike Galbraith first reported the problem first and bisected it to the
embedding percpu allocator commit.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Mike Galbraith <efault@gmx.de>
Reported-by: Jaswinder Singh Rajput <jaswinder@kernel.org>
arch/x86/kernel/setup_percpu.c
include/linux/percpu.h