aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-03-06 00:33:59 -0500
committerTejun Heo <tj@kernel.org>2009-03-06 00:33:59 -0500
commit6b19b0c2400437a3c10059ede0e59b517092e1bd (patch)
tree4fc1868fc8fde37315b54c6d416b48000621af9d /include
parentedcb463997ed7b2ffa3bac76e3e75957318f2e01 (diff)
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>
Diffstat (limited to 'include')
-rw-r--r--include/linux/percpu.h35
1 files changed, 12 insertions, 23 deletions
diff --git a/include/linux/percpu.h b/include/linux/percpu.h
index 8ff15153ae20..54a968b4b924 100644
--- a/include/linux/percpu.h
+++ b/include/linux/percpu.h
@@ -85,31 +85,20 @@
85 85
86/* 86/*
87 * PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy 87 * PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy
88 * back on the first chunk if arch is manually allocating and mapping 88 * back on the first chunk for dynamic percpu allocation if arch is
89 * it for faster access (as a part of large page mapping for example). 89 * manually allocating and mapping it for faster access (as a part of
90 * Note that dynamic percpu allocator covers both static and dynamic 90 * large page mapping for example).
91 * areas, so these values are bigger than PERCPU_MODULE_RESERVE.
92 * 91 *
93 * On typical configuration with modules, the following values leave 92 * The following values give between one and two pages of free space
94 * about 8k of free space on the first chunk after boot on both x86_32 93 * after typical minimal boot (2-way SMP, single disk and NIC) with
95 * and 64 when module support is enabled. When module support is 94 * both defconfig and a distro config on x86_64 and 32. More
96 * disabled, it's much tighter. 95 * intelligent way to determine this would be nice.
97 */ 96 */
98#ifndef PERCPU_DYNAMIC_RESERVE 97#if BITS_PER_LONG > 32
99# if BITS_PER_LONG > 32 98#define PERCPU_DYNAMIC_RESERVE (20 << 10)
100# ifdef CONFIG_MODULES 99#else
101# define PERCPU_DYNAMIC_RESERVE (24 << 10) 100#define PERCPU_DYNAMIC_RESERVE (12 << 10)
102# else 101#endif
103# define PERCPU_DYNAMIC_RESERVE (16 << 10)
104# endif
105# else
106# ifdef CONFIG_MODULES
107# define PERCPU_DYNAMIC_RESERVE (16 << 10)
108# else
109# define PERCPU_DYNAMIC_RESERVE (8 << 10)
110# endif
111# endif
112#endif /* PERCPU_DYNAMIC_RESERVE */
113 102
114extern void *pcpu_base_addr; 103extern void *pcpu_base_addr;
115 104