1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
/* SPDX-License-Identifier: GPL-2.0 */
#pragma once
#include "actions.h"
#include "timerlat_u.h"
#include "trace.h"
#include "utils.h"
/*
* OSNOISE_LL_OPTIONS - list of long long options backed by tracefs files.
* OSNOISE_LL_OPTION(field_name, tracefs_path)
*
* OSNOISE_FLAG_OPTIONS - list of boolean options backed by osnoise/options.
* OSNOISE_FLAG_OPTION(field_name, option_string)
*
* These X-macro lists are invoked in four places:
* - struct osnoise_context field declarations (common.h),
* - function declarations for osnoise_set_<opt>/osnoise_restore_<opt> (common.h),
* - function definitions for set/restore/put (osnoise.c),
* - context initialization and teardown in osnoise_context_alloc() and
* osnoise_put_context() (osnoise.c).
*/
#define OSNOISE_LL_OPTIONS \
OSNOISE_LL_OPTION(stop_us, "osnoise/stop_tracing_us") \
OSNOISE_LL_OPTION(stop_total_us, "osnoise/stop_tracing_total_us") \
OSNOISE_LL_OPTION(print_stack, "osnoise/print_stack") \
OSNOISE_LL_OPTION(tracing_thresh, "tracing_thresh") \
OSNOISE_LL_OPTION(timerlat_period_us, "osnoise/timerlat_period_us") \
OSNOISE_LL_OPTION(timerlat_align_us, "osnoise/timerlat_align_us")
#define OSNOISE_FLAG_OPTIONS \
OSNOISE_FLAG_OPTION(irq_disable, "OSNOISE_IRQ_DISABLE") \
OSNOISE_FLAG_OPTION(workload, "OSNOISE_WORKLOAD") \
OSNOISE_FLAG_OPTION(timerlat_align, "TIMERLAT_ALIGN")
/*
* osnoise_context - read, store, write, restore osnoise configs.
*/
#define OSNOISE_LL_OPTION(name, path) \
long long orig_##name; \
long long name;
#define OSNOISE_FLAG_OPTION(name, option_str) \
int orig_opt_##name; \
int opt_##name;
struct osnoise_context {
int flags;
int ref;
char *curr_cpus;
char *orig_cpus;
long long orig_runtime_us;
long long runtime_us;
long long orig_period_us;
long long period_us;
OSNOISE_LL_OPTIONS
OSNOISE_FLAG_OPTIONS
};
#undef OSNOISE_LL_OPTION
#undef OSNOISE_FLAG_OPTION
extern volatile int stop_tracing;
struct hist_params {
bool no_irq;
bool no_thread;
bool no_header;
bool no_summary;
bool no_index;
bool 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;
bool pretty_output;
bool quiet;
bool user_workload;
bool kernel_workload;
bool user_data;
bool aa_only;
bool ipi;
struct actions threshold_actions;
struct actions end_actions;
struct timerlat_u_params user;
};
#define for_each_monitored_cpu(cpu, common) \
for (cpu = 0; cpu < nr_cpus; cpu++) \
if (!(common)->cpus || CPU_ISSET(cpu, &(common)->monitored_cpus))
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);
};
/**
* should_continue_tracing - check if tracing should continue after threshold
* @params: pointer to the common parameters structure
*
* Returns true if the continue action was configured (--on-threshold continue),
* indicating that tracing should be restarted after handling the threshold event.
*
* Return: 1 if tracing should continue, 0 otherwise.
*/
static inline int
should_continue_tracing(const struct common_params *params)
{
return params->threshold_actions.continue_flag;
}
int
common_threshold_handler(const struct osnoise_tool *tool);
int osnoise_get_cpu_count(void);
int osnoise_set_cpus(struct osnoise_context *context, char *cpus);
void osnoise_restore_cpus(struct osnoise_context *context);
#define OSNOISE_LL_OPTION(name, path) \
int osnoise_set_##name(struct osnoise_context *context, long long name); \
void osnoise_restore_##name(struct osnoise_context *context);
#define OSNOISE_FLAG_OPTION(name, option_str) \
int osnoise_set_##name(struct osnoise_context *context, bool onoff); \
void osnoise_restore_##name(struct osnoise_context *context);
OSNOISE_LL_OPTIONS
OSNOISE_FLAG_OPTIONS
#undef OSNOISE_LL_OPTION
#undef OSNOISE_FLAG_OPTION
void osnoise_destroy_tool(struct osnoise_tool *top);
struct osnoise_tool *osnoise_init_tool(char *tool_name);
struct osnoise_tool *osnoise_init_trace_tool(struct common_params *params, 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);
int osn_set_stop(struct osnoise_tool *tool);
void common_usage(const char *tool, const char *mode,
const char *desc, const char * const *start_msgs, const char * const *opt_msgs);
|