Lines Matching +full:up +full:- +full:samples
1 // SPDX-License-Identifier: GPL-2.0
19 int *samples; member
37 * osnoise_free_histogram - free runtime data
45 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_free_histogram()
46 if (data->hist[cpu].samples) in osnoise_free_histogram()
47 free(data->hist[cpu].samples); in osnoise_free_histogram()
51 if (data->hist) in osnoise_free_histogram()
52 free(data->hist); in osnoise_free_histogram()
58 * osnoise_alloc_histogram - alloc runtime data
70 data->entries = entries; in osnoise_alloc_histogram()
71 data->bucket_size = bucket_size; in osnoise_alloc_histogram()
72 data->nr_cpus = nr_cpus; in osnoise_alloc_histogram()
74 data->hist = calloc(1, sizeof(*data->hist) * nr_cpus); in osnoise_alloc_histogram()
75 if (!data->hist) in osnoise_alloc_histogram()
79 data->hist[cpu].samples = calloc(1, sizeof(*data->hist->samples) * (entries + 1)); in osnoise_alloc_histogram()
80 if (!data->hist[cpu].samples) in osnoise_alloc_histogram()
86 data->hist[cpu].min_sample = ~0; in osnoise_alloc_histogram()
98 struct osnoise_params *params = tool->params; in osnoise_hist_update_multiple()
99 struct osnoise_hist_data *data = tool->data; in osnoise_hist_update_multiple()
101 int entries = data->entries; in osnoise_hist_update_multiple()
105 if (params->output_divisor) in osnoise_hist_update_multiple()
106 duration = duration / params->output_divisor; in osnoise_hist_update_multiple()
108 bucket = duration / data->bucket_size; in osnoise_hist_update_multiple()
112 hist = data->hist[cpu].samples; in osnoise_hist_update_multiple()
113 data->hist[cpu].count += count; in osnoise_hist_update_multiple()
114 update_min(&data->hist[cpu].min_sample, &duration); in osnoise_hist_update_multiple()
115 update_sum(&data->hist[cpu].sum_sample, &total_duration); in osnoise_hist_update_multiple()
116 update_max(&data->hist[cpu].max_sample, &duration); in osnoise_hist_update_multiple()
125 * osnoise_destroy_trace_hist - disable events used to collect histogram
129 struct osnoise_hist_data *data = tool->data; in osnoise_destroy_trace_hist()
131 tracefs_hist_pause(tool->trace.inst, data->trace_hist); in osnoise_destroy_trace_hist()
132 tracefs_hist_destroy(tool->trace.inst, data->trace_hist); in osnoise_destroy_trace_hist()
136 * osnoise_init_trace_hist - enable events used to collect histogram
140 struct osnoise_params *params = tool->params; in osnoise_init_trace_hist()
141 struct osnoise_hist_data *data = tool->data; in osnoise_init_trace_hist()
149 bucket_size = params->output_divisor * params->bucket_size; in osnoise_init_trace_hist()
152 data->trace_hist = tracefs_hist_alloc(tool->trace.tep, "osnoise", "sample_threshold", in osnoise_init_trace_hist()
154 if (!data->trace_hist) in osnoise_init_trace_hist()
157 retval = tracefs_hist_add_key(data->trace_hist, "cpu", 0); in osnoise_init_trace_hist()
161 retval = tracefs_hist_start(tool->trace.inst, data->trace_hist); in osnoise_init_trace_hist()
173 * osnoise_read_trace_hist - parse histogram file and file osnoise histogram
177 struct osnoise_hist_data *data = tool->data; in osnoise_read_trace_hist()
181 tracefs_hist_pause(tool->trace.inst, data->trace_hist); in osnoise_read_trace_hist()
183 content = tracefs_event_file_read(tool->trace.inst, "osnoise", in osnoise_read_trace_hist()
196 if (duration == -1) in osnoise_read_trace_hist()
204 if (cpu == -1) in osnoise_read_trace_hist()
212 if (counter == -1) in osnoise_read_trace_hist()
221 * osnoise_hist_header - print the header of the tracer to the output
225 struct osnoise_params *params = tool->params; in osnoise_hist_header()
226 struct osnoise_hist_data *data = tool->data; in osnoise_hist_header()
227 struct trace_seq *s = tool->trace.seq; in osnoise_hist_header()
231 if (params->no_header) in osnoise_hist_header()
234 get_duration(tool->start_time, duration, sizeof(duration)); in osnoise_hist_header()
237 params->output_divisor == 1 ? "nanoseconds" : "microseconds", in osnoise_hist_header()
238 params->output_divisor == 1 ? "ns" : "us"); in osnoise_hist_header()
242 if (!params->no_index) in osnoise_hist_header()
245 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_hist_header()
246 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_hist_header()
249 if (!data->hist[cpu].count) in osnoise_hist_header()
252 trace_seq_printf(s, " CPU-%03d", cpu); in osnoise_hist_header()
261 * osnoise_print_summary - print the summary of the hist data to the output
270 if (params->no_summary) in osnoise_print_summary()
273 if (!params->no_index) in osnoise_print_summary()
274 trace_seq_printf(trace->seq, "count:"); in osnoise_print_summary()
276 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
277 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_summary()
280 if (!data->hist[cpu].count) in osnoise_print_summary()
283 trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].count); in osnoise_print_summary()
285 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
287 if (!params->no_index) in osnoise_print_summary()
288 trace_seq_printf(trace->seq, "min: "); in osnoise_print_summary()
290 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
291 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_summary()
294 if (!data->hist[cpu].count) in osnoise_print_summary()
297 trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].min_sample); in osnoise_print_summary()
300 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
302 if (!params->no_index) in osnoise_print_summary()
303 trace_seq_printf(trace->seq, "avg: "); in osnoise_print_summary()
305 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
306 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_summary()
309 if (!data->hist[cpu].count) in osnoise_print_summary()
312 if (data->hist[cpu].count) in osnoise_print_summary()
313 trace_seq_printf(trace->seq, "%9.2f ", in osnoise_print_summary()
314 ((double) data->hist[cpu].sum_sample) / data->hist[cpu].count); in osnoise_print_summary()
316 trace_seq_printf(trace->seq, " - "); in osnoise_print_summary()
318 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
320 if (!params->no_index) in osnoise_print_summary()
321 trace_seq_printf(trace->seq, "max: "); in osnoise_print_summary()
323 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
324 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_summary()
327 if (!data->hist[cpu].count) in osnoise_print_summary()
330 trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].max_sample); in osnoise_print_summary()
333 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
334 trace_seq_do_printf(trace->seq); in osnoise_print_summary()
335 trace_seq_reset(trace->seq); in osnoise_print_summary()
339 * osnoise_print_stats - print data for all CPUs
344 struct osnoise_hist_data *data = tool->data; in osnoise_print_stats()
345 struct trace_instance *trace = &tool->trace; in osnoise_print_stats()
352 for (bucket = 0; bucket < data->entries; bucket++) { in osnoise_print_stats()
355 if (!params->no_index) in osnoise_print_stats()
356 trace_seq_printf(trace->seq, "%-6d", in osnoise_print_stats()
357 bucket * data->bucket_size); in osnoise_print_stats()
359 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_stats()
360 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_stats()
363 if (!data->hist[cpu].count) in osnoise_print_stats()
366 total += data->hist[cpu].samples[bucket]; in osnoise_print_stats()
367 trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].samples[bucket]); in osnoise_print_stats()
370 if (total == 0 && !params->with_zeros) { in osnoise_print_stats()
371 trace_seq_reset(trace->seq); in osnoise_print_stats()
375 /* There are samples above the threshold */ in osnoise_print_stats()
377 trace_seq_printf(trace->seq, "\n"); in osnoise_print_stats()
378 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
379 trace_seq_reset(trace->seq); in osnoise_print_stats()
383 * If no samples were recorded, skip calculations, print zeroed statistics in osnoise_print_stats()
387 trace_seq_reset(trace->seq); in osnoise_print_stats()
388 trace_seq_printf(trace->seq, "over: 0\ncount: 0\nmin: 0\navg: 0\nmax: 0\n"); in osnoise_print_stats()
389 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
390 trace_seq_reset(trace->seq); in osnoise_print_stats()
394 if (!params->no_index) in osnoise_print_stats()
395 trace_seq_printf(trace->seq, "over: "); in osnoise_print_stats()
397 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_stats()
398 if (params->cpus && !CPU_ISSET(cpu, ¶ms->monitored_cpus)) in osnoise_print_stats()
401 if (!data->hist[cpu].count) in osnoise_print_stats()
404 trace_seq_printf(trace->seq, "%9d ", in osnoise_print_stats()
405 data->hist[cpu].samples[data->entries]); in osnoise_print_stats()
407 trace_seq_printf(trace->seq, "\n"); in osnoise_print_stats()
408 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
409 trace_seq_reset(trace->seq); in osnoise_print_stats()
416 * osnoise_hist_usage - prints osnoise hist usage message
424 " usage: rtla osnoise hist [-h] [-D] [-d s] [-a us] [-p us] [-r us] [-s us] [-S us] \\", in osnoise_hist_usage()
425 " [-T us] [-t[file]] [-e sys[:event]] [--filter <filter>] [--trigger <trigger>] \\", in osnoise_hist_usage()
426 " [-c cpu-list] [-H cpu-list] [-P priority] [-b N] [-E N] [--no-header] [--no-summary] \\", in osnoise_hist_usage()
427 " [--no-index] [--with-zeros] [-C[=cgroup_name]] [--warm-up]", in osnoise_hist_usage()
429 " -h/--help: print this menu", in osnoise_hist_usage()
430 " -a/--auto: set automatic trace mode, stopping the session if argument in us sample is hit", in osnoise_hist_usage()
431 " -p/--period us: osnoise period in us", in osnoise_hist_usage()
432 " -r/--runtime us: osnoise runtime in us", in osnoise_hist_usage()
433 " -s/--stop us: stop trace if a single sample is higher than the argument in us", in osnoise_hist_usage()
434 " -S/--stop-total us: stop trace if the total sample is higher than the argument in us", in osnoise_hist_usage()
435 " -T/--threshold us: the minimum delta to be considered a noise", in osnoise_hist_usage()
436 " -c/--cpus cpu-list: list of cpus to run osnoise threads", in osnoise_hist_usage()
437 " -H/--house-keeping cpus: run rtla control threads only on the given cpus", in osnoise_hist_usage()
438 …" -C/--cgroup[=cgroup_name]: set cgroup, if no cgroup_name is passed, the rtla's cgroup will be … in osnoise_hist_usage()
439 " -d/--duration time[s|m|h|d]: duration of the session", in osnoise_hist_usage()
440 " -D/--debug: print debug info", in osnoise_hist_usage()
441 " -t/--trace[file]: save the stopped trace to [file|osnoise_trace.txt]", in osnoise_hist_usage()
442 …" -e/--event <sys:event>: enable the <sys:event> in the trace instance, multiple -e are allowed", in osnoise_hist_usage()
443 " --filter <filter>: enable a trace event filter to the previous -e event", in osnoise_hist_usage()
444 " --trigger <trigger>: enable a trace event trigger to the previous -e event", in osnoise_hist_usage()
445 " -b/--bucket-size N: set the histogram bucket size (default 1)", in osnoise_hist_usage()
446 " -E/--entries N: set the number of entries of the histogram (default 256)", in osnoise_hist_usage()
447 " --no-header: do not print header", in osnoise_hist_usage()
448 " --no-summary: do not print summary", in osnoise_hist_usage()
449 " --no-index: do not print index", in osnoise_hist_usage()
450 " --with-zeros: print zero only entries", in osnoise_hist_usage()
451 " -P/--priority o:prio|r:prio|f:prio|d:runtime:period: set scheduling parameters", in osnoise_hist_usage()
452 " o:prio - use SCHED_OTHER with prio", in osnoise_hist_usage()
453 " r:prio - use SCHED_RR with prio", in osnoise_hist_usage()
454 " f:prio - use SCHED_FIFO with prio", in osnoise_hist_usage()
455 " d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period", in osnoise_hist_usage()
457 " --warm-up: let the workload run for s seconds before collecting data", in osnoise_hist_usage()
458 " --trace-buffer-size kB: set the per-cpu trace buffer size in kB", in osnoise_hist_usage()
465 fprintf(stderr, "rtla osnoise hist: a per-cpu histogram of the OS noise (version %s)\n", in osnoise_hist_usage()
478 * osnoise_hist_parse_args - allocs, parse and fill the cmd line parameters
493 params->output_divisor = 1000; in osnoise_hist_parse_args()
494 params->bucket_size = 1; in osnoise_hist_parse_args()
495 params->entries = 256; in osnoise_hist_parse_args()
500 {"bucket-size", required_argument, 0, 'b'}, in osnoise_hist_parse_args()
506 {"house-keeping", required_argument, 0, 'H'}, in osnoise_hist_parse_args()
512 {"stop-total", required_argument, 0, 'S'}, in osnoise_hist_parse_args()
516 {"no-header", no_argument, 0, '0'}, in osnoise_hist_parse_args()
517 {"no-summary", no_argument, 0, '1'}, in osnoise_hist_parse_args()
518 {"no-index", no_argument, 0, '2'}, in osnoise_hist_parse_args()
519 {"with-zeros", no_argument, 0, '3'}, in osnoise_hist_parse_args()
522 {"warm-up", required_argument, 0, '6'}, in osnoise_hist_parse_args()
523 {"trace-buffer-size", required_argument, 0, '7'}, in osnoise_hist_parse_args()
534 if (c == -1) in osnoise_hist_parse_args()
540 params->stop_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
543 params->threshold = 1; in osnoise_hist_parse_args()
546 params->trace_output = "osnoise_trace.txt"; in osnoise_hist_parse_args()
550 params->bucket_size = get_llong_from_str(optarg); in osnoise_hist_parse_args()
551 if ((params->bucket_size == 0) || (params->bucket_size >= 1000000)) in osnoise_hist_parse_args()
555 retval = parse_cpu_set(optarg, ¶ms->monitored_cpus); in osnoise_hist_parse_args()
557 osnoise_hist_usage("\nInvalid -c cpu list\n"); in osnoise_hist_parse_args()
558 params->cpus = optarg; in osnoise_hist_parse_args()
561 params->cgroup = 1; in osnoise_hist_parse_args()
564 params->cgroup_name = NULL; in osnoise_hist_parse_args()
567 params->cgroup_name = ++optarg; in osnoise_hist_parse_args()
574 params->duration = parse_seconds_duration(optarg); in osnoise_hist_parse_args()
575 if (!params->duration) in osnoise_hist_parse_args()
576 osnoise_hist_usage("Invalid -D duration\n"); in osnoise_hist_parse_args()
585 if (params->events) in osnoise_hist_parse_args()
586 tevent->next = params->events; in osnoise_hist_parse_args()
588 params->events = tevent; in osnoise_hist_parse_args()
591 params->entries = get_llong_from_str(optarg); in osnoise_hist_parse_args()
592 if ((params->entries < 10) || (params->entries > 9999999)) in osnoise_hist_parse_args()
600 params->hk_cpus = 1; in osnoise_hist_parse_args()
601 retval = parse_cpu_set(optarg, ¶ms->hk_cpu_set); in osnoise_hist_parse_args()
608 params->period = get_llong_from_str(optarg); in osnoise_hist_parse_args()
609 if (params->period > 10000000) in osnoise_hist_parse_args()
613 retval = parse_prio(optarg, ¶ms->sched_param); in osnoise_hist_parse_args()
614 if (retval == -1) in osnoise_hist_parse_args()
615 osnoise_hist_usage("Invalid -P priority"); in osnoise_hist_parse_args()
616 params->set_sched = 1; in osnoise_hist_parse_args()
619 params->runtime = get_llong_from_str(optarg); in osnoise_hist_parse_args()
620 if (params->runtime < 100) in osnoise_hist_parse_args()
624 params->stop_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
627 params->stop_total_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
630 params->threshold = get_llong_from_str(optarg); in osnoise_hist_parse_args()
635 params->trace_output = &optarg[1]; in osnoise_hist_parse_args()
637 params->trace_output = &optarg[0]; in osnoise_hist_parse_args()
639 params->trace_output = argv[optind]; in osnoise_hist_parse_args()
641 params->trace_output = "osnoise_trace.txt"; in osnoise_hist_parse_args()
644 params->no_header = 1; in osnoise_hist_parse_args()
647 params->no_summary = 1; in osnoise_hist_parse_args()
650 params->no_index = 1; in osnoise_hist_parse_args()
653 params->with_zeros = 1; in osnoise_hist_parse_args()
656 if (params->events) { in osnoise_hist_parse_args()
657 retval = trace_event_add_trigger(params->events, optarg); in osnoise_hist_parse_args()
663 osnoise_hist_usage("--trigger requires a previous -e\n"); in osnoise_hist_parse_args()
667 if (params->events) { in osnoise_hist_parse_args()
668 retval = trace_event_add_filter(params->events, optarg); in osnoise_hist_parse_args()
674 osnoise_hist_usage("--filter requires a previous -e\n"); in osnoise_hist_parse_args()
678 params->warmup = get_llong_from_str(optarg); in osnoise_hist_parse_args()
681 params->buffer_size = get_llong_from_str(optarg); in osnoise_hist_parse_args()
693 if (params->no_index && !params->with_zeros) in osnoise_hist_parse_args()
694 osnoise_hist_usage("no-index set and with-zeros not set - it does not make sense"); in osnoise_hist_parse_args()
700 * osnoise_hist_apply_config - apply the hist configs to the initialized tool
714 return -1; in osnoise_hist_apply_config()
718 * osnoise_init_hist - initialize a osnoise hist tool with parameters
732 tool->data = osnoise_alloc_histogram(nr_cpus, params->entries, params->bucket_size); in osnoise_init_hist()
733 if (!tool->data) in osnoise_init_hist()
736 tool->params = params; in osnoise_init_hist()
752 * osnoise_hist_set_signals - handles the signal to stop the tool
758 if (params->duration) { in osnoise_hist_set_signals()
760 alarm(params->duration); in osnoise_hist_set_signals()
789 trace = &tool->trace; in osnoise_hist_main()
801 if (params->set_sched) { in osnoise_hist_main()
802 retval = set_comm_sched_attr("osnoise/", ¶ms->sched_param); in osnoise_hist_main()
809 if (params->cgroup) { in osnoise_hist_main()
810 retval = set_comm_cgroup("timerlat/", params->cgroup_name); in osnoise_hist_main()
817 if (params->trace_output) { in osnoise_hist_main()
824 if (params->events) { in osnoise_hist_main()
825 retval = trace_events_enable(&record->trace, params->events); in osnoise_hist_main()
830 if (params->buffer_size > 0) { in osnoise_hist_main()
831 retval = trace_set_buffer_size(&record->trace, params->buffer_size); in osnoise_hist_main()
844 if (params->trace_output) in osnoise_hist_main()
845 trace_instance_start(&record->trace); in osnoise_hist_main()
848 if (params->warmup > 0) { in osnoise_hist_main()
849 debug_msg("Warming up for %d seconds\n", params->warmup); in osnoise_hist_main()
850 sleep(params->warmup); in osnoise_hist_main()
855 * Clean up the buffer. The osnoise workload do not run in osnoise_hist_main()
859 retval = tracefs_instance_file_write(trace->inst, "trace", ""); in osnoise_hist_main()
861 debug_msg("Error cleaning up the buffer"); in osnoise_hist_main()
867 tool->start_time = time(NULL); in osnoise_hist_main()
871 sleep(params->sleep_time); in osnoise_hist_main()
873 retval = tracefs_iterate_raw_events(trace->tep, in osnoise_hist_main()
874 trace->inst, in osnoise_hist_main()
896 save_trace_to_file(record ? record->trace.inst : NULL, in osnoise_hist_main()
897 params->trace_output); in osnoise_hist_main()
901 trace_events_destroy(&record->trace, params->events); in osnoise_hist_main()
902 params->events = NULL; in osnoise_hist_main()
904 osnoise_free_histogram(tool->data); in osnoise_hist_main()