diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-08-28 13:37:31 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-08-28 13:37:31 -0400 |
| commit | cdf0bfb0126bbd8c5424ca01fd59fd70d8ea80f9 (patch) | |
| tree | e7864d3dacf433b7ccbe17a49b2e72b6a4b3a24c /kernel/trace/trace_syscalls.c | |
| parent | b4f656eea63376da79b0b5a17660c4ce14b71b74 (diff) | |
| parent | 6af396a6b6c698eb3834184518fc9a59bc22c817 (diff) | |
Merge branch 'for-rmk/barriers' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into devel-stable
Diffstat (limited to 'kernel/trace/trace_syscalls.c')
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 322e16461072..8fd03657bc7d 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -175,7 +175,7 @@ print_syscall_exit(struct trace_iterator *iter, int flags, | |||
| 175 | entry = syscall_nr_to_meta(syscall); | 175 | entry = syscall_nr_to_meta(syscall); |
| 176 | 176 | ||
| 177 | if (!entry) { | 177 | if (!entry) { |
| 178 | trace_seq_printf(s, "\n"); | 178 | trace_seq_putc(s, '\n'); |
| 179 | return TRACE_TYPE_HANDLED; | 179 | return TRACE_TYPE_HANDLED; |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -566,15 +566,15 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) | |||
| 566 | if (!sys_data) | 566 | if (!sys_data) |
| 567 | return; | 567 | return; |
| 568 | 568 | ||
| 569 | head = this_cpu_ptr(sys_data->enter_event->perf_events); | ||
| 570 | if (hlist_empty(head)) | ||
| 571 | return; | ||
| 572 | |||
| 569 | /* get the size after alignment with the u32 buffer size field */ | 573 | /* get the size after alignment with the u32 buffer size field */ |
| 570 | size = sizeof(unsigned long) * sys_data->nb_args + sizeof(*rec); | 574 | size = sizeof(unsigned long) * sys_data->nb_args + sizeof(*rec); |
| 571 | size = ALIGN(size + sizeof(u32), sizeof(u64)); | 575 | size = ALIGN(size + sizeof(u32), sizeof(u64)); |
| 572 | size -= sizeof(u32); | 576 | size -= sizeof(u32); |
| 573 | 577 | ||
| 574 | if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, | ||
| 575 | "perf buffer not large enough")) | ||
| 576 | return; | ||
| 577 | |||
| 578 | rec = (struct syscall_trace_enter *)perf_trace_buf_prepare(size, | 578 | rec = (struct syscall_trace_enter *)perf_trace_buf_prepare(size, |
| 579 | sys_data->enter_event->event.type, regs, &rctx); | 579 | sys_data->enter_event->event.type, regs, &rctx); |
| 580 | if (!rec) | 580 | if (!rec) |
| @@ -583,8 +583,6 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) | |||
| 583 | rec->nr = syscall_nr; | 583 | rec->nr = syscall_nr; |
| 584 | syscall_get_arguments(current, regs, 0, sys_data->nb_args, | 584 | syscall_get_arguments(current, regs, 0, sys_data->nb_args, |
| 585 | (unsigned long *)&rec->args); | 585 | (unsigned long *)&rec->args); |
| 586 | |||
| 587 | head = this_cpu_ptr(sys_data->enter_event->perf_events); | ||
| 588 | perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); | 586 | perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); |
| 589 | } | 587 | } |
| 590 | 588 | ||
| @@ -642,18 +640,14 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) | |||
| 642 | if (!sys_data) | 640 | if (!sys_data) |
| 643 | return; | 641 | return; |
| 644 | 642 | ||
| 643 | head = this_cpu_ptr(sys_data->exit_event->perf_events); | ||
| 644 | if (hlist_empty(head)) | ||
| 645 | return; | ||
| 646 | |||
| 645 | /* We can probably do that at build time */ | 647 | /* We can probably do that at build time */ |
| 646 | size = ALIGN(sizeof(*rec) + sizeof(u32), sizeof(u64)); | 648 | size = ALIGN(sizeof(*rec) + sizeof(u32), sizeof(u64)); |
| 647 | size -= sizeof(u32); | 649 | size -= sizeof(u32); |
| 648 | 650 | ||
| 649 | /* | ||
| 650 | * Impossible, but be paranoid with the future | ||
| 651 | * How to put this check outside runtime? | ||
| 652 | */ | ||
| 653 | if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, | ||
| 654 | "exit event has grown above perf buffer size")) | ||
| 655 | return; | ||
| 656 | |||
| 657 | rec = (struct syscall_trace_exit *)perf_trace_buf_prepare(size, | 651 | rec = (struct syscall_trace_exit *)perf_trace_buf_prepare(size, |
| 658 | sys_data->exit_event->event.type, regs, &rctx); | 652 | sys_data->exit_event->event.type, regs, &rctx); |
| 659 | if (!rec) | 653 | if (!rec) |
| @@ -661,8 +655,6 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) | |||
| 661 | 655 | ||
| 662 | rec->nr = syscall_nr; | 656 | rec->nr = syscall_nr; |
| 663 | rec->ret = syscall_get_return_value(current, regs); | 657 | rec->ret = syscall_get_return_value(current, regs); |
| 664 | |||
| 665 | head = this_cpu_ptr(sys_data->exit_event->perf_events); | ||
| 666 | perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); | 658 | perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); |
| 667 | } | 659 | } |
| 668 | 660 | ||
