Huang Ying
18fab912d4
tracing: Fix ring_buffer_read_page reading out of page boundary
With the configuration: CONFIG_DEBUG_PAGEALLOC=y and Shaohua's patch:
[PATCH]x86: make spurious_fault check correct pte bit
Function call graph trace with the following will trigger a page fault.
# cd /sys/kernel/debug/tracing/
# echo function_graph > current_tracer
# cat per_cpu/cpu1/trace_pipe_raw > /dev/null
BUG: unable to handle kernel paging request at ffff880006e99000
IP: [<ffffffff81085572>] rb_event_length+0x1/0x3f
PGD 1b19063 PUD 1b1d063 PMD 3f067 PTE 6e99160
Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
last sysfs file: /sys/devices/virtual/net/lo/operstate
CPU 1
Modules linked in:
Pid: 1982, comm: cat Not tainted 2.6.35-rc6-aes+ #300 /Bochs
RIP: 0010:[<ffffffff81085572>] [<ffffffff81085572>] rb_event_length+0x1/0x3f
RSP: 0018:ffff880006475e38 EFLAGS: 00010006
RAX: 0000000000000ff0 RBX: ffff88000786c630 RCX: 000000000000001d
RDX: ffff880006e98000 RSI: 0000000000000ff0 RDI: ffff880006e99000
RBP: ffff880006475eb8 R08: 000000145d7008bd R09: 0000000000000000
R10: 0000000000008000 R11: ffffffff815d9336 R12: ffff880006d08000
R13: ffff880006e605d8 R14: 0000000000000000 R15: 0000000000000018
FS: 00007f2b83e456f0(0000) GS:ffff880002100000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: ffff880006e99000 CR3: 00000000064a8000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process cat (pid: 1982, threadinfo ffff880006474000, task ffff880006e40770)
Stack:
ffff880006475eb8 ffffffff8108730f 0000000000000ff0 000000145d7008bd
<0> ffff880006e98010 ffff880006d08010 0000000000000296 ffff88000786c640
<0> ffffffff81002956 0000000000000000 ffff8800071f4680 ffff8800071f4680
Call Trace:
[<ffffffff8108730f>] ? ring_buffer_read_page+0x15a/0x24a
[<ffffffff81002956>] ? return_to_handler+0x15/0x2f
[<ffffffff8108a575>] tracing_buffers_read+0xb9/0x164
[<ffffffff810debfe>] vfs_read+0xaf/0x150
[<ffffffff81002941>] return_to_handler+0x0/0x2f
[<ffffffff810248b0>] __bad_area_nosemaphore+0x17e/0x1a1
[<ffffffff81002941>] return_to_handler+0x0/0x2f
[<ffffffff810248e6>] bad_area_nosemaphore+0x13/0x15
Code: 80 25 b2 16 b3 00 fe c9 c3 55 48 89 e5 f0 80 0d a4 16 b3 00 02 c9 c3 55 31 c0 48 89 e5 48 83 3d 94 16 b3 00 01 c9 0f 94 c0 c3 55 <8a> 0f 48 89 e5 83 e1 1f b8 08 00 00 00 0f b6 d1 83 fa 1e 74 27
RIP [<ffffffff81085572>] rb_event_length+0x1/0x3f
RSP <ffff880006475e38>
CR2: ffff880006e99000
---[ end trace a6877bb92ccb36bb ]---
The root cause is that ring_buffer_read_page() may read out of page
boundary, because the boundary checking is done after reading. This is
fixed via doing boundary checking before reading.
Reported-by: Shaohua Li <shaohua.li@intel.com>
Cc: <stable@kernel.org>
Signed-off-by: Huang Ying <ying.huang@intel.com>
LKML-Reference: <1280297641.2771.307.camel@yhuang-dev>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2010-08-06 14:34:45 -04:00
..
2010-06-05 11:17:36 +09:30
2009-09-21 14:29:21 +02:00
2010-06-09 17:05:08 +02:00
2010-06-10 11:02:34 -04:00
2010-07-02 09:52:58 -07:00
2010-08-06 14:34:45 -04:00
2010-05-18 08:57:00 +10:00
2010-03-30 22:02:32 +09:00
2010-03-30 22:02:32 +09:00
2010-03-30 22:02:32 +09:00
2010-03-30 22:02:32 +09:00
2010-03-30 22:02:32 +09:00
2010-04-05 13:19:45 -07:00
2009-12-12 13:08:14 +01:00
2010-04-02 20:12:00 +02:00
2010-05-10 23:18:47 +02:00
2010-06-04 15:21:45 -07:00
2010-05-19 11:48:18 -07:00
2010-06-01 09:22:50 -07:00
2010-05-27 09:12:44 -07:00
2010-05-27 09:12:45 -07:00
2010-03-29 18:55:40 +02:00
2010-03-06 11:26:46 -08:00
2010-06-04 15:21:45 -07:00
2010-05-27 09:12:47 -07:00
2010-05-30 09:00:03 -07:00
2009-12-09 14:22:14 +01:00
2010-06-30 15:43:44 -07:00
2010-04-12 12:19:18 +10:00
2010-05-26 16:15:37 +02:00
2009-11-27 06:21:57 +01:00
2010-05-04 08:39:36 +02:00
2009-11-18 16:32:12 +01:00
2010-05-20 21:04:21 -05:00
2009-12-03 11:50:11 +01:00
2010-06-29 15:29:31 -07:00
2010-02-16 15:11:08 -08:00
2010-05-27 09:12:45 -07:00
2010-05-08 18:08:30 +02:00
2010-05-21 09:37:31 -07:00
2010-03-24 16:31:21 -07:00
2010-03-30 22:02:32 +09:00
2010-05-04 05:38:16 +02:00
2010-04-06 00:15:37 +02:00
2010-05-21 09:37:30 -07:00
2010-05-20 21:04:18 -05:00
2010-07-04 20:17:22 -07:00
2009-10-11 11:20:58 -07:00
2009-12-14 23:55:32 +01:00
2010-05-19 08:18:44 +02:00
2010-02-25 10:34:26 +01:00
2009-09-24 07:20:58 -07:00
2010-03-30 22:02:32 +09:00
2010-05-27 09:12:48 -07:00
2010-05-27 09:12:53 -07:00
2010-03-12 16:04:50 -08:00
2010-06-08 18:43:00 +02:00
2010-03-30 22:02:32 +09:00
2010-05-27 09:12:51 -07:00
2010-05-17 00:21:03 +02:00
2010-05-27 09:12:46 -07:00
2010-05-27 22:38:15 +02:00
2010-05-20 21:04:27 -05:00
2010-05-27 09:12:57 -07:00
2010-05-27 09:12:44 -07:00
2010-02-10 17:47:17 -08:00
2010-05-10 11:08:34 -07:00
2010-05-10 11:08:34 -07:00
2010-05-11 16:10:47 -07:00
2010-05-18 08:27:54 -07:00
2010-05-11 16:10:47 -07:00
2010-05-10 11:08:35 -07:00
2010-05-11 16:10:47 -07:00
2010-05-10 11:08:35 -07:00
2010-05-27 09:12:48 -07:00
2010-03-30 22:02:32 +09:00
2010-05-11 12:01:10 -07:00
2009-12-14 23:55:33 +01:00
2009-12-14 23:55:33 +01:00
2010-04-15 08:54:59 +02:00
2010-03-30 22:02:32 +09:00
2009-12-14 23:55:33 +01:00
2010-05-27 09:12:47 -07:00
2010-06-23 06:50:44 -07:00
2010-03-11 18:32:53 +01:00
2010-04-23 11:02:02 +02:00
2010-04-02 20:12:05 +02:00
2010-07-02 09:52:58 -07:00
2010-05-27 09:12:46 -07:00
2009-12-01 08:20:31 -08:00
2010-03-29 09:13:30 -07:00
2010-03-29 09:14:47 -07:00
2010-05-27 09:12:48 -07:00
2010-06-04 15:21:45 -07:00
2010-03-21 19:30:13 +01:00
2009-12-14 23:55:33 +01:00
2010-03-30 22:02:32 +09:00
2010-05-31 08:37:44 +02:00
2010-03-12 15:52:32 -08:00
2010-05-27 09:12:44 -07:00
2010-05-25 08:07:05 -07:00
2009-12-03 12:14:38 -08:00
2010-06-03 14:54:39 +02:00
2010-03-30 22:02:32 +09:00
2010-05-24 11:50:38 +02:00
2010-06-04 15:21:45 -07:00
2010-05-14 09:50:34 -04:00
2010-03-06 11:26:23 -08:00
2009-09-23 18:13:10 -07:00
2010-05-21 09:37:29 -07:00
2009-12-02 10:22:59 +01:00
2010-05-10 08:48:39 +02:00
2009-11-12 02:04:55 -08:00
2010-05-27 09:12:48 -07:00