diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2010-05-19 04:52:27 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-05-21 05:37:56 -0400 |
commit | b7e2ecef92d2e7785e6d76b41e5ba8bcbc45259d (patch) | |
tree | 341c3a03743108bbdf82ee0eed9f4c4085f1b694 /kernel/trace/trace_kprobe.c | |
parent | 1c34bde13a3cdcd4c7c6322f8052e67c2c91caf1 (diff) |
perf, trace: Optimize tracepoints by removing IRQ-disable from perf/tracepoint interaction
Improves performance.
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1274259525.5605.10352.camel@twins>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace_kprobe.c')
-rw-r--r-- | kernel/trace/trace_kprobe.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 2d7bf4146be8..20c96de0aea0 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
@@ -1343,7 +1343,6 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp, | |||
1343 | struct kprobe_trace_entry_head *entry; | 1343 | struct kprobe_trace_entry_head *entry; |
1344 | u8 *data; | 1344 | u8 *data; |
1345 | int size, __size, i; | 1345 | int size, __size, i; |
1346 | unsigned long irq_flags; | ||
1347 | int rctx; | 1346 | int rctx; |
1348 | 1347 | ||
1349 | __size = sizeof(*entry) + tp->size; | 1348 | __size = sizeof(*entry) + tp->size; |
@@ -1353,7 +1352,7 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp, | |||
1353 | "profile buffer not large enough")) | 1352 | "profile buffer not large enough")) |
1354 | return; | 1353 | return; |
1355 | 1354 | ||
1356 | entry = perf_trace_buf_prepare(size, call->id, &rctx, &irq_flags); | 1355 | entry = perf_trace_buf_prepare(size, call->id, regs, &rctx); |
1357 | if (!entry) | 1356 | if (!entry) |
1358 | return; | 1357 | return; |
1359 | 1358 | ||
@@ -1362,7 +1361,7 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp, | |||
1362 | for (i = 0; i < tp->nr_args; i++) | 1361 | for (i = 0; i < tp->nr_args; i++) |
1363 | call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); | 1362 | call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); |
1364 | 1363 | ||
1365 | perf_trace_buf_submit(entry, size, rctx, entry->ip, 1, irq_flags, regs, call->perf_data); | 1364 | perf_trace_buf_submit(entry, size, rctx, entry->ip, 1, regs, call->perf_data); |
1366 | } | 1365 | } |
1367 | 1366 | ||
1368 | /* Kretprobe profile handler */ | 1367 | /* Kretprobe profile handler */ |
@@ -1374,7 +1373,6 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, | |||
1374 | struct kretprobe_trace_entry_head *entry; | 1373 | struct kretprobe_trace_entry_head *entry; |
1375 | u8 *data; | 1374 | u8 *data; |
1376 | int size, __size, i; | 1375 | int size, __size, i; |
1377 | unsigned long irq_flags; | ||
1378 | int rctx; | 1376 | int rctx; |
1379 | 1377 | ||
1380 | __size = sizeof(*entry) + tp->size; | 1378 | __size = sizeof(*entry) + tp->size; |
@@ -1384,7 +1382,7 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, | |||
1384 | "profile buffer not large enough")) | 1382 | "profile buffer not large enough")) |
1385 | return; | 1383 | return; |
1386 | 1384 | ||
1387 | entry = perf_trace_buf_prepare(size, call->id, &rctx, &irq_flags); | 1385 | entry = perf_trace_buf_prepare(size, call->id, regs, &rctx); |
1388 | if (!entry) | 1386 | if (!entry) |
1389 | return; | 1387 | return; |
1390 | 1388 | ||
@@ -1395,7 +1393,7 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, | |||
1395 | call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); | 1393 | call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); |
1396 | 1394 | ||
1397 | perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, | 1395 | perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, |
1398 | irq_flags, regs, call->perf_data); | 1396 | regs, call->perf_data); |
1399 | } | 1397 | } |
1400 | 1398 | ||
1401 | static int probe_perf_enable(struct ftrace_event_call *call) | 1399 | static int probe_perf_enable(struct ftrace_event_call *call) |