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 /* Display function arguments ? */
76 { TRACER_OPT(funcgraph-args, TRACE_GRAPH_ARGS) },
79 { TRACER_OPT(sleep-time, TRACE_GRAPH_SLEEP_TIME) },
83 { TRACER_OPT(graph-time, TRACE_GRAPH_GRAPH_TIME) },
90 /* Don't display overruns, proc, or tail by default */
103 * DURATION column is being also used to display IRQ signs,
121 struct trace_buffer *buffer = tr->array_buffer.buffer; in __graph_entry()
133 entry->graph_ent = *trace; in __graph_entry()
138 entry->args[i] = ftrace_regs_get_argument(fregs, i); in __graph_entry()
161 struct trace_buffer *buffer = tr->array_buffer.buffer; in __trace_graph_retaddr_entry()
169 entry->graph_ent.func = trace->func; in __trace_graph_retaddr_entry()
170 entry->graph_ent.depth = trace->depth; in __trace_graph_retaddr_entry()
171 entry->graph_ent.retaddr = retaddr; in __trace_graph_retaddr_entry()
204 struct trace_array *tr = gops->private; in graph_entry()
222 if (ftrace_graph_notrace_addr(trace->func)) { in graph_entry()
242 ftimes = fgraph_reserve_data(gops->idx, sizeof(ftimes->calltime)); in graph_entry()
244 ftimes = fgraph_reserve_data(gops->idx, sizeof(*ftimes)); in graph_entry()
246 ftimes->sleeptime = current->ftrace_sleeptime; in graph_entry()
251 ftimes->calltime = trace_clock_local(); in graph_entry()
262 data = per_cpu_ptr(tr->array_buffer.data, cpu); in graph_entry()
263 disabled = atomic_read(&data->disabled); in graph_entry()
300 .depth = 0, in __trace_graph_function()
304 .depth = 0, in __trace_graph_function()
325 struct trace_buffer *buffer = tr->array_buffer.buffer; in __trace_graph_return()
333 entry->ret = *trace; in __trace_graph_return()
334 entry->calltime = calltime; in __trace_graph_return()
335 entry->rettime = rettime; in __trace_graph_return()
346 ftimes->calltime += current->ftrace_sleeptime - ftimes->sleeptime; in handle_nosleeptime()
353 struct trace_array *tr = gops->private; in trace_graph_return()
371 ftimes = fgraph_retrieve_data(gops->idx, &size); in trace_graph_return()
377 calltime = ftimes->calltime; in trace_graph_return()
381 data = per_cpu_ptr(tr->array_buffer.data, cpu); in trace_graph_return()
382 disabled = atomic_read(&data->disabled); in trace_graph_return()
404 ftimes = fgraph_retrieve_data(gops->idx, &size); in trace_graph_thresh_return()
411 (trace_clock_local() - ftimes->calltime < tracing_thresh)) in trace_graph_thresh_return()
428 return -ENOMEM; in allocate_fgraph_ops()
430 gops->entryfunc = &trace_graph_entry; in allocate_fgraph_ops()
431 gops->retfunc = &trace_graph_return; in allocate_fgraph_ops()
433 tr->gops = gops; in allocate_fgraph_ops()
434 gops->private = tr; in allocate_fgraph_ops()
436 fgraph_init_ops(&gops->ops, ops); in allocate_fgraph_ops()
443 kfree(tr->gops); in free_fgraph_ops()
448 tr->gops = &funcgraph_ops; in init_array_fgraph_ops()
450 fgraph_init_ops(&tr->gops->ops, ops); in init_array_fgraph_ops()
458 tr->gops->entryfunc = trace_graph_entry_args; in graph_trace_init()
460 tr->gops->entryfunc = trace_graph_entry; in graph_trace_init()
463 tr->gops->retfunc = trace_graph_thresh_return; in graph_trace_init()
465 tr->gops->retfunc = trace_graph_return; in graph_trace_init()
470 ret = register_ftrace_graph(tr->gops); in graph_trace_init()
488 if (tr->gops->entryfunc == entry) in ftrace_graph_trace_args()
491 unregister_ftrace_graph(tr->gops); in ftrace_graph_trace_args()
493 tr->gops->entryfunc = entry; in ftrace_graph_trace_args()
497 return register_ftrace_graph(tr->gops); in ftrace_graph_trace_args()
503 unregister_ftrace_graph(tr->gops); in graph_trace_reset()
517 * Start with a space character - to make it stand out in print_graph_cpu()
539 /* 1 stands for the "-" character */ in print_graph_proc()
543 spaces = TRACE_GRAPH_PROCINFO_LENGTH - len; in print_graph_proc()
549 trace_seq_printf(s, "%s-%s", comm, pid_str); in print_graph_proc()
552 for (i = 0; i < spaces - (spaces / 2); i++) in print_graph_proc()
574 last_pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid); in verif_pid()
582 if (prev_pid == -1) in verif_pid()
585 * Context-switch trace line: in verif_pid()
587 ------------------------------------------ in verif_pid()
588 | 1) migration/0--1 => sshd-1755 in verif_pid()
589 ------------------------------------------ in verif_pid()
592 trace_seq_puts(s, " ------------------------------------------\n"); in verif_pid()
597 trace_seq_puts(s, "\n ------------------------------------------\n\n"); in verif_pid()
604 struct fgraph_data *data = iter->private; in get_return_for_leaf()
613 if (data && data->failed) { in get_return_for_leaf()
614 curr = &data->ent.ent; in get_return_for_leaf()
615 next = &data->ret; in get_return_for_leaf()
618 ring_iter = trace_buffer_iter(iter, iter->cpu); in get_return_for_leaf()
628 ring_buffer_consume(iter->array_buffer->buffer, iter->cpu, in get_return_for_leaf()
630 event = ring_buffer_peek(iter->array_buffer->buffer, iter->cpu, in get_return_for_leaf()
644 if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) in get_return_for_leaf()
645 data->ent.rent = *(struct fgraph_retaddr_ent_entry *)curr; in get_return_for_leaf()
647 data->ent.ent = *curr; in get_return_for_leaf()
653 if (next->ent.type == TRACE_GRAPH_RET) in get_return_for_leaf()
654 data->ret = *next; in get_return_for_leaf()
656 data->ret.ent.type = next->ent.type; in get_return_for_leaf()
660 if (next->ent.type != TRACE_GRAPH_RET) in get_return_for_leaf()
663 if (curr->ent.pid != next->ent.pid || in get_return_for_leaf()
664 curr->graph_ent.func != next->ret.func) in get_return_for_leaf()
690 usecs = iter->ts - iter->array_buffer->time_start; in print_graph_rel_time()
700 struct trace_array *tr = iter->tr; in print_graph_irq()
701 struct trace_seq *s = &iter->seq; in print_graph_irq()
702 struct trace_entry *ent = iter->ent; in print_graph_irq()
704 addr += iter->tr->text_delta; in print_graph_irq()
710 if (tr->trace_flags & TRACE_ITER_CONTEXT_INFO) { in print_graph_irq()
713 print_graph_abs_time(iter->ts, s); in print_graph_irq()
730 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) in print_graph_irq()
765 size_t slen = min_t(size_t, sizeof(nsecs_str), 8UL - len); in trace_print_graph_duration()
784 !(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_duration()
824 trace_seq_puts(s, " <-"); in print_graph_retaddr()
825 seq_print_ip_sym(s, entry->graph_ent.retaddr, trace_flags | TRACE_ITER_SYM_OFFSET); in print_graph_retaddr()
848 retval = graph_ret->retval; in print_graph_retval()
870 if (entry->ent.type != TRACE_GRAPH_RETADDR_ENT) in print_graph_retval()
876 print_function_args(s, entry->args, (unsigned long)func); in print_graph_retval()
917 struct fgraph_data *data = iter->private; in print_graph_entry_leaf()
918 struct trace_array *tr = iter->tr; in print_graph_entry_leaf()
924 int cpu = iter->cpu; in print_graph_entry_leaf()
927 args_size = iter->ent_size - offsetof(struct ftrace_graph_ent_entry, args); in print_graph_entry_leaf()
929 graph_ret = &ret_entry->ret; in print_graph_entry_leaf()
930 call = &entry->graph_ent; in print_graph_entry_leaf()
931 duration = ret_entry->rettime - ret_entry->calltime; in print_graph_entry_leaf()
936 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_entry_leaf()
939 * Comments display at + 1 to depth. Since in print_graph_entry_leaf()
941 * equal to this depth. in print_graph_entry_leaf()
943 cpu_data->depth = call->depth - 1; in print_graph_entry_leaf()
945 /* No need to keep this function around for this depth */ in print_graph_entry_leaf()
946 if (call->depth < FTRACE_RETFUNC_DEPTH && in print_graph_entry_leaf()
947 !WARN_ON_ONCE(call->depth < 0)) in print_graph_entry_leaf()
948 cpu_data->enter_funcs[call->depth] = 0; in print_graph_entry_leaf()
955 for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) in print_graph_entry_leaf()
958 ret_func = graph_ret->func + iter->tr->text_delta; in print_graph_entry_leaf()
965 (void *)graph_ret->func + iter->tr->text_delta, in print_graph_entry_leaf()
966 flags, tr->trace_flags, args_size); in print_graph_entry_leaf()
971 print_function_args(s, entry->args, ret_func); in print_graph_entry_leaf()
978 print_graph_irq(iter, graph_ret->func, TRACE_GRAPH_RET, in print_graph_entry_leaf()
979 cpu, iter->ent->pid, flags); in print_graph_entry_leaf()
989 struct ftrace_graph_ent *call = &entry->graph_ent; in print_graph_entry_nested()
990 struct fgraph_data *data = iter->private; in print_graph_entry_nested()
991 struct trace_array *tr = iter->tr; in print_graph_entry_nested()
998 int cpu = iter->cpu; in print_graph_entry_nested()
1000 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_entry_nested()
1001 cpu_data->depth = call->depth; in print_graph_entry_nested()
1004 if (call->depth < FTRACE_RETFUNC_DEPTH && in print_graph_entry_nested()
1005 !WARN_ON_ONCE(call->depth < 0)) in print_graph_entry_nested()
1006 cpu_data->enter_funcs[call->depth] = call->func; in print_graph_entry_nested()
1013 for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++) in print_graph_entry_nested()
1016 func = call->func + iter->tr->text_delta; in print_graph_entry_nested()
1020 args_size = iter->ent_size - offsetof(struct ftrace_graph_ent_entry, args); in print_graph_entry_nested()
1023 print_function_args(s, entry->args, func); in print_graph_entry_nested()
1030 entry->ent.type == TRACE_GRAPH_RETADDR_ENT) in print_graph_entry_nested()
1032 tr->trace_flags, true); in print_graph_entry_nested()
1049 struct fgraph_data *data = iter->private; in print_graph_prologue()
1050 struct trace_entry *ent = iter->ent; in print_graph_prologue()
1051 struct trace_array *tr = iter->tr; in print_graph_prologue()
1052 int cpu = iter->cpu; in print_graph_prologue()
1055 verif_pid(s, ent->pid, cpu, data); in print_graph_prologue()
1059 print_graph_irq(iter, addr, type, cpu, ent->pid, flags); in print_graph_prologue()
1061 if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_prologue()
1066 print_graph_abs_time(iter->ts, s); in print_graph_prologue()
1078 print_graph_proc(s, ent->pid); in print_graph_prologue()
1083 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) in print_graph_prologue()
1093 * - we are inside irq code
1094 * - we just entered irq code
1097 * - funcgraph-interrupts option is set
1098 * - we are not inside irq code
1102 unsigned long addr, int depth) in check_irq_entry() argument
1104 int cpu = iter->cpu; in check_irq_entry()
1106 struct fgraph_data *data = iter->private; in check_irq_entry()
1108 addr += iter->tr->text_delta; in check_irq_entry()
1119 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in check_irq_entry()
1134 *depth_irq = depth; in check_irq_entry()
1142 * - we are inside irq code
1143 * - we just left irq code
1146 * - funcgraph-interrupts option is set
1147 * - we are not inside irq code
1150 check_irq_return(struct trace_iterator *iter, u32 flags, int depth) in check_irq_return() argument
1152 int cpu = iter->cpu; in check_irq_return()
1154 struct fgraph_data *data = iter->private; in check_irq_return()
1165 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in check_irq_return()
1170 if (*depth_irq == -1) in check_irq_return()
1175 * Let's not trace it and clear the entry depth, since in check_irq_return()
1179 * we are out of the entry depth. Thus protecting us from in check_irq_return()
1182 if (*depth_irq >= depth) { in check_irq_return()
1183 *depth_irq = -1; in check_irq_return()
1197 struct fgraph_data *data = iter->private; in print_graph_entry()
1201 int cpu = iter->cpu; in print_graph_entry()
1212 if (iter->ent_size > sizeof(save_buf)) in print_graph_entry()
1213 iter->ent_size = sizeof(save_buf); in print_graph_entry()
1216 memcpy(entry, field, iter->ent_size); in print_graph_entry()
1218 call = &entry->graph_ent; in print_graph_entry()
1220 if (check_irq_entry(iter, flags, call->func, call->depth)) in print_graph_entry()
1223 print_graph_prologue(iter, s, TRACE_GRAPH_ENT, call->func, flags); in print_graph_entry()
1236 if (s->full) { in print_graph_entry()
1237 data->failed = 1; in print_graph_entry()
1238 data->cpu = cpu; in print_graph_entry()
1240 data->failed = 0; in print_graph_entry()
1251 struct ftrace_graph_ret *trace = &retentry->ret; in print_graph_return()
1252 u64 calltime = retentry->calltime; in print_graph_return()
1253 u64 rettime = retentry->rettime; in print_graph_return()
1254 unsigned long long duration = rettime - calltime; in print_graph_return()
1255 struct fgraph_data *data = iter->private; in print_graph_return()
1256 struct trace_array *tr = iter->tr; in print_graph_return()
1258 pid_t pid = ent->pid; in print_graph_return()
1259 int cpu = iter->cpu; in print_graph_return()
1263 func = trace->func + iter->tr->text_delta; in print_graph_return()
1265 if (check_irq_return(iter, flags, trace->depth)) in print_graph_return()
1270 int cpu = iter->cpu; in print_graph_return()
1272 cpu_data = per_cpu_ptr(data->cpu_data, cpu); in print_graph_return()
1275 * Comments display at + 1 to depth. This is the in print_graph_return()
1277 * to display at the same level of the bracket. in print_graph_return()
1279 cpu_data->depth = trace->depth - 1; in print_graph_return()
1281 if (trace->depth < FTRACE_RETFUNC_DEPTH && in print_graph_return()
1282 !WARN_ON_ONCE(trace->depth < 0)) { in print_graph_return()
1283 if (cpu_data->enter_funcs[trace->depth] != trace->func) in print_graph_return()
1285 cpu_data->enter_funcs[trace->depth] = 0; in print_graph_return()
1295 for (i = 0; i < trace->depth * TRACE_GRAPH_INDENT; i++) in print_graph_return()
1300 * funcgraph-retval option is enabled. in print_graph_return()
1304 tr->trace_flags, 0); in print_graph_return()
1311 * that if the funcgraph-tail option is enabled. in print_graph_return()
1323 trace->overrun); in print_graph_return()
1325 print_graph_irq(iter, trace->func, TRACE_GRAPH_RET, in print_graph_return()
1335 struct trace_array *tr = iter->tr; in print_graph_comment()
1336 unsigned long sym_flags = (tr->trace_flags & TRACE_ITER_SYM_MASK); in print_graph_comment()
1337 struct fgraph_data *data = iter->private; in print_graph_comment()
1339 int depth = 0; in print_graph_comment() local
1344 depth = per_cpu_ptr(data->cpu_data, iter->cpu)->depth; in print_graph_comment()
1352 if (depth > 0) in print_graph_comment()
1353 for (i = 0; i < (depth + 1) * TRACE_GRAPH_INDENT; i++) in print_graph_comment()
1359 switch (iter->ent->type) { in print_graph_comment()
1376 event = ftrace_find_event(ent->type); in print_graph_comment()
1380 ret = event->funcs->trace(iter, sym_flags, event); in print_graph_comment()
1389 if (s->buffer[s->seq.len - 1] == '\n') { in print_graph_comment()
1390 s->buffer[s->seq.len - 1] = '\0'; in print_graph_comment()
1391 s->seq.len--; in print_graph_comment()
1404 struct fgraph_data *data = iter->private; in print_graph_function_flags()
1405 struct trace_entry *entry = iter->ent; in print_graph_function_flags()
1406 struct trace_seq *s = &iter->seq; in print_graph_function_flags()
1407 int cpu = iter->cpu; in print_graph_function_flags()
1410 if (data && per_cpu_ptr(data->cpu_data, cpu)->ignore) { in print_graph_function_flags()
1411 per_cpu_ptr(data->cpu_data, cpu)->ignore = 0; in print_graph_function_flags()
1419 if (data && data->failed) { in print_graph_function_flags()
1420 field = &data->ent.ent; in print_graph_function_flags()
1421 iter->cpu = data->cpu; in print_graph_function_flags()
1423 if (ret == TRACE_TYPE_HANDLED && iter->cpu != cpu) { in print_graph_function_flags()
1424 per_cpu_ptr(data->cpu_data, iter->cpu)->ignore = 1; in print_graph_function_flags()
1427 iter->cpu = cpu; in print_graph_function_flags()
1431 switch (entry->type) { in print_graph_function_flags()
1492 seq_printf(s, "#%.*s _-----=> irqs-off \n", size, spaces); in print_lat_header()
1493 seq_printf(s, "#%.*s / _----=> need-resched \n", size, spaces); in print_lat_header()
1494 seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); in print_lat_header()
1495 seq_printf(s, "#%.*s|| / _--=> preempt-depth \n", size, spaces); in print_lat_header()
1502 int lat = tr->trace_flags & TRACE_ITER_LATENCY_FMT; in __print_graph_headers_flags()
1547 struct trace_iterator *iter = s->private; in print_graph_headers_flags()
1548 struct trace_array *tr = iter->tr; in print_graph_headers_flags()
1550 if (!(tr->trace_flags & TRACE_ITER_CONTEXT_INFO)) in print_graph_headers_flags()
1553 if (tr->trace_flags & TRACE_ITER_LATENCY_FMT) { in print_graph_headers_flags()
1566 /* pid and depth on the last trace processed */ in graph_trace_open()
1571 iter->private = NULL; in graph_trace_open()
1580 data->cpu_data = alloc_percpu_gfp(struct fgraph_cpu_data, gfpflags); in graph_trace_open()
1581 if (!data->cpu_data) in graph_trace_open()
1585 pid_t *pid = &(per_cpu_ptr(data->cpu_data, cpu)->last_pid); in graph_trace_open()
1586 int *depth = &(per_cpu_ptr(data->cpu_data, cpu)->depth); in graph_trace_open() local
1587 int *ignore = &(per_cpu_ptr(data->cpu_data, cpu)->ignore); in graph_trace_open()
1588 int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq); in graph_trace_open()
1590 *pid = -1; in graph_trace_open()
1591 *depth = 0; in graph_trace_open()
1593 *depth_irq = -1; in graph_trace_open()
1596 iter->private = data; in graph_trace_open()
1608 struct fgraph_data *data = iter->private; in graph_trace_close()
1611 free_percpu(data->cpu_data); in graph_trace_close()
1613 iter->private = NULL; in graph_trace_close()
1730 max_bytes_for_cpu = snprintf(NULL, 0, "%u", nr_cpu_ids - 1); in init_graph_trace()