aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r--kernel/trace/trace_output.c123
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
289static void 289static int
290lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu) 290lat_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
325static unsigned long preempt_mark_thresh = 100; 315static unsigned long preempt_mark_thresh = 100;
326 316
327static void 317static int
328lat_print_timestamp(struct trace_seq *s, u64 abs_usecs, 318lat_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
340int trace_print_context(struct trace_iterator *iter) 326int 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
358partial:
359 return TRACE_TYPE_PARTIAL_LINE;
360} 337}
361 338
362int trace_print_lat_context(struct trace_iterator *iter) 339int 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
396static const char state_to_char[] = TASK_STATE_TO_CHAR_STR; 375static const char state_to_char[] = TASK_STATE_TO_CHAR_STR;
@@ -486,7 +465,7 @@ int unregister_ftrace_event(struct trace_event *event)
486 465
487int trace_nop_print(struct trace_iterator *iter, int flags) 466int 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
556static int trace_fn_hex(struct trace_iterator *iter, int flags) 535static 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
569static int trace_fn_bin(struct trace_iterator *iter, int flags) 548static 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
582static struct trace_event trace_fn_event = { 561static 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
617static int trace_ctx_print(struct trace_iterator *iter, int flags) 596static 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
650static int trace_ctx_raw(struct trace_iterator *iter, int flags) 629static 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
684static int trace_ctx_hex(struct trace_iterator *iter, int flags) 663static 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
711static struct trace_event trace_ctx_event = { 690static 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
745static int trace_special_hex(struct trace_iterator *iter, int flags) 724static 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
759static int trace_special_bin(struct trace_iterator *iter, int flags) 738static 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
773static struct trace_event trace_special_event = { 752static 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;