| From 0f8f8094d28eb53368ac09186ea6b3a324cc7d44 Mon Sep 17 00:00:00 2001 |
| From: Christoph Lameter <cl@linux.com> |
| Date: Tue, 2 Jul 2013 12:12:10 -0700 |
| Subject: slab: fix init_lock_keys |
| |
| From: Christoph Lameter <cl@linux.com> |
| |
| commit 0f8f8094d28eb53368ac09186ea6b3a324cc7d44 upstream. |
| |
| Some architectures (e.g. powerpc built with CONFIG_PPC_256K_PAGES=y |
| CONFIG_FORCE_MAX_ZONEORDER=11) get PAGE_SHIFT + MAX_ORDER > 26. |
| |
| In 3.10 kernels, CONFIG_LOCKDEP=y with PAGE_SHIFT + MAX_ORDER > 26 makes |
| init_lock_keys() dereference beyond kmalloc_caches[26]. |
| This leads to an unbootable system (kernel panic at initializing SLAB) |
| if one of kmalloc_caches[26...PAGE_SHIFT+MAX_ORDER-1] is not NULL. |
| |
| Fix this by making sure that init_lock_keys() does not dereference beyond |
| kmalloc_caches[26] arrays. |
| |
| Signed-off-by: Christoph Lameter <cl@linux.com> |
| Reported-by: Tetsuo Handa <penguin-kernel@I-Love.SAKURA.ne.jp> |
| Cc: Pekka Enberg <penberg@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Pekka Enberg <penberg@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| mm/slab.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/mm/slab.c |
| +++ b/mm/slab.c |
| @@ -565,7 +565,7 @@ static void init_node_lock_keys(int q) |
| if (slab_state < UP) |
| return; |
| |
| - for (i = 1; i < PAGE_SHIFT + MAX_ORDER; i++) { |
| + for (i = 1; i <= KMALLOC_SHIFT_HIGH; i++) { |
| struct kmem_cache_node *n; |
| struct kmem_cache *cache = kmalloc_caches[i]; |
| |