diff options
| author | Lai Jiangshan <laijs@cn.fujitsu.com> | 2009-01-15 05:05:40 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-01-16 06:15:20 -0500 |
| commit | 6c1a99afbda99cd8d8c69d756387041567a13d87 (patch) | |
| tree | 8f8c9d5cb072bb6d9f83f82c81cf81c123579863 /kernel/trace/trace_output.c | |
| parent | 55922173f1f63903b6de03711ab8ff980cbe58d2 (diff) | |
ftrace: fix trace_output
Impact: fix bug for handling partial line
trace_seq_printf(), seq_print_userip_objs(), ... return
0 -- partial line was written
other(>0) -- success
duplicate output is also removed in trace_print_raw().
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index df0c25cbed30..4e3ad36b117c 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -440,9 +440,9 @@ trace_fn_raw(struct trace_seq *s, struct trace_entry *entry, int flags) | |||
| 440 | 440 | ||
| 441 | trace_assign_type(field, entry); | 441 | trace_assign_type(field, entry); |
| 442 | 442 | ||
| 443 | if (trace_seq_printf(s, "%x %x\n", | 443 | if (!trace_seq_printf(s, "%x %x\n", |
| 444 | field->ip, | 444 | field->ip, |
| 445 | field->parent_ip)) | 445 | field->parent_ip)) |
| 446 | return TRACE_TYPE_PARTIAL_LINE; | 446 | return TRACE_TYPE_PARTIAL_LINE; |
| 447 | 447 | ||
| 448 | return 0; | 448 | return 0; |
| @@ -497,14 +497,14 @@ trace_ctxwake_print(struct trace_seq *s, struct trace_entry *entry, int flags, | |||
| 497 | T = task_state_char(field->next_state); | 497 | T = task_state_char(field->next_state); |
| 498 | S = task_state_char(field->prev_state); | 498 | S = task_state_char(field->prev_state); |
| 499 | comm = trace_find_cmdline(field->next_pid); | 499 | comm = trace_find_cmdline(field->next_pid); |
| 500 | if (trace_seq_printf(s, " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n", | 500 | if (!trace_seq_printf(s, " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n", |
| 501 | field->prev_pid, | 501 | field->prev_pid, |
| 502 | field->prev_prio, | 502 | field->prev_prio, |
| 503 | S, delim, | 503 | S, delim, |
| 504 | field->next_cpu, | 504 | field->next_cpu, |
| 505 | field->next_pid, | 505 | field->next_pid, |
| 506 | field->next_prio, | 506 | field->next_prio, |
| 507 | T, comm)) | 507 | T, comm)) |
| 508 | return TRACE_TYPE_PARTIAL_LINE; | 508 | return TRACE_TYPE_PARTIAL_LINE; |
| 509 | 509 | ||
| 510 | return 0; | 510 | return 0; |
| @@ -534,14 +534,14 @@ trace_ctxwake_raw(struct trace_seq *s, struct trace_entry *entry, int flags, | |||
| 534 | if (!S) | 534 | if (!S) |
| 535 | task_state_char(field->prev_state); | 535 | task_state_char(field->prev_state); |
| 536 | T = task_state_char(field->next_state); | 536 | T = task_state_char(field->next_state); |
| 537 | if (trace_seq_printf(s, "%d %d %c %d %d %d %c\n", | 537 | if (!trace_seq_printf(s, "%d %d %c %d %d %d %c\n", |
| 538 | field->prev_pid, | 538 | field->prev_pid, |
| 539 | field->prev_prio, | 539 | field->prev_prio, |
| 540 | S, | 540 | S, |
| 541 | field->next_cpu, | 541 | field->next_cpu, |
| 542 | field->next_pid, | 542 | field->next_pid, |
| 543 | field->next_prio, | 543 | field->next_prio, |
| 544 | T)) | 544 | T)) |
| 545 | return TRACE_TYPE_PARTIAL_LINE; | 545 | return TRACE_TYPE_PARTIAL_LINE; |
| 546 | 546 | ||
| 547 | return 0; | 547 | return 0; |
| @@ -639,10 +639,10 @@ trace_special_print(struct trace_seq *s, struct trace_entry *entry, int flags) | |||
| 639 | 639 | ||
| 640 | trace_assign_type(field, entry); | 640 | trace_assign_type(field, entry); |
| 641 | 641 | ||
| 642 | if (trace_seq_printf(s, "# %ld %ld %ld\n", | 642 | if (!trace_seq_printf(s, "# %ld %ld %ld\n", |
| 643 | field->arg1, | 643 | field->arg1, |
| 644 | field->arg2, | 644 | field->arg2, |
| 645 | field->arg3)) | 645 | field->arg3)) |
| 646 | return TRACE_TYPE_PARTIAL_LINE; | 646 | return TRACE_TYPE_PARTIAL_LINE; |
| 647 | 647 | ||
| 648 | return 0; | 648 | return 0; |
| @@ -697,13 +697,13 @@ trace_stack_print(struct trace_seq *s, struct trace_entry *entry, int flags) | |||
| 697 | 697 | ||
| 698 | for (i = 0; i < FTRACE_STACK_ENTRIES; i++) { | 698 | for (i = 0; i < FTRACE_STACK_ENTRIES; i++) { |
| 699 | if (i) { | 699 | if (i) { |
| 700 | if (trace_seq_puts(s, " <= ")) | 700 | if (!trace_seq_puts(s, " <= ")) |
| 701 | goto partial; | 701 | goto partial; |
| 702 | 702 | ||
| 703 | if (seq_print_ip_sym(s, field->caller[i], flags)) | 703 | if (!seq_print_ip_sym(s, field->caller[i], flags)) |
| 704 | goto partial; | 704 | goto partial; |
| 705 | } | 705 | } |
| 706 | if (trace_seq_puts(s, "\n")) | 706 | if (!trace_seq_puts(s, "\n")) |
| 707 | goto partial; | 707 | goto partial; |
| 708 | } | 708 | } |
| 709 | 709 | ||
| @@ -731,10 +731,10 @@ trace_user_stack_print(struct trace_seq *s, struct trace_entry *entry, | |||
| 731 | 731 | ||
| 732 | trace_assign_type(field, entry); | 732 | trace_assign_type(field, entry); |
| 733 | 733 | ||
| 734 | if (seq_print_userip_objs(field, s, flags)) | 734 | if (!seq_print_userip_objs(field, s, flags)) |
| 735 | goto partial; | 735 | goto partial; |
| 736 | 736 | ||
| 737 | if (trace_seq_putc(s, '\n')) | 737 | if (!trace_seq_putc(s, '\n')) |
| 738 | goto partial; | 738 | goto partial; |
| 739 | 739 | ||
| 740 | return 0; | 740 | return 0; |
| @@ -760,10 +760,10 @@ trace_print_print(struct trace_seq *s, struct trace_entry *entry, int flags) | |||
| 760 | 760 | ||
| 761 | trace_assign_type(field, entry); | 761 | trace_assign_type(field, entry); |
| 762 | 762 | ||
| 763 | if (seq_print_ip_sym(s, field->ip, flags)) | 763 | if (!seq_print_ip_sym(s, field->ip, flags)) |
| 764 | goto partial; | 764 | goto partial; |
| 765 | 765 | ||
| 766 | if (trace_seq_printf(s, ": %s", field->buf)) | 766 | if (!trace_seq_printf(s, ": %s", field->buf)) |
| 767 | goto partial; | 767 | goto partial; |
| 768 | 768 | ||
| 769 | return 0; | 769 | return 0; |
| @@ -779,10 +779,7 @@ trace_print_raw(struct trace_seq *s, struct trace_entry *entry, int flags) | |||
| 779 | 779 | ||
| 780 | trace_assign_type(field, entry); | 780 | trace_assign_type(field, entry); |
| 781 | 781 | ||
| 782 | if (seq_print_ip_sym(s, field->ip, flags)) | 782 | if (!trace_seq_printf(s, "# %lx %s", field->ip, field->buf)) |
| 783 | goto partial; | ||
| 784 | |||
| 785 | if (trace_seq_printf(s, "# %lx %s", field->ip, field->buf)) | ||
| 786 | goto partial; | 783 | goto partial; |
| 787 | 784 | ||
| 788 | return 0; | 785 | return 0; |
