Lines Matching +full:display +full:- +full:depth
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2008-2009 Frederic Weisbecker <fweisbec@gmail.com>
24 int depth; member
48 /* Display overruns? (for self-debug purpose) */
49 { TRACER_OPT(funcgraph-overrun, TRACE_GRAPH_PRINT_OVERRUN) },
50 /* Display CPU ? */
51 { TRACER_OPT(funcgraph-cpu, TRACE_GRAPH_PRINT_CPU) },
52 /* Display Overhead ? */
53 { TRACER_OPT(funcgraph-overhead, TRACE_GRAPH_PRINT_OVERHEAD) },
54 /* Display proc name/pid */
55 { TRACER_OPT(funcgraph-proc, TRACE_GRAPH_PRINT_PROC) },
56 /* Display duration of execution */
57 { TRACER_OPT(funcgraph-duration, TRACE_GRAPH_PRINT_DURATION) },
58 /* Display absolute time of an entry */
59 { TRACER_OPT(funcgraph-abstime, TRACE_GRAPH_PRINT_ABS_TIME) },
60 /* Display interrupts */
61 { TRACER_OPT(funcgraph-irqs, TRACE_GRAPH_PRINT_IRQS) },
62 /* Display function name after trailing } */
63 { TRACER_OPT(funcgraph-tail, TRACE_GRAPH_PRINT_TAIL) },
65 /* Display function return value ? */
66 { TRACER_OPT(funcgraph-retval, TRACE_GRAPH_PRINT_RETVAL) },
67 /* Display function return value in hexadecimal format ? */
68 { TRACER_OPT(funcgraph-retval-hex, TRACE_GRAPH_PRINT_RETVAL_HEX) },
71 /* Display function return address ? */
72 { TRACER_OPT(funcgraph-retaddr, TRACE_GRAPH_PRINT_RETADDR) },
75 { TRACER_OPT(sleep-time, TRACE_GRAPH_SLEEP_TIME) },
79 { TRACER_OPT(graph-time, TRACE_GRAPH_GRAPH_TIME) },
86 /* Don't display overruns, proc, or tail by default */
99 * DURATION column is being also used to display IRQ signs,
118 struct trace_buffer *buffer = tr->array_buffer.buffer; in __trace_graph_entry()
126 entry->graph_ent = *trace; in __trace_graph_entry()
139 struct trace_buffer *buffer = tr->array_buffer.buffer; in __trace_graph_retaddr_entry()
147 entry->graph_ent.func = trace->func; in __trace_graph_retaddr_entry()
148 entry->graph_ent.depth = trace->depth; in __trace_graph_retaddr_entry()
149 entry->graph_ent.retaddr = retaddr; in __trace_graph_retaddr_entry()
182 struct trace_array *tr = gops->private; in trace_graph_entry()
200 if (ftrace_graph_notrace_addr(trace->func)) { in trace_graph_entry()
220 ftimes = fgraph_reserve_data(gops->idx, sizeof(ftimes->calltime)); in trace_graph_entry()
222 ftimes = fgraph_reserve_data(gops->idx, sizeof(*ftimes)); in trace_graph_entry()
224 ftimes->sleeptime = current->ftrace_sleeptime; in trace_graph_entry()
229 ftimes->calltime = trace_clock_local(); in trace_graph_entry()
240 data = per_cpu_ptr(tr->array_buffer.data, cpu); in trace_graph_entry()
241 disabled = atomic_read(&data->disabled); in trace_graph_entry()
264 .depth = 0, in __trace_graph_function()
268 .depth = 0, in __trace_graph_function()
289 struct trace_buffer *buffer = tr->array_buffer.buffer; in __trace_graph_return()
297 entry->ret = *trace; in __trace_graph_return()
298 entry->calltime = calltime; in __trace_graph_return()
299 entry->rettime = rettime; in __trace_graph_return()
310 ftimes->calltime += current->ftrace_sleeptime - ftimes->sleeptime; in handle_nosleeptime()
317 struct trace_array *tr = gops->private; in trace_graph_return()
335 ftimes = fgraph_retrieve_data(gops->idx, &size); in trace_graph_return()
341 calltime = ftimes->calltime; in trace_graph_return()
345 data = per_cpu_ptr(tr->array_buffer.data, cpu); in trace_graph_return()
346 disabled = atomic_read(&data->disabled); in trace_graph_return()
368 ftimes = fgraph_retrieve_data(gops->idx, &size); in trace_graph_thresh_return()
375 (trace_clock_local() - ftimes->calltime < tracing_thresh)) in trace_graph_thresh_return()
392 return -ENOMEM; in allocate_fgraph_ops()
394 gops->entryfunc = &trace_graph_entry; in allocate_fgraph_ops()
395 gops->retfunc = &trace_graph_return; in allocate_fgraph_ops()
397 tr->gops = gops; in allocate_fgraph_ops()
398 gops->private = tr; in allocate_fgraph_ops()
400 fgraph_init_ops(&gops->ops, ops); in allocate_fgraph_ops()
407 kfree(tr->gops); in free_fgraph_ops()
412 tr->gops = &funcgraph_ops; in init_array_fgraph_ops()
414 fgraph_init_ops(&tr->gops->ops, ops); in init_array_fgraph_ops()
421 tr->gops->entryfunc = trace_graph_entry; in graph_trace_init()
424 tr->gops->retfunc = trace_graph_thresh_return; in graph_trace_init()
426 tr->gops->retfunc = trace_graph_return; in graph_trace_init()
431 ret = register_ftrace_graph(tr->gops); in graph_trace_init()
442 unregister_ftrace_graph(tr->gops); in graph_trace_reset()
456 * Start with a space character - to make it stand out in print_graph_cpu()
478 /* 1 stands for the "-" character */ in print_graph_proc()
482 spaces = TRACE_GRAPH_PROCINFO_LENGTH - len; in print_graph_proc()
488 trace_seq_printf(s, "%s-%s", comm, pid_str); in print_graph_proc()
491 for (i = 0; i < spaces - (spaces / 2); i++) in print_graph_proc()
513 last_pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid); in verif_pid()
521 if (prev_pid == -1) in verif_pid()
524 * Context-switch trace line: in verif_pid()
526 ------------------------------------------ in verif_pid()
527 | 1) migration/0--1 => sshd-1755 in verif_pid()
528 ------------------------------------------ in verif_pid()
531 trace_seq_puts(s, " ------------------------------------------\n"); in verif_pid()
536 trace_seq_puts(s, "\n ------------------------------------------\n\n"); in verif_pid()
543 struct fgraph_data *data = iter->private; in get_return_for_leaf()
552 if (data && data->failed) { in get_return_for_leaf()
553 curr = &data->ent.ent; in get_return_for_leaf()
554 next = &data->ret; in get_return_for_leaf()
557 ring_iter = trace_buffer_iter(iter, iter->cpu); in get_return_for_leaf()
567 ring_buffer_consume(iter->array_buffer->buffer, iter->cpu, in get_return_for_leaf()
569 event = ring_buffer_peek(iter->array_buffer->buffer, iter->cpu, in get_return_for_leaf()
583 if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) in get_return_for_leaf()
584 data->ent.rent = *(struct fgraph_retaddr_ent_entry *)curr; in get_return_for_leaf()
586 data->ent.ent = *curr; in get_return_for_leaf()
592 if (next->ent.type == TRACE_GRAPH_RET) in get_return_for_leaf()
593 data->ret = *next; in get_return_for_leaf()
595 data->ret.ent.type = next->ent.type; in get_return_for_leaf()
599 if (next->ent.type != TRACE_GRAPH_RET) in get_return_for_leaf()
602 if (curr->ent.pid != next->ent.pid || in get_return_for_leaf()
603 curr->graph_ent.func != next->ret.func) in get_return_for_leaf()
629 usecs = iter->ts - iter->array_buffer->time_start; in print_graph_rel_time()
639 struct trace_array *tr = iter->tr; in print_graph_irq()
640 struct trace_seq *s = &iter->seq; in print_graph_irq()
641 struct trace_entry *ent = iter->ent; in print_graph_irq()
643 addr += iter->tr->text_delta; in print_graph_irq()
649 if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { in print_graph_irq()
652 print_graph_abs_time(iter->ts, s); in print_graph_irq()
669 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) in print_graph_irq()
704 size_t slen = min_t(size_t, sizeof(nsecs_str), 8UL - len); in trace_print_graph_duration()
723 !(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_duration()
763 trace_seq_puts(s, " <-"); in print_graph_retaddr()
764 seq_print_ip_sym(s, entry->graph_ent.retaddr, trace_flags | TRACE_ITER_SYM_OFFSET); in print_graph_retaddr()
787 retval = graph_ret->retval; in print_graph_retval()
809 if (entry->ent.type != TRACE_GRAPH_RETADDR_ENT) in print_graph_retval()
850 struct fgraph_data *data = iter->private; in print_graph_entry_leaf()
851 struct trace_array *tr = iter->tr; in print_graph_entry_leaf()
856 int cpu = iter->cpu; in print_graph_entry_leaf()
859 graph_ret = &ret_entry->ret; in print_graph_entry_leaf()
860 call = &entry->graph_ent; in print_graph_entry_leaf()
861 duration = ret_entry->rettime - ret_entry->calltime; in print_graph_entry_leaf()
863 func = call->func + iter->tr->text_delta; in print_graph_entry_leaf()
868 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_entry_leaf()
871 * Comments display at + 1 to depth. Since in print_graph_entry_leaf()
873 * equal to this depth. in print_graph_entry_leaf()
875 cpu_data->depth = call->depth - 1; in print_graph_entry_leaf()
877 /* No need to keep this function around for this depth */ in print_graph_entry_leaf()
878 if (call->depth < FTRACE_RETFUNC_DEPTH && in print_graph_entry_leaf()
879 !WARN_ON_ONCE(call->depth < 0)) in print_graph_entry_leaf()
880 cpu_data->enter_funcs[call->depth] = 0; in print_graph_entry_leaf()
887 for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) in print_graph_entry_leaf()
895 (void *)graph_ret->func + iter->tr->text_delta, in print_graph_entry_leaf()
896 flags, tr->trace_flags); in print_graph_entry_leaf()
901 print_graph_irq(iter, graph_ret->func, TRACE_GRAPH_RET, in print_graph_entry_leaf()
902 cpu, iter->ent->pid, flags); in print_graph_entry_leaf()
912 struct ftrace_graph_ent *call = &entry->graph_ent; in print_graph_entry_nested()
913 struct fgraph_data *data = iter->private; in print_graph_entry_nested()
914 struct trace_array *tr = iter->tr; in print_graph_entry_nested()
920 int cpu = iter->cpu; in print_graph_entry_nested()
922 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_entry_nested()
923 cpu_data->depth = call->depth; in print_graph_entry_nested()
926 if (call->depth < FTRACE_RETFUNC_DEPTH && in print_graph_entry_nested()
927 !WARN_ON_ONCE(call->depth < 0)) in print_graph_entry_nested()
928 cpu_data->enter_funcs[call->depth] = call->func; in print_graph_entry_nested()
935 for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) in print_graph_entry_nested()
938 func = call->func + iter->tr->text_delta; in print_graph_entry_nested()
942 entry->ent.type == TRACE_GRAPH_RETADDR_ENT) in print_graph_entry_nested()
944 tr->trace_flags, true); in print_graph_entry_nested()
961 struct fgraph_data *data = iter->private; in print_graph_prologue()
962 struct trace_entry *ent = iter->ent; in print_graph_prologue()
963 struct trace_array *tr = iter->tr; in print_graph_prologue()
964 int cpu = iter->cpu; in print_graph_prologue()
967 verif_pid(s, ent->pid, cpu, data); in print_graph_prologue()
971 print_graph_irq(iter, addr, type, cpu, ent->pid, flags); in print_graph_prologue()
973 if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_prologue()
978 print_graph_abs_time(iter->ts, s); in print_graph_prologue()
990 print_graph_proc(s, ent->pid); in print_graph_prologue()
995 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) in print_graph_prologue()
1005 * - we are inside irq code
1006 * - we just entered irq code
1009 * - funcgraph-interrupts option is set
1010 * - we are not inside irq code
1014 unsigned long addr, int depth) in check_irq_entry() argument
1016 int cpu = iter->cpu; in check_irq_entry()
1018 struct fgraph_data *data = iter->private; in check_irq_entry()
1020 addr += iter->tr->text_delta; in check_irq_entry()
1031 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in check_irq_entry()
1046 *depth_irq = depth; in check_irq_entry()
1054 * - we are inside irq code
1055 * - we just left irq code
1058 * - funcgraph-interrupts option is set
1059 * - we are not inside irq code
1062 check_irq_return(struct trace_iterator *iter, u32 flags, int depth) in check_irq_return() argument
1064 int cpu = iter->cpu; in check_irq_return()
1066 struct fgraph_data *data = iter->private; in check_irq_return()
1077 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in check_irq_return()
1082 if (*depth_irq == -1) in check_irq_return()
1087 * Let's not trace it and clear the entry depth, since in check_irq_return()
1091 * we are out of the entry depth. Thus protecting us from in check_irq_return()
1094 if (*depth_irq >= depth) { in check_irq_return()
1095 *depth_irq = -1; in check_irq_return()
1109 struct fgraph_data *data = iter->private; in print_graph_entry()
1110 struct ftrace_graph_ent *call = &field->graph_ent; in print_graph_entry()
1113 int cpu = iter->cpu; in print_graph_entry()
1115 if (check_irq_entry(iter, flags, call->func, call->depth)) in print_graph_entry()
1118 print_graph_prologue(iter, s, TRACE_GRAPH_ENT, call->func, flags); in print_graph_entry()
1131 if (s->full) { in print_graph_entry()
1132 data->failed = 1; in print_graph_entry()
1133 data->cpu = cpu; in print_graph_entry()
1135 data->failed = 0; in print_graph_entry()
1146 struct ftrace_graph_ret *trace = &retentry->ret; in print_graph_return()
1147 u64 calltime = retentry->calltime; in print_graph_return()
1148 u64 rettime = retentry->rettime; in print_graph_return()
1149 unsigned long long duration = rettime - calltime; in print_graph_return()
1150 struct fgraph_data *data = iter->private; in print_graph_return()
1151 struct trace_array *tr = iter->tr; in print_graph_return()
1153 pid_t pid = ent->pid; in print_graph_return()
1154 int cpu = iter->cpu; in print_graph_return()
1158 func = trace->func + iter->tr->text_delta; in print_graph_return()
1160 if (check_irq_return(iter, flags, trace->depth)) in print_graph_return()
1165 int cpu = iter->cpu; in print_graph_return()
1167 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_return()
1170 * Comments display at + 1 to depth. This is the in print_graph_return()
1172 * to display at the same level of the bracket. in print_graph_return()
1174 cpu_data->depth = trace->depth - 1; in print_graph_return()
1176 if (trace->depth < FTRACE_RETFUNC_DEPTH && in print_graph_return()
1177 !WARN_ON_ONCE(trace->depth < 0)) { in print_graph_return()
1178 if (cpu_data->enter_funcs[trace->depth] != trace->func) in print_graph_return()
1180 cpu_data->enter_funcs[trace->depth] = 0; in print_graph_return()
1190 for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++) in print_graph_return()
1195 * funcgraph-retval option is enabled. in print_graph_return()
1198 print_graph_retval(s, NULL, trace, (void *)func, flags, tr->trace_flags); in print_graph_return()
1205 * that if the funcgraph-tail option is enabled. in print_graph_return()
1216 trace->overrun); in print_graph_return()
1218 print_graph_irq(iter, trace->func, TRACE_GRAPH_RET, in print_graph_return()
1228 struct trace_array *tr = iter->tr; in print_graph_comment()
1229 unsigned long sym_flags = (tr->trace_flags & TRACE_ITER_SYM_MASK); in print_graph_comment()
1230 struct fgraph_data *data = iter->private; in print_graph_comment()
1232 int depth = 0; in print_graph_comment() local
1237 depth = per_cpu_ptr(data->cpu_data, iter->cpu)->depth; in print_graph_comment()
1245 if (depth > 0) in print_graph_comment()
1246 for (i = 0; i < (depth + 1) * TRACE_GRAPH_INDENT; i++) in print_graph_comment()
1252 switch (iter->ent->type) { in print_graph_comment()
1269 event = ftrace_find_event(ent->type); in print_graph_comment()
1273 ret = event->funcs->trace(iter, sym_flags, event); in print_graph_comment()
1282 if (s->buffer[s->seq.len - 1] == '\n') { in print_graph_comment()
1283 s->buffer[s->seq.len - 1] = '\0'; in print_graph_comment()
1284 s->seq.len--; in print_graph_comment()
1297 struct fgraph_data *data = iter->private; in print_graph_function_flags()
1298 struct trace_entry *entry = iter->ent; in print_graph_function_flags()
1299 struct trace_seq *s = &iter->seq; in print_graph_function_flags()
1300 int cpu = iter->cpu; in print_graph_function_flags()
1303 if (data && per_cpu_ptr(data->cpu_data, cpu)->ignore) { in print_graph_function_flags()
1304 per_cpu_ptr(data->cpu_data, cpu)->ignore = 0; in print_graph_function_flags()
1312 if (data && data->failed) { in print_graph_function_flags()
1313 field = &data->ent.ent; in print_graph_function_flags()
1314 iter->cpu = data->cpu; in print_graph_function_flags()
1316 if (ret == TRACE_TYPE_HANDLED && iter->cpu != cpu) { in print_graph_function_flags()
1317 per_cpu_ptr(data->cpu_data, iter->cpu)->ignore = 1; in print_graph_function_flags()
1320 iter->cpu = cpu; in print_graph_function_flags()
1324 switch (entry->type) { in print_graph_function_flags()
1393 seq_printf(s, "#%.*s _-----=> irqs-off \n", size, spaces); in print_lat_header()
1394 seq_printf(s, "#%.*s / _----=> need-resched \n", size, spaces); in print_lat_header()
1395 seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); in print_lat_header()
1396 seq_printf(s, "#%.*s|| / _--=> preempt-depth \n", size, spaces); in print_lat_header()
1403 int lat = tr->trace_flags & TRACE_ITER_LATENCY_FMT; in __print_graph_headers_flags()
1448 struct trace_iterator *iter = s->private; in print_graph_headers_flags()
1449 struct trace_array *tr = iter->tr; in print_graph_headers_flags()
1451 if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_headers_flags()
1454 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) { in print_graph_headers_flags()
1467 /* pid and depth on the last trace processed */ in graph_trace_open()
1472 iter->private = NULL; in graph_trace_open()
1481 data->cpu_data = alloc_percpu_gfp(struct fgraph_cpu_data, gfpflags); in graph_trace_open()
1482 if (!data->cpu_data) in graph_trace_open()
1486 pid_t *pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid); in graph_trace_open()
1487 int *depth = &(per_cpu_ptr(data->cpu_data, cpu)->depth); in graph_trace_open() local
1488 int *ignore = &(per_cpu_ptr(data->cpu_data, cpu)->ignore); in graph_trace_open()
1489 int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in graph_trace_open()
1491 *pid = -1; in graph_trace_open()
1492 *depth = 0; in graph_trace_open()
1494 *depth_irq = -1; in graph_trace_open()
1497 iter->private = data; in graph_trace_open()
1509 struct fgraph_data *data = iter->private; in graph_trace_close()
1512 free_percpu(data->cpu_data); in graph_trace_close()
1627 max_bytes_for_cpu = snprintf(NULL, 0, "%u", nr_cpu_ids - 1); in init_graph_trace()