projects
/
firefly-linux-kernel-4.4.55.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
826b7a8
)
slub: Handle NULL parameter in kmem_cache_flags
author
Christoph Lameter
<cl@linux.com>
Thu, 7 Nov 2013 16:29:15 +0000
(16:29 +0000)
committer
Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Fri, 29 Nov 2013 19:11:52 +0000
(11:11 -0800)
commit
c6f58d9b362b45c52afebe4342c9137d0dabe47f
upstream.
Andreas Herrmann writes:
When I've used slub_debug kernel option (e.g.
"slub_debug=,skbuff_fclone_cache" or similar) on a debug session I've
seen a panic like:
Highbank #setenv bootargs console=ttyAMA0 root=/dev/sda2 kgdboc.kgdboc=ttyAMA0,115200 slub_debug=,kmalloc-4096 earlyprintk=ttyAMA0
...
Unable to handle kernel NULL pointer dereference at virtual address
00000000
pgd =
c0004000
[
00000000
] *pgd=
00000000
Internal error: Oops: 5 [#1] SMP ARM
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Tainted: G W
3.12.0-00048-gbe408cd
#314
task:
c0898360
ti:
c088a000
task.ti:
c088a000
PC is at strncmp+0x1c/0x84
LR is at kmem_cache_flags.isra.46.part.47+0x44/0x60
pc : [<
c02c6da0
>] lr : [<
c0110a3c
>] psr:
200001d3
sp :
c088bea8
ip :
c088beb8
fp :
c088beb4
r10:
00000000
r9 :
413fc090
r8 :
00000001
r7 :
00000000
r6 :
c2984a08
r5 :
c0966e78
r4 :
00000000
r3 :
0000006b
r2 :
0000000c
r1 :
00000000
r0 :
c2984a08
Flags: nzCv IRQs off FIQs off Mode SVC_32 ISA ARM Segment kernel
Control:
10c5387d
Table:
0000404a
DAC:
00000015
Process swapper (pid: 0, stack limit = 0xc088a248)
Stack: (0xc088bea8 to 0xc088c000)
bea0:
c088bed4
c088beb8
c0110a3c
c02c6d90
c0966e78
00000040
bec0:
ef001f00
00000040
c088bf14
c088bed8
c0112070
c0110a04
00000005
c010fac8
bee0:
c088bf5c
c088bef0
c010fac8
ef001f00
00000040
00000000
00000040
00000001
bf00:
413fc090
00000000
c088bf34
c088bf18
c0839190
c0112040
00000000
ef001f00
bf20:
00000000
00000000
c088bf54
c088bf38
c0839200
c083914c
00000006
c0961c4c
bf40:
c0961c28
00000000
c088bf7c
c088bf58
c08392ac
c08391c0
c08a2ed8
c0966e78
bf60:
c086b874
c08a3f50
c0961c28
00000001
c088bfb4
c088bf80
c083b258
c0839248
bf80:
2f800000
0f000000
c08935b4
ffffffff
c08cd400
ffffffff
c08cd400
c0868408
bfa0:
c29849c0
00000000
c088bff4
c088bfb8
c0824974
c083b1e4
ffffffff
ffffffff
bfc0:
c08245c0
00000000
00000000
c0868408
00000000
10c5387d
c0892bcc
c0868404
bfe0:
c0899440
0000406a
00000000
c088bff8
00008074
c0824824
00000000
00000000
[<
c02c6da0
>] (strncmp+0x1c/0x84) from [<
c0110a3c
>] (kmem_cache_flags.isra.46.part.47+0x44/0x60)
[<
c0110a3c
>] (kmem_cache_flags.isra.46.part.47+0x44/0x60) from [<
c0112070
>] (__kmem_cache_create+0x3c/0x410)
[<
c0112070
>] (__kmem_cache_create+0x3c/0x410) from [<
c0839190
>] (create_boot_cache+0x50/0x74)
[<
c0839190
>] (create_boot_cache+0x50/0x74) from [<
c0839200
>] (create_kmalloc_cache+0x4c/0x88)
[<
c0839200
>] (create_kmalloc_cache+0x4c/0x88) from [<
c08392ac
>] (create_kmalloc_caches+0x70/0x114)
[<
c08392ac
>] (create_kmalloc_caches+0x70/0x114) from [<
c083b258
>] (kmem_cache_init+0x80/0xe0)
[<
c083b258
>] (kmem_cache_init+0x80/0xe0) from [<
c0824974
>] (start_kernel+0x15c/0x318)
[<
c0824974
>] (start_kernel+0x15c/0x318) from [<
00008074
>] (0x8074)
Code:
e3520000
01a00002
089da800
e5d03000
(
e5d1c000
)
---[ end trace
1b75b31a2719ed1d
]---
Kernel panic - not syncing: Fatal exception
Problem is that slub_debug option is not parsed before
create_boot_cache is called. Solve this by changing slub_debug to
early_param.
Kernels 3.11, 3.10 are also affected. I am not sure about older
kernels.
Christoph Lameter explains:
kmem_cache_flags may be called with NULL parameter during early boot.
Skip the test in that case.
Reported-by: Andreas Herrmann <andreas.herrmann@calxeda.com>
Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mm/slub.c
patch
|
blob
|
history
diff --git
a/mm/slub.c
b/mm/slub.c
index 57707f01bcfb72395fd7414de8059dcb341cbdbd..c34bd44e8be94764c1143fe9ba6d5313b37d7239 100644
(file)
--- a/
mm/slub.c
+++ b/
mm/slub.c
@@
-1201,8
+1201,8
@@
static unsigned long kmem_cache_flags(unsigned long object_size,
/*
* Enable debugging if selected on the kernel commandline.
*/
- if (slub_debug && (!slub_debug_slabs ||
- !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs))))
+ if (slub_debug && (!slub_debug_slabs ||
(name &&
+ !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs))))
)
flags |= slub_debug;
return flags;