tracing: updates for 2.6.36 and stable
Subsystems (2)
Steven Rostedt
maintainerIngo,
Please pull the latest tip/perf/urgent tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
tip/perf/urgent
Huang Ying (1):
tracing: Fix ring_buffer_read_page reading out of page boundary
Shaohua Li (1):
tracing: Fix an unallocated memory access in function_graph
----
kernel/trace/ring_buffer.c | 3 +++ kernel/trace/trace_functions_graph.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletions(-)
Steven Rostedt
maintainerPATCH 1/2 tracing: Fix an unallocated memory access in function_graph
From: Shaohua Li <[email protected]>
With CONFIG_DEBUG_PAGEALLOC, I observed an unallocated memory access in function_graph trace. It appears we find a small size entry in ring buffer, but we access it as a big size entry. The access overflows the page size and touches an unallocated page.
LKML-Reference: <[email protected]>
--- kernel/trace/trace_functions_graph.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)
kernel/trace/trace_functions_graph.c +9 -1
@@ -507,7 +507,15 @@ get_return_for_leaf(struct trace_iterator *iter,* if the output fails. */ data->ent = *curr; - data->ret = *next; +/* +* If the next event is not a return type, then +* we only care about what type it is. Otherwise we can +* safely copy the entire event. +*/ +if (next->ent.type ==TRACE_GRAPH_RET ) + data->ret = *next; +else + data->ret.ent.type = next->ent.type; } }
Signature · 1 line
1.7.1
Steven Rostedt
maintainerPATCH 2/2 tracing: Fix ring_buffer_read_page reading out of page boundary
In reply to Steven RostedtFrom: Huang Ying <[email protected]>
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.
LKML-Reference: <1280297641.2771.307.camel@yhuang-dev>
--- kernel/trace/ring_buffer.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
kernel/trace/ring_buffer.c +3 -0
@@ -3868,6 +3868,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer, rpos = reader->read; pos += size; +if (rpos >= commit) +break ; + event =rb_reader_event (cpu_buffer); size =rb_event_length (event); }while (len > size);
Signature · 1 line
1.7.1