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; |