Lines Matching +full:higher +full:- +full:than +full:- +full:threshold
1 // SPDX-License-Identifier: GPL-2.0
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()
59 osnoise_free_histogram(tool->data); in osnoise_free_hist_tool()
63 * osnoise_alloc_histogram - alloc runtime data
75 data->entries = entries; in osnoise_alloc_histogram()
76 data->bucket_size = bucket_size; in osnoise_alloc_histogram()
77 data->nr_cpus = nr_cpus; in osnoise_alloc_histogram()
79 data->hist = calloc(1, sizeof(*data->hist) * nr_cpus); in osnoise_alloc_histogram()
80 if (!data->hist) in osnoise_alloc_histogram()
84 data->hist[cpu].samples = calloc(1, sizeof(*data->hist->samples) * (entries + 1)); in osnoise_alloc_histogram()
85 if (!data->hist[cpu].samples) in osnoise_alloc_histogram()
91 data->hist[cpu].min_sample = ~0; in osnoise_alloc_histogram()
103 struct osnoise_params *params = to_osnoise_params(tool->params); in osnoise_hist_update_multiple()
104 struct osnoise_hist_data *data = tool->data; in osnoise_hist_update_multiple()
106 int entries = data->entries; in osnoise_hist_update_multiple()
110 if (params->common.output_divisor) in osnoise_hist_update_multiple()
111 duration = duration / params->common.output_divisor; in osnoise_hist_update_multiple()
113 bucket = duration / data->bucket_size; in osnoise_hist_update_multiple()
117 hist = data->hist[cpu].samples; in osnoise_hist_update_multiple()
118 data->hist[cpu].count += count; in osnoise_hist_update_multiple()
119 update_min(&data->hist[cpu].min_sample, &duration); in osnoise_hist_update_multiple()
120 update_sum(&data->hist[cpu].sum_sample, &total_duration); in osnoise_hist_update_multiple()
121 update_max(&data->hist[cpu].max_sample, &duration); in osnoise_hist_update_multiple()
130 * osnoise_destroy_trace_hist - disable events used to collect histogram
134 struct osnoise_hist_data *data = tool->data; in osnoise_destroy_trace_hist()
136 tracefs_hist_pause(tool->trace.inst, data->trace_hist); in osnoise_destroy_trace_hist()
137 tracefs_hist_destroy(tool->trace.inst, data->trace_hist); in osnoise_destroy_trace_hist()
141 * osnoise_init_trace_hist - enable events used to collect histogram
145 struct osnoise_params *params = to_osnoise_params(tool->params); in osnoise_init_trace_hist()
146 struct osnoise_hist_data *data = tool->data; in osnoise_init_trace_hist()
154 bucket_size = params->common.output_divisor * params->common.hist.bucket_size; in osnoise_init_trace_hist()
157 data->trace_hist = tracefs_hist_alloc(tool->trace.tep, "osnoise", "sample_threshold", in osnoise_init_trace_hist()
159 if (!data->trace_hist) in osnoise_init_trace_hist()
162 retval = tracefs_hist_add_key(data->trace_hist, "cpu", 0); in osnoise_init_trace_hist()
166 retval = tracefs_hist_start(tool->trace.inst, data->trace_hist); in osnoise_init_trace_hist()
178 * osnoise_read_trace_hist - parse histogram file and file osnoise histogram
182 struct osnoise_hist_data *data = tool->data; in osnoise_read_trace_hist()
186 tracefs_hist_pause(tool->trace.inst, data->trace_hist); in osnoise_read_trace_hist()
188 content = tracefs_event_file_read(tool->trace.inst, "osnoise", in osnoise_read_trace_hist()
201 if (duration == -1) in osnoise_read_trace_hist()
209 if (cpu == -1) in osnoise_read_trace_hist()
217 if (counter == -1) in osnoise_read_trace_hist()
226 * osnoise_hist_header - print the header of the tracer to the output
230 struct osnoise_params *params = to_osnoise_params(tool->params); in osnoise_hist_header()
231 struct osnoise_hist_data *data = tool->data; in osnoise_hist_header()
232 struct trace_seq *s = tool->trace.seq; in osnoise_hist_header()
236 if (params->common.hist.no_header) in osnoise_hist_header()
239 get_duration(tool->start_time, duration, sizeof(duration)); in osnoise_hist_header()
242 params->common.output_divisor == 1 ? "nanoseconds" : "microseconds", in osnoise_hist_header()
243 params->common.output_divisor == 1 ? "ns" : "us"); in osnoise_hist_header()
247 if (!params->common.hist.no_index) in osnoise_hist_header()
250 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_hist_header()
251 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_hist_header()
254 if (!data->hist[cpu].count) in osnoise_hist_header()
257 trace_seq_printf(s, " CPU-%03d", cpu); in osnoise_hist_header()
266 * osnoise_print_summary - print the summary of the hist data to the output
275 if (params->common.hist.no_summary) in osnoise_print_summary()
278 if (!params->common.hist.no_index) in osnoise_print_summary()
279 trace_seq_printf(trace->seq, "count:"); in osnoise_print_summary()
281 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
282 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_summary()
285 if (!data->hist[cpu].count) in osnoise_print_summary()
288 trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].count); in osnoise_print_summary()
290 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
292 if (!params->common.hist.no_index) in osnoise_print_summary()
293 trace_seq_printf(trace->seq, "min: "); in osnoise_print_summary()
295 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
296 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_summary()
299 if (!data->hist[cpu].count) in osnoise_print_summary()
302 trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].min_sample); in osnoise_print_summary()
305 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
307 if (!params->common.hist.no_index) in osnoise_print_summary()
308 trace_seq_printf(trace->seq, "avg: "); in osnoise_print_summary()
310 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
311 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_summary()
314 if (!data->hist[cpu].count) in osnoise_print_summary()
317 if (data->hist[cpu].count) in osnoise_print_summary()
318 trace_seq_printf(trace->seq, "%9.2f ", in osnoise_print_summary()
319 ((double) data->hist[cpu].sum_sample) / data->hist[cpu].count); in osnoise_print_summary()
321 trace_seq_printf(trace->seq, " - "); in osnoise_print_summary()
323 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
325 if (!params->common.hist.no_index) in osnoise_print_summary()
326 trace_seq_printf(trace->seq, "max: "); in osnoise_print_summary()
328 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_summary()
329 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_summary()
332 if (!data->hist[cpu].count) in osnoise_print_summary()
335 trace_seq_printf(trace->seq, "%9llu ", data->hist[cpu].max_sample); in osnoise_print_summary()
338 trace_seq_printf(trace->seq, "\n"); in osnoise_print_summary()
339 trace_seq_do_printf(trace->seq); in osnoise_print_summary()
340 trace_seq_reset(trace->seq); in osnoise_print_summary()
344 * osnoise_print_stats - print data for all CPUs
349 struct osnoise_params *params = to_osnoise_params(tool->params); in osnoise_print_stats()
350 struct osnoise_hist_data *data = tool->data; in osnoise_print_stats()
351 struct trace_instance *trace = &tool->trace; in osnoise_print_stats()
358 for (bucket = 0; bucket < data->entries; bucket++) { in osnoise_print_stats()
361 if (!params->common.hist.no_index) in osnoise_print_stats()
362 trace_seq_printf(trace->seq, "%-6d", in osnoise_print_stats()
363 bucket * data->bucket_size); in osnoise_print_stats()
365 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_stats()
366 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_stats()
369 if (!data->hist[cpu].count) in osnoise_print_stats()
372 total += data->hist[cpu].samples[bucket]; in osnoise_print_stats()
373 trace_seq_printf(trace->seq, "%9d ", data->hist[cpu].samples[bucket]); in osnoise_print_stats()
376 if (total == 0 && !params->common.hist.with_zeros) { in osnoise_print_stats()
377 trace_seq_reset(trace->seq); in osnoise_print_stats()
381 /* There are samples above the threshold */ in osnoise_print_stats()
383 trace_seq_printf(trace->seq, "\n"); in osnoise_print_stats()
384 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
385 trace_seq_reset(trace->seq); in osnoise_print_stats()
393 trace_seq_reset(trace->seq); in osnoise_print_stats()
394 trace_seq_printf(trace->seq, "over: 0\ncount: 0\nmin: 0\navg: 0\nmax: 0\n"); in osnoise_print_stats()
395 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
396 trace_seq_reset(trace->seq); in osnoise_print_stats()
400 if (!params->common.hist.no_index) in osnoise_print_stats()
401 trace_seq_printf(trace->seq, "over: "); in osnoise_print_stats()
403 for (cpu = 0; cpu < data->nr_cpus; cpu++) { in osnoise_print_stats()
404 if (params->common.cpus && !CPU_ISSET(cpu, ¶ms->common.monitored_cpus)) in osnoise_print_stats()
407 if (!data->hist[cpu].count) in osnoise_print_stats()
410 trace_seq_printf(trace->seq, "%9d ", in osnoise_print_stats()
411 data->hist[cpu].samples[data->entries]); in osnoise_print_stats()
413 trace_seq_printf(trace->seq, "\n"); in osnoise_print_stats()
414 trace_seq_do_printf(trace->seq); in osnoise_print_stats()
415 trace_seq_reset(trace->seq); in osnoise_print_stats()
422 * osnoise_hist_usage - prints osnoise hist usage message
430 " usage: rtla osnoise hist [-h] [-D] [-d s] [-a us] [-p us] [-r us] [-s us] [-S us] \\", in osnoise_hist_usage()
431 " [-T us] [-t[file]] [-e sys[:event]] [--filter <filter>] [--trigger <trigger>] \\", in osnoise_hist_usage()
432 " [-c cpu-list] [-H cpu-list] [-P priority] [-b N] [-E N] [--no-header] [--no-summary] \\", in osnoise_hist_usage()
433 " [--no-index] [--with-zeros] [-C[=cgroup_name]] [--warm-up]", in osnoise_hist_usage()
435 " -h/--help: print this menu", in osnoise_hist_usage()
436 " -a/--auto: set automatic trace mode, stopping the session if argument in us sample is hit", in osnoise_hist_usage()
437 " -p/--period us: osnoise period in us", in osnoise_hist_usage()
438 " -r/--runtime us: osnoise runtime in us", in osnoise_hist_usage()
439 " -s/--stop us: stop trace if a single sample is higher than the argument in us", in osnoise_hist_usage()
440 " -S/--stop-total us: stop trace if the total sample is higher than the argument in us", in osnoise_hist_usage()
441 " -T/--threshold us: the minimum delta to be considered a noise", in osnoise_hist_usage()
442 " -c/--cpus cpu-list: list of cpus to run osnoise threads", in osnoise_hist_usage()
443 " -H/--house-keeping cpus: run rtla control threads only on the given cpus", in osnoise_hist_usage()
444 …" -C/--cgroup[=cgroup_name]: set cgroup, if no cgroup_name is passed, the rtla's cgroup will be … in osnoise_hist_usage()
445 " -d/--duration time[s|m|h|d]: duration of the session", in osnoise_hist_usage()
446 " -D/--debug: print debug info", in osnoise_hist_usage()
447 " -t/--trace[file]: save the stopped trace to [file|osnoise_trace.txt]", in osnoise_hist_usage()
448 …" -e/--event <sys:event>: enable the <sys:event> in the trace instance, multiple -e are allowed", in osnoise_hist_usage()
449 " --filter <filter>: enable a trace event filter to the previous -e event", in osnoise_hist_usage()
450 " --trigger <trigger>: enable a trace event trigger to the previous -e event", in osnoise_hist_usage()
451 " -b/--bucket-size N: set the histogram bucket size (default 1)", in osnoise_hist_usage()
452 " -E/--entries N: set the number of entries of the histogram (default 256)", in osnoise_hist_usage()
453 " --no-header: do not print header", in osnoise_hist_usage()
454 " --no-summary: do not print summary", in osnoise_hist_usage()
455 " --no-index: do not print index", in osnoise_hist_usage()
456 " --with-zeros: print zero only entries", in osnoise_hist_usage()
457 " -P/--priority o:prio|r:prio|f:prio|d:runtime:period: set scheduling parameters", in osnoise_hist_usage()
458 " o:prio - use SCHED_OTHER with prio", in osnoise_hist_usage()
459 " r:prio - use SCHED_RR with prio", in osnoise_hist_usage()
460 " f:prio - use SCHED_FIFO with prio", in osnoise_hist_usage()
461 " d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period", in osnoise_hist_usage()
463 " --warm-up: let the workload run for s seconds before collecting data", in osnoise_hist_usage()
464 " --trace-buffer-size kB: set the per-cpu trace buffer size in kB", in osnoise_hist_usage()
465 …" --on-threshold <action>: define action to be executed at stop-total threshold, multiple are… in osnoise_hist_usage()
466 " --on-end <action>: define action to be executed at measurement end, multiple are allowed", in osnoise_hist_usage()
473 fprintf(stderr, "rtla osnoise hist: a per-cpu histogram of the OS noise (version %s)\n", in osnoise_hist_usage()
486 * osnoise_hist_parse_args - allocs, parse and fill the cmd line parameters
501 actions_init(¶ms->common.threshold_actions); in osnoise_hist_parse_args()
502 actions_init(¶ms->common.end_actions); in osnoise_hist_parse_args()
505 params->common.output_divisor = 1000; in osnoise_hist_parse_args()
506 params->common.hist.bucket_size = 1; in osnoise_hist_parse_args()
507 params->common.hist.entries = 256; in osnoise_hist_parse_args()
512 {"bucket-size", required_argument, 0, 'b'}, in osnoise_hist_parse_args()
518 {"house-keeping", required_argument, 0, 'H'}, in osnoise_hist_parse_args()
524 {"stop-total", required_argument, 0, 'S'}, in osnoise_hist_parse_args()
527 {"threshold", required_argument, 0, 'T'}, in osnoise_hist_parse_args()
528 {"no-header", no_argument, 0, '0'}, in osnoise_hist_parse_args()
529 {"no-summary", no_argument, 0, '1'}, in osnoise_hist_parse_args()
530 {"no-index", no_argument, 0, '2'}, in osnoise_hist_parse_args()
531 {"with-zeros", no_argument, 0, '3'}, in osnoise_hist_parse_args()
534 {"warm-up", required_argument, 0, '6'}, in osnoise_hist_parse_args()
535 {"trace-buffer-size", required_argument, 0, '7'}, in osnoise_hist_parse_args()
536 {"on-threshold", required_argument, 0, '8'}, in osnoise_hist_parse_args()
537 {"on-end", required_argument, 0, '9'}, in osnoise_hist_parse_args()
548 if (c == -1) in osnoise_hist_parse_args()
554 params->common.stop_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
556 /* set sample threshold to 1 */ in osnoise_hist_parse_args()
557 params->threshold = 1; in osnoise_hist_parse_args()
564 params->common.hist.bucket_size = get_llong_from_str(optarg); in osnoise_hist_parse_args()
565 if (params->common.hist.bucket_size == 0 || in osnoise_hist_parse_args()
566 params->common.hist.bucket_size >= 1000000) in osnoise_hist_parse_args()
570 retval = parse_cpu_set(optarg, ¶ms->common.monitored_cpus); in osnoise_hist_parse_args()
572 osnoise_hist_usage("\nInvalid -c cpu list\n"); in osnoise_hist_parse_args()
573 params->common.cpus = optarg; in osnoise_hist_parse_args()
576 params->common.cgroup = 1; in osnoise_hist_parse_args()
579 params->common.cgroup_name = NULL; in osnoise_hist_parse_args()
582 params->common.cgroup_name = ++optarg; in osnoise_hist_parse_args()
589 params->common.duration = parse_seconds_duration(optarg); in osnoise_hist_parse_args()
590 if (!params->common.duration) in osnoise_hist_parse_args()
591 osnoise_hist_usage("Invalid -D duration\n"); in osnoise_hist_parse_args()
600 if (params->common.events) in osnoise_hist_parse_args()
601 tevent->next = params->common.events; in osnoise_hist_parse_args()
603 params->common.events = tevent; in osnoise_hist_parse_args()
606 params->common.hist.entries = get_llong_from_str(optarg); in osnoise_hist_parse_args()
607 if (params->common.hist.entries < 10 || in osnoise_hist_parse_args()
608 params->common.hist.entries > 9999999) in osnoise_hist_parse_args()
616 params->common.hk_cpus = 1; in osnoise_hist_parse_args()
617 retval = parse_cpu_set(optarg, ¶ms->common.hk_cpu_set); in osnoise_hist_parse_args()
624 params->period = get_llong_from_str(optarg); in osnoise_hist_parse_args()
625 if (params->period > 10000000) in osnoise_hist_parse_args()
626 osnoise_hist_usage("Period longer than 10 s\n"); in osnoise_hist_parse_args()
629 retval = parse_prio(optarg, ¶ms->common.sched_param); in osnoise_hist_parse_args()
630 if (retval == -1) in osnoise_hist_parse_args()
631 osnoise_hist_usage("Invalid -P priority"); in osnoise_hist_parse_args()
632 params->common.set_sched = 1; in osnoise_hist_parse_args()
635 params->runtime = get_llong_from_str(optarg); in osnoise_hist_parse_args()
636 if (params->runtime < 100) in osnoise_hist_parse_args()
637 osnoise_hist_usage("Runtime shorter than 100 us\n"); in osnoise_hist_parse_args()
640 params->common.stop_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
643 params->common.stop_total_us = get_llong_from_str(optarg); in osnoise_hist_parse_args()
646 params->threshold = get_llong_from_str(optarg); in osnoise_hist_parse_args()
660 params->common.hist.no_header = 1; in osnoise_hist_parse_args()
663 params->common.hist.no_summary = 1; in osnoise_hist_parse_args()
666 params->common.hist.no_index = 1; in osnoise_hist_parse_args()
669 params->common.hist.with_zeros = 1; in osnoise_hist_parse_args()
672 if (params->common.events) { in osnoise_hist_parse_args()
673 retval = trace_event_add_trigger(params->common.events, optarg); in osnoise_hist_parse_args()
679 osnoise_hist_usage("--trigger requires a previous -e\n"); in osnoise_hist_parse_args()
683 if (params->common.events) { in osnoise_hist_parse_args()
684 retval = trace_event_add_filter(params->common.events, optarg); in osnoise_hist_parse_args()
690 osnoise_hist_usage("--filter requires a previous -e\n"); in osnoise_hist_parse_args()
694 params->common.warmup = get_llong_from_str(optarg); in osnoise_hist_parse_args()
697 params->common.buffer_size = get_llong_from_str(optarg); in osnoise_hist_parse_args()
700 retval = actions_parse(¶ms->common.threshold_actions, optarg, in osnoise_hist_parse_args()
708 retval = actions_parse(¶ms->common.end_actions, optarg, in osnoise_hist_parse_args()
721 actions_add_trace_output(¶ms->common.threshold_actions, trace_output); in osnoise_hist_parse_args()
728 if (params->common.hist.no_index && !params->common.hist.with_zeros) in osnoise_hist_parse_args()
729 osnoise_hist_usage("no-index set and with-zeros not set - it does not make sense"); in osnoise_hist_parse_args()
731 return ¶ms->common; in osnoise_hist_parse_args()
735 * osnoise_hist_apply_config - apply the hist configs to the initialized tool
740 return osnoise_apply_config(tool, to_osnoise_params(tool->params)); in osnoise_hist_apply_config()
744 * osnoise_init_hist - initialize a osnoise hist tool with parameters
758 tool->data = osnoise_alloc_histogram(nr_cpus, params->hist.entries, in osnoise_init_hist()
759 params->hist.bucket_size); in osnoise_init_hist()
760 if (!tool->data) in osnoise_init_hist()