• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: LGPL-2.1 */
2 /*
3  * Copyright (C) 2019, VMware, Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
4  *
5  */
6 #ifndef _TRACE_FS_H
7 #define _TRACE_FS_H
8 
9 #include <fcntl.h>
10 #include <sched.h>
11 #include <event-parse.h>
12 #include <kbuffer.h>
13 
14 char *tracefs_get_tracing_file(const char *name);
15 void tracefs_put_tracing_file(char *name);
16 
17 /* the returned string must *not* be freed */
18 const char *tracefs_tracing_dir(void);
19 const char *tracefs_debug_dir(void);
20 int tracefs_set_tracing_dir(char *tracing_dir);
21 int tracefs_tracing_dir_is_mounted(bool mount, const char **path);
22 
23 /* ftrace instances */
24 struct tracefs_instance;
25 
26 void tracefs_instance_free(struct tracefs_instance *instance);
27 void tracefs_instance_reset(struct tracefs_instance *instance);
28 int tracefs_instance_clear(struct tracefs_instance *instance);
29 struct tracefs_instance *tracefs_instance_create(const char *name);
30 struct tracefs_instance *tracefs_instance_alloc(const char *tracing_dir,
31 						const char *name);
32 int tracefs_instance_destroy(struct tracefs_instance *instance);
33 bool tracefs_instance_is_new(struct tracefs_instance *instance);
34 const char *tracefs_instance_get_name(struct tracefs_instance *instance);
35 const char *tracefs_instance_get_trace_dir(struct tracefs_instance *instance);
36 char *
37 tracefs_instance_get_file(struct tracefs_instance *instance, const char *file);
38 char *tracefs_instance_get_dir(struct tracefs_instance *instance);
39 int tracefs_instance_file_write(struct tracefs_instance *instance,
40 				const char *file, const char *str);
41 int tracefs_instance_file_write_number(struct tracefs_instance *instance,
42 				       const char *file, size_t val);
43 int tracefs_instance_file_append(struct tracefs_instance *instance,
44 				 const char *file, const char *str);
45 int tracefs_instance_file_clear(struct tracefs_instance *instance,
46 				const char *file);
47 char *tracefs_instance_file_read(struct tracefs_instance *instance,
48 				 const char *file, int *psize);
49 int tracefs_instance_file_read_number(struct tracefs_instance *instance,
50 				      const char *file, long long *res);
51 int tracefs_instance_file_open(struct tracefs_instance *instance,
52 			       const char *file, int mode);
53 int tracefs_instances_walk(int (*callback)(const char *, void *), void *context);
54 int tracefs_instance_set_affinity_set(struct tracefs_instance *instance,
55 				  cpu_set_t *set, size_t set_size);
56 int tracefs_instance_set_affinity_raw(struct tracefs_instance *instance,
57 				      const char *mask);
58 int tracefs_instance_set_affinity(struct tracefs_instance *instance,
59 				  const char *cpu_str);
60 char *tracefs_instance_get_affinity(struct tracefs_instance *instance);
61 char *tracefs_instance_get_affinity_raw(struct tracefs_instance *instance);
62 int tracefs_instance_get_affinity_set(struct tracefs_instance *instance,
63 				      cpu_set_t *set, size_t set_size);
64 ssize_t tracefs_instance_get_buffer_size(struct tracefs_instance *instance, int cpu);
65 int tracefs_instance_set_buffer_size(struct tracefs_instance *instance, size_t size, int cpu);
66 ssize_t tracefs_instance_get_subbuf_size(struct tracefs_instance *instance);
67 int tracefs_instance_set_subbuf_size(struct tracefs_instance *instance, size_t size);
68 char **tracefs_instances(const char *regex);
69 
70 int tracefs_instance_get_buffer_percent(struct tracefs_instance *instance);
71 int tracefs_instance_set_buffer_percent(struct tracefs_instance *instance, int val);
72 
73 struct tracefs_buffer_stat;
74 
75 struct tracefs_buffer_stat *tracefs_instance_get_stat(struct tracefs_instance *instance, int cpu);
76 void tracefs_instance_put_stat(struct tracefs_buffer_stat *tstat);
77 ssize_t tracefs_buffer_stat_entries(struct tracefs_buffer_stat *tstat);
78 ssize_t tracefs_buffer_stat_overrun(struct tracefs_buffer_stat *tstat);
79 ssize_t tracefs_buffer_stat_commit_overrun(struct tracefs_buffer_stat *tstat);
80 ssize_t tracefs_buffer_stat_bytes(struct tracefs_buffer_stat *tstat);
81 long long tracefs_buffer_stat_event_timestamp(struct tracefs_buffer_stat *tstat);
82 long long tracefs_buffer_stat_timestamp(struct tracefs_buffer_stat *tstat);
83 ssize_t tracefs_buffer_stat_dropped_events(struct tracefs_buffer_stat *tstat);
84 ssize_t tracefs_buffer_stat_read_events(struct tracefs_buffer_stat *tstat);
85 
86 bool tracefs_instance_exists(const char *name);
87 bool tracefs_file_exists(struct tracefs_instance *instance, const char *name);
88 bool tracefs_dir_exists(struct tracefs_instance *instance, const char *name);
89 
90 int tracefs_trace_is_on(struct tracefs_instance *instance);
91 int tracefs_trace_on(struct tracefs_instance *instance);
92 int tracefs_trace_off(struct tracefs_instance *instance);
93 int tracefs_trace_on_fd(int fd);
94 int tracefs_trace_off_fd(int fd);
95 
96 enum tracefs_enable_state {
97 	TRACEFS_ERROR		= -1,
98 	TRACEFS_ALL_DISABLED	= 0,
99 	TRACEFS_ALL_ENABLED	= 1,
100 	TRACEFS_SOME_ENABLED	= 2,
101 };
102 
103 int tracefs_event_enable(struct tracefs_instance *instance, const char *system, const char *event);
104 int tracefs_event_disable(struct tracefs_instance *instance, const char *system, const char *event);
105 enum tracefs_enable_state tracefs_event_is_enabled(struct tracefs_instance *instance,
106 			 const char *system, const char *event);
107 
108 char *tracefs_error_last(struct tracefs_instance *instance);
109 char *tracefs_error_all(struct tracefs_instance *instance);
110 int tracefs_error_clear(struct tracefs_instance *instance);
111 
112 void tracefs_list_free(char **list);
113 char **tracefs_list_add(char **list, const char *string);
114 int tracefs_list_size(char **list);
115 
116 bool tracefs_tracer_available(const char *tracing_dir, const char *tracer);
117 
118 /**
119  * tracefs_trace_on_get_fd - Get a file descriptor of "tracing_on" in given instance
120  * @instance: ftrace instance, can be NULL for the top instance
121  *
122  * Returns -1 in case of an error, or a valid file descriptor to "tracing_on"
123  * file for reading and writing.The returned FD must be closed with close().
124  */
tracefs_trace_on_get_fd(struct tracefs_instance * instance)125 static inline int tracefs_trace_on_get_fd(struct tracefs_instance *instance)
126 {
127 	return tracefs_instance_file_open(instance, "tracing_on", O_RDWR);
128 }
129 
130 /* trace print string*/
131 int tracefs_print_init(struct tracefs_instance *instance);
132 int tracefs_printf(struct tracefs_instance *instance, const char *fmt, ...);
133 int tracefs_vprintf(struct tracefs_instance *instance, const char *fmt, va_list ap);
134 void tracefs_print_close(struct tracefs_instance *instance);
135 
136 /* trace write binary data*/
137 int tracefs_binary_init(struct tracefs_instance *instance);
138 int tracefs_binary_write(struct tracefs_instance *instance, void *data, int len);
139 void tracefs_binary_close(struct tracefs_instance *instance);
140 
141 /* events */
142 char **tracefs_event_systems(const char *tracing_dir);
143 char **tracefs_system_events(const char *tracing_dir, const char *system);
144 int tracefs_iterate_raw_events(struct tep_handle *tep,
145 				struct tracefs_instance *instance,
146 				cpu_set_t *cpus, int cpu_size,
147 				int (*callback)(struct tep_event *,
148 						struct tep_record *,
149 						int, void *),
150 				void *callback_context);
151 void tracefs_iterate_stop(struct tracefs_instance *instance);
152 int tracefs_follow_event(struct tep_handle *tep, struct tracefs_instance *instance,
153 			  const char *system, const char *event_name,
154 			  int (*callback)(struct tep_event *,
155 					  struct tep_record *,
156 					  int, void *),
157 			  void *callback_data);
158 int tracefs_follow_missed_events(struct tracefs_instance *instance,
159 				 int (*callback)(struct tep_event *,
160 						 struct tep_record *,
161 						 int, void *),
162 				 void *callback_data);
163 int tracefs_follow_event_clear(struct tracefs_instance *instance,
164 			  const char *system, const char *event_name);
165 int tracefs_follow_missed_events_clear(struct tracefs_instance *instance);
166 
167 
168 char *tracefs_event_get_file(struct tracefs_instance *instance,
169 			     const char *system, const char *event,
170 			     const char *file);
171 char *tracefs_event_file_read(struct tracefs_instance *instance,
172 			      const char *system, const char *event,
173 			      const char *file, int *psize);
174 int tracefs_event_file_write(struct tracefs_instance *instance,
175 			     const char *system, const char *event,
176 			     const char *file, const char *str);
177 int tracefs_event_file_append(struct tracefs_instance *instance,
178 			      const char *system, const char *event,
179 			      const char *file, const char *str);
180 int tracefs_event_file_clear(struct tracefs_instance *instance,
181 			     const char *system, const char *event,
182 			     const char *file);
183 bool tracefs_event_file_exists(struct tracefs_instance *instance,
184 			       const char *system, const char *event,
185 			       const char *file);
186 
187 char **tracefs_tracers(const char *tracing_dir);
188 char **tracefs_instance_tracers(struct tracefs_instance *instance);
189 
190 struct tep_handle *tracefs_local_events(const char *tracing_dir);
191 struct tep_handle *tracefs_local_events_system(const char *tracing_dir,
192 					       const char * const *sys_names);
193 int tracefs_fill_local_events(const char *tracing_dir,
194 			       struct tep_handle *tep, int *parsing_failures);
195 
196 int tracefs_load_cmdlines(const char *tracing_dir, struct tep_handle *tep);
197 
198 int tracefs_load_headers(const char *tracing_dir, struct tep_handle *tep);
199 
200 char *tracefs_get_clock(struct tracefs_instance *instance);
201 
202 enum tracefs_option_id {
203 	TRACEFS_OPTION_INVALID = 0,
204 	TRACEFS_OPTION_ANNOTATE,
205 	TRACEFS_OPTION_BIN,
206 	TRACEFS_OPTION_BLK_CGNAME,
207 	TRACEFS_OPTION_BLK_CGROUP,
208 	TRACEFS_OPTION_BLK_CLASSIC,
209 	TRACEFS_OPTION_BLOCK,
210 	TRACEFS_OPTION_CONTEXT_INFO,
211 	TRACEFS_OPTION_DISABLE_ON_FREE,
212 	TRACEFS_OPTION_DISPLAY_GRAPH,
213 	TRACEFS_OPTION_EVENT_FORK,
214 	TRACEFS_OPTION_FGRAPH_ABSTIME,
215 	TRACEFS_OPTION_FGRAPH_CPU,
216 	TRACEFS_OPTION_FGRAPH_DURATION,
217 	TRACEFS_OPTION_FGRAPH_IRQS,
218 	TRACEFS_OPTION_FGRAPH_OVERHEAD,
219 	TRACEFS_OPTION_FGRAPH_OVERRUN,
220 	TRACEFS_OPTION_FGRAPH_PROC,
221 	TRACEFS_OPTION_FGRAPH_TAIL,
222 	TRACEFS_OPTION_FUNC_STACKTRACE,
223 	TRACEFS_OPTION_FUNCTION_FORK,
224 	TRACEFS_OPTION_FUNCTION_TRACE,
225 	TRACEFS_OPTION_GRAPH_TIME,
226 	TRACEFS_OPTION_HEX,
227 	TRACEFS_OPTION_IRQ_INFO,
228 	TRACEFS_OPTION_LATENCY_FORMAT,
229 	TRACEFS_OPTION_MARKERS,
230 	TRACEFS_OPTION_OVERWRITE,
231 	TRACEFS_OPTION_PAUSE_ON_TRACE,
232 	TRACEFS_OPTION_PRINTK_MSG_ONLY,
233 	TRACEFS_OPTION_PRINT_PARENT,
234 	TRACEFS_OPTION_RAW,
235 	TRACEFS_OPTION_RECORD_CMD,
236 	TRACEFS_OPTION_RECORD_TGID,
237 	TRACEFS_OPTION_SLEEP_TIME,
238 	TRACEFS_OPTION_STACKTRACE,
239 	TRACEFS_OPTION_SYM_ADDR,
240 	TRACEFS_OPTION_SYM_OFFSET,
241 	TRACEFS_OPTION_SYM_USEROBJ,
242 	TRACEFS_OPTION_TRACE_PRINTK,
243 	TRACEFS_OPTION_USERSTACKTRACE,
244 	TRACEFS_OPTION_VERBOSE,
245 };
246 #define TRACEFS_OPTION_MAX (TRACEFS_OPTION_VERBOSE + 1)
247 
248 struct tracefs_options_mask;
249 bool tracefs_option_mask_is_set(const struct tracefs_options_mask *options,
250 				enum tracefs_option_id id);
251 const struct tracefs_options_mask *tracefs_options_get_supported(struct tracefs_instance *instance);
252 bool tracefs_option_is_supported(struct tracefs_instance *instance, enum tracefs_option_id id);
253 const struct tracefs_options_mask *tracefs_options_get_enabled(struct tracefs_instance *instance);
254 bool tracefs_option_is_enabled(struct tracefs_instance *instance, enum tracefs_option_id id);
255 int tracefs_option_enable(struct tracefs_instance *instance, enum tracefs_option_id id);
256 int tracefs_option_disable(struct tracefs_instance *instance, enum tracefs_option_id id);
257 const char *tracefs_option_name(enum tracefs_option_id id);
258 enum tracefs_option_id tracefs_option_id(const char *name);
259 
260 /*
261  * RESET	- Reset on opening filter file (O_TRUNC)
262  * CONTINUE	- Do not close filter file on return.
263  * FUTURE	- For kernels that support this feature, enable filters for
264  *		  a module that has yet to be loaded.
265  */
266 enum {
267 	TRACEFS_FL_RESET	= (1 << 0),
268 	TRACEFS_FL_CONTINUE	= (1 << 1),
269 	TRACEFS_FL_FUTURE	= (1 << 2),
270 };
271 
272 int tracefs_filter_pid_function(struct tracefs_instance *instance, int pid,
273 				bool reset, bool notrace);
274 int tracefs_filter_pid_function_clear(struct tracefs_instance *instance, bool notrace);
275 int tracefs_filter_pid_events(struct tracefs_instance *instance, int pid,
276 			     bool reset, bool notrace);
277 int tracefs_filter_pid_events_clear(struct tracefs_instance *instance, bool notrace);
278 
279 int tracefs_function_filter(struct tracefs_instance *instance, const char *filter,
280 			    const char *module, unsigned int flags);
281 int tracefs_function_notrace(struct tracefs_instance *instance, const char *filter,
282 			     const char *module, unsigned int flags);
283 int tracefs_filter_functions(const char *filter, const char *module, char ***list);
284 
285 
286 /* Control library logs */
287 void tracefs_set_loglevel(enum tep_loglevel level);
288 
289 enum tracefs_tracers {
290 	TRACEFS_TRACER_NOP = 0,
291 	TRACEFS_TRACER_CUSTOM,
292 	TRACEFS_TRACER_FUNCTION,
293 	TRACEFS_TRACER_FUNCTION_GRAPH,
294 	TRACEFS_TRACER_IRQSOFF,
295 	TRACEFS_TRACER_PREEMPTOFF,
296 	TRACEFS_TRACER_PREEMPTIRQSOFF,
297 	TRACEFS_TRACER_WAKEUP,
298 	TRACEFS_TRACER_WAKEUP_RT,
299 	TRACEFS_TRACER_WAKEUP_DL,
300 	TRACEFS_TRACER_MMIOTRACE,
301 	TRACEFS_TRACER_HWLAT,
302 	TRACEFS_TRACER_BRANCH,
303 	TRACEFS_TRACER_BLOCK,
304 };
305 
306 int tracefs_tracer_set(struct tracefs_instance *instance, enum tracefs_tracers tracer, ...);
307 
308 int tracefs_tracer_clear(struct tracefs_instance *instance);
309 
310 ssize_t tracefs_trace_pipe_stream(int fd, struct tracefs_instance *instance, int flags);
311 ssize_t tracefs_trace_pipe_print(struct tracefs_instance *instance, int flags);
312 void tracefs_trace_pipe_stop(struct tracefs_instance *instance);
313 
314 /* Dynamic events */
315 struct tracefs_dynevent;
316 enum tracefs_dynevent_type {
317 	TRACEFS_DYNEVENT_UNKNOWN	= 0,
318 	TRACEFS_DYNEVENT_KPROBE		= 1 << 0,
319 	TRACEFS_DYNEVENT_KRETPROBE	= 1 << 1,
320 	TRACEFS_DYNEVENT_UPROBE		= 1 << 2,
321 	TRACEFS_DYNEVENT_URETPROBE	= 1 << 3,
322 	TRACEFS_DYNEVENT_EPROBE		= 1 << 4,
323 	TRACEFS_DYNEVENT_SYNTH		= 1 << 5,
324 	TRACEFS_DYNEVENT_MAX		= 1 << 6,
325 };
326 
327 #define TRACEFS_DYNEVENT_ALL		0xFFFFFFFF
328 
329 int tracefs_dynevent_create(struct tracefs_dynevent *devent);
330 int tracefs_dynevent_destroy(struct tracefs_dynevent *devent, bool force);
331 int tracefs_dynevent_destroy_all(unsigned int types, bool force);
332 void tracefs_dynevent_free(struct tracefs_dynevent *devent);
333 void tracefs_dynevent_list_free(struct tracefs_dynevent **events);
334 struct tracefs_dynevent **
335 tracefs_dynevent_get_all(unsigned int types, const char *system);
336 struct tracefs_dynevent *
337 tracefs_dynevent_get(enum tracefs_dynevent_type type, const char *system, const char *event);
338 enum tracefs_dynevent_type
339 tracefs_dynevent_info(struct tracefs_dynevent *dynevent, char **system,
340 		      char **event, char **prefix, char **addr, char **format);
341 struct tep_event *
342 tracefs_dynevent_get_event(struct tep_handle *tep, struct tracefs_dynevent *dynevent);
343 
344 struct tracefs_dynevent *
345 tracefs_eprobe_alloc(const char *system, const char *event,
346 		     const char *target_system, const char *target_event, const char *fetchargs);
347 struct tracefs_dynevent *
348 tracefs_uprobe_alloc(const char *system, const char *event,
349 		     const char *file, unsigned long long offset, const char *fetchargs);
350 struct tracefs_dynevent *
351 tracefs_uretprobe_alloc(const char *system, const char *event,
352 			const char *file, unsigned long long offset, const char *fetchargs);
353 
354 struct tracefs_dynevent *
355 tracefs_kprobe_alloc(const char *system, const char *event, const char *addr, const char *format);
356 struct tracefs_dynevent *
357 tracefs_kretprobe_alloc(const char *system, const char *event,
358 			const char *addr, const char *format, unsigned int max);
359 int tracefs_kprobe_raw(const char *system, const char *event,
360 		       const char *addr, const char *format);
361 int tracefs_kretprobe_raw(const char *system, const char *event,
362 			  const char *addr, const char *format);
363 int tracefs_kprobe_destroy(const char *system, const char *event,
364 			   const char *addr, const char *format, bool force);
365 
366 enum tracefs_hist_key_type {
367 	TRACEFS_HIST_KEY_NORMAL = 0,
368 	TRACEFS_HIST_KEY_HEX,
369 	TRACEFS_HIST_KEY_SYM,
370 	TRACEFS_HIST_KEY_SYM_OFFSET,
371 	TRACEFS_HIST_KEY_SYSCALL,
372 	TRACEFS_HIST_KEY_EXECNAME,
373 	TRACEFS_HIST_KEY_LOG,
374 	TRACEFS_HIST_KEY_USECS,
375 	TRACEFS_HIST_KEY_BUCKETS,
376 	TRACEFS_HIST_KEY_STACKTRACE,
377 	TRACEFS_HIST_KEY_MAX
378 };
379 
380 enum tracefs_hist_sort_direction {
381 	TRACEFS_HIST_SORT_ASCENDING,
382 	TRACEFS_HIST_SORT_DESCENDING,
383 };
384 
385 #define TRACEFS_HIST_TIMESTAMP		"common_timestamp"
386 #define TRACEFS_HIST_TIMESTAMP_USECS	"common_timestamp.usecs"
387 #define TRACEFS_HIST_CPU		"cpu"
388 
389 #define TRACEFS_HIST_COUNTER		"__COUNTER__"
390 
391 #define TRACEFS_HIST_HITCOUNT		"hitcount"
392 
393 struct tracefs_hist;
394 
395 enum tracefs_hist_command {
396 	TRACEFS_HIST_CMD_START = 0,
397 	TRACEFS_HIST_CMD_PAUSE,
398 	TRACEFS_HIST_CMD_CONT,
399 	TRACEFS_HIST_CMD_CLEAR,
400 	TRACEFS_HIST_CMD_DESTROY,
401 };
402 
403 enum tracefs_filter {
404 	TRACEFS_FILTER_COMPARE,
405 	TRACEFS_FILTER_AND,
406 	TRACEFS_FILTER_OR,
407 	TRACEFS_FILTER_NOT,
408 	TRACEFS_FILTER_OPEN_PAREN,
409 	TRACEFS_FILTER_CLOSE_PAREN,
410 };
411 
412 enum tracefs_compare {
413 	TRACEFS_COMPARE_EQ,
414 	TRACEFS_COMPARE_NE,
415 	TRACEFS_COMPARE_GT,
416 	TRACEFS_COMPARE_GE,
417 	TRACEFS_COMPARE_LT,
418 	TRACEFS_COMPARE_LE,
419 	TRACEFS_COMPARE_RE,
420 	TRACEFS_COMPARE_AND,
421 };
422 
423 void tracefs_hist_free(struct tracefs_hist *hist);
424 struct tracefs_hist *
425 tracefs_hist_alloc(struct tep_handle *tep,
426 		   const char *system, const char *event_name,
427 		   const char *key, enum tracefs_hist_key_type type);
428 struct tracefs_hist *
429 tracefs_hist_alloc_2d(struct tep_handle *tep,
430 		      const char *system, const char *event_name,
431 		      const char *key1, enum tracefs_hist_key_type type1,
432 		      const char *key2, enum tracefs_hist_key_type type2);
433 
434 struct tracefs_hist_axis {
435 	const char *key;
436 	enum tracefs_hist_key_type type;
437 };
438 
439 struct tracefs_hist_axis_cnt {
440 	const char *key;
441 	enum tracefs_hist_key_type type;
442 	int cnt;
443 };
444 
445 struct tracefs_hist *
446 tracefs_hist_alloc_nd(struct tep_handle *tep,
447 		      const char *system, const char *event_name,
448 		      struct tracefs_hist_axis *axes);
449 struct tracefs_hist *
450 tracefs_hist_alloc_nd_cnt(struct tep_handle *tep,
451 			  const char *system, const char *event_name,
452 			  struct tracefs_hist_axis_cnt *axes);
453 const char *tracefs_hist_get_name(struct tracefs_hist *hist);
454 const char *tracefs_hist_get_event(struct tracefs_hist *hist);
455 const char *tracefs_hist_get_system(struct tracefs_hist *hist);
456 int tracefs_hist_add_key(struct tracefs_hist *hist, const char *key,
457 			 enum tracefs_hist_key_type type);
458 int tracefs_hist_add_key_cnt(struct tracefs_hist *hist, const char *key,
459 			 enum tracefs_hist_key_type type, int cnt);
460 int tracefs_hist_add_value(struct tracefs_hist *hist, const char *value);
461 int tracefs_hist_add_sort_key(struct tracefs_hist *hist,
462 			      const char *sort_key);
463 int tracefs_hist_set_sort_key(struct tracefs_hist *hist,
464 			      const char *sort_key, ...);
465 int tracefs_hist_sort_key_direction(struct tracefs_hist *hist,
466 				    const char *sort_key,
467 				    enum tracefs_hist_sort_direction dir);
468 int tracefs_hist_add_name(struct tracefs_hist *hist, const char *name);
469 int tracefs_hist_append_filter(struct tracefs_hist *hist,
470 			       enum tracefs_filter type,
471 			       const char *field,
472 			       enum tracefs_compare compare,
473 			       const char *val);
474 int tracefs_hist_echo_cmd(struct trace_seq *seq,  struct tracefs_instance *instance,
475 			  struct tracefs_hist *hist, enum tracefs_hist_command command);
476 int tracefs_hist_command(struct tracefs_instance *instance,
477 			 struct tracefs_hist *hist, enum tracefs_hist_command cmd);
478 
479 /**
480  * tracefs_hist_start - enable a histogram
481  * @instance: The instance the histogram will be in (NULL for toplevel)
482  * @hist: The histogram to start
483  *
484  * Starts executing a histogram.
485  *
486  * Returns 0 on success, -1 on error.
487  */
tracefs_hist_start(struct tracefs_instance * instance,struct tracefs_hist * hist)488 static inline int tracefs_hist_start(struct tracefs_instance *instance,
489 				     struct tracefs_hist *hist)
490 {
491 	return tracefs_hist_command(instance, hist, TRACEFS_HIST_CMD_START);
492 }
493 
494 /**
495  * tracefs_hist_pause - pause a histogram
496  * @instance: The instance the histogram is in (NULL for toplevel)
497  * @hist: The histogram to pause
498  *
499  * Pause a histogram.
500  *
501  * Returns 0 on success, -1 on error.
502  */
tracefs_hist_pause(struct tracefs_instance * instance,struct tracefs_hist * hist)503 static inline int tracefs_hist_pause(struct tracefs_instance *instance,
504 				     struct tracefs_hist *hist)
505 {
506 	return tracefs_hist_command(instance, hist, TRACEFS_HIST_CMD_PAUSE);
507 }
508 
509 /**
510  * tracefs_hist_continue - continue a paused histogram
511  * @instance: The instance the histogram is in (NULL for toplevel)
512  * @hist: The histogram to continue
513  *
514  * Continue a histogram.
515  *
516  * Returns 0 on success, -1 on error.
517  */
tracefs_hist_continue(struct tracefs_instance * instance,struct tracefs_hist * hist)518 static inline int tracefs_hist_continue(struct tracefs_instance *instance,
519 					struct tracefs_hist *hist)
520 {
521 	return tracefs_hist_command(instance, hist, TRACEFS_HIST_CMD_CONT);
522 }
523 
524 /**
525  * tracefs_hist_reset - clear a histogram
526  * @instance: The instance the histogram is in (NULL for toplevel)
527  * @hist: The histogram to reset
528  *
529  * Resets a histogram.
530  *
531  * Returns 0 on success, -1 on error.
532  */
tracefs_hist_reset(struct tracefs_instance * instance,struct tracefs_hist * hist)533 static inline int tracefs_hist_reset(struct tracefs_instance *instance,
534 				     struct tracefs_hist *hist)
535 {
536 	return tracefs_hist_command(instance, hist, TRACEFS_HIST_CMD_CLEAR);
537 }
538 
539 /**
540  * tracefs_hist_destroy - deletes a histogram (needs to be enabled again)
541  * @instance: The instance the histogram is in (NULL for toplevel)
542  * @hist: The histogram to delete
543  *
544  * Deletes (removes) a running histogram. This is different than
545  * clear, as clear only clears the data but the histogram still exists.
546  * This deletes the histogram and should be called before
547  * tracefs_hist_free() to clean up properly.
548  *
549  * Returns 0 on success, -1 on error.
550  */
tracefs_hist_destroy(struct tracefs_instance * instance,struct tracefs_hist * hist)551 static inline int tracefs_hist_destroy(struct tracefs_instance *instance,
552 				       struct tracefs_hist *hist)
553 {
554 	return tracefs_hist_command(instance, hist, TRACEFS_HIST_CMD_DESTROY);
555 }
556 
557 struct tracefs_synth;
558 
559 /*
560  * DELTA_END	- end_field - start_field
561  * DELTA_START	- start_field - end_field
562  * ADD		- start_field + end_field
563  */
564 enum tracefs_synth_calc {
565 	TRACEFS_SYNTH_DELTA_END,
566 	TRACEFS_SYNTH_DELTA_START,
567 	TRACEFS_SYNTH_ADD,
568 };
569 
570 int tracefs_filter_string_append(struct tep_event *event, char **filter,
571 				 enum tracefs_filter type,
572 				 const char *field, enum tracefs_compare compare,
573 				 const char *val);
574 int tracefs_filter_string_verify(struct tep_event *event, const char *filter,
575 				 char **err);
576 
577 int tracefs_event_filter_apply(struct tracefs_instance *instance,
578 			       struct tep_event *event, const char *filter);
579 
580 int tracefs_event_filter_clear(struct tracefs_instance *instance,
581 			       struct tep_event *event);
582 
583 /** Deprecated do not use: Instead use tracefs_filter_string_append() **/
584 int tracefs_event_append_filter(struct tep_event *event, char **filter,
585 				enum tracefs_filter type,
586 				const char *field, enum tracefs_compare compare,
587 				const char *val);
588 
589 /** Deprecated do not use: Instead use tracefs_filter_string_verify()  **/
590 int tracefs_event_verify_filter(struct tep_event *event, const char *filter,
591 				char **err);
592 
593 #define TRACEFS_TIMESTAMP "common_timestamp"
594 #define TRACEFS_TIMESTAMP_USECS "common_timestamp.usecs"
595 
596 #define TRACEFS_STACKTRACE "common_stacktrace"
597 
598 enum tracefs_synth_handler {
599 	TRACEFS_SYNTH_HANDLE_NONE	= 0,
600 	TRACEFS_SYNTH_HANDLE_MATCH,
601 	TRACEFS_SYNTH_HANDLE_MAX,
602 	TRACEFS_SYNTH_HANDLE_CHANGE,
603 };
604 
605 const char *tracefs_synth_get_name(struct tracefs_synth *synth);
606 struct tracefs_synth *tracefs_synth_alloc(struct tep_handle *tep,
607 					  const char *name,
608 					  const char *start_system,
609 					  const char *start_event,
610 					  const char *end_system,
611 					  const char *end_event,
612 					  const char *start_match_field,
613 					  const char *end_match_field,
614 					  const char *match_name);
615 int tracefs_synth_add_match_field(struct tracefs_synth *synth,
616 				  const char *start_match_field,
617 				  const char *end_match_field,
618 				  const char *name);
619 int tracefs_synth_add_compare_field(struct tracefs_synth *synth,
620 				    const char *start_compare_field,
621 				    const char *end_compare_field,
622 				    enum tracefs_synth_calc calc,
623 				    const char *name);
624 int tracefs_synth_add_start_field(struct tracefs_synth *synth,
625 				  const char *start_field,
626 				  const char *name);
627 int tracefs_synth_add_end_field(struct tracefs_synth *synth,
628 				const char *end_field,
629 				const char *name);
630 int tracefs_synth_append_start_filter(struct tracefs_synth *synth,
631 				      enum tracefs_filter type,
632 				      const char *field,
633 				      enum tracefs_compare compare,
634 				      const char *val);
635 int tracefs_synth_append_end_filter(struct tracefs_synth *synth,
636 				    enum tracefs_filter type,
637 				    const char *field,
638 				    enum tracefs_compare compare,
639 				    const char *val);
640 int tracefs_synth_trace(struct tracefs_synth *synth,
641 			enum tracefs_synth_handler type, const char *field);
642 int tracefs_synth_snapshot(struct tracefs_synth *synth,
643 			   enum tracefs_synth_handler type, const char *field);
644 int tracefs_synth_save(struct tracefs_synth *synth,
645 		       enum tracefs_synth_handler type, const char *field,
646 		       char **save_fields);
647 bool tracefs_synth_complete(struct tracefs_synth *synth);
648 struct tracefs_hist *tracefs_synth_get_start_hist(struct tracefs_synth *synth);
649 int tracefs_synth_create(struct tracefs_synth *synth);
650 int tracefs_synth_destroy(struct tracefs_synth *synth);
651 void tracefs_synth_free(struct tracefs_synth *synth);
652 int tracefs_synth_set_instance(struct tracefs_synth *synth, struct tracefs_instance *instance);
653 int tracefs_synth_echo_cmd(struct trace_seq *seq, struct tracefs_synth *synth);
654 int tracefs_synth_raw_fmt(struct trace_seq *seq, struct tracefs_synth *synth);
655 const char *tracefs_synth_show_event(struct tracefs_synth *synth);
656 const char *tracefs_synth_show_start_hist(struct tracefs_synth *synth);
657 const char *tracefs_synth_show_end_hist(struct tracefs_synth *synth);
658 
659 struct tracefs_synth *tracefs_sql(struct tep_handle *tep, const char *name,
660 				  const char *sql_buffer, char **err);
661 struct tep_event *
662 tracefs_synth_get_event(struct tep_handle *tep, struct tracefs_synth *synth);
663 
664 struct tracefs_cpu;
665 
666 struct tracefs_cpu *tracefs_cpu_alloc_fd(int fd, int subbuf_size, bool nonblock);
667 struct tracefs_cpu *tracefs_cpu_open(struct tracefs_instance *instance,
668 				     int cpu, bool nonblock);
669 void tracefs_cpu_close(struct tracefs_cpu *tcpu);
670 void tracefs_cpu_free_fd(struct tracefs_cpu *tcpu);
671 int tracefs_cpu_read_size(struct tracefs_cpu *tcpu);
672 int tracefs_cpu_read(struct tracefs_cpu *tcpu, void *buffer, bool nonblock);
673 struct kbuffer *tracefs_cpu_read_buf(struct tracefs_cpu *tcpu, bool nonblock);
674 int tracefs_cpu_buffered_read(struct tracefs_cpu *tcpu, void *buffer, bool nonblock);
675 struct kbuffer *tracefs_cpu_buffered_read_buf(struct tracefs_cpu *tcpu, bool nonblock);
676 int tracefs_cpu_write(struct tracefs_cpu *tcpu, int wfd, bool nonblock);
677 int tracefs_cpu_stop(struct tracefs_cpu *tcpu);
678 int tracefs_cpu_flush(struct tracefs_cpu *tcpu, void *buffer);
679 struct kbuffer *tracefs_cpu_flush_buf(struct tracefs_cpu *tcpu);
680 int tracefs_cpu_flush_write(struct tracefs_cpu *tcpu, int wfd);
681 int tracefs_cpu_pipe(struct tracefs_cpu *tcpu, int wfd, bool nonblock);
682 
683 struct tracefs_cpu *
684 tracefs_cpu_snapshot_open(struct tracefs_instance *instance, int cpu, bool nonblock);
685 int tracefs_iterate_snapshot_events(struct tep_handle *tep,
686 				    struct tracefs_instance *instance,
687 				    cpu_set_t *cpus, int cpu_size,
688 				    int (*callback)(struct tep_event *,
689 						    struct tep_record *,
690 						    int, void *),
691 				    void *callback_context);
692 int tracefs_snapshot_snap(struct tracefs_instance *instance);
693 int tracefs_snapshot_clear(struct tracefs_instance *instance);
694 int tracefs_snapshot_free(struct tracefs_instance *instance);
695 
696 /* Memory mapping of ring buffer */
697 bool tracefs_cpu_is_mapped(struct tracefs_cpu *tcpu);
698 bool tracefs_mapped_is_supported(void);
699 int tracefs_cpu_map(struct tracefs_cpu *tcpu);
700 void tracefs_cpu_unmap(struct tracefs_cpu *tcpu);
701 struct tracefs_cpu *tracefs_cpu_open_mapped(struct tracefs_instance *instance,
702 					    int cpu, bool nonblock);
703 
704 /* Mapping vsocket cids to pids using tracing */
705 int tracefs_instance_find_cid_pid(struct tracefs_instance *instance, int cid);
706 int tracefs_find_cid_pid(int cid);
707 
708 /* More guest helpers */
709 int tracefs_time_conversion(int cpu, int *shift, int *mult, long long *offset);
710 
711 #endif /* _TRACE_FS_H */
712