134482388SCosta Shulyupin /* SPDX-License-Identifier: GPL-2.0 */ 234482388SCosta Shulyupin #pragma once 334482388SCosta Shulyupin 4*2f3172f9SCrystal Wood #include "actions.h" 5*2f3172f9SCrystal Wood #include "timerlat_u.h" 6263d7eacSCrystal Wood #include "trace.h" 734482388SCosta Shulyupin #include "utils.h" 834482388SCosta Shulyupin 9263d7eacSCrystal Wood /* 10263d7eacSCrystal Wood * osnoise_context - read, store, write, restore osnoise configs. 11263d7eacSCrystal Wood */ 12263d7eacSCrystal Wood struct osnoise_context { 13263d7eacSCrystal Wood int flags; 14263d7eacSCrystal Wood int ref; 15263d7eacSCrystal Wood 16263d7eacSCrystal Wood char *curr_cpus; 17263d7eacSCrystal Wood char *orig_cpus; 18263d7eacSCrystal Wood 19263d7eacSCrystal Wood /* 0 as init value */ 20263d7eacSCrystal Wood unsigned long long orig_runtime_us; 21263d7eacSCrystal Wood unsigned long long runtime_us; 22263d7eacSCrystal Wood 23263d7eacSCrystal Wood /* 0 as init value */ 24263d7eacSCrystal Wood unsigned long long orig_period_us; 25263d7eacSCrystal Wood unsigned long long period_us; 26263d7eacSCrystal Wood 27263d7eacSCrystal Wood /* 0 as init value */ 28263d7eacSCrystal Wood long long orig_timerlat_period_us; 29263d7eacSCrystal Wood long long timerlat_period_us; 30263d7eacSCrystal Wood 31263d7eacSCrystal Wood /* 0 as init value */ 32263d7eacSCrystal Wood long long orig_tracing_thresh; 33263d7eacSCrystal Wood long long tracing_thresh; 34263d7eacSCrystal Wood 35263d7eacSCrystal Wood /* -1 as init value because 0 is disabled */ 36263d7eacSCrystal Wood long long orig_stop_us; 37263d7eacSCrystal Wood long long stop_us; 38263d7eacSCrystal Wood 39263d7eacSCrystal Wood /* -1 as init value because 0 is disabled */ 40263d7eacSCrystal Wood long long orig_stop_total_us; 41263d7eacSCrystal Wood long long stop_total_us; 42263d7eacSCrystal Wood 43263d7eacSCrystal Wood /* -1 as init value because 0 is disabled */ 44263d7eacSCrystal Wood long long orig_print_stack; 45263d7eacSCrystal Wood long long print_stack; 46263d7eacSCrystal Wood 47263d7eacSCrystal Wood /* -1 as init value because 0 is off */ 48263d7eacSCrystal Wood int orig_opt_irq_disable; 49263d7eacSCrystal Wood int opt_irq_disable; 50263d7eacSCrystal Wood 51263d7eacSCrystal Wood /* -1 as init value because 0 is off */ 52263d7eacSCrystal Wood int orig_opt_workload; 53263d7eacSCrystal Wood int opt_workload; 54263d7eacSCrystal Wood }; 55263d7eacSCrystal Wood 56*2f3172f9SCrystal Wood extern struct trace_instance *trace_inst; 57*2f3172f9SCrystal Wood extern int stop_tracing; 58263d7eacSCrystal Wood 595742bf62SCrystal Wood struct hist_params { 605742bf62SCrystal Wood char no_irq; 615742bf62SCrystal Wood char no_thread; 625742bf62SCrystal Wood char no_header; 635742bf62SCrystal Wood char no_summary; 645742bf62SCrystal Wood char no_index; 655742bf62SCrystal Wood char with_zeros; 665742bf62SCrystal Wood int bucket_size; 675742bf62SCrystal Wood int entries; 685742bf62SCrystal Wood }; 695742bf62SCrystal Wood 7034482388SCosta Shulyupin /* 7134482388SCosta Shulyupin * common_params - Parameters shared between timerlat_params and osnoise_params 7234482388SCosta Shulyupin */ 7334482388SCosta Shulyupin struct common_params { 7434482388SCosta Shulyupin /* trace configuration */ 7534482388SCosta Shulyupin char *cpus; 7634482388SCosta Shulyupin cpu_set_t monitored_cpus; 7734482388SCosta Shulyupin struct trace_events *events; 7834482388SCosta Shulyupin int buffer_size; 7934482388SCosta Shulyupin 8034482388SCosta Shulyupin /* Timing parameters */ 8134482388SCosta Shulyupin int warmup; 8234482388SCosta Shulyupin long long stop_us; 8334482388SCosta Shulyupin long long stop_total_us; 8434482388SCosta Shulyupin int sleep_time; 8534482388SCosta Shulyupin int duration; 8634482388SCosta Shulyupin 8734482388SCosta Shulyupin /* Scheduling parameters */ 8834482388SCosta Shulyupin int set_sched; 8934482388SCosta Shulyupin struct sched_attr sched_param; 9034482388SCosta Shulyupin int cgroup; 9134482388SCosta Shulyupin char *cgroup_name; 9234482388SCosta Shulyupin int hk_cpus; 9334482388SCosta Shulyupin cpu_set_t hk_cpu_set; 945742bf62SCrystal Wood 955742bf62SCrystal Wood /* Other parameters */ 965742bf62SCrystal Wood struct hist_params hist; 975742bf62SCrystal Wood int output_divisor; 985742bf62SCrystal Wood int pretty_output; 995742bf62SCrystal Wood int quiet; 100*2f3172f9SCrystal Wood int user_workload; 101263d7eacSCrystal Wood int kernel_workload; 102*2f3172f9SCrystal Wood int user_data; 103*2f3172f9SCrystal Wood int aa_only; 104*2f3172f9SCrystal Wood 105*2f3172f9SCrystal Wood struct actions threshold_actions; 106*2f3172f9SCrystal Wood struct actions end_actions; 107*2f3172f9SCrystal Wood struct timerlat_u_params user; 108*2f3172f9SCrystal Wood }; 109*2f3172f9SCrystal Wood 110*2f3172f9SCrystal Wood struct tool_ops; 111*2f3172f9SCrystal Wood 112*2f3172f9SCrystal Wood /* 113*2f3172f9SCrystal Wood * osnoise_tool - osnoise based tool definition. 114*2f3172f9SCrystal Wood * 115*2f3172f9SCrystal Wood * Only the "trace" and "context" fields are used for 116*2f3172f9SCrystal Wood * the additional trace instances (record and aa). 117*2f3172f9SCrystal Wood */ 118*2f3172f9SCrystal Wood struct osnoise_tool { 119*2f3172f9SCrystal Wood struct tool_ops *ops; 120*2f3172f9SCrystal Wood struct trace_instance trace; 121*2f3172f9SCrystal Wood struct osnoise_context *context; 122*2f3172f9SCrystal Wood void *data; 123*2f3172f9SCrystal Wood struct common_params *params; 124*2f3172f9SCrystal Wood time_t start_time; 125*2f3172f9SCrystal Wood struct osnoise_tool *record; 126*2f3172f9SCrystal Wood struct osnoise_tool *aa; 127*2f3172f9SCrystal Wood }; 128*2f3172f9SCrystal Wood 129*2f3172f9SCrystal Wood struct tool_ops { 130*2f3172f9SCrystal Wood const char *tracer; 131*2f3172f9SCrystal Wood const char *comm_prefix; 132*2f3172f9SCrystal Wood struct common_params *(*parse_args)(int argc, char *argv[]); 133*2f3172f9SCrystal Wood struct osnoise_tool *(*init_tool)(struct common_params *params); 134*2f3172f9SCrystal Wood int (*apply_config)(struct osnoise_tool *tool); 135*2f3172f9SCrystal Wood int (*enable)(struct osnoise_tool *tool); 136*2f3172f9SCrystal Wood int (*main)(struct osnoise_tool *tool); 137*2f3172f9SCrystal Wood void (*print_stats)(struct osnoise_tool *tool); 138*2f3172f9SCrystal Wood void (*analyze)(struct osnoise_tool *tool, bool stopped); 139*2f3172f9SCrystal Wood void (*free)(struct osnoise_tool *tool); 14034482388SCosta Shulyupin }; 141263d7eacSCrystal Wood 142263d7eacSCrystal Wood int osnoise_set_cpus(struct osnoise_context *context, char *cpus); 143263d7eacSCrystal Wood void osnoise_restore_cpus(struct osnoise_context *context); 144263d7eacSCrystal Wood 145263d7eacSCrystal Wood int osnoise_set_workload(struct osnoise_context *context, bool onoff); 146263d7eacSCrystal Wood 147*2f3172f9SCrystal Wood void osnoise_destroy_tool(struct osnoise_tool *top); 148*2f3172f9SCrystal Wood struct osnoise_tool *osnoise_init_tool(char *tool_name); 149*2f3172f9SCrystal Wood struct osnoise_tool *osnoise_init_trace_tool(const char *tracer); 150*2f3172f9SCrystal Wood bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record); 151*2f3172f9SCrystal Wood 152263d7eacSCrystal Wood int common_apply_config(struct osnoise_tool *tool, struct common_params *params); 153*2f3172f9SCrystal Wood int top_main_loop(struct osnoise_tool *tool); 154*2f3172f9SCrystal Wood int hist_main_loop(struct osnoise_tool *tool); 155