Lines Matching +full:exit +full:- +full:latency +full:- +full:us

1 // SPDX-License-Identifier: GPL-2.0
52 * timerlat_free_histogram - free runtime data
60 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_free_histogram()
61 if (data->hist[cpu].irq) in timerlat_free_histogram()
62 free(data->hist[cpu].irq); in timerlat_free_histogram()
64 if (data->hist[cpu].thread) in timerlat_free_histogram()
65 free(data->hist[cpu].thread); in timerlat_free_histogram()
67 if (data->hist[cpu].user) in timerlat_free_histogram()
68 free(data->hist[cpu].user); in timerlat_free_histogram()
73 if (data->hist) in timerlat_free_histogram()
74 free(data->hist); in timerlat_free_histogram()
80 * timerlat_alloc_histogram - alloc runtime data
92 data->entries = entries; in timerlat_alloc_histogram()
93 data->bucket_size = bucket_size; in timerlat_alloc_histogram()
94 data->nr_cpus = nr_cpus; in timerlat_alloc_histogram()
97 data->hist = calloc(1, sizeof(*data->hist) * nr_cpus); in timerlat_alloc_histogram()
98 if (!data->hist) in timerlat_alloc_histogram()
103 data->hist[cpu].irq = calloc(1, sizeof(*data->hist->irq) * (entries + 1)); in timerlat_alloc_histogram()
104 if (!data->hist[cpu].irq) in timerlat_alloc_histogram()
107 data->hist[cpu].thread = calloc(1, sizeof(*data->hist->thread) * (entries + 1)); in timerlat_alloc_histogram()
108 if (!data->hist[cpu].thread) in timerlat_alloc_histogram()
111 data->hist[cpu].user = calloc(1, sizeof(*data->hist->user) * (entries + 1)); in timerlat_alloc_histogram()
112 if (!data->hist[cpu].user) in timerlat_alloc_histogram()
118 data->hist[cpu].min_irq = ~0; in timerlat_alloc_histogram()
119 data->hist[cpu].min_thread = ~0; in timerlat_alloc_histogram()
120 data->hist[cpu].min_user = ~0; in timerlat_alloc_histogram()
131 * timerlat_hist_update - record a new timerlat occurent on cpu, updating data
136 unsigned long long latency) in timerlat_hist_update() argument
138 struct timerlat_params *params = tool->params; in timerlat_hist_update()
139 struct timerlat_hist_data *data = tool->data; in timerlat_hist_update()
140 int entries = data->entries; in timerlat_hist_update()
144 if (params->output_divisor) in timerlat_hist_update()
145 latency = latency / params->output_divisor; in timerlat_hist_update()
147 bucket = latency / data->bucket_size; in timerlat_hist_update()
150 hist = data->hist[cpu].irq; in timerlat_hist_update()
151 data->hist[cpu].irq_count++; in timerlat_hist_update()
152 update_min(&data->hist[cpu].min_irq, &latency); in timerlat_hist_update()
153 update_sum(&data->hist[cpu].sum_irq, &latency); in timerlat_hist_update()
154 update_max(&data->hist[cpu].max_irq, &latency); in timerlat_hist_update()
156 hist = data->hist[cpu].thread; in timerlat_hist_update()
157 data->hist[cpu].thread_count++; in timerlat_hist_update()
158 update_min(&data->hist[cpu].min_thread, &latency); in timerlat_hist_update()
159 update_sum(&data->hist[cpu].sum_thread, &latency); in timerlat_hist_update()
160 update_max(&data->hist[cpu].max_thread, &latency); in timerlat_hist_update()
162 hist = data->hist[cpu].user; in timerlat_hist_update()
163 data->hist[cpu].user_count++; in timerlat_hist_update()
164 update_min(&data->hist[cpu].min_user, &latency); in timerlat_hist_update()
165 update_sum(&data->hist[cpu].sum_user, &latency); in timerlat_hist_update()
166 update_max(&data->hist[cpu].max_user, &latency); in timerlat_hist_update()
176 * timerlat_hist_handler - this is the handler for timerlat tracer events
183 unsigned long long context, latency; in timerlat_hist_handler() local
185 int cpu = record->cpu; in timerlat_hist_handler()
190 tep_get_field_val(s, event, "timer_latency", record, &latency, 1); in timerlat_hist_handler()
192 timerlat_hist_update(tool, cpu, context, latency); in timerlat_hist_handler()
198 * timerlat_hist_bpf_pull_data - copy data from BPF maps into userspace
202 struct timerlat_hist_data *data = tool->data; in timerlat_hist_bpf_pull_data()
204 long long value_irq[data->nr_cpus], in timerlat_hist_bpf_pull_data()
205 value_thread[data->nr_cpus], in timerlat_hist_bpf_pull_data()
206 value_user[data->nr_cpus]; in timerlat_hist_bpf_pull_data()
209 for (i = 0; i < data->entries; i++) { in timerlat_hist_bpf_pull_data()
211 value_user, data->nr_cpus); in timerlat_hist_bpf_pull_data()
214 for (j = 0; j < data->nr_cpus; j++) { in timerlat_hist_bpf_pull_data()
215 data->hist[j].irq[i] = value_irq[j]; in timerlat_hist_bpf_pull_data()
216 data->hist[j].thread[i] = value_thread[j]; in timerlat_hist_bpf_pull_data()
217 data->hist[j].user[i] = value_user[j]; in timerlat_hist_bpf_pull_data()
224 data->nr_cpus); in timerlat_hist_bpf_pull_data()
227 for (i = 0; i < data->nr_cpus; i++) { in timerlat_hist_bpf_pull_data()
228 data->hist[i].irq_count = value_irq[i]; in timerlat_hist_bpf_pull_data()
229 data->hist[i].thread_count = value_thread[i]; in timerlat_hist_bpf_pull_data()
230 data->hist[i].user_count = value_user[i]; in timerlat_hist_bpf_pull_data()
235 data->nr_cpus); in timerlat_hist_bpf_pull_data()
238 for (i = 0; i < data->nr_cpus; i++) { in timerlat_hist_bpf_pull_data()
239 data->hist[i].min_irq = value_irq[i]; in timerlat_hist_bpf_pull_data()
240 data->hist[i].min_thread = value_thread[i]; in timerlat_hist_bpf_pull_data()
241 data->hist[i].min_user = value_user[i]; in timerlat_hist_bpf_pull_data()
246 data->nr_cpus); in timerlat_hist_bpf_pull_data()
249 for (i = 0; i < data->nr_cpus; i++) { in timerlat_hist_bpf_pull_data()
250 data->hist[i].max_irq = value_irq[i]; in timerlat_hist_bpf_pull_data()
251 data->hist[i].max_thread = value_thread[i]; in timerlat_hist_bpf_pull_data()
252 data->hist[i].max_user = value_user[i]; in timerlat_hist_bpf_pull_data()
257 data->nr_cpus); in timerlat_hist_bpf_pull_data()
260 for (i = 0; i < data->nr_cpus; i++) { in timerlat_hist_bpf_pull_data()
261 data->hist[i].sum_irq = value_irq[i]; in timerlat_hist_bpf_pull_data()
262 data->hist[i].sum_thread = value_thread[i]; in timerlat_hist_bpf_pull_data()
263 data->hist[i].sum_user = value_user[i]; in timerlat_hist_bpf_pull_data()
268 data->nr_cpus); in timerlat_hist_bpf_pull_data()
271 for (i = 0; i < data->nr_cpus; i++) { in timerlat_hist_bpf_pull_data()
272 data->hist[i].irq[data->entries] = value_irq[i]; in timerlat_hist_bpf_pull_data()
273 data->hist[i].thread[data->entries] = value_thread[i]; in timerlat_hist_bpf_pull_data()
274 data->hist[i].user[data->entries] = value_user[i]; in timerlat_hist_bpf_pull_data()
281 * timerlat_hist_header - print the header of the tracer to the output
285 struct timerlat_params *params = tool->params; in timerlat_hist_header()
286 struct timerlat_hist_data *data = tool->data; in timerlat_hist_header()
287 struct trace_seq *s = tool->trace.seq; in timerlat_hist_header()
291 if (params->no_header) in timerlat_hist_header()
294 get_duration(tool->start_time, duration, sizeof(duration)); in timerlat_hist_header()
297 params->output_divisor == 1 ? "nanoseconds" : "microseconds", in timerlat_hist_header()
298 params->output_divisor == 1 ? "ns" : "us"); in timerlat_hist_header()
302 if (!params->no_index) in timerlat_hist_header()
305 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_hist_header()
306 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_hist_header()
309 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_hist_header()
312 if (!params->no_irq) in timerlat_hist_header()
313 trace_seq_printf(s, " IRQ-%03d", cpu); in timerlat_hist_header()
315 if (!params->no_thread) in timerlat_hist_header()
316 trace_seq_printf(s, " Thr-%03d", cpu); in timerlat_hist_header()
318 if (params->user_data) in timerlat_hist_header()
319 trace_seq_printf(s, " Usr-%03d", cpu); in timerlat_hist_header()
329 * format_summary_value - format a line of summary value (min, max or avg)
340 trace_seq_printf(seq, "%9c ", '-'); in format_summary_value()
344 * timerlat_print_summary - print the summary of the hist data to the output
353 if (params->no_summary) in timerlat_print_summary()
356 if (!params->no_index) in timerlat_print_summary()
357 trace_seq_printf(trace->seq, "count:"); in timerlat_print_summary()
359 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_summary()
360 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_summary()
363 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_summary()
366 if (!params->no_irq) in timerlat_print_summary()
367 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_summary()
368 data->hist[cpu].irq_count); in timerlat_print_summary()
370 if (!params->no_thread) in timerlat_print_summary()
371 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_summary()
372 data->hist[cpu].thread_count); in timerlat_print_summary()
374 if (params->user_data) in timerlat_print_summary()
375 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_summary()
376 data->hist[cpu].user_count); in timerlat_print_summary()
378 trace_seq_printf(trace->seq, "\n"); in timerlat_print_summary()
380 if (!params->no_index) in timerlat_print_summary()
381 trace_seq_printf(trace->seq, "min: "); in timerlat_print_summary()
383 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_summary()
384 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_summary()
387 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_summary()
390 if (!params->no_irq) in timerlat_print_summary()
391 format_summary_value(trace->seq, in timerlat_print_summary()
392 data->hist[cpu].irq_count, in timerlat_print_summary()
393 data->hist[cpu].min_irq, in timerlat_print_summary()
396 if (!params->no_thread) in timerlat_print_summary()
397 format_summary_value(trace->seq, in timerlat_print_summary()
398 data->hist[cpu].thread_count, in timerlat_print_summary()
399 data->hist[cpu].min_thread, in timerlat_print_summary()
402 if (params->user_data) in timerlat_print_summary()
403 format_summary_value(trace->seq, in timerlat_print_summary()
404 data->hist[cpu].user_count, in timerlat_print_summary()
405 data->hist[cpu].min_user, in timerlat_print_summary()
408 trace_seq_printf(trace->seq, "\n"); in timerlat_print_summary()
410 if (!params->no_index) in timerlat_print_summary()
411 trace_seq_printf(trace->seq, "avg: "); in timerlat_print_summary()
413 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_summary()
414 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_summary()
417 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_summary()
420 if (!params->no_irq) in timerlat_print_summary()
421 format_summary_value(trace->seq, in timerlat_print_summary()
422 data->hist[cpu].irq_count, in timerlat_print_summary()
423 data->hist[cpu].sum_irq, in timerlat_print_summary()
426 if (!params->no_thread) in timerlat_print_summary()
427 format_summary_value(trace->seq, in timerlat_print_summary()
428 data->hist[cpu].thread_count, in timerlat_print_summary()
429 data->hist[cpu].sum_thread, in timerlat_print_summary()
432 if (params->user_data) in timerlat_print_summary()
433 format_summary_value(trace->seq, in timerlat_print_summary()
434 data->hist[cpu].user_count, in timerlat_print_summary()
435 data->hist[cpu].sum_user, in timerlat_print_summary()
438 trace_seq_printf(trace->seq, "\n"); in timerlat_print_summary()
440 if (!params->no_index) in timerlat_print_summary()
441 trace_seq_printf(trace->seq, "max: "); in timerlat_print_summary()
443 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_summary()
444 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_summary()
447 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_summary()
450 if (!params->no_irq) in timerlat_print_summary()
451 format_summary_value(trace->seq, in timerlat_print_summary()
452 data->hist[cpu].irq_count, in timerlat_print_summary()
453 data->hist[cpu].max_irq, in timerlat_print_summary()
456 if (!params->no_thread) in timerlat_print_summary()
457 format_summary_value(trace->seq, in timerlat_print_summary()
458 data->hist[cpu].thread_count, in timerlat_print_summary()
459 data->hist[cpu].max_thread, in timerlat_print_summary()
462 if (params->user_data) in timerlat_print_summary()
463 format_summary_value(trace->seq, in timerlat_print_summary()
464 data->hist[cpu].user_count, in timerlat_print_summary()
465 data->hist[cpu].max_user, in timerlat_print_summary()
468 trace_seq_printf(trace->seq, "\n"); in timerlat_print_summary()
469 trace_seq_do_printf(trace->seq); in timerlat_print_summary()
470 trace_seq_reset(trace->seq); in timerlat_print_summary()
482 if (params->no_summary) in timerlat_print_stats_all()
490 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_stats_all()
491 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_stats_all()
494 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_stats_all()
497 cpu_data = &data->hist[cpu]; in timerlat_print_stats_all()
499 sum.irq_count += cpu_data->irq_count; in timerlat_print_stats_all()
500 update_min(&sum.min_irq, &cpu_data->min_irq); in timerlat_print_stats_all()
501 update_sum(&sum.sum_irq, &cpu_data->sum_irq); in timerlat_print_stats_all()
502 update_max(&sum.max_irq, &cpu_data->max_irq); in timerlat_print_stats_all()
504 sum.thread_count += cpu_data->thread_count; in timerlat_print_stats_all()
505 update_min(&sum.min_thread, &cpu_data->min_thread); in timerlat_print_stats_all()
506 update_sum(&sum.sum_thread, &cpu_data->sum_thread); in timerlat_print_stats_all()
507 update_max(&sum.max_thread, &cpu_data->max_thread); in timerlat_print_stats_all()
509 sum.user_count += cpu_data->user_count; in timerlat_print_stats_all()
510 update_min(&sum.min_user, &cpu_data->min_user); in timerlat_print_stats_all()
511 update_sum(&sum.sum_user, &cpu_data->sum_user); in timerlat_print_stats_all()
512 update_max(&sum.max_user, &cpu_data->max_user); in timerlat_print_stats_all()
515 if (!params->no_index) in timerlat_print_stats_all()
516 trace_seq_printf(trace->seq, "ALL: "); in timerlat_print_stats_all()
518 if (!params->no_irq) in timerlat_print_stats_all()
519 trace_seq_printf(trace->seq, " IRQ"); in timerlat_print_stats_all()
521 if (!params->no_thread) in timerlat_print_stats_all()
522 trace_seq_printf(trace->seq, " Thr"); in timerlat_print_stats_all()
524 if (params->user_data) in timerlat_print_stats_all()
525 trace_seq_printf(trace->seq, " Usr"); in timerlat_print_stats_all()
527 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats_all()
529 if (!params->no_index) in timerlat_print_stats_all()
530 trace_seq_printf(trace->seq, "count:"); in timerlat_print_stats_all()
532 if (!params->no_irq) in timerlat_print_stats_all()
533 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_stats_all()
536 if (!params->no_thread) in timerlat_print_stats_all()
537 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_stats_all()
540 if (params->user_data) in timerlat_print_stats_all()
541 trace_seq_printf(trace->seq, "%9llu ", in timerlat_print_stats_all()
544 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats_all()
546 if (!params->no_index) in timerlat_print_stats_all()
547 trace_seq_printf(trace->seq, "min: "); in timerlat_print_stats_all()
549 if (!params->no_irq) in timerlat_print_stats_all()
550 format_summary_value(trace->seq, in timerlat_print_stats_all()
555 if (!params->no_thread) in timerlat_print_stats_all()
556 format_summary_value(trace->seq, in timerlat_print_stats_all()
561 if (params->user_data) in timerlat_print_stats_all()
562 format_summary_value(trace->seq, in timerlat_print_stats_all()
567 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats_all()
569 if (!params->no_index) in timerlat_print_stats_all()
570 trace_seq_printf(trace->seq, "avg: "); in timerlat_print_stats_all()
572 if (!params->no_irq) in timerlat_print_stats_all()
573 format_summary_value(trace->seq, in timerlat_print_stats_all()
578 if (!params->no_thread) in timerlat_print_stats_all()
579 format_summary_value(trace->seq, in timerlat_print_stats_all()
584 if (params->user_data) in timerlat_print_stats_all()
585 format_summary_value(trace->seq, in timerlat_print_stats_all()
590 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats_all()
592 if (!params->no_index) in timerlat_print_stats_all()
593 trace_seq_printf(trace->seq, "max: "); in timerlat_print_stats_all()
595 if (!params->no_irq) in timerlat_print_stats_all()
596 format_summary_value(trace->seq, in timerlat_print_stats_all()
601 if (!params->no_thread) in timerlat_print_stats_all()
602 format_summary_value(trace->seq, in timerlat_print_stats_all()
607 if (params->user_data) in timerlat_print_stats_all()
608 format_summary_value(trace->seq, in timerlat_print_stats_all()
613 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats_all()
614 trace_seq_do_printf(trace->seq); in timerlat_print_stats_all()
615 trace_seq_reset(trace->seq); in timerlat_print_stats_all()
619 * timerlat_print_stats - print data for each CPUs
624 struct timerlat_hist_data *data = tool->data; in timerlat_print_stats()
625 struct trace_instance *trace = &tool->trace; in timerlat_print_stats()
631 for (bucket = 0; bucket < data->entries; bucket++) { in timerlat_print_stats()
634 if (!params->no_index) in timerlat_print_stats()
635 trace_seq_printf(trace->seq, "%-6d", in timerlat_print_stats()
636 bucket * data->bucket_size); in timerlat_print_stats()
638 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_stats()
639 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_stats()
642 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_stats()
645 if (!params->no_irq) { in timerlat_print_stats()
646 total += data->hist[cpu].irq[bucket]; in timerlat_print_stats()
647 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
648 data->hist[cpu].irq[bucket]); in timerlat_print_stats()
651 if (!params->no_thread) { in timerlat_print_stats()
652 total += data->hist[cpu].thread[bucket]; in timerlat_print_stats()
653 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
654 data->hist[cpu].thread[bucket]); in timerlat_print_stats()
657 if (params->user_data) { in timerlat_print_stats()
658 total += data->hist[cpu].user[bucket]; in timerlat_print_stats()
659 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
660 data->hist[cpu].user[bucket]); in timerlat_print_stats()
665 if (total == 0 && !params->with_zeros) { in timerlat_print_stats()
666 trace_seq_reset(trace->seq); in timerlat_print_stats()
670 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats()
671 trace_seq_do_printf(trace->seq); in timerlat_print_stats()
672 trace_seq_reset(trace->seq); in timerlat_print_stats()
675 if (!params->no_index) in timerlat_print_stats()
676 trace_seq_printf(trace->seq, "over: "); in timerlat_print_stats()
678 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in timerlat_print_stats()
679 if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus)) in timerlat_print_stats()
682 if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count) in timerlat_print_stats()
685 if (!params->no_irq) in timerlat_print_stats()
686 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
687 data->hist[cpu].irq[data->entries]); in timerlat_print_stats()
689 if (!params->no_thread) in timerlat_print_stats()
690 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
691 data->hist[cpu].thread[data->entries]); in timerlat_print_stats()
693 if (params->user_data) in timerlat_print_stats()
694 trace_seq_printf(trace->seq, "%9d ", in timerlat_print_stats()
695 data->hist[cpu].user[data->entries]); in timerlat_print_stats()
697 trace_seq_printf(trace->seq, "\n"); in timerlat_print_stats()
698 trace_seq_do_printf(trace->seq); in timerlat_print_stats()
699 trace_seq_reset(trace->seq); in timerlat_print_stats()
707 * timerlat_hist_usage - prints timerlat top usage message
715 …" usage: [rtla] timerlat hist [-h] [-q] [-d s] [-D] [-n] [-a us] [-p us] [-i us] [-T us] [-s us] … in timerlat_hist_usage()
716 …" [-t[file]] [-e sys[:event]] [--filter <filter>] [--trigger <trigger>] [-c cpu-list] [-H … in timerlat_hist_usage()
717 " [-P priority] [-E N] [-b N] [--no-irq] [--no-thread] [--no-header] [--no-summary] \\", in timerlat_hist_usage()
718 …" [--no-index] [--with-zeros] [--dma-latency us] [-C[=cgroup_name]] [--no-aa] [--dump-task] [-u| in timerlat_hist_usage()
719 " [--warm-up s] [--deepest-idle-state n]", in timerlat_hist_usage()
721 " -h/--help: print this menu", in timerlat_hist_usage()
722 " -a/--auto: set automatic trace mode, stopping the session if argument in us latency is hit", in timerlat_hist_usage()
723 " -p/--period us: timerlat period in us", in timerlat_hist_usage()
724 " -i/--irq us: stop trace if the irq latency is higher than the argument in us", in timerlat_hist_usage()
725 " -T/--thread us: stop trace if the thread latency is higher than the argument in us", in timerlat_hist_usage()
726 …" -s/--stack us: save the stack trace at the IRQ if a thread latency is higher than the argument… in timerlat_hist_usage()
727 " -c/--cpus cpus: run the tracer only on the given cpus", in timerlat_hist_usage()
728 " -H/--house-keeping cpus: run rtla control threads only on the given cpus", in timerlat_hist_usage()
729 …" -C/--cgroup[=cgroup_name]: set cgroup, if no cgroup_name is passed, the rtla's cgroup will be … in timerlat_hist_usage()
730 " -d/--duration time[m|h|d]: duration of the session in seconds", in timerlat_hist_usage()
731 …" --dump-tasks: prints the task running on all CPUs if stop conditions are met (depends on !-… in timerlat_hist_usage()
732 " -D/--debug: print debug info", in timerlat_hist_usage()
733 " -t/--trace[file]: save the stopped trace to [file|timerlat_trace.txt]", in timerlat_hist_usage()
734 …" -e/--event <sys:event>: enable the <sys:event> in the trace instance, multiple -e are allowed", in timerlat_hist_usage()
735 " --filter <filter>: enable a trace event filter to the previous -e event", in timerlat_hist_usage()
736 " --trigger <trigger>: enable a trace event trigger to the previous -e event", in timerlat_hist_usage()
737 " -n/--nano: display data in nanoseconds", in timerlat_hist_usage()
738 " --no-aa: disable auto-analysis, reducing rtla timerlat cpu usage", in timerlat_hist_usage()
739 " -b/--bucket-size N: set the histogram bucket size (default 1)", in timerlat_hist_usage()
740 " -E/--entries N: set the number of entries of the histogram (default 256)", in timerlat_hist_usage()
741 " --no-irq: ignore IRQ latencies", in timerlat_hist_usage()
742 " --no-thread: ignore thread latencies", in timerlat_hist_usage()
743 " --no-header: do not print header", in timerlat_hist_usage()
744 " --no-summary: do not print summary", in timerlat_hist_usage()
745 " --no-index: do not print index", in timerlat_hist_usage()
746 " --with-zeros: print zero only entries", in timerlat_hist_usage()
747 " --dma-latency us: set /dev/cpu_dma_latency latency <us> to reduce exit from idle latency", in timerlat_hist_usage()
748 " -P/--priority o:prio|r:prio|f:prio|d:runtime:period : set scheduling parameters", in timerlat_hist_usage()
749 " o:prio - use SCHED_OTHER with prio", in timerlat_hist_usage()
750 " r:prio - use SCHED_RR with prio", in timerlat_hist_usage()
751 " f:prio - use SCHED_FIFO with prio", in timerlat_hist_usage()
752 " d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period", in timerlat_hist_usage()
754 " -u/--user-threads: use rtla user-space threads instead of kernel-space timerlat threads", in timerlat_hist_usage()
755 " -k/--kernel-threads: use timerlat kernel-space threads instead of rtla user-space threads", in timerlat_hist_usage()
756 " -U/--user-load: enable timerlat for user-defined user-space workload", in timerlat_hist_usage()
757 " --warm-up s: let the workload run for s seconds before collecting data", in timerlat_hist_usage()
758 " --trace-buffer-size kB: set the per-cpu trace buffer size in kB", in timerlat_hist_usage()
759 …" --deepest-idle-state n: only go down to idle state n on cpus used by timerlat to reduce exi… in timerlat_hist_usage()
766 fprintf(stderr, "rtla timerlat hist: a per-cpu histogram of the timer latency (version %s)\n", in timerlat_hist_usage()
773 exit(EXIT_FAILURE); in timerlat_hist_usage()
775 exit(EXIT_SUCCESS); in timerlat_hist_usage()
779 * timerlat_hist_parse_args - allocs, parse and fill the cmd line parameters
792 exit(1); in timerlat_hist_parse_args()
795 params->dma_latency = -1; in timerlat_hist_parse_args()
798 params->deepest_idle_state = -2; in timerlat_hist_parse_args()
801 params->output_divisor = 1000; in timerlat_hist_parse_args()
802 params->bucket_size = 1; in timerlat_hist_parse_args()
803 params->entries = 256; in timerlat_hist_parse_args()
810 {"bucket-size", required_argument, 0, 'b'}, in timerlat_hist_parse_args()
814 {"house-keeping", required_argument, 0, 'H'}, in timerlat_hist_parse_args()
823 {"user-threads", no_argument, 0, 'u'}, in timerlat_hist_parse_args()
824 {"kernel-threads", no_argument, 0, 'k'}, in timerlat_hist_parse_args()
825 {"user-load", no_argument, 0, 'U'}, in timerlat_hist_parse_args()
827 {"no-irq", no_argument, 0, '0'}, in timerlat_hist_parse_args()
828 {"no-thread", no_argument, 0, '1'}, in timerlat_hist_parse_args()
829 {"no-header", no_argument, 0, '2'}, in timerlat_hist_parse_args()
830 {"no-summary", no_argument, 0, '3'}, in timerlat_hist_parse_args()
831 {"no-index", no_argument, 0, '4'}, in timerlat_hist_parse_args()
832 {"with-zeros", no_argument, 0, '5'}, in timerlat_hist_parse_args()
835 {"dma-latency", required_argument, 0, '8'}, in timerlat_hist_parse_args()
836 {"no-aa", no_argument, 0, '9'}, in timerlat_hist_parse_args()
837 {"dump-task", no_argument, 0, '\1'}, in timerlat_hist_parse_args()
838 {"warm-up", required_argument, 0, '\2'}, in timerlat_hist_parse_args()
839 {"trace-buffer-size", required_argument, 0, '\3'}, in timerlat_hist_parse_args()
840 {"deepest-idle-state", required_argument, 0, '\4'}, in timerlat_hist_parse_args()
851 if (c == -1) in timerlat_hist_parse_args()
859 params->stop_total_us = auto_thresh; in timerlat_hist_parse_args()
860 params->stop_us = auto_thresh; in timerlat_hist_parse_args()
863 params->print_stack = auto_thresh; in timerlat_hist_parse_args()
866 params->trace_output = "timerlat_trace.txt"; in timerlat_hist_parse_args()
870 retval = parse_cpu_set(optarg, &params->monitored_cpus); in timerlat_hist_parse_args()
872 timerlat_hist_usage("\nInvalid -c cpu list\n"); in timerlat_hist_parse_args()
873 params->cpus = optarg; in timerlat_hist_parse_args()
876 params->cgroup = 1; in timerlat_hist_parse_args()
879 params->cgroup_name = NULL; in timerlat_hist_parse_args()
882 params->cgroup_name = ++optarg; in timerlat_hist_parse_args()
886 params->bucket_size = get_llong_from_str(optarg); in timerlat_hist_parse_args()
887 if ((params->bucket_size == 0) || (params->bucket_size >= 1000000)) in timerlat_hist_parse_args()
894 params->duration = parse_seconds_duration(optarg); in timerlat_hist_parse_args()
895 if (!params->duration) in timerlat_hist_parse_args()
896 timerlat_hist_usage("Invalid -D duration\n"); in timerlat_hist_parse_args()
902 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
905 if (params->events) in timerlat_hist_parse_args()
906 tevent->next = params->events; in timerlat_hist_parse_args()
908 params->events = tevent; in timerlat_hist_parse_args()
911 params->entries = get_llong_from_str(optarg); in timerlat_hist_parse_args()
912 if ((params->entries < 10) || (params->entries > 9999999)) in timerlat_hist_parse_args()
920 params->hk_cpus = 1; in timerlat_hist_parse_args()
921 retval = parse_cpu_set(optarg, &params->hk_cpu_set); in timerlat_hist_parse_args()
924 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
928 params->stop_us = get_llong_from_str(optarg); in timerlat_hist_parse_args()
931 params->kernel_workload = 1; in timerlat_hist_parse_args()
934 params->output_divisor = 1; in timerlat_hist_parse_args()
937 params->timerlat_period_us = get_llong_from_str(optarg); in timerlat_hist_parse_args()
938 if (params->timerlat_period_us > 1000000) in timerlat_hist_parse_args()
942 retval = parse_prio(optarg, &params->sched_param); in timerlat_hist_parse_args()
943 if (retval == -1) in timerlat_hist_parse_args()
944 timerlat_hist_usage("Invalid -P priority"); in timerlat_hist_parse_args()
945 params->set_sched = 1; in timerlat_hist_parse_args()
948 params->print_stack = get_llong_from_str(optarg); in timerlat_hist_parse_args()
951 params->stop_total_us = get_llong_from_str(optarg); in timerlat_hist_parse_args()
956 params->trace_output = &optarg[1]; in timerlat_hist_parse_args()
958 params->trace_output = &optarg[0]; in timerlat_hist_parse_args()
959 } else if (optind < argc && argv[optind][0] != '-') in timerlat_hist_parse_args()
960 params->trace_output = argv[optind]; in timerlat_hist_parse_args()
962 params->trace_output = "timerlat_trace.txt"; in timerlat_hist_parse_args()
965 params->user_workload = 1; in timerlat_hist_parse_args()
966 /* fallback: -u implies in -U */ in timerlat_hist_parse_args()
968 params->user_data = 1; in timerlat_hist_parse_args()
971 params->no_irq = 1; in timerlat_hist_parse_args()
974 params->no_thread = 1; in timerlat_hist_parse_args()
977 params->no_header = 1; in timerlat_hist_parse_args()
980 params->no_summary = 1; in timerlat_hist_parse_args()
983 params->no_index = 1; in timerlat_hist_parse_args()
986 params->with_zeros = 1; in timerlat_hist_parse_args()
989 if (params->events) { in timerlat_hist_parse_args()
990 retval = trace_event_add_trigger(params->events, optarg); in timerlat_hist_parse_args()
993 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
996 timerlat_hist_usage("--trigger requires a previous -e\n"); in timerlat_hist_parse_args()
1000 if (params->events) { in timerlat_hist_parse_args()
1001 retval = trace_event_add_filter(params->events, optarg); in timerlat_hist_parse_args()
1004 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
1007 timerlat_hist_usage("--filter requires a previous -e\n"); in timerlat_hist_parse_args()
1011 params->dma_latency = get_llong_from_str(optarg); in timerlat_hist_parse_args()
1012 if (params->dma_latency < 0 || params->dma_latency > 10000) { in timerlat_hist_parse_args()
1013 err_msg("--dma-latency needs to be >= 0 and < 10000"); in timerlat_hist_parse_args()
1014 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
1018 params->no_aa = 1; in timerlat_hist_parse_args()
1021 params->dump_tasks = 1; in timerlat_hist_parse_args()
1024 params->warmup = get_llong_from_str(optarg); in timerlat_hist_parse_args()
1027 params->buffer_size = get_llong_from_str(optarg); in timerlat_hist_parse_args()
1030 params->deepest_idle_state = get_llong_from_str(optarg); in timerlat_hist_parse_args()
1039 exit(EXIT_FAILURE); in timerlat_hist_parse_args()
1042 if (params->no_irq && params->no_thread) in timerlat_hist_parse_args()
1043 timerlat_hist_usage("no-irq and no-thread set, there is nothing to do here"); in timerlat_hist_parse_args()
1045 if (params->no_index && !params->with_zeros) in timerlat_hist_parse_args()
1046 timerlat_hist_usage("no-index set with with-zeros is not set - it does not make sense"); in timerlat_hist_parse_args()
1051 if (!params->stop_us && !params->stop_total_us) in timerlat_hist_parse_args()
1052 params->no_aa = 1; in timerlat_hist_parse_args()
1054 if (params->kernel_workload && params->user_workload) in timerlat_hist_parse_args()
1055 timerlat_hist_usage("--kernel-threads and --user-threads are mutually exclusive!"); in timerlat_hist_parse_args()
1061 * timerlat_hist_apply_config - apply the hist configs to the initialized tool
1075 return -1; in timerlat_hist_apply_config()
1079 * timerlat_init_hist - initialize a timerlat hist tool with parameters
1093 tool->data = timerlat_alloc_histogram(nr_cpus, params->entries, params->bucket_size); in timerlat_init_hist()
1094 if (!tool->data) in timerlat_init_hist()
1097 tool->params = params; in timerlat_init_hist()
1099 tep_register_event_handler(tool->trace.tep, -1, "ftrace", "timerlat", in timerlat_init_hist()
1116 * exit immediately in stop_hist()
1118 tracefs_iterate_stop(hist_inst->inst); in stop_hist()
1127 * timerlat_hist_set_signals - handles the signal to stop the tool
1133 if (params->duration) { in timerlat_hist_set_signals()
1135 alarm(params->duration); in timerlat_hist_set_signals()
1147 int dma_latency_fd = -1; in timerlat_hist_main()
1156 exit(1); in timerlat_hist_main()
1170 trace = &tool->trace; in timerlat_hist_main()
1183 if (!no_bpf && !tep_find_event_by_name(trace->tep, "osnoise", "timerlat_sample")) { in timerlat_hist_main()
1202 if (params->set_sched) { in timerlat_hist_main()
1203 retval = set_comm_sched_attr("timerlat/", &params->sched_param); in timerlat_hist_main()
1210 if (params->cgroup && !params->user_workload) { in timerlat_hist_main()
1211 retval = set_comm_cgroup("timerlat/", params->cgroup_name); in timerlat_hist_main()
1218 if (params->dma_latency >= 0) { in timerlat_hist_main()
1219 dma_latency_fd = set_cpu_dma_latency(params->dma_latency); in timerlat_hist_main()
1226 if (params->deepest_idle_state >= -1) { in timerlat_hist_main()
1228 err_msg("rtla built without libcpupower, --deepest-idle-state is not supported\n"); in timerlat_hist_main()
1235 if (params->cpus && !CPU_ISSET(i, &params->monitored_cpus)) in timerlat_hist_main()
1241 if (set_deepest_cpu_idle_state(i, params->deepest_idle_state) < 0) { in timerlat_hist_main()
1248 if (params->trace_output) { in timerlat_hist_main()
1255 if (params->events) { in timerlat_hist_main()
1256 retval = trace_events_enable(&record->trace, params->events); in timerlat_hist_main()
1261 if (params->buffer_size > 0) { in timerlat_hist_main()
1262 retval = trace_set_buffer_size(&record->trace, params->buffer_size); in timerlat_hist_main()
1268 if (!params->no_aa) { in timerlat_hist_main()
1273 retval = timerlat_aa_init(aa, params->dump_tasks); in timerlat_hist_main()
1279 retval = enable_timerlat(&aa->trace); in timerlat_hist_main()
1286 if (params->user_workload) { in timerlat_hist_main()
1292 params_u.set = &params->monitored_cpus; in timerlat_hist_main()
1293 if (params->set_sched) in timerlat_hist_main()
1294 params_u.sched_param = &params->sched_param; in timerlat_hist_main()
1298 params_u.cgroup_name = params->cgroup_name; in timerlat_hist_main()
1302 err_msg("Error creating timerlat user-space threads\n"); in timerlat_hist_main()
1305 if (params->warmup > 0) { in timerlat_hist_main()
1306 debug_msg("Warming up for %d seconds\n", params->warmup); in timerlat_hist_main()
1307 sleep(params->warmup); in timerlat_hist_main()
1319 if (params->trace_output) in timerlat_hist_main()
1320 trace_instance_start(&record->trace); in timerlat_hist_main()
1321 if (!params->no_aa) in timerlat_hist_main()
1322 trace_instance_start(&aa->trace); in timerlat_hist_main()
1333 tool->start_time = time(NULL); in timerlat_hist_main()
1338 sleep(params->sleep_time); in timerlat_hist_main()
1340 retval = tracefs_iterate_raw_events(trace->tep, in timerlat_hist_main()
1341 trace->inst, in timerlat_hist_main()
1354 /* is there still any user-threads ? */ in timerlat_hist_main()
1355 if (params->user_workload) { in timerlat_hist_main()
1357 debug_msg("timerlat user-space threads stopped!\n"); in timerlat_hist_main()
1363 timerlat_bpf_wait(-1); in timerlat_hist_main()
1374 if (params->user_workload && !params_u.stopped_running) { in timerlat_hist_main()
1386 if (!params->no_aa) in timerlat_hist_main()
1387 timerlat_auto_analysis(params->stop_us, params->stop_total_us); in timerlat_hist_main()
1389 save_trace_to_file(record ? record->trace.inst : NULL, in timerlat_hist_main()
1390 params->trace_output); in timerlat_hist_main()
1397 if (params->deepest_idle_state >= -1) { in timerlat_hist_main()
1399 if (params->cpus && !CPU_ISSET(i, &params->monitored_cpus)) in timerlat_hist_main()
1404 trace_events_destroy(&record->trace, params->events); in timerlat_hist_main()
1405 params->events = NULL; in timerlat_hist_main()
1407 timerlat_free_histogram(tool->data); in timerlat_hist_main()
1416 exit(return_value); in timerlat_hist_main()