Lines Matching +full:ftrace +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0-only
3 * builtin-ftrace.c
22 #include <subcmd/parse-options.h>
32 #include "util/parse-sublevel-options.h"
80 workload_exec_errno = info->si_value.sival_int; in ftrace__workload_exec_failed_signal()
87 int fd, ret = -1; in __write_tracing_file()
88 ssize_t size = strlen(val); in __write_tracing_file() local
96 return -1; in __write_tracing_file()
118 val_copy[size] = '\n'; in __write_tracing_file()
120 if (write(fd, val_copy, size + 1) == size + 1) in __write_tracing_file()
149 int ret = -1; in read_tracing_file_to_stdout()
154 return -1; in read_tracing_file_to_stdout()
196 return -1; in read_tracing_file_by_line()
203 return -1; in read_tracing_file_by_line()
206 while (getline(&line, &len, fp) != -1) { in read_tracing_file_by_line()
224 return -1; in write_tracing_file_int()
235 return -1; in write_tracing_option_file()
245 static void reset_tracing_options(struct perf_ftrace *ftrace __maybe_unused) in reset_tracing_options()
247 write_tracing_option_file("function-fork", "0"); in reset_tracing_options()
249 write_tracing_option_file("sleep-time", "1"); in reset_tracing_options()
250 write_tracing_option_file("funcgraph-irqs", "1"); in reset_tracing_options()
251 write_tracing_option_file("funcgraph-proc", "0"); in reset_tracing_options()
252 write_tracing_option_file("funcgraph-abstime", "0"); in reset_tracing_options()
253 write_tracing_option_file("latency-format", "0"); in reset_tracing_options()
254 write_tracing_option_file("irq-info", "0"); in reset_tracing_options()
257 static int reset_tracing_files(struct perf_ftrace *ftrace __maybe_unused) in reset_tracing_files()
260 return -1; in reset_tracing_files()
263 return -1; in reset_tracing_files()
266 return -1; in reset_tracing_files()
269 return -1; in reset_tracing_files()
272 return -1; in reset_tracing_files()
275 return -1; in reset_tracing_files()
278 reset_tracing_options(ftrace); in reset_tracing_files()
282 static int set_tracing_pid(struct perf_ftrace *ftrace) in set_tracing_pid() argument
287 if (target__has_cpu(&ftrace->target)) in set_tracing_pid()
290 for (i = 0; i < perf_thread_map__nr(ftrace->evlist->core.threads); i++) { in set_tracing_pid()
292 perf_thread_map__pid(ftrace->evlist->core.threads, i)); in set_tracing_pid()
294 return -1; in set_tracing_pid()
306 last_cpu = cpu_map__cpu(cpumap, cpumap->nr - 1); in set_tracing_cpumask()
313 return -1; in set_tracing_cpumask()
324 static int set_tracing_cpu(struct perf_ftrace *ftrace) in set_tracing_cpu() argument
326 struct perf_cpu_map *cpumap = ftrace->evlist->core.cpus; in set_tracing_cpu()
328 if (!target__has_cpu(&ftrace->target)) in set_tracing_cpu()
334 static int set_tracing_func_stack_trace(struct perf_ftrace *ftrace) in set_tracing_func_stack_trace() argument
336 if (!ftrace->func_stack_trace) in set_tracing_func_stack_trace()
340 return -1; in set_tracing_func_stack_trace()
345 static int set_tracing_func_irqinfo(struct perf_ftrace *ftrace) in set_tracing_func_irqinfo() argument
347 if (!ftrace->func_irq_info) in set_tracing_func_irqinfo()
350 if (write_tracing_option_file("irq-info", "1") < 0) in set_tracing_func_irqinfo()
351 return -1; in set_tracing_func_irqinfo()
371 if (append_tracing_file(filter_file, pos->name) < 0) in __set_tracing_filter()
372 return -1; in __set_tracing_filter()
378 static int set_tracing_filters(struct perf_ftrace *ftrace) in set_tracing_filters() argument
382 ret = __set_tracing_filter("set_ftrace_filter", &ftrace->filters); in set_tracing_filters()
386 ret = __set_tracing_filter("set_ftrace_notrace", &ftrace->notrace); in set_tracing_filters()
390 ret = __set_tracing_filter("set_graph_function", &ftrace->graph_funcs); in set_tracing_filters()
395 __set_tracing_filter("set_graph_notrace", &ftrace->nograph_funcs); in set_tracing_filters()
408 static int set_tracing_depth(struct perf_ftrace *ftrace) in set_tracing_depth() argument
410 if (ftrace->graph_depth == 0) in set_tracing_depth()
413 if (ftrace->graph_depth < 0) { in set_tracing_depth()
414 pr_err("invalid graph depth: %d\n", ftrace->graph_depth); in set_tracing_depth()
415 return -1; in set_tracing_depth()
418 if (write_tracing_file_int("max_graph_depth", ftrace->graph_depth) < 0) in set_tracing_depth()
419 return -1; in set_tracing_depth()
424 static int set_tracing_percpu_buffer_size(struct perf_ftrace *ftrace) in set_tracing_percpu_buffer_size() argument
428 if (ftrace->percpu_buffer_size == 0) in set_tracing_percpu_buffer_size()
432 ftrace->percpu_buffer_size / 1024); in set_tracing_percpu_buffer_size()
439 static int set_tracing_trace_inherit(struct perf_ftrace *ftrace) in set_tracing_trace_inherit() argument
441 if (!ftrace->inherit) in set_tracing_trace_inherit()
444 if (write_tracing_option_file("function-fork", "1") < 0) in set_tracing_trace_inherit()
445 return -1; in set_tracing_trace_inherit()
450 static int set_tracing_sleep_time(struct perf_ftrace *ftrace) in set_tracing_sleep_time() argument
452 if (!ftrace->graph_nosleep_time) in set_tracing_sleep_time()
455 if (write_tracing_option_file("sleep-time", "0") < 0) in set_tracing_sleep_time()
456 return -1; in set_tracing_sleep_time()
461 static int set_tracing_funcgraph_irqs(struct perf_ftrace *ftrace) in set_tracing_funcgraph_irqs() argument
463 if (!ftrace->graph_noirqs) in set_tracing_funcgraph_irqs()
466 if (write_tracing_option_file("funcgraph-irqs", "0") < 0) in set_tracing_funcgraph_irqs()
467 return -1; in set_tracing_funcgraph_irqs()
472 static int set_tracing_funcgraph_verbose(struct perf_ftrace *ftrace) in set_tracing_funcgraph_verbose() argument
474 if (!ftrace->graph_verbose) in set_tracing_funcgraph_verbose()
477 if (write_tracing_option_file("funcgraph-proc", "1") < 0) in set_tracing_funcgraph_verbose()
478 return -1; in set_tracing_funcgraph_verbose()
480 if (write_tracing_option_file("funcgraph-abstime", "1") < 0) in set_tracing_funcgraph_verbose()
481 return -1; in set_tracing_funcgraph_verbose()
483 if (write_tracing_option_file("latency-format", "1") < 0) in set_tracing_funcgraph_verbose()
484 return -1; in set_tracing_funcgraph_verbose()
489 static int set_tracing_thresh(struct perf_ftrace *ftrace) in set_tracing_thresh() argument
493 if (ftrace->graph_thresh == 0) in set_tracing_thresh()
496 ret = write_tracing_file_int("tracing_thresh", ftrace->graph_thresh); in set_tracing_thresh()
503 static int set_tracing_options(struct perf_ftrace *ftrace) in set_tracing_options() argument
505 if (set_tracing_pid(ftrace) < 0) { in set_tracing_options()
506 pr_err("failed to set ftrace pid\n"); in set_tracing_options()
507 return -1; in set_tracing_options()
510 if (set_tracing_cpu(ftrace) < 0) { in set_tracing_options()
512 return -1; in set_tracing_options()
515 if (set_tracing_func_stack_trace(ftrace) < 0) { in set_tracing_options()
517 return -1; in set_tracing_options()
520 if (set_tracing_func_irqinfo(ftrace) < 0) { in set_tracing_options()
521 pr_err("failed to set tracing option irq-info\n"); in set_tracing_options()
522 return -1; in set_tracing_options()
525 if (set_tracing_filters(ftrace) < 0) { in set_tracing_options()
527 return -1; in set_tracing_options()
530 if (set_tracing_depth(ftrace) < 0) { in set_tracing_options()
532 return -1; in set_tracing_options()
535 if (set_tracing_percpu_buffer_size(ftrace) < 0) { in set_tracing_options()
536 pr_err("failed to set tracing per-cpu buffer size\n"); in set_tracing_options()
537 return -1; in set_tracing_options()
540 if (set_tracing_trace_inherit(ftrace) < 0) { in set_tracing_options()
541 pr_err("failed to set tracing option function-fork\n"); in set_tracing_options()
542 return -1; in set_tracing_options()
545 if (set_tracing_sleep_time(ftrace) < 0) { in set_tracing_options()
546 pr_err("failed to set tracing option sleep-time\n"); in set_tracing_options()
547 return -1; in set_tracing_options()
550 if (set_tracing_funcgraph_irqs(ftrace) < 0) { in set_tracing_options()
551 pr_err("failed to set tracing option funcgraph-irqs\n"); in set_tracing_options()
552 return -1; in set_tracing_options()
555 if (set_tracing_funcgraph_verbose(ftrace) < 0) { in set_tracing_options()
556 pr_err("failed to set tracing option funcgraph-proc/funcgraph-abstime\n"); in set_tracing_options()
557 return -1; in set_tracing_options()
560 if (set_tracing_thresh(ftrace) < 0) { in set_tracing_options()
562 return -1; in set_tracing_options()
568 static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv) in __cmd_ftrace() argument
579 pr_err("ftrace only works for %s!\n", in __cmd_ftrace()
586 return -1; in __cmd_ftrace()
594 if (reset_tracing_files(ftrace) < 0) { in __cmd_ftrace()
595 pr_err("failed to reset ftrace\n"); in __cmd_ftrace()
599 /* reset ftrace buffer */ in __cmd_ftrace()
603 if (argc && perf_evlist__prepare_workload(ftrace->evlist, in __cmd_ftrace()
604 &ftrace->target, argv, false, in __cmd_ftrace()
609 if (set_tracing_options(ftrace) < 0) in __cmd_ftrace()
612 if (write_tracing_file("current_tracer", ftrace->tracer) < 0) { in __cmd_ftrace()
613 pr_err("failed to set current_tracer to %s\n", ftrace->tracer); in __cmd_ftrace()
640 if (!ftrace->initial_delay) { in __cmd_ftrace()
647 perf_evlist__start_workload(ftrace->evlist); in __cmd_ftrace()
649 if (ftrace->initial_delay) { in __cmd_ftrace()
650 usleep(ftrace->initial_delay * 1000); in __cmd_ftrace()
658 if (poll(&pollfd, 1, -1) < 0) in __cmd_ftrace()
692 reset_tracing_files(ftrace); in __cmd_ftrace()
694 return (done && !workload_exec_errno) ? 0 : -1; in __cmd_ftrace()
699 struct perf_ftrace *ftrace = cb; in perf_ftrace_config() local
701 if (!strstarts(var, "ftrace.")) in perf_ftrace_config()
704 if (strcmp(var, "ftrace.tracer")) in perf_ftrace_config()
705 return -1; in perf_ftrace_config()
709 ftrace->tracer = value; in perf_ftrace_config()
714 return -1; in perf_ftrace_config()
733 return -1; in opt_list_avail_functions()
737 return err ? -EINVAL : -ENOMEM; in opt_list_avail_functions()
740 if (ret == -EINVAL) { in opt_list_avail_functions()
741 pr_err("Filter parse error at %td.\n", err - str + 1); in opt_list_avail_functions()
743 pr_err(" %*c\n", (int)(err - str + 1), '^'); in opt_list_avail_functions()
760 struct list_head *head = opt->value; in parse_filter_func()
765 return -ENOMEM; in parse_filter_func()
767 strcpy(entry->name, str); in parse_filter_func()
768 list_add_tail(&entry->list, head); in parse_filter_func()
778 list_del_init(&pos->list); in delete_filter_func()
786 unsigned long *s = (unsigned long *)opt->value; in parse_buffer_size()
802 if (val != (unsigned long) -1) { in parse_buffer_size()
804 pr_err("buffer size too small, must larger than 1KB."); in parse_buffer_size()
805 return -1; in parse_buffer_size()
811 return -1; in parse_buffer_size()
818 struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value; in parse_func_tracer_opts() local
820 { .name = "call-graph", .value_ptr = &ftrace->func_stack_trace }, in parse_func_tracer_opts()
821 { .name = "irq-info", .value_ptr = &ftrace->func_irq_info }, in parse_func_tracer_opts()
839 struct perf_ftrace *ftrace = (struct perf_ftrace *) opt->value; in parse_graph_tracer_opts() local
841 { .name = "nosleep-time", .value_ptr = &ftrace->graph_nosleep_time }, in parse_graph_tracer_opts()
842 { .name = "noirqs", .value_ptr = &ftrace->graph_noirqs }, in parse_graph_tracer_opts()
843 { .name = "verbose", .value_ptr = &ftrace->graph_verbose }, in parse_graph_tracer_opts()
844 { .name = "thresh", .value_ptr = &ftrace->graph_thresh }, in parse_graph_tracer_opts()
845 { .name = "depth", .value_ptr = &ftrace->graph_depth }, in parse_graph_tracer_opts()
859 static void select_tracer(struct perf_ftrace *ftrace) in select_tracer() argument
861 bool graph = !list_empty(&ftrace->graph_funcs) || in select_tracer()
862 !list_empty(&ftrace->nograph_funcs); in select_tracer()
863 bool func = !list_empty(&ftrace->filters) || in select_tracer()
864 !list_empty(&ftrace->notrace); in select_tracer()
868 ftrace->tracer = "function_graph"; in select_tracer()
870 ftrace->tracer = "function"; in select_tracer()
873 pr_debug("%s tracer is used\n", ftrace->tracer); in select_tracer()
879 struct perf_ftrace ftrace = { in cmd_ftrace() local
884 "perf ftrace [<options>] [<command>]", in cmd_ftrace()
885 "perf ftrace [<options>] -- <command> [<options>]", in cmd_ftrace()
889 OPT_STRING('t', "tracer", &ftrace.tracer, "tracer", in cmd_ftrace()
894 OPT_STRING('p', "pid", &ftrace.target.pid, "pid", in cmd_ftrace()
896 /* TODO: Add short option -t after -t/--tracer can be removed. */ in cmd_ftrace()
897 OPT_STRING(0, "tid", &ftrace.target.tid, "tid", in cmd_ftrace()
898 "Trace on existing thread id (exclusive to --pid)"), in cmd_ftrace()
901 OPT_BOOLEAN('a', "all-cpus", &ftrace.target.system_wide, in cmd_ftrace()
902 "System-wide collection from all CPUs"), in cmd_ftrace()
903 OPT_STRING('C', "cpu", &ftrace.target.cpu_list, "cpu", in cmd_ftrace()
905 OPT_CALLBACK('T', "trace-funcs", &ftrace.filters, "func", in cmd_ftrace()
908 OPT_CALLBACK('N', "notrace-funcs", &ftrace.notrace, "func", in cmd_ftrace()
910 OPT_CALLBACK(0, "func-opts", &ftrace, "options", in cmd_ftrace()
911 "Function tracer options, available options: call-graph,irq-info", in cmd_ftrace()
913 OPT_CALLBACK('G', "graph-funcs", &ftrace.graph_funcs, "func", in cmd_ftrace()
916 OPT_CALLBACK('g', "nograph-funcs", &ftrace.nograph_funcs, "func", in cmd_ftrace()
918 OPT_CALLBACK(0, "graph-opts", &ftrace, "options", in cmd_ftrace()
919 "Graph tracer options, available options: nosleep-time,noirqs,verbose,thresh=<n>,depth=<n>", in cmd_ftrace()
921 OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size", in cmd_ftrace()
922 "Size of per cpu buffer, needs to use a B, K, M or G suffix.", parse_buffer_size), in cmd_ftrace()
923 OPT_BOOLEAN(0, "inherit", &ftrace.inherit, in cmd_ftrace()
925 OPT_UINTEGER('D', "delay", &ftrace.initial_delay, in cmd_ftrace()
930 INIT_LIST_HEAD(&ftrace.filters); in cmd_ftrace()
931 INIT_LIST_HEAD(&ftrace.notrace); in cmd_ftrace()
932 INIT_LIST_HEAD(&ftrace.graph_funcs); in cmd_ftrace()
933 INIT_LIST_HEAD(&ftrace.nograph_funcs); in cmd_ftrace()
935 ret = perf_config(perf_ftrace_config, &ftrace); in cmd_ftrace()
937 return -1; in cmd_ftrace()
941 if (!argc && target__none(&ftrace.target)) in cmd_ftrace()
942 ftrace.target.system_wide = true; in cmd_ftrace()
944 select_tracer(&ftrace); in cmd_ftrace()
946 ret = target__validate(&ftrace.target); in cmd_ftrace()
950 target__strerror(&ftrace.target, ret, errbuf, 512); in cmd_ftrace()
955 ftrace.evlist = evlist__new(); in cmd_ftrace()
956 if (ftrace.evlist == NULL) { in cmd_ftrace()
957 ret = -ENOMEM; in cmd_ftrace()
961 ret = perf_evlist__create_maps(ftrace.evlist, &ftrace.target); in cmd_ftrace()
965 ret = __cmd_ftrace(&ftrace, argc, argv); in cmd_ftrace()
968 evlist__delete(ftrace.evlist); in cmd_ftrace()
971 delete_filter_func(&ftrace.filters); in cmd_ftrace()
972 delete_filter_func(&ftrace.notrace); in cmd_ftrace()
973 delete_filter_func(&ftrace.graph_funcs); in cmd_ftrace()
974 delete_filter_func(&ftrace.nograph_funcs); in cmd_ftrace()