projects
/
linux-block.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
2aaf209
)
kfifo: fix kernel BUG in dma example
author
Andrea Righi
<arighi@develer.com>
Thu, 19 Aug 2010 21:13:29 +0000
(14:13 -0700)
committer
Linus Torvalds
<torvalds@linux-foundation.org>
Fri, 20 Aug 2010 16:34:54 +0000
(09:34 -0700)
The scatterlist is used uninitialized in kfifo_dma_in_prepare(). This
triggers the following bug if CONFIG_DEBUG_SG=y:
------------[ cut here ]------------
kernel BUG at include/linux/scatterlist.h:65!
invalid opcode: 0000 [#1] PREEMPT SMP
...
Call Trace:
[<
ffffffff810a1eab
>] setup_sgl+0x6b/0xe0
[<
ffffffffa03d7000
>] ? example_init+0x0/0x265 [dma_example]
[<
ffffffff810a2021
>] __kfifo_dma_in_prepare+0x21/0x30
[<
ffffffffa03d7124
>] example_init+0x124/0x265 [dma_example]
[<
ffffffff810f9c55
>] ? trace_module_notify+0x25/0x370
[<
ffffffff81110c6e
>] ? free_pages_prepare+0x11e/0x1e0
[<
ffffffff8106f2b1
>] ? get_parent_ip+0x11/0x50
[<
ffffffff810f9c55
>] ? trace_module_notify+0x25/0x370
[<
ffffffff810b65fd
>] ? trace_hardirqs_on+0xd/0x10
[<
ffffffff814beade
>] ? mutex_unlock+0xe/0x10
[<
ffffffff810f9c71
>] ? trace_module_notify+0x41/0x370
[<
ffffffff810a77d5
>] ? __blocking_notifier_call_chain+0x45/0x80
[<
ffffffff81137b7a
>] ? vfree+0x2a/0x30
[<
ffffffff810a6ac3
>] ? up_read+0x23/0x40
[<
ffffffff810a77f5
>] ? __blocking_notifier_call_chain+0x65/0x80
[<
ffffffff810001e3
>] do_one_initcall+0x43/0x180
[<
ffffffff810c577a
>] sys_init_module+0xba/0x200
[<
ffffffff8103819b
>] system_call_fastpath+0x16/0x1b
RIP [<
ffffffff810a1e31
>] setup_sgl_buf+0x1a1/0x1b0
RSP <
ffff88006720dc98
>
---[ end trace
a72b979fd3c1d3a5
]---
Add the proper initialization to avoid the bug.
Signed-off-by: Andrea Righi <arighi@develer.com>
Acked-by: Stefani Seibold <stefani@seibold.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
samples/kfifo/dma-example.c
patch
|
blob
|
blame
|
history
diff --git
a/samples/kfifo/dma-example.c
b/samples/kfifo/dma-example.c
index b9482c28b41aa0a54cb24c483a84499fe0135d9a..03433ca5bdadeeba348b7c5436ee2f3fae28b5d4 100644
(file)
--- a/
samples/kfifo/dma-example.c
+++ b/
samples/kfifo/dma-example.c
@@
-45,6
+45,7
@@
static int __init example_init(void)
printk(KERN_INFO "queue len: %u\n", kfifo_len(&fifo));
+ sg_init_table(sg, ARRAY_SIZE(sg));
ret = kfifo_dma_in_prepare(&fifo, sg, ARRAY_SIZE(sg), FIFO_SIZE);
printk(KERN_INFO "DMA sgl entries: %d\n", ret);