/* SPDX-License-Identifier: GPL-2.0 */ #pragma once #include "actions.h" #include "timerlat_u.h" #include "trace.h" #include "utils.h" /* * osnoise_context - read, store, write, restore osnoise configs. */ struct osnoise_context { int flags; int ref; char *curr_cpus; char *orig_cpus; /* 0 as init value */ unsigned long long orig_runtime_us; unsigned long long runtime_us; /* 0 as init value */ unsigned long long orig_period_us; unsigned long long period_us; /* 0 as init value */ long long orig_timerlat_period_us; long long timerlat_period_us; /* 0 as init value */ long long orig_tracing_thresh; long long tracing_thresh; /* -1 as init value because 0 is disabled */ long long orig_stop_us; long long stop_us; /* -1 as init value because 0 is disabled */ long long orig_stop_total_us; long long stop_total_us; /* -1 as init value because 0 is disabled */ long long orig_print_stack; long long print_stack; /* -1 as init value because 0 is off */ int orig_opt_irq_disable; int opt_irq_disable; /* -1 as init value because 0 is off */ int orig_opt_workload; int opt_workload; }; extern struct trace_instance *trace_inst; extern int stop_tracing; struct hist_params { char no_irq; char no_thread; char no_header; char no_summary; char no_index; char with_zeros; int bucket_size; int entries; }; /* * common_params - Parameters shared between timerlat_params and osnoise_params */ struct common_params { /* trace configuration */ char *cpus; cpu_set_t monitored_cpus; struct trace_events *events; int buffer_size; /* Timing parameters */ int warmup; long long stop_us; long long stop_total_us; int sleep_time; int duration; /* Scheduling parameters */ int set_sched; struct sched_attr sched_param; int cgroup; char *cgroup_name; int hk_cpus; cpu_set_t hk_cpu_set; /* Other parameters */ struct hist_params hist; int output_divisor; int pretty_output; int quiet; int user_workload; int kernel_workload; int user_data; int aa_only; struct actions threshold_actions; struct actions end_actions; struct timerlat_u_params user; }; struct tool_ops; /* * osnoise_tool - osnoise based tool definition. * * Only the "trace" and "context" fields are used for * the additional trace instances (record and aa). */ struct osnoise_tool { struct tool_ops *ops; struct trace_instance trace; struct osnoise_context *context; void *data; struct common_params *params; time_t start_time; struct osnoise_tool *record; struct osnoise_tool *aa; }; struct tool_ops { const char *tracer; const char *comm_prefix; struct common_params *(*parse_args)(int argc, char *argv[]); struct osnoise_tool *(*init_tool)(struct common_params *params); int (*apply_config)(struct osnoise_tool *tool); int (*enable)(struct osnoise_tool *tool); int (*main)(struct osnoise_tool *tool); void (*print_stats)(struct osnoise_tool *tool); void (*analyze)(struct osnoise_tool *tool, bool stopped); void (*free)(struct osnoise_tool *tool); }; int osnoise_set_cpus(struct osnoise_context *context, char *cpus); void osnoise_restore_cpus(struct osnoise_context *context); int osnoise_set_workload(struct osnoise_context *context, bool onoff); void osnoise_destroy_tool(struct osnoise_tool *top); struct osnoise_tool *osnoise_init_tool(char *tool_name); struct osnoise_tool *osnoise_init_trace_tool(const char *tracer); bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record); int common_apply_config(struct osnoise_tool *tool, struct common_params *params); int top_main_loop(struct osnoise_tool *tool); int hist_main_loop(struct osnoise_tool *tool);