diff options
author | Tejun Heo <tj@kernel.org> | 2009-07-21 10:11:50 +0200 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2009-08-14 06:20:53 +0200 |
commit | 74d46d6b2d23d44d72c37df4c6a5d2e782f7b088 (patch) | |
tree | bcc468968e738394b9c4a44b8936a0e6037be163 /mm/slub.c | |
parent | init: set nr_cpu_ids before setup_per_cpu_areas() (diff) | |
download | linux-74d46d6b2d23d44d72c37df4c6a5d2e782f7b088.tar.xz linux-74d46d6b2d23d44d72c37df4c6a5d2e782f7b088.zip |
percpu, sparc64: fix sparse possible cpu map handling
percpu code has been assuming num_possible_cpus() == nr_cpu_ids which
is incorrect if cpu_possible_map contains holes. This causes percpu
code to access beyond allocated memories and vmalloc areas. On a
sparc64 machine with cpus 0 and 2 (u60), this triggers the following
warning or fails boot.
WARNING: at /devel/tj/os/work/mm/vmalloc.c:106 vmap_page_range_noflush+0x1f0/0x240()
Modules linked in:
Call Trace:
[00000000004b17d0] vmap_page_range_noflush+0x1f0/0x240
[00000000004b1840] map_vm_area+0x20/0x60
[00000000004b1950] __vmalloc_area_node+0xd0/0x160
[0000000000593434] deflate_init+0x14/0xe0
[0000000000583b94] __crypto_alloc_tfm+0xd4/0x1e0
[00000000005844f0] crypto_alloc_base+0x50/0xa0
[000000000058b898] alg_test_comp+0x18/0x80
[000000000058dad4] alg_test+0x54/0x180
[000000000058af00] cryptomgr_test+0x40/0x60
[0000000000473098] kthread+0x58/0x80
[000000000042b590] kernel_thread+0x30/0x60
[0000000000472fd0] kthreadd+0xf0/0x160
---[ end trace 429b268a213317ba ]---
This patch fixes generic percpu functions and sparc64
setup_per_cpu_areas() so that they handle sparse cpu_possible_map
properly.
Please note that on x86, cpu_possible_map() doesn't contain holes and
thus num_possible_cpus() == nr_cpu_ids and this patch doesn't cause
any behavior difference.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David S. Miller <davem@davemloft.net>
Cc: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'mm/slub.c')
0 files changed, 0 insertions, 0 deletions