xref: /linux/tools/tracing/rtla/src/common.h (revision 03d745b9843560ab89a796d0d9311bed5c6df6d6)
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  */
12 struct 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 
64 extern volatile int stop_tracing;
65 
66 struct 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  */
80 struct 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 
117 extern 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 
123 struct 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  */
131 struct 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 
142 struct 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  */
164 static inline int
165 should_continue_tracing(const struct common_params *params)
166 {
167 	return params->threshold_actions.continue_flag;
168 }
169 
170 int
171 common_threshold_handler(const struct osnoise_tool *tool);
172 
173 int osnoise_set_cpus(struct osnoise_context *context, char *cpus);
174 void osnoise_restore_cpus(struct osnoise_context *context);
175 
176 int osnoise_set_workload(struct osnoise_context *context, bool onoff);
177 
178 void osnoise_destroy_tool(struct osnoise_tool *top);
179 struct osnoise_tool *osnoise_init_tool(char *tool_name);
180 struct osnoise_tool *osnoise_init_trace_tool(const char *tracer);
181 bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record);
182 int osnoise_set_stop_us(struct osnoise_context *context, long long stop_us);
183 int osnoise_set_stop_total_us(struct osnoise_context *context,
184 			      long long stop_total_us);
185 
186 int common_apply_config(struct osnoise_tool *tool, struct common_params *params);
187 int top_main_loop(struct osnoise_tool *tool);
188 int hist_main_loop(struct osnoise_tool *tool);
189 int osn_set_stop(struct osnoise_tool *tool);
190 
191 void common_usage(const char *tool, const char *mode,
192 		  const char *desc, const char * const *start_msgs, const char * const *opt_msgs);
193