projects/linux·blob master · refs

192 lines · 4.9 KiB

1/* SPDX-License-Identifier: GPL-2.0 */
2#pragma once
3
4#include "actions.h"
5#include "timerlat_u.h"
6#include "trace.h"
7#include "utils.h"
8
9/*
10 * osnoise_context - read, store, write, restore osnoise configs.
11 */
12struct osnoise_context {
13 int flags;
14 int ref;
15
16 char *curr_cpus;
17 char *orig_cpus;
18
19 /* 0 as init value */
20 unsigned long long orig_runtime_us;
21 unsigned long long runtime_us;
22
23 /* 0 as init value */
24 unsigned long long orig_period_us;
25 unsigned long long period_us;
26
27 /* 0 as init value */
28 long long orig_timerlat_period_us;
29 long long timerlat_period_us;
30
31 /* 0 as init value */
32 long long orig_tracing_thresh;
33 long long tracing_thresh;
34
35 /* -1 as init value because 0 is disabled */
36 long long orig_stop_us;
37 long long stop_us;
38
39 /* -1 as init value because 0 is disabled */
40 long long orig_stop_total_us;
41 long long stop_total_us;
42
43 /* -1 as init value because 0 is disabled */
44 long long orig_print_stack;
45 long long print_stack;
46
47 /* -1 as init value because 0 is off */
48 int orig_opt_irq_disable;
49 int opt_irq_disable;
50
51 /* -1 as init value because 0 is off */
52 int orig_opt_workload;
53 int opt_workload;
54
55 /* -1 as init value because 0 is off */
56 int orig_opt_timerlat_align;
57 int opt_timerlat_align;
58
59 /* 0 as init value */
60 unsigned long long orig_timerlat_align_us;
61 unsigned long long timerlat_align_us;
62};
63
64extern volatile int stop_tracing;
65
66struct hist_params {
67 bool no_irq;
68 bool no_thread;
69 bool no_header;
70 bool no_summary;
71 bool no_index;
72 bool with_zeros;
73 int bucket_size;
74 int entries;
75};
76
77/*
78 * common_params - Parameters shared between timerlat_params and osnoise_params
79 */
80struct common_params {
81 /* trace configuration */
82 char *cpus;
83 cpu_set_t monitored_cpus;
84 struct trace_events *events;
85 int buffer_size;
86
87 /* Timing parameters */
88 int warmup;
89 long long stop_us;
90 long long stop_total_us;
91 int sleep_time;
92 int duration;
93
94 /* Scheduling parameters */
95 int set_sched;
96 struct sched_attr sched_param;
97 int cgroup;
98 char *cgroup_name;
99 int hk_cpus;
100 cpu_set_t hk_cpu_set;
101
102 /* Other parameters */
103 struct hist_params hist;
104 int output_divisor;
105 bool pretty_output;
106 bool quiet;
107 bool user_workload;
108 bool kernel_workload;
109 bool user_data;
110 bool aa_only;
111
112 struct actions threshold_actions;
113 struct actions end_actions;
114 struct timerlat_u_params user;
115};
116
117extern int nr_cpus;
118
119#define for_each_monitored_cpu(cpu, common) \
120 for (cpu = 0; cpu < nr_cpus; cpu++) \
121 if (!(common)->cpus || CPU_ISSET(cpu, &(common)->monitored_cpus))
122
123struct tool_ops;
124
125/*
126 * osnoise_tool - osnoise based tool definition.
127 *
128 * Only the "trace" and "context" fields are used for
129 * the additional trace instances (record and aa).
130 */
131struct osnoise_tool {
132 struct tool_ops *ops;
133 struct trace_instance trace;
134 struct osnoise_context *context;
135 void *data;
136 struct common_params *params;
137 time_t start_time;
138 struct osnoise_tool *record;
139 struct osnoise_tool *aa;
140};
141
142struct tool_ops {
143 const char *tracer;
144 const char *comm_prefix;
145 struct common_params *(*parse_args)(int argc, char *argv[]);
146 struct osnoise_tool *(*init_tool)(struct common_params *params);
147 int (*apply_config)(struct osnoise_tool *tool);
148 int (*enable)(struct osnoise_tool *tool);
149 int (*main)(struct osnoise_tool *tool);
150 void (*print_stats)(struct osnoise_tool *tool);
151 void (*analyze)(struct osnoise_tool *tool, bool stopped);
152 void (*free)(struct osnoise_tool *tool);
153};
154
155/**
156 * should_continue_tracing - check if tracing should continue after threshold
157 * @params: pointer to the common parameters structure
158 *
159 * Returns true if the continue action was configured (--on-threshold continue),
160 * indicating that tracing should be restarted after handling the threshold event.
161 *
162 * Return: 1 if tracing should continue, 0 otherwise.
163 */
164static inline int
165should_continue_tracing(const struct common_params *params)
166{
167 return params->threshold_actions.continue_flag;
168}
169
170int
171common_threshold_handler(const struct osnoise_tool *tool);
172
173int osnoise_set_cpus(struct osnoise_context *context, char *cpus);
174void osnoise_restore_cpus(struct osnoise_context *context);
175
176int osnoise_set_workload(struct osnoise_context *context, bool onoff);
177
178void osnoise_destroy_tool(struct osnoise_tool *top);
179struct osnoise_tool *osnoise_init_tool(char *tool_name);
180struct osnoise_tool *osnoise_init_trace_tool(const char *tracer);
181bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record);
182int osnoise_set_stop_us(struct osnoise_context *context, long long stop_us);
183int osnoise_set_stop_total_us(struct osnoise_context *context,
184 long long stop_total_us);
185
186int common_apply_config(struct osnoise_tool *tool, struct common_params *params);
187int top_main_loop(struct osnoise_tool *tool);
188int hist_main_loop(struct osnoise_tool *tool);
189int osn_set_stop(struct osnoise_tool *tool);
190
191void common_usage(const char *tool, const char *mode,
192 const char *desc, const char * const *start_msgs, const char * const *opt_msgs);