Lines Matching +full:exit +full:- +full:latency +full:- +full:us
1 // SPDX-License-Identifier: GPL-2.0
50 * timerlat_free_top - free runtime data
55 free(data->cpu_data); in timerlat_free_top()
60 * timerlat_alloc_histogram - alloc runtime data
71 data->nr_cpus = nr_cpus; in timerlat_alloc_top()
74 data->cpu_data = calloc(1, sizeof(*data->cpu_data) * nr_cpus); in timerlat_alloc_top()
75 if (!data->cpu_data) in timerlat_alloc_top()
80 data->cpu_data[cpu].min_irq = ~0; in timerlat_alloc_top()
81 data->cpu_data[cpu].min_thread = ~0; in timerlat_alloc_top()
82 data->cpu_data[cpu].min_user = ~0; in timerlat_alloc_top()
96 summary->min_irq = ~0; in timerlat_top_reset_sum()
97 summary->min_thread = ~0; in timerlat_top_reset_sum()
98 summary->min_user = ~0; in timerlat_top_reset_sum()
104 struct timerlat_top_data *data = tool->data; in timerlat_top_update_sum()
105 struct timerlat_top_cpu *cpu_data = &data->cpu_data[cpu]; in timerlat_top_update_sum()
107 sum->irq_count += cpu_data->irq_count; in timerlat_top_update_sum()
108 update_min(&sum->min_irq, &cpu_data->min_irq); in timerlat_top_update_sum()
109 update_sum(&sum->sum_irq, &cpu_data->sum_irq); in timerlat_top_update_sum()
110 update_max(&sum->max_irq, &cpu_data->max_irq); in timerlat_top_update_sum()
112 sum->thread_count += cpu_data->thread_count; in timerlat_top_update_sum()
113 update_min(&sum->min_thread, &cpu_data->min_thread); in timerlat_top_update_sum()
114 update_sum(&sum->sum_thread, &cpu_data->sum_thread); in timerlat_top_update_sum()
115 update_max(&sum->max_thread, &cpu_data->max_thread); in timerlat_top_update_sum()
117 sum->user_count += cpu_data->user_count; in timerlat_top_update_sum()
118 update_min(&sum->min_user, &cpu_data->min_user); in timerlat_top_update_sum()
119 update_sum(&sum->sum_user, &cpu_data->sum_user); in timerlat_top_update_sum()
120 update_max(&sum->max_user, &cpu_data->max_user); in timerlat_top_update_sum()
124 * timerlat_hist_update - record a new timerlat occurent on cpu, updating data
129 unsigned long long latency) in timerlat_top_update() argument
131 struct timerlat_params *params = tool->params; in timerlat_top_update()
132 struct timerlat_top_data *data = tool->data; in timerlat_top_update()
133 struct timerlat_top_cpu *cpu_data = &data->cpu_data[cpu]; in timerlat_top_update()
135 if (params->output_divisor) in timerlat_top_update()
136 latency = latency / params->output_divisor; in timerlat_top_update()
139 cpu_data->irq_count++; in timerlat_top_update()
140 cpu_data->cur_irq = latency; in timerlat_top_update()
141 update_min(&cpu_data->min_irq, &latency); in timerlat_top_update()
142 update_sum(&cpu_data->sum_irq, &latency); in timerlat_top_update()
143 update_max(&cpu_data->max_irq, &latency); in timerlat_top_update()
145 cpu_data->thread_count++; in timerlat_top_update()
146 cpu_data->cur_thread = latency; in timerlat_top_update()
147 update_min(&cpu_data->min_thread, &latency); in timerlat_top_update()
148 update_sum(&cpu_data->sum_thread, &latency); in timerlat_top_update()
149 update_max(&cpu_data->max_thread, &latency); in timerlat_top_update()
151 cpu_data->user_count++; in timerlat_top_update()
152 cpu_data->cur_user = latency; in timerlat_top_update()
153 update_min(&cpu_data->min_user, &latency); in timerlat_top_update()
154 update_sum(&cpu_data->sum_user, &latency); in timerlat_top_update()
155 update_max(&cpu_data->max_user, &latency); in timerlat_top_update()
160 * timerlat_top_handler - this is the handler for timerlat tracer events
168 unsigned long long latency, thread; in timerlat_top_handler() local
170 int cpu = record->cpu; in timerlat_top_handler()
173 params = top->params; in timerlat_top_handler()
175 if (!params->aa_only) { in timerlat_top_handler()
177 tep_get_field_val(s, event, "timer_latency", record, &latency, 1); in timerlat_top_handler()
179 timerlat_top_update(top, cpu, thread, latency); in timerlat_top_handler()
186 * timerlat_top_bpf_pull_data - copy data from BPF maps into userspace
190 struct timerlat_top_data *data = tool->data; in timerlat_top_bpf_pull_data()
192 long long value_irq[data->nr_cpus], in timerlat_top_bpf_pull_data()
193 value_thread[data->nr_cpus], in timerlat_top_bpf_pull_data()
194 value_user[data->nr_cpus]; in timerlat_top_bpf_pull_data()
199 data->nr_cpus); in timerlat_top_bpf_pull_data()
202 for (i = 0; i < data->nr_cpus; i++) { in timerlat_top_bpf_pull_data()
203 data->cpu_data[i].cur_irq = value_irq[i]; in timerlat_top_bpf_pull_data()
204 data->cpu_data[i].cur_thread = value_thread[i]; in timerlat_top_bpf_pull_data()
205 data->cpu_data[i].cur_user = value_user[i]; in timerlat_top_bpf_pull_data()
210 data->nr_cpus); in timerlat_top_bpf_pull_data()
213 for (i = 0; i < data->nr_cpus; i++) { in timerlat_top_bpf_pull_data()
214 data->cpu_data[i].irq_count = value_irq[i]; in timerlat_top_bpf_pull_data()
215 data->cpu_data[i].thread_count = value_thread[i]; in timerlat_top_bpf_pull_data()
216 data->cpu_data[i].user_count = value_user[i]; in timerlat_top_bpf_pull_data()
221 data->nr_cpus); in timerlat_top_bpf_pull_data()
224 for (i = 0; i < data->nr_cpus; i++) { in timerlat_top_bpf_pull_data()
225 data->cpu_data[i].min_irq = value_irq[i]; in timerlat_top_bpf_pull_data()
226 data->cpu_data[i].min_thread = value_thread[i]; in timerlat_top_bpf_pull_data()
227 data->cpu_data[i].min_user = value_user[i]; in timerlat_top_bpf_pull_data()
232 data->nr_cpus); in timerlat_top_bpf_pull_data()
235 for (i = 0; i < data->nr_cpus; i++) { in timerlat_top_bpf_pull_data()
236 data->cpu_data[i].max_irq = value_irq[i]; in timerlat_top_bpf_pull_data()
237 data->cpu_data[i].max_thread = value_thread[i]; in timerlat_top_bpf_pull_data()
238 data->cpu_data[i].max_user = value_user[i]; in timerlat_top_bpf_pull_data()
243 data->nr_cpus); in timerlat_top_bpf_pull_data()
246 for (i = 0; i < data->nr_cpus; i++) { in timerlat_top_bpf_pull_data()
247 data->cpu_data[i].sum_irq = value_irq[i]; in timerlat_top_bpf_pull_data()
248 data->cpu_data[i].sum_thread = value_thread[i]; in timerlat_top_bpf_pull_data()
249 data->cpu_data[i].sum_user = value_user[i]; in timerlat_top_bpf_pull_data()
256 * timerlat_top_header - print the header of the tool output
260 struct trace_seq *s = top->trace.seq; in timerlat_top_header()
263 get_duration(top->start_time, duration, sizeof(duration)); in timerlat_top_header()
265 if (params->pretty_output) in timerlat_top_header()
268 …trace_seq_printf(s, " Timer Latency … in timerlat_top_header()
269 if (params->user_data) in timerlat_top_header()
272 if (params->pretty_output) in timerlat_top_header()
276 …trace_seq_printf(s, "%-6s | IRQ Timer Latency (%s) | Thread Timer Latenc… in timerlat_top_header()
277 params->output_divisor == 1 ? "ns" : "us", in timerlat_top_header()
278 params->output_divisor == 1 ? "ns" : "us"); in timerlat_top_header()
280 if (params->user_data) { in timerlat_top_header()
281 trace_seq_printf(s, " | Ret user Timer Latency (%s)", in timerlat_top_header()
282 params->output_divisor == 1 ? "ns" : "us"); in timerlat_top_header()
286 if (params->pretty_output) in timerlat_top_header()
290 if (params->user_data) in timerlat_top_header()
293 if (params->pretty_output) in timerlat_top_header()
298 static const char *no_value = " -";
301 * timerlat_top_print - prints the output of a given CPU
306 struct timerlat_params *params = top->params; in timerlat_top_print()
307 struct timerlat_top_data *data = top->data; in timerlat_top_print()
308 struct timerlat_top_cpu *cpu_data = &data->cpu_data[cpu]; in timerlat_top_print()
309 struct trace_seq *s = top->trace.seq; in timerlat_top_print()
314 if (!cpu_data->irq_count && !cpu_data->thread_count) in timerlat_top_print()
320 trace_seq_printf(s, "%3d #%-9llu |", cpu, cpu_data->irq_count); in timerlat_top_print()
322 if (!cpu_data->irq_count) { in timerlat_top_print()
325 trace_seq_printf(s, "%9llu ", cpu_data->cur_irq); in timerlat_top_print()
326 trace_seq_printf(s, "%9llu ", cpu_data->min_irq); in timerlat_top_print()
327 trace_seq_printf(s, "%9llu ", cpu_data->sum_irq / cpu_data->irq_count); in timerlat_top_print()
328 trace_seq_printf(s, "%9llu |", cpu_data->max_irq); in timerlat_top_print()
331 if (!cpu_data->thread_count) { in timerlat_top_print()
334 trace_seq_printf(s, "%9llu ", cpu_data->cur_thread); in timerlat_top_print()
335 trace_seq_printf(s, "%9llu ", cpu_data->min_thread); in timerlat_top_print()
337 cpu_data->sum_thread / cpu_data->thread_count); in timerlat_top_print()
338 trace_seq_printf(s, "%9llu", cpu_data->max_thread); in timerlat_top_print()
341 if (!params->user_data) { in timerlat_top_print()
348 if (!cpu_data->user_count) { in timerlat_top_print()
351 trace_seq_printf(s, "%9llu ", cpu_data->cur_user); in timerlat_top_print()
352 trace_seq_printf(s, "%9llu ", cpu_data->min_user); in timerlat_top_print()
354 cpu_data->sum_user / cpu_data->user_count); in timerlat_top_print()
355 trace_seq_printf(s, "%9llu\n", cpu_data->max_user); in timerlat_top_print()
360 * timerlat_top_print_sum - prints the summary output
365 const char *split = "----------------------------------------"; in timerlat_top_print_sum()
366 struct timerlat_params *params = top->params; in timerlat_top_print_sum()
367 unsigned long long count = summary->irq_count; in timerlat_top_print_sum()
368 struct trace_seq *s = top->trace.seq; in timerlat_top_print_sum()
374 if (!summary->irq_count && !summary->thread_count) in timerlat_top_print_sum()
383 if (params->user_data) in timerlat_top_print_sum()
384 trace_seq_printf(s, "-|%.*s", 39, split); in timerlat_top_print_sum()
387 trace_seq_printf(s, "ALL #%-6llu e%d |", count, e); in timerlat_top_print_sum()
389 if (!summary->irq_count) { in timerlat_top_print_sum()
393 trace_seq_printf(s, "%9llu ", summary->min_irq); in timerlat_top_print_sum()
394 trace_seq_printf(s, "%9llu ", summary->sum_irq / summary->irq_count); in timerlat_top_print_sum()
395 trace_seq_printf(s, "%9llu |", summary->max_irq); in timerlat_top_print_sum()
398 if (!summary->thread_count) { in timerlat_top_print_sum()
402 trace_seq_printf(s, "%9llu ", summary->min_thread); in timerlat_top_print_sum()
404 summary->sum_thread / summary->thread_count); in timerlat_top_print_sum()
405 trace_seq_printf(s, "%9llu", summary->max_thread); in timerlat_top_print_sum()
408 if (!params->user_data) { in timerlat_top_print_sum()
415 if (!summary->user_count) { in timerlat_top_print_sum()
419 trace_seq_printf(s, "%9llu ", summary->min_user); in timerlat_top_print_sum()
421 summary->sum_user / summary->user_count); in timerlat_top_print_sum()
422 trace_seq_printf(s, "%9llu\n", summary->max_user); in timerlat_top_print_sum()
427 * clear_terminal - clears the output terminal
436 * timerlat_print_stats - print data for all cpus
441 struct trace_instance *trace = &top->trace; in timerlat_print_stats()
443 static int nr_cpus = -1; in timerlat_print_stats()
446 if (params->aa_only) in timerlat_print_stats()
449 if (nr_cpus == -1) in timerlat_print_stats()
452 if (!params->quiet) in timerlat_print_stats()
453 clear_terminal(trace->seq); in timerlat_print_stats()
460 if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus)) in timerlat_print_stats()
468 trace_seq_do_printf(trace->seq); in timerlat_print_stats()
469 trace_seq_reset(trace->seq); in timerlat_print_stats()
474 * timerlat_top_usage - prints timerlat top usage message
482 …" usage: rtla timerlat [top] [-h] [-q] [-a us] [-d s] [-D] [-n] [-p us] [-i us] [-T us] [-s us] \… in timerlat_top_usage()
483 …" [[-t[file]] [-e sys[:event]] [--filter <filter>] [--trigger <trigger>] [-c cpu-list] [-H cpu-l… in timerlat_top_usage()
484 …" [-P priority] [--dma-latency us] [--aa-only us] [-C[=cgroup_name]] [-u|-k] [--warm-up s] [--de… in timerlat_top_usage()
486 " -h/--help: print this menu", in timerlat_top_usage()
487 " -a/--auto: set automatic trace mode, stopping the session if argument in us latency is hit", in timerlat_top_usage()
488 …" --aa-only us: stop if <us> latency is hit, only printing the auto analysis (reduces CPU usa… in timerlat_top_usage()
489 " -p/--period us: timerlat period in us", in timerlat_top_usage()
490 " -i/--irq us: stop trace if the irq latency is higher than the argument in us", in timerlat_top_usage()
491 " -T/--thread us: stop trace if the thread latency is higher than the argument in us", in timerlat_top_usage()
492 …" -s/--stack us: save the stack trace at the IRQ if a thread latency is higher than the argument… in timerlat_top_usage()
493 " -c/--cpus cpus: run the tracer only on the given cpus", in timerlat_top_usage()
494 " -H/--house-keeping cpus: run rtla control threads only on the given cpus", in timerlat_top_usage()
495 …" -C/--cgroup[=cgroup_name]: set cgroup, if no cgroup_name is passed, the rtla's cgroup will be … in timerlat_top_usage()
496 " -d/--duration time[s|m|h|d]: duration of the session", in timerlat_top_usage()
497 " -D/--debug: print debug info", in timerlat_top_usage()
498 …" --dump-tasks: prints the task running on all CPUs if stop conditions are met (depends on !-… in timerlat_top_usage()
499 " -t/--trace[file]: save the stopped trace to [file|timerlat_trace.txt]", in timerlat_top_usage()
500 …" -e/--event <sys:event>: enable the <sys:event> in the trace instance, multiple -e are allowed", in timerlat_top_usage()
501 " --filter <command>: enable a trace event filter to the previous -e event", in timerlat_top_usage()
502 " --trigger <command>: enable a trace event trigger to the previous -e event", in timerlat_top_usage()
503 " -n/--nano: display data in nanoseconds", in timerlat_top_usage()
504 " --no-aa: disable auto-analysis, reducing rtla timerlat cpu usage", in timerlat_top_usage()
505 " -q/--quiet print only a summary at the end", in timerlat_top_usage()
506 " --dma-latency us: set /dev/cpu_dma_latency latency <us> to reduce exit from idle latency", in timerlat_top_usage()
507 " -P/--priority o:prio|r:prio|f:prio|d:runtime:period : set scheduling parameters", in timerlat_top_usage()
508 " o:prio - use SCHED_OTHER with prio", in timerlat_top_usage()
509 " r:prio - use SCHED_RR with prio", in timerlat_top_usage()
510 " f:prio - use SCHED_FIFO with prio", in timerlat_top_usage()
511 " d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period", in timerlat_top_usage()
513 " -u/--user-threads: use rtla user-space threads instead of kernel-space timerlat threads", in timerlat_top_usage()
514 " -k/--kernel-threads: use timerlat kernel-space threads instead of rtla user-space threads", in timerlat_top_usage()
515 " -U/--user-load: enable timerlat for user-defined user-space workload", in timerlat_top_usage()
516 " --warm-up s: let the workload run for s seconds before collecting data", in timerlat_top_usage()
517 " --trace-buffer-size kB: set the per-cpu trace buffer size in kB", in timerlat_top_usage()
518 …" --deepest-idle-state n: only go down to idle state n on cpus used by timerlat to reduce exi… in timerlat_top_usage()
525 fprintf(stderr, "rtla timerlat top: a per-cpu summary of the timer latency (version %s)\n", in timerlat_top_usage()
532 exit(EXIT_FAILURE); in timerlat_top_usage()
534 exit(EXIT_SUCCESS); in timerlat_top_usage()
538 * timerlat_top_parse_args - allocs, parse and fill the cmd line parameters
551 exit(1); in timerlat_top_parse_args()
554 params->dma_latency = -1; in timerlat_top_parse_args()
557 params->deepest_idle_state = -2; in timerlat_top_parse_args()
560 params->output_divisor = 1000; in timerlat_top_parse_args()
571 {"house-keeping", required_argument, 0, 'H'}, in timerlat_top_parse_args()
580 {"user-threads", no_argument, 0, 'u'}, in timerlat_top_parse_args()
581 {"kernel-threads", no_argument, 0, 'k'}, in timerlat_top_parse_args()
582 {"user-load", no_argument, 0, 'U'}, in timerlat_top_parse_args()
585 {"dma-latency", required_argument, 0, '2'}, in timerlat_top_parse_args()
586 {"no-aa", no_argument, 0, '3'}, in timerlat_top_parse_args()
587 {"dump-tasks", no_argument, 0, '4'}, in timerlat_top_parse_args()
588 {"aa-only", required_argument, 0, '5'}, in timerlat_top_parse_args()
589 {"warm-up", required_argument, 0, '6'}, in timerlat_top_parse_args()
590 {"trace-buffer-size", required_argument, 0, '7'}, in timerlat_top_parse_args()
591 {"deepest-idle-state", required_argument, 0, '8'}, in timerlat_top_parse_args()
602 if (c == -1) in timerlat_top_parse_args()
610 params->stop_total_us = auto_thresh; in timerlat_top_parse_args()
611 params->stop_us = auto_thresh; in timerlat_top_parse_args()
614 params->print_stack = auto_thresh; in timerlat_top_parse_args()
617 params->trace_output = "timerlat_trace.txt"; in timerlat_top_parse_args()
620 /* it is here because it is similar to -a */ in timerlat_top_parse_args()
624 params->stop_total_us = auto_thresh; in timerlat_top_parse_args()
625 params->stop_us = auto_thresh; in timerlat_top_parse_args()
628 params->print_stack = auto_thresh; in timerlat_top_parse_args()
631 params->aa_only = 1; in timerlat_top_parse_args()
634 retval = parse_cpu_set(optarg, ¶ms->monitored_cpus); in timerlat_top_parse_args()
636 timerlat_top_usage("\nInvalid -c cpu list\n"); in timerlat_top_parse_args()
637 params->cpus = optarg; in timerlat_top_parse_args()
640 params->cgroup = 1; in timerlat_top_parse_args()
643 params->cgroup_name = NULL; in timerlat_top_parse_args()
646 params->cgroup_name = ++optarg; in timerlat_top_parse_args()
653 params->duration = parse_seconds_duration(optarg); in timerlat_top_parse_args()
654 if (!params->duration) in timerlat_top_parse_args()
655 timerlat_top_usage("Invalid -d duration\n"); in timerlat_top_parse_args()
661 exit(EXIT_FAILURE); in timerlat_top_parse_args()
664 if (params->events) in timerlat_top_parse_args()
665 tevent->next = params->events; in timerlat_top_parse_args()
666 params->events = tevent; in timerlat_top_parse_args()
673 params->hk_cpus = 1; in timerlat_top_parse_args()
674 retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set); in timerlat_top_parse_args()
677 exit(EXIT_FAILURE); in timerlat_top_parse_args()
681 params->stop_us = get_llong_from_str(optarg); in timerlat_top_parse_args()
684 params->kernel_workload = true; in timerlat_top_parse_args()
687 params->output_divisor = 1; in timerlat_top_parse_args()
690 params->timerlat_period_us = get_llong_from_str(optarg); in timerlat_top_parse_args()
691 if (params->timerlat_period_us > 1000000) in timerlat_top_parse_args()
695 retval = parse_prio(optarg, ¶ms->sched_param); in timerlat_top_parse_args()
696 if (retval == -1) in timerlat_top_parse_args()
697 timerlat_top_usage("Invalid -P priority"); in timerlat_top_parse_args()
698 params->set_sched = 1; in timerlat_top_parse_args()
701 params->quiet = 1; in timerlat_top_parse_args()
704 params->print_stack = get_llong_from_str(optarg); in timerlat_top_parse_args()
707 params->stop_total_us = get_llong_from_str(optarg); in timerlat_top_parse_args()
712 params->trace_output = &optarg[1]; in timerlat_top_parse_args()
714 params->trace_output = &optarg[0]; in timerlat_top_parse_args()
715 } else if (optind < argc && argv[optind][0] != '-') in timerlat_top_parse_args()
716 params->trace_output = argv[optind]; in timerlat_top_parse_args()
718 params->trace_output = "timerlat_trace.txt"; in timerlat_top_parse_args()
722 params->user_workload = true; in timerlat_top_parse_args()
723 /* fallback: -u implies -U */ in timerlat_top_parse_args()
725 params->user_data = true; in timerlat_top_parse_args()
728 if (params->events) { in timerlat_top_parse_args()
729 retval = trace_event_add_trigger(params->events, optarg); in timerlat_top_parse_args()
732 exit(EXIT_FAILURE); in timerlat_top_parse_args()
735 timerlat_top_usage("--trigger requires a previous -e\n"); in timerlat_top_parse_args()
739 if (params->events) { in timerlat_top_parse_args()
740 retval = trace_event_add_filter(params->events, optarg); in timerlat_top_parse_args()
743 exit(EXIT_FAILURE); in timerlat_top_parse_args()
746 timerlat_top_usage("--filter requires a previous -e\n"); in timerlat_top_parse_args()
749 case '2': /* dma-latency */ in timerlat_top_parse_args()
750 params->dma_latency = get_llong_from_str(optarg); in timerlat_top_parse_args()
751 if (params->dma_latency < 0 || params->dma_latency > 10000) { in timerlat_top_parse_args()
752 err_msg("--dma-latency needs to be >= 0 and < 10000"); in timerlat_top_parse_args()
753 exit(EXIT_FAILURE); in timerlat_top_parse_args()
756 case '3': /* no-aa */ in timerlat_top_parse_args()
757 params->no_aa = 1; in timerlat_top_parse_args()
760 params->dump_tasks = 1; in timerlat_top_parse_args()
763 params->warmup = get_llong_from_str(optarg); in timerlat_top_parse_args()
766 params->buffer_size = get_llong_from_str(optarg); in timerlat_top_parse_args()
769 params->deepest_idle_state = get_llong_from_str(optarg); in timerlat_top_parse_args()
778 exit(EXIT_FAILURE); in timerlat_top_parse_args()
784 if (!params->stop_us && !params->stop_total_us) in timerlat_top_parse_args()
785 params->no_aa = 1; in timerlat_top_parse_args()
787 if (params->no_aa && params->aa_only) in timerlat_top_parse_args()
788 timerlat_top_usage("--no-aa and --aa-only are mutually exclusive!"); in timerlat_top_parse_args()
790 if (params->kernel_workload && params->user_workload) in timerlat_top_parse_args()
791 timerlat_top_usage("--kernel-threads and --user-threads are mutually exclusive!"); in timerlat_top_parse_args()
797 * timerlat_top_apply_config - apply the top configs to the initialized tool
808 if (isatty(STDOUT_FILENO) && !params->quiet) in timerlat_top_apply_config()
809 params->pretty_output = 1; in timerlat_top_apply_config()
814 return -1; in timerlat_top_apply_config()
818 * timerlat_init_top - initialize a timerlat top tool with parameters
832 top->data = timerlat_alloc_top(nr_cpus); in timerlat_init_top()
833 if (!top->data) in timerlat_init_top()
836 top->params = params; in timerlat_init_top()
838 tep_register_event_handler(top->trace.tep, -1, "ftrace", "timerlat", in timerlat_init_top()
855 * exit immediately in stop_top()
857 tracefs_iterate_stop(top_inst->inst); in stop_top()
866 * timerlat_top_set_signals - handles the signal to stop the tool
872 if (params->duration) { in timerlat_top_set_signals()
874 alarm(params->duration); in timerlat_top_set_signals()
879 * timerlat_top_main_loop - main loop to process events
887 struct trace_instance *trace = &top->trace; in timerlat_top_main_loop()
891 sleep(params->sleep_time); in timerlat_top_main_loop()
893 if (params->aa_only && !osnoise_trace_is_off(top, record)) in timerlat_top_main_loop()
896 retval = tracefs_iterate_raw_events(trace->tep, in timerlat_top_main_loop()
897 trace->inst, in timerlat_top_main_loop()
907 if (!params->quiet) in timerlat_top_main_loop()
913 /* is there still any user-threads ? */ in timerlat_top_main_loop()
914 if (params->user_workload) { in timerlat_top_main_loop()
915 if (params_u->stopped_running) { in timerlat_top_main_loop()
926 * timerlat_top_bpf_main_loop - main loop to process events (BPF variant)
936 if (params->aa_only) { in timerlat_top_bpf_main_loop()
937 /* Auto-analysis only, just wait for stop tracing */ in timerlat_top_bpf_main_loop()
938 timerlat_bpf_wait(-1); in timerlat_top_bpf_main_loop()
942 if (params->quiet) { in timerlat_top_bpf_main_loop()
944 timerlat_bpf_wait(-1); in timerlat_top_bpf_main_loop()
957 wait_retval = timerlat_bpf_wait(params->sleep_time); in timerlat_top_bpf_main_loop()
971 /* is there still any user-threads ? */ in timerlat_top_bpf_main_loop()
972 if (params->user_workload) { in timerlat_top_bpf_main_loop()
973 if (params_u->stopped_running) { in timerlat_top_bpf_main_loop()
991 int dma_latency_fd = -1; in timerlat_top_main()
1001 exit(1); in timerlat_top_main()
1015 trace = &top->trace; in timerlat_top_main()
1028 if (!no_bpf && !tep_find_event_by_name(trace->tep, "osnoise", "timerlat_sample")) { in timerlat_top_main()
1047 if (params->set_sched) { in timerlat_top_main()
1048 retval = set_comm_sched_attr("timerlat/", ¶ms->sched_param); in timerlat_top_main()
1055 if (params->cgroup && !params->user_data) { in timerlat_top_main()
1056 retval = set_comm_cgroup("timerlat/", params->cgroup_name); in timerlat_top_main()
1063 if (params->dma_latency >= 0) { in timerlat_top_main()
1064 dma_latency_fd = set_cpu_dma_latency(params->dma_latency); in timerlat_top_main()
1071 if (params->deepest_idle_state >= -1) { in timerlat_top_main()
1073 err_msg("rtla built without libcpupower, --deepest-idle-state is not supported\n"); in timerlat_top_main()
1080 if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus)) in timerlat_top_main()
1086 if (set_deepest_cpu_idle_state(i, params->deepest_idle_state) < 0) { in timerlat_top_main()
1093 if (params->trace_output) { in timerlat_top_main()
1100 if (params->events) { in timerlat_top_main()
1101 retval = trace_events_enable(&record->trace, params->events); in timerlat_top_main()
1106 if (params->buffer_size > 0) { in timerlat_top_main()
1107 retval = trace_set_buffer_size(&record->trace, params->buffer_size); in timerlat_top_main()
1113 if (!params->no_aa) { in timerlat_top_main()
1118 retval = timerlat_aa_init(aa, params->dump_tasks); in timerlat_top_main()
1124 /* if it is re-using the main instance, there is no need to start it */ in timerlat_top_main()
1126 retval = enable_timerlat(&aa->trace); in timerlat_top_main()
1134 if (params->user_workload) { in timerlat_top_main()
1140 params_u.set = ¶ms->monitored_cpus; in timerlat_top_main()
1141 if (params->set_sched) in timerlat_top_main()
1142 params_u.sched_param = ¶ms->sched_param; in timerlat_top_main()
1146 params_u.cgroup_name = params->cgroup_name; in timerlat_top_main()
1150 err_msg("Error creating timerlat user-space threads\n"); in timerlat_top_main()
1153 if (params->warmup > 0) { in timerlat_top_main()
1154 debug_msg("Warming up for %d seconds\n", params->warmup); in timerlat_top_main()
1155 sleep(params->warmup); in timerlat_top_main()
1165 if (params->trace_output) in timerlat_top_main()
1166 trace_instance_start(&record->trace); in timerlat_top_main()
1167 if (!params->no_aa) in timerlat_top_main()
1168 trace_instance_start(&aa->trace); in timerlat_top_main()
1179 top->start_time = time(NULL); in timerlat_top_main()
1193 if (params->user_workload && !params_u.stopped_running) { in timerlat_top_main()
1205 if (!params->no_aa) in timerlat_top_main()
1206 timerlat_auto_analysis(params->stop_us, params->stop_total_us); in timerlat_top_main()
1208 save_trace_to_file(record ? record->trace.inst : NULL, in timerlat_top_main()
1209 params->trace_output); in timerlat_top_main()
1210 } else if (params->aa_only) { in timerlat_top_main()
1212 * If the trace did not stop with --aa-only, at least print the in timerlat_top_main()
1213 * max known latency. in timerlat_top_main()
1215 max_lat = tracefs_instance_file_read(trace->inst, "tracing_max_latency", NULL); in timerlat_top_main()
1217 printf(" Max latency was %s\n", max_lat); in timerlat_top_main()
1226 if (params->deepest_idle_state >= -1) { in timerlat_top_main()
1228 if (params->cpus && !CPU_ISSET(i, ¶ms->monitored_cpus)) in timerlat_top_main()
1233 trace_events_destroy(&record->trace, params->events); in timerlat_top_main()
1234 params->events = NULL; in timerlat_top_main()
1236 timerlat_free_top(top->data); in timerlat_top_main()
1244 exit(return_value); in timerlat_top_main()