diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 123 | 
1 files changed, 51 insertions, 72 deletions
| diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index c24503b281a0..5b3c914053f2 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -286,55 +286,41 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags) | |||
| 286 | return ret; | 286 | return ret; | 
| 287 | } | 287 | } | 
| 288 | 288 | ||
| 289 | static void | 289 | static int | 
| 290 | lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | 290 | lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) | 
| 291 | { | 291 | { | 
| 292 | int hardirq, softirq; | 292 | int hardirq, softirq; | 
| 293 | char *comm; | 293 | char *comm; | 
| 294 | 294 | ||
| 295 | comm = trace_find_cmdline(entry->pid); | 295 | comm = trace_find_cmdline(entry->pid); | 
| 296 | |||
| 297 | trace_seq_printf(s, "%8.8s-%-5d ", comm, entry->pid); | ||
| 298 | trace_seq_printf(s, "%3d", cpu); | ||
| 299 | trace_seq_printf(s, "%c%c", | ||
| 300 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : | ||
| 301 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : '.', | ||
| 302 | ((entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.')); | ||
| 303 | |||
| 304 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; | 296 | hardirq = entry->flags & TRACE_FLAG_HARDIRQ; | 
| 305 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; | 297 | softirq = entry->flags & TRACE_FLAG_SOFTIRQ; | 
| 306 | if (hardirq && softirq) { | 298 | |
| 307 | trace_seq_putc(s, 'H'); | 299 | if (!trace_seq_printf(s, "%8.8s-%-5d %3d%c%c%c", | 
| 308 | } else { | 300 | comm, entry->pid, cpu, | 
| 309 | if (hardirq) { | 301 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : | 
| 310 | trace_seq_putc(s, 'h'); | 302 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? | 
| 311 | } else { | 303 | 'X' : '.', | 
| 312 | if (softirq) | 304 | (entry->flags & TRACE_FLAG_NEED_RESCHED) ? | 
| 313 | trace_seq_putc(s, 's'); | 305 | 'N' : '.', | 
| 314 | else | 306 | (hardirq && softirq) ? 'H' : | 
| 315 | trace_seq_putc(s, '.'); | 307 | hardirq ? 'h' : softirq ? 's' : '.')) | 
| 316 | } | 308 | return 0; | 
| 317 | } | ||
| 318 | 309 | ||
| 319 | if (entry->preempt_count) | 310 | if (entry->preempt_count) | 
| 320 | trace_seq_printf(s, "%x", entry->preempt_count); | 311 | return trace_seq_printf(s, "%x", entry->preempt_count); | 
| 321 | else | 312 | return trace_seq_puts(s, "."); | 
| 322 | trace_seq_puts(s, "."); | ||
| 323 | } | 313 | } | 
| 324 | 314 | ||
| 325 | static unsigned long preempt_mark_thresh = 100; | 315 | static unsigned long preempt_mark_thresh = 100; | 
| 326 | 316 | ||
| 327 | static void | 317 | static int | 
| 328 | lat_print_timestamp(struct trace_seq *s, u64 abs_usecs, | 318 | lat_print_timestamp(struct trace_seq *s, u64 abs_usecs, | 
| 329 | unsigned long rel_usecs) | 319 | unsigned long rel_usecs) | 
| 330 | { | 320 | { | 
| 331 | trace_seq_printf(s, " %4lldus", abs_usecs); | 321 | return trace_seq_printf(s, " %4lldus%c: ", abs_usecs, | 
| 332 | if (rel_usecs > preempt_mark_thresh) | 322 | rel_usecs > preempt_mark_thresh ? '!' : | 
| 333 | trace_seq_puts(s, "!: "); | 323 | rel_usecs > 1 ? '+' : ' '); | 
| 334 | else if (rel_usecs > 1) | ||
| 335 | trace_seq_puts(s, "+: "); | ||
| 336 | else | ||
| 337 | trace_seq_puts(s, " : "); | ||
| 338 | } | 324 | } | 
| 339 | 325 | ||
| 340 | int trace_print_context(struct trace_iterator *iter) | 326 | int trace_print_context(struct trace_iterator *iter) | 
| @@ -346,22 +332,14 @@ int trace_print_context(struct trace_iterator *iter) | |||
| 346 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); | 332 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); | 
| 347 | unsigned long secs = (unsigned long)t; | 333 | unsigned long secs = (unsigned long)t; | 
| 348 | 334 | ||
| 349 | if (!trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid)) | 335 | return trace_seq_printf(s, "%16s-%-5d [%03d] %5lu.%06lu: ", | 
| 350 | goto partial; | 336 | comm, entry->pid, entry->cpu, secs, usec_rem); | 
| 351 | if (!trace_seq_printf(s, "[%03d] ", entry->cpu)) | ||
| 352 | goto partial; | ||
| 353 | if (!trace_seq_printf(s, "%5lu.%06lu: ", secs, usec_rem)) | ||
| 354 | goto partial; | ||
| 355 | |||
| 356 | return 0; | ||
| 357 | |||
| 358 | partial: | ||
| 359 | return TRACE_TYPE_PARTIAL_LINE; | ||
| 360 | } | 337 | } | 
| 361 | 338 | ||
| 362 | int trace_print_lat_context(struct trace_iterator *iter) | 339 | int trace_print_lat_context(struct trace_iterator *iter) | 
| 363 | { | 340 | { | 
| 364 | u64 next_ts; | 341 | u64 next_ts; | 
| 342 | int ret; | ||
| 365 | struct trace_seq *s = &iter->seq; | 343 | struct trace_seq *s = &iter->seq; | 
| 366 | struct trace_entry *entry = iter->ent, | 344 | struct trace_entry *entry = iter->ent, | 
| 367 | *next_entry = trace_find_next_entry(iter, NULL, | 345 | *next_entry = trace_find_next_entry(iter, NULL, | 
| @@ -376,21 +354,22 @@ int trace_print_lat_context(struct trace_iterator *iter) | |||
| 376 | 354 | ||
| 377 | if (verbose) { | 355 | if (verbose) { | 
| 378 | char *comm = trace_find_cmdline(entry->pid); | 356 | char *comm = trace_find_cmdline(entry->pid); | 
| 379 | trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08lx]" | 357 | ret = trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08lx]" | 
| 380 | " %ld.%03ldms (+%ld.%03ldms): ", | 358 | " %ld.%03ldms (+%ld.%03ldms): ", comm, | 
| 381 | comm, | 359 | entry->pid, entry->cpu, entry->flags, | 
| 382 | entry->pid, entry->cpu, entry->flags, | 360 | entry->preempt_count, iter->idx, | 
| 383 | entry->preempt_count, iter->idx, | 361 | ns2usecs(iter->ts), | 
| 384 | ns2usecs(iter->ts), | 362 | abs_usecs / USEC_PER_MSEC, | 
| 385 | abs_usecs/1000, | 363 | abs_usecs % USEC_PER_MSEC, | 
| 386 | abs_usecs % 1000, rel_usecs/1000, | 364 | rel_usecs / USEC_PER_MSEC, | 
| 387 | rel_usecs % 1000); | 365 | rel_usecs % USEC_PER_MSEC); | 
| 388 | } else { | 366 | } else { | 
| 389 | lat_print_generic(s, entry, entry->cpu); | 367 | ret = lat_print_generic(s, entry, entry->cpu); | 
| 390 | lat_print_timestamp(s, abs_usecs, rel_usecs); | 368 | if (ret) | 
| 369 | ret = lat_print_timestamp(s, abs_usecs, rel_usecs); | ||
| 391 | } | 370 | } | 
| 392 | 371 | ||
| 393 | return 0; | 372 | return ret; | 
| 394 | } | 373 | } | 
| 395 | 374 | ||
| 396 | static const char state_to_char[] = TASK_STATE_TO_CHAR_STR; | 375 | static const char state_to_char[] = TASK_STATE_TO_CHAR_STR; | 
| @@ -486,7 +465,7 @@ int unregister_ftrace_event(struct trace_event *event) | |||
| 486 | 465 | ||
| 487 | int trace_nop_print(struct trace_iterator *iter, int flags) | 466 | int trace_nop_print(struct trace_iterator *iter, int flags) | 
| 488 | { | 467 | { | 
| 489 | return 0; | 468 | return TRACE_TYPE_HANDLED; | 
| 490 | } | 469 | } | 
| 491 | 470 | ||
| 492 | /* TRACE_FN */ | 471 | /* TRACE_FN */ | 
| @@ -506,7 +485,7 @@ static int trace_fn_latency(struct trace_iterator *iter, int flags) | |||
| 506 | if (!trace_seq_puts(s, ")\n")) | 485 | if (!trace_seq_puts(s, ")\n")) | 
| 507 | goto partial; | 486 | goto partial; | 
| 508 | 487 | ||
| 509 | return 0; | 488 | return TRACE_TYPE_HANDLED; | 
| 510 | 489 | ||
| 511 | partial: | 490 | partial: | 
| 512 | return TRACE_TYPE_PARTIAL_LINE; | 491 | return TRACE_TYPE_PARTIAL_LINE; | 
| @@ -533,7 +512,7 @@ static int trace_fn_trace(struct trace_iterator *iter, int flags) | |||
| 533 | if (!trace_seq_printf(s, "\n")) | 512 | if (!trace_seq_printf(s, "\n")) | 
| 534 | goto partial; | 513 | goto partial; | 
| 535 | 514 | ||
| 536 | return 0; | 515 | return TRACE_TYPE_HANDLED; | 
| 537 | 516 | ||
| 538 | partial: | 517 | partial: | 
| 539 | return TRACE_TYPE_PARTIAL_LINE; | 518 | return TRACE_TYPE_PARTIAL_LINE; | 
| @@ -550,7 +529,7 @@ static int trace_fn_raw(struct trace_iterator *iter, int flags) | |||
| 550 | field->parent_ip)) | 529 | field->parent_ip)) | 
| 551 | return TRACE_TYPE_PARTIAL_LINE; | 530 | return TRACE_TYPE_PARTIAL_LINE; | 
| 552 | 531 | ||
| 553 | return 0; | 532 | return TRACE_TYPE_HANDLED; | 
| 554 | } | 533 | } | 
| 555 | 534 | ||
| 556 | static int trace_fn_hex(struct trace_iterator *iter, int flags) | 535 | static int trace_fn_hex(struct trace_iterator *iter, int flags) | 
| @@ -563,7 +542,7 @@ static int trace_fn_hex(struct trace_iterator *iter, int flags) | |||
| 563 | SEQ_PUT_HEX_FIELD_RET(s, field->ip); | 542 | SEQ_PUT_HEX_FIELD_RET(s, field->ip); | 
| 564 | SEQ_PUT_HEX_FIELD_RET(s, field->parent_ip); | 543 | SEQ_PUT_HEX_FIELD_RET(s, field->parent_ip); | 
| 565 | 544 | ||
| 566 | return 0; | 545 | return TRACE_TYPE_HANDLED; | 
| 567 | } | 546 | } | 
| 568 | 547 | ||
| 569 | static int trace_fn_bin(struct trace_iterator *iter, int flags) | 548 | static int trace_fn_bin(struct trace_iterator *iter, int flags) | 
| @@ -576,7 +555,7 @@ static int trace_fn_bin(struct trace_iterator *iter, int flags) | |||
| 576 | SEQ_PUT_FIELD_RET(s, field->ip); | 555 | SEQ_PUT_FIELD_RET(s, field->ip); | 
| 577 | SEQ_PUT_FIELD_RET(s, field->parent_ip); | 556 | SEQ_PUT_FIELD_RET(s, field->parent_ip); | 
| 578 | 557 | ||
| 579 | return 0; | 558 | return TRACE_TYPE_HANDLED; | 
| 580 | } | 559 | } | 
| 581 | 560 | ||
| 582 | static struct trace_event trace_fn_event = { | 561 | static struct trace_event trace_fn_event = { | 
| @@ -611,7 +590,7 @@ static int trace_ctxwake_print(struct trace_iterator *iter, char *delim) | |||
| 611 | T, comm)) | 590 | T, comm)) | 
| 612 | return TRACE_TYPE_PARTIAL_LINE; | 591 | return TRACE_TYPE_PARTIAL_LINE; | 
| 613 | 592 | ||
| 614 | return 0; | 593 | return TRACE_TYPE_HANDLED; | 
| 615 | } | 594 | } | 
| 616 | 595 | ||
| 617 | static int trace_ctx_print(struct trace_iterator *iter, int flags) | 596 | static int trace_ctx_print(struct trace_iterator *iter, int flags) | 
| @@ -644,7 +623,7 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S) | |||
| 644 | T)) | 623 | T)) | 
| 645 | return TRACE_TYPE_PARTIAL_LINE; | 624 | return TRACE_TYPE_PARTIAL_LINE; | 
| 646 | 625 | ||
| 647 | return 0; | 626 | return TRACE_TYPE_HANDLED; | 
| 648 | } | 627 | } | 
| 649 | 628 | ||
| 650 | static int trace_ctx_raw(struct trace_iterator *iter, int flags) | 629 | static int trace_ctx_raw(struct trace_iterator *iter, int flags) | 
| @@ -678,7 +657,7 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S) | |||
| 678 | SEQ_PUT_HEX_FIELD_RET(s, field->next_prio); | 657 | SEQ_PUT_HEX_FIELD_RET(s, field->next_prio); | 
| 679 | SEQ_PUT_HEX_FIELD_RET(s, T); | 658 | SEQ_PUT_HEX_FIELD_RET(s, T); | 
| 680 | 659 | ||
| 681 | return 0; | 660 | return TRACE_TYPE_HANDLED; | 
| 682 | } | 661 | } | 
| 683 | 662 | ||
| 684 | static int trace_ctx_hex(struct trace_iterator *iter, int flags) | 663 | static int trace_ctx_hex(struct trace_iterator *iter, int flags) | 
| @@ -705,7 +684,7 @@ static int trace_ctxwake_bin(struct trace_iterator *iter, int flags) | |||
| 705 | SEQ_PUT_FIELD_RET(s, field->next_prio); | 684 | SEQ_PUT_FIELD_RET(s, field->next_prio); | 
| 706 | SEQ_PUT_FIELD_RET(s, field->next_state); | 685 | SEQ_PUT_FIELD_RET(s, field->next_state); | 
| 707 | 686 | ||
| 708 | return 0; | 687 | return TRACE_TYPE_HANDLED; | 
| 709 | } | 688 | } | 
| 710 | 689 | ||
| 711 | static struct trace_event trace_ctx_event = { | 690 | static struct trace_event trace_ctx_event = { | 
| @@ -739,7 +718,7 @@ static int trace_special_print(struct trace_iterator *iter, int flags) | |||
| 739 | field->arg3)) | 718 | field->arg3)) | 
| 740 | return TRACE_TYPE_PARTIAL_LINE; | 719 | return TRACE_TYPE_PARTIAL_LINE; | 
| 741 | 720 | ||
| 742 | return 0; | 721 | return TRACE_TYPE_HANDLED; | 
| 743 | } | 722 | } | 
| 744 | 723 | ||
| 745 | static int trace_special_hex(struct trace_iterator *iter, int flags) | 724 | static int trace_special_hex(struct trace_iterator *iter, int flags) | 
| @@ -753,7 +732,7 @@ static int trace_special_hex(struct trace_iterator *iter, int flags) | |||
| 753 | SEQ_PUT_HEX_FIELD_RET(s, field->arg2); | 732 | SEQ_PUT_HEX_FIELD_RET(s, field->arg2); | 
| 754 | SEQ_PUT_HEX_FIELD_RET(s, field->arg3); | 733 | SEQ_PUT_HEX_FIELD_RET(s, field->arg3); | 
| 755 | 734 | ||
| 756 | return 0; | 735 | return TRACE_TYPE_HANDLED; | 
| 757 | } | 736 | } | 
| 758 | 737 | ||
| 759 | static int trace_special_bin(struct trace_iterator *iter, int flags) | 738 | static int trace_special_bin(struct trace_iterator *iter, int flags) | 
| @@ -767,7 +746,7 @@ static int trace_special_bin(struct trace_iterator *iter, int flags) | |||
| 767 | SEQ_PUT_FIELD_RET(s, field->arg2); | 746 | SEQ_PUT_FIELD_RET(s, field->arg2); | 
| 768 | SEQ_PUT_FIELD_RET(s, field->arg3); | 747 | SEQ_PUT_FIELD_RET(s, field->arg3); | 
| 769 | 748 | ||
| 770 | return 0; | 749 | return TRACE_TYPE_HANDLED; | 
| 771 | } | 750 | } | 
| 772 | 751 | ||
| 773 | static struct trace_event trace_special_event = { | 752 | static struct trace_event trace_special_event = { | 
| @@ -801,7 +780,7 @@ static int trace_stack_print(struct trace_iterator *iter, int flags) | |||
| 801 | goto partial; | 780 | goto partial; | 
| 802 | } | 781 | } | 
| 803 | 782 | ||
| 804 | return 0; | 783 | return TRACE_TYPE_HANDLED; | 
| 805 | 784 | ||
| 806 | partial: | 785 | partial: | 
| 807 | return TRACE_TYPE_PARTIAL_LINE; | 786 | return TRACE_TYPE_PARTIAL_LINE; | 
| @@ -830,7 +809,7 @@ static int trace_user_stack_print(struct trace_iterator *iter, int flags) | |||
| 830 | if (!trace_seq_putc(s, '\n')) | 809 | if (!trace_seq_putc(s, '\n')) | 
| 831 | goto partial; | 810 | goto partial; | 
| 832 | 811 | ||
| 833 | return 0; | 812 | return TRACE_TYPE_HANDLED; | 
| 834 | 813 | ||
| 835 | partial: | 814 | partial: | 
| 836 | return TRACE_TYPE_PARTIAL_LINE; | 815 | return TRACE_TYPE_PARTIAL_LINE; | 
| @@ -859,7 +838,7 @@ static int trace_print_print(struct trace_iterator *iter, int flags) | |||
| 859 | if (!trace_seq_printf(s, ": %s", field->buf)) | 838 | if (!trace_seq_printf(s, ": %s", field->buf)) | 
| 860 | goto partial; | 839 | goto partial; | 
| 861 | 840 | ||
| 862 | return 0; | 841 | return TRACE_TYPE_HANDLED; | 
| 863 | 842 | ||
| 864 | partial: | 843 | partial: | 
| 865 | return TRACE_TYPE_PARTIAL_LINE; | 844 | return TRACE_TYPE_PARTIAL_LINE; | 
| @@ -874,7 +853,7 @@ static int trace_print_raw(struct trace_iterator *iter, int flags) | |||
| 874 | if (!trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf)) | 853 | if (!trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf)) | 
| 875 | goto partial; | 854 | goto partial; | 
| 876 | 855 | ||
| 877 | return 0; | 856 | return TRACE_TYPE_HANDLED; | 
| 878 | 857 | ||
| 879 | partial: | 858 | partial: | 
| 880 | return TRACE_TYPE_PARTIAL_LINE; | 859 | return TRACE_TYPE_PARTIAL_LINE; | 
