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