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