142 lines
3.8 KiB
C
142 lines
3.8 KiB
C
|
|
/* SPDX-License-Identifier: LGPL-2.1 */
|
||
|
|
/*
|
||
|
|
* Copyright (C) 2019, VMware, Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
#ifndef _TRACE_FS_LOCAL_H
|
||
|
|
#define _TRACE_FS_LOCAL_H
|
||
|
|
|
||
|
|
#include <pthread.h>
|
||
|
|
|
||
|
|
#define __hidden __attribute__((visibility ("hidden")))
|
||
|
|
#define __weak __attribute__((weak))
|
||
|
|
|
||
|
|
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
|
||
|
|
|
||
|
|
/* Will cause a division by zero warning if cond is true */
|
||
|
|
#define BUILD_BUG_ON(cond) \
|
||
|
|
do { if (!(1/!(cond))) { } } while (0)
|
||
|
|
|
||
|
|
#define HASH_BITS 10
|
||
|
|
|
||
|
|
struct tracefs_options_mask {
|
||
|
|
unsigned long long mask;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct follow_event {
|
||
|
|
struct tep_event *event;
|
||
|
|
void *callback_data;
|
||
|
|
int (*callback)(struct tep_event *,
|
||
|
|
struct tep_record *,
|
||
|
|
int, void *);
|
||
|
|
};
|
||
|
|
|
||
|
|
struct tracefs_instance {
|
||
|
|
struct tracefs_options_mask supported_opts;
|
||
|
|
struct tracefs_options_mask enabled_opts;
|
||
|
|
struct follow_event *followers;
|
||
|
|
struct follow_event *missed_followers;
|
||
|
|
char *trace_dir;
|
||
|
|
char *name;
|
||
|
|
pthread_mutex_t lock;
|
||
|
|
int ref;
|
||
|
|
int flags;
|
||
|
|
int ftrace_filter_fd;
|
||
|
|
int ftrace_notrace_fd;
|
||
|
|
int ftrace_marker_fd;
|
||
|
|
int ftrace_marker_raw_fd;
|
||
|
|
int nr_followers;
|
||
|
|
int nr_missed_followers;
|
||
|
|
bool pipe_keep_going;
|
||
|
|
bool iterate_keep_going;
|
||
|
|
};
|
||
|
|
|
||
|
|
extern pthread_mutex_t toplevel_lock;
|
||
|
|
|
||
|
|
static inline pthread_mutex_t *trace_get_lock(struct tracefs_instance *instance)
|
||
|
|
{
|
||
|
|
return instance ? &instance->lock : &toplevel_lock;
|
||
|
|
}
|
||
|
|
|
||
|
|
void trace_put_instance(struct tracefs_instance *instance);
|
||
|
|
int trace_get_instance(struct tracefs_instance *instance);
|
||
|
|
|
||
|
|
/* Can be overridden */
|
||
|
|
void tracefs_warning(const char *fmt, ...);
|
||
|
|
|
||
|
|
int str_read_file(const char *file, char **buffer, bool warn);
|
||
|
|
char *trace_append_file(const char *dir, const char *name);
|
||
|
|
char *trace_find_tracing_dir(bool debugfs);
|
||
|
|
|
||
|
|
#ifndef ACCESSPERMS
|
||
|
|
#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifndef ALLPERMS
|
||
|
|
#define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) /* 07777 */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifndef DEFFILEMODE
|
||
|
|
#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666*/
|
||
|
|
#endif
|
||
|
|
|
||
|
|
struct tracefs_options_mask *
|
||
|
|
supported_opts_mask(struct tracefs_instance *instance);
|
||
|
|
|
||
|
|
struct tracefs_options_mask *
|
||
|
|
enabled_opts_mask(struct tracefs_instance *instance);
|
||
|
|
|
||
|
|
char **trace_list_create_empty(void);
|
||
|
|
int trace_list_pop(char **list);
|
||
|
|
|
||
|
|
char *append_string(char *str, const char *delim, const char *add);
|
||
|
|
int trace_test_state(int state);
|
||
|
|
bool trace_verify_event_field(struct tep_event *event,
|
||
|
|
const char *field_name,
|
||
|
|
const struct tep_format_field **ptr_field);
|
||
|
|
int trace_append_filter(char **filter, unsigned int *state,
|
||
|
|
unsigned int *open_parens,
|
||
|
|
struct tep_event *event,
|
||
|
|
enum tracefs_filter type,
|
||
|
|
const char *field_name,
|
||
|
|
enum tracefs_compare compare,
|
||
|
|
const char *val);
|
||
|
|
|
||
|
|
struct tracefs_synth *synth_init_from(struct tep_handle *tep,
|
||
|
|
const char *start_system,
|
||
|
|
const char *start_event);
|
||
|
|
|
||
|
|
#define HIST_COUNTER_TYPE (TRACEFS_HIST_KEY_MAX + 100)
|
||
|
|
int synth_add_start_field(struct tracefs_synth *synth,
|
||
|
|
const char *start_field,
|
||
|
|
const char *name,
|
||
|
|
enum tracefs_hist_key_type type, int cnt);
|
||
|
|
|
||
|
|
/* Internal interface for ftrace dynamic events */
|
||
|
|
|
||
|
|
struct tracefs_dynevent {
|
||
|
|
char *trace_file;
|
||
|
|
char *prefix;
|
||
|
|
char *system;
|
||
|
|
char *event;
|
||
|
|
char *address;
|
||
|
|
char *format;
|
||
|
|
enum tracefs_dynevent_type type;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct tracefs_dynevent *
|
||
|
|
dynevent_alloc(enum tracefs_dynevent_type type, const char *system,
|
||
|
|
const char *event, const char *address, const char *format);
|
||
|
|
int dynevent_get_count(unsigned int types, const char *system);
|
||
|
|
|
||
|
|
int trace_load_events(struct tep_handle *tep,
|
||
|
|
const char *tracing_dir, const char *system);
|
||
|
|
int trace_rescan_events(struct tep_handle *tep,
|
||
|
|
const char *tracing_dir, const char *system);
|
||
|
|
struct tep_event *get_tep_event(struct tep_handle *tep,
|
||
|
|
const char *system, const char *name);
|
||
|
|
|
||
|
|
unsigned int quick_hash(const char *str);
|
||
|
|
|
||
|
|
#endif /* _TRACE_FS_LOCAL_H */
|