From 4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2 Mon Sep 17 00:00:00 2001 From: "Tzvetomir Stoyanov (VMware)" Date: Thu, 12 Nov 2020 13:52:08 +0200 Subject: [PATCH] trace-cmd: libtracecmd API cleanup The tracecmd library is used by trace-cmd and KernelShark applications. All APIs, that are not used by KernelShark are removed from trace-cmd.h. This is the first step to cleanup the library APIs and dependencies. Link: https://lore.kernel.org/linux-trace-devel/20201112115208.1250789-3-tz.stoyanov@gmail.com Signed-off-by: Tzvetomir Stoyanov (VMware) Signed-off-by: Steven Rostedt (VMware) [Retrieved from: https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/commit/?id=4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2] Signed-off-by: Fabrice Fontaine --- Makefile | 2 +- include/trace-cmd/trace-cmd.h | 488 +----------------- include/trace-cmd/trace-filter-hash.h | 64 --- include/trace-cmd/trace-hash.h | 55 -- include/trace-cmd/trace-msg.h | 15 - .../include/private/trace-cmd-private.h | 480 +++++++++++++++++ .../include/private/trace-filter-hash.h | 64 +++ lib/trace-cmd/include/private/trace-hash.h | 55 ++ lib/trace-cmd/include/private/trace-msg.h | 15 + lib/trace-cmd/include/trace-cmd-local.h | 2 + lib/trace-cmd/trace-ftrace.c | 2 +- lib/trace-cmd/trace-hooks.c | 2 +- lib/trace-cmd/trace-recorder.c | 2 +- lib/trace-cmd/trace-timesync.c | 2 +- lib/trace-cmd/trace-util.c | 2 +- lib/traceevent/plugins/plugin_python_loader.c | 3 +- python/ctracecmd.i | 1 + tracecmd/include/trace-local.h | 2 +- 18 files changed, 637 insertions(+), 619 deletions(-) delete mode 100644 include/trace-cmd/trace-filter-hash.h delete mode 100644 include/trace-cmd/trace-hash.h delete mode 100644 include/trace-cmd/trace-msg.h create mode 100644 lib/trace-cmd/include/private/trace-cmd-private.h create mode 100644 lib/trace-cmd/include/private/trace-filter-hash.h create mode 100644 lib/trace-cmd/include/private/trace-hash.h create mode 100644 lib/trace-cmd/include/private/trace-msg.h diff --git a/Makefile b/Makefile index b034042..6ef6936 100644 --- a/Makefile +++ b/Makefile @@ -224,6 +224,7 @@ INCLUDES += -I$(src)/include/trace-cmd INCLUDES += -I$(src)/include/tracefs INCLUDES += -I$(src)/lib/traceevent/include INCLUDES += -I$(src)/lib/trace-cmd/include +INCLUDES += -I$(src)/lib/trace-cmd/include/private INCLUDES += -I$(src)/lib/tracefs/include INCLUDES += -I$(src)/tracecmd/include INCLUDES += -I$(obj)/tracecmd/include @@ -417,7 +418,6 @@ install_libs: libs $(Q)$(call do_install,$(src)/include/traceevent/event-parse.h,$(includedir_SQ)/traceevent) $(Q)$(call do_install,$(src)/include/traceevent/trace-seq.h,$(includedir_SQ)/traceevent) $(Q)$(call do_install,$(src)/include/trace-cmd/trace-cmd.h,$(includedir_SQ)/trace-cmd) - $(Q)$(call do_install,$(src)/include/trace-cmd/trace-filter-hash.h,$(includedir_SQ)/trace-cmd) $(Q)$(call do_install,$(src)/include/tracefs/tracefs.h,$(includedir_SQ)/tracefs) $(Q)$(call do_install_ld,$(TRACE_LD_FILE),$(LD_SO_CONF_DIR),$(libdir_SQ)/trace-cmd) $(Q)$(call do_install_ld,$(TRACE_LD_FILE),$(LD_SO_CONF_DIR),$(libdir_SQ)/traceevent) diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h index 3c2b474..9751ac3 100644 --- a/include/trace-cmd/trace-cmd.h +++ b/include/trace-cmd/trace-cmd.h @@ -9,497 +9,31 @@ #include "traceevent/event-parse.h" #include "tracefs/tracefs.h" -#define TRACECMD_MAGIC { 23, 8, 68 } - -#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0])) -#define __weak __attribute__((weak)) -#define __noreturn __attribute__((noreturn)) - -#define TRACECMD_ERR_MSK ((unsigned long)(-1) & ~((1UL << 14) - 1)) -#define TRACECMD_ISERR(ptr) ((unsigned long)(ptr) > TRACECMD_ERR_MSK) -#define TRACECMD_ERROR(ret) ((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK)) -#define TRACECMD_PTR2ERR(ptr) ((unisgned long)(ptr) & ~TRACECMD_ERR_MSK) - -void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size); -void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); -void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); -struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep); - -int *tracecmd_add_id(int *list, int id, int len); - -enum { - RINGBUF_TYPE_PADDING = 29, - RINGBUF_TYPE_TIME_EXTEND = 30, - RINGBUF_TYPE_TIME_STAMP = 31, -}; - -void tracecmd_record_ref(struct tep_record *record); -void free_record(struct tep_record *record); - -void tracecmd_set_debug(bool set_debug); -bool tracecmd_get_debug(void); - struct tracecmd_input; -struct tracecmd_output; -struct tracecmd_recorder; -struct hook_list; - -/* --- tracecmd plugins --- */ - -extern int tracecmd_disable_sys_plugins; -extern int tracecmd_disable_plugins; - -enum tracecmd_context { - TRACECMD_INPUT, - TRACECMD_OUTPUT, -}; - -enum tracecmd_plugin_flag { - TRACECMD_DISABLE_SYS_PLUGINS = 1, - TRACECMD_DISABLE_PLUGINS = 1 << 1, -}; - -struct trace_plugin_context; - -struct trace_plugin_context * -tracecmd_plugin_context_create(enum tracecmd_context context, void *data); - -void tracecmd_plugin_set_flag(struct trace_plugin_context *context, - enum tracecmd_plugin_flag flag); - -#define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader -#define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader -#define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias -#define _MAKE_STR(x) #x -#define MAKE_STR(x) _MAKE_STR(x) -#define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER) -#define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER) -#define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS) - -typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace); -typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace); - -struct tracecmd_input * -tracecmd_plugin_context_input(struct trace_plugin_context *trace_context); -struct tracecmd_output * -tracecmd_plugin_context_output(struct trace_plugin_context *trace_context); - -void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet); -bool tracecmd_get_quiet(struct tracecmd_output *handle); - -static inline int tracecmd_host_bigendian(void) -{ - unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; - unsigned int *ptr; - - ptr = (unsigned int *)str; - return *ptr == 0x01020304; -} - -/* --- Opening and Reading the trace.dat file --- */ - -enum { - TRACECMD_OPTION_DONE, - TRACECMD_OPTION_DATE, - TRACECMD_OPTION_CPUSTAT, - TRACECMD_OPTION_BUFFER, - TRACECMD_OPTION_TRACECLOCK, - TRACECMD_OPTION_UNAME, - TRACECMD_OPTION_HOOK, - TRACECMD_OPTION_OFFSET, - TRACECMD_OPTION_CPUCOUNT, - TRACECMD_OPTION_VERSION, - TRACECMD_OPTION_PROCMAPS, - TRACECMD_OPTION_TRACEID, - TRACECMD_OPTION_TIME_SHIFT, - TRACECMD_OPTION_GUEST, -}; - -enum { - TRACECMD_FL_IGNORE_DATE = (1 << 0), - TRACECMD_FL_BUFFER_INSTANCE = (1 << 1), - TRACECMD_FL_LATENCY = (1 << 2), - TRACECMD_FL_IN_USECS = (1 << 3), - TRACECMD_FL_FLYRECORD = (1 << 4), -}; - -struct tracecmd_ftrace { - struct tracecmd_input *handle; - struct tep_event *fgraph_ret_event; - int fgraph_ret_id; - int long_size; -}; - -struct tracecmd_proc_addr_map { - unsigned long long start; - unsigned long long end; - char *lib_name; -}; - -typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle, - struct tep_record *record); -typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle, - struct hook_list *hook, int global); -struct tracecmd_input *tracecmd_alloc(const char *file); -struct tracecmd_input *tracecmd_alloc_fd(int fd); -struct tracecmd_input *tracecmd_open(const char *file); struct tracecmd_input *tracecmd_open_head(const char *file); -struct tracecmd_input *tracecmd_open_fd(int fd); +void tracecmd_close(struct tracecmd_input *handle); int tracecmd_pair_peer(struct tracecmd_input *handle, struct tracecmd_input *peer); -void tracecmd_unpair_peer(struct tracecmd_input *handle); -void tracecmd_ref(struct tracecmd_input *handle); -void tracecmd_close(struct tracecmd_input *handle); -int tracecmd_read_headers(struct tracecmd_input *handle); -int tracecmd_get_parsing_failures(struct tracecmd_input *handle); -int tracecmd_long_size(struct tracecmd_input *handle); -int tracecmd_page_size(struct tracecmd_input *handle); -int tracecmd_cpus(struct tracecmd_input *handle); -int tracecmd_copy_headers(struct tracecmd_input *handle, int fd); -void tracecmd_set_flag(struct tracecmd_input *handle, int flag); -void tracecmd_clear_flag(struct tracecmd_input *handle, int flag); -unsigned long tracecmd_get_flags(struct tracecmd_input *handle); -unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle); -int tracecmd_get_guest_cpumap(struct tracecmd_input *handle, - unsigned long long trace_id, - const char **name, - int *vcpu_count, const int **cpu_pid); -unsigned long long tracecmd_get_tsync_peer(struct tracecmd_input *handle); -int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable); - -void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size); - -int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus); - -int tracecmd_buffer_instances(struct tracecmd_input *handle); -const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx); -struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx); -int tracecmd_is_buffer_instance(struct tracecmd_input *handle); - -void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset); -void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz); - -void tracecmd_print_events(struct tracecmd_input *handle, const char *regex); - -struct hook_list *tracecmd_hooks(struct tracecmd_input *handle); int tracecmd_init_data(struct tracecmd_input *handle); - -void tracecmd_print_stats(struct tracecmd_input *handle); -void tracecmd_print_uname(struct tracecmd_input *handle); -void tracecmd_print_version(struct tracecmd_input *handle); - struct tep_record * -tracecmd_peek_data(struct tracecmd_input *handle, int cpu); - -static inline struct tep_record * -tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu) -{ - struct tep_record *rec = tracecmd_peek_data(handle, cpu); - if (rec) - rec->ref_count++; - return rec; -} - +tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu); struct tep_record * tracecmd_read_data(struct tracecmd_input *handle, int cpu); - -struct tep_record * -tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record); - -struct tep_record * -tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu); - -struct tep_record * -tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu); - struct tep_record * tracecmd_read_at(struct tracecmd_input *handle, unsigned long long offset, int *cpu); -struct tep_record * -tracecmd_translate_data(struct tracecmd_input *handle, - void *ptr, int size); -struct tep_record * -tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu); -struct tep_record * -tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu); -int tracecmd_refresh_record(struct tracecmd_input *handle, - struct tep_record *record); - -int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle, - int cpu, unsigned long long ts); -void -tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle, - unsigned long long time); - -int tracecmd_set_cursor(struct tracecmd_input *handle, - int cpu, unsigned long long offset); -unsigned long long -tracecmd_get_cursor(struct tracecmd_input *handle, int cpu); +void free_record(struct tep_record *record); -int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo); struct tep_handle *tracecmd_get_pevent(struct tracecmd_input *handle); -bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle); -tracecmd_show_data_func -tracecmd_get_show_data_func(struct tracecmd_input *handle); -void tracecmd_set_show_data_func(struct tracecmd_input *handle, - tracecmd_show_data_func func); - -int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record); -unsigned long long tracecmd_page_ts(struct tracecmd_input *handle, - struct tep_record *record); -unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle, - struct tep_record *record); - -struct tracecmd_proc_addr_map * -tracecmd_search_task_map(struct tracecmd_input *handle, - int pid, unsigned long long addr); -#ifndef SWIG -/* hack for function graph work around */ -extern __thread struct tracecmd_input *tracecmd_curr_thread_handle; -#endif - - -/* --- Creating and Writing the trace.dat file --- */ - -struct tracecmd_event_list { - struct tracecmd_event_list *next; - const char *glob; -}; - -struct tracecmd_option; -struct tracecmd_msg_handle; - -struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus); -struct tracecmd_output *tracecmd_create_file(const char *output_file, - int cpus, char * const *cpu_data_files); -struct tracecmd_output * -tracecmd_create_file_glob(const char *output_file, - int cpus, char * const *cpu_data_files, - struct tracecmd_event_list *event_globs); -struct tracecmd_output * -tracecmd_create_init_file_glob(const char *output_file, - struct tracecmd_event_list *list); -struct tracecmd_output *tracecmd_create_init_fd(int fd); -struct tracecmd_output * -tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list); -struct tracecmd_output * -tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle, - struct tracecmd_event_list *list); -struct tracecmd_output *tracecmd_create_init_file(const char *output_file); -struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file, - const char *tracing_dir, - const char *kallsyms); -struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle, - unsigned short id, int size, - const void *data); -struct tracecmd_option * -tracecmd_add_option_v(struct tracecmd_output *handle, - unsigned short id, const struct iovec *vector, int count); - -struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle, - const char *name, int cpus); - -int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus); -int tracecmd_write_options(struct tracecmd_output *handle); -int tracecmd_append_options(struct tracecmd_output *handle); -int tracecmd_update_option(struct tracecmd_output *handle, - struct tracecmd_option *option, int size, - const void *data); -void tracecmd_output_close(struct tracecmd_output *handle); -void tracecmd_output_free(struct tracecmd_output *handle); -struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle, - const char *file); - -int tracecmd_write_cpu_data(struct tracecmd_output *handle, - int cpus, char * const *cpu_data_files); -int tracecmd_append_cpu_data(struct tracecmd_output *handle, - int cpus, char * const *cpu_data_files); -int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle, - struct tracecmd_option *option, - int cpus, char * const *cpu_data_files); - -struct tracecmd_output *tracecmd_get_output_handle_fd(int fd); - -/* --- Reading the Fly Recorder Trace --- */ - -enum { - TRACECMD_RECORD_NOSPLICE = (1 << 0), /* Use read instead of splice */ - TRACECMD_RECORD_SNAPSHOT = (1 << 1), /* Extract from snapshot */ - TRACECMD_RECORD_BLOCK = (1 << 2), /* Block on splice write */ - TRACECMD_RECORD_NOBRASS = (1 << 3), /* Splice directly without a brass pipe */ -}; - -void tracecmd_free_recorder(struct tracecmd_recorder *recorder); -struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags); -struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags); -struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd); -struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb); -struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer); -struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer); -struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb); - -int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep); -void tracecmd_stop_recording(struct tracecmd_recorder *recorder); -long tracecmd_flush_recording(struct tracecmd_recorder *recorder); - -enum tracecmd_msg_flags { - TRACECMD_MSG_FL_USE_TCP = 1 << 0, -}; - -/* for both client and server */ -struct tracecmd_msg_handle { - int fd; - short cpu_count; - short version; /* Current protocol version */ - unsigned long flags; - bool done; -}; - -struct tracecmd_msg_handle * - tracecmd_msg_handle_alloc(int fd, unsigned long flags); - -/* Closes the socket and frees the handle */ -void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle); - -/* for clients */ -int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle, - unsigned int **client_ports); -int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle, - const char *buf, int size); -int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle); -int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle); -int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle); -int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle); -int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle); - -/* for server */ -int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle); -int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle, - unsigned *ports); -int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd); -int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd); -bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle); -void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle); - -int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, - int argc, char **argv, bool use_fifos, - unsigned long long trace_id, - char *tsync_protos, - int tsync_protos_size); -int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, - int *argc, char ***argv, bool *use_fifos, - unsigned long long *trace_id, - char **tsync_protos, - unsigned int *tsync_protos_size); - -int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, - int nr_cpus, int page_size, - unsigned int *ports, bool use_fifos, - unsigned long long trace_id, - unsigned int tsync_proto, - unsigned int tsync_port); -int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, - int *nr_cpus, int *page_size, - unsigned int **ports, bool *use_fifos, - unsigned long long *trace_id, - unsigned int *tsync_proto, - unsigned int *tsync_port); - -int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle, - unsigned int sync_protocol, - unsigned int sync_msg_id, - unsigned int payload_size, char *payload); -int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle, - unsigned int *sync_protocol, - unsigned int *sync_msg_id, - unsigned int *payload_size, char **payload); - -/* --- Timestamp synchronization --- */ - -enum{ - TRACECMD_TIME_SYNC_PROTO_NONE = 0, -}; -enum{ - TRACECMD_TIME_SYNC_CMD_PROBE = 1, - TRACECMD_TIME_SYNC_CMD_STOP = 2, -}; - -#define TRACECMD_TIME_SYNC_PROTO_PTP_WEIGHT 10 - -struct tracecmd_time_sync { - unsigned int sync_proto; - int loop_interval; - pthread_mutex_t lock; - pthread_cond_t cond; - char *clock_str; - struct tracecmd_msg_handle *msg_handle; - void *context; -}; - -void tracecmd_tsync_init(void); -int tracecmd_tsync_proto_getall(char **proto_mask, int *words); -unsigned int tracecmd_tsync_proto_select(char *proto_mask, int words); -bool tsync_proto_is_supported(unsigned int proto_id); -void tracecmd_tsync_with_host(struct tracecmd_time_sync *tsync); -void tracecmd_tsync_with_guest(struct tracecmd_time_sync *tsync); -int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync, - int *count, - long long **ts, long long **offsets); -void tracecmd_tsync_free(struct tracecmd_time_sync *tsync); - -/* --- Plugin handling --- */ -extern struct tep_plugin_option trace_ftrace_options[]; - -char **trace_util_find_plugin_files(const char *suffix); -void trace_util_free_plugin_files(char **files); - -/* Used for trace-cmd list */ -void tracecmd_ftrace_load_options(void); - -/* event hooks */ - -struct hook_list { - struct hook_list *next; - struct buffer_instance *instance; - const char *hook; - char *str; - char *start_system; - char *start_event; - char *start_match; - char *end_system; - char *end_event; - char *end_match; - char *pid; - int migrate; - int global; - int stack; -}; - -struct hook_list *tracecmd_create_event_hook(const char *arg); -void tracecmd_free_hooks(struct hook_list *hooks); - -void tracecmd_plog(const char *fmt, ...); -void tracecmd_plog_error(const char *fmt, ...); -int tracecmd_set_logfile(char *logfile); - -/* --- System --- */ -unsigned long long tracecmd_generate_traceid(void); -int tracecmd_count_cpus(void); - -/* --- Hack! --- */ -int tracecmd_blk_hack(struct tracecmd_input *handle); - -/* --- Stack tracer functions --- */ -int tracecmd_stack_tracer_status(int *status); - -/* --- Debugging --- */ -struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle, - struct tep_record *record); -void *tracecmd_record_page(struct tracecmd_input *handle, - struct tep_record *record); -void *tracecmd_record_offset(struct tracecmd_input *handle, - struct tep_record *record); +unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle); +int tracecmd_get_guest_cpumap(struct tracecmd_input *handle, + unsigned long long trace_id, + const char **name, + int *vcpu_count, const int **cpu_pid); +int tracecmd_buffer_instances(struct tracecmd_input *handle); +const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx); +struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx); #endif /* _TRACE_CMD_H */ diff --git a/include/trace-cmd/trace-filter-hash.h b/include/trace-cmd/trace-filter-hash.h deleted file mode 100644 index 4111c41..0000000 --- a/include/trace-cmd/trace-filter-hash.h +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1 */ -/* - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt - * Copyright (C) 2018 VMware Inc, Steven Rostedt - * - */ -#ifndef _TRACE_FILTER_HASH_H -#define _TRACE_FILTER_HASH_H - -#include - -struct tracecmd_filter_id_item { - struct tracecmd_filter_id_item *next; - int id; -}; - -struct tracecmd_filter_id { - struct tracecmd_filter_id_item **hash; - int count; -}; - -/** - * tracecmd_quick_hash - A quick (non secured) hash alogirthm - * @val: The value to perform the hash on - * @bits: The size in bits you need to return - * - * This is a quick hashing function adapted from Donald E. Knuth's 32 - * bit multiplicative hash. See The Art of Computer Programming (TAOCP). - * Multiplication by the Prime number, closest to the golden ratio of - * 2^32. - * - * @bits is used to max the result for use cases that require - * a power of 2 return value that is less than 32 bits. Any value - * of @bits greater than 31 (or zero), will simply return the full hash on @val. - */ -static inline uint32_t tracecmd_quick_hash(uint32_t val, unsigned int bits) -{ - val *= UINT32_C(2654435761); - - if (!bits || bits > 31) - return val; - - return val & ((1 << bits) - 1); -} - -struct tracecmd_filter_id_item * - tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id); -void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id); -void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id); -void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash); -struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void); -void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash); -struct tracecmd_filter_id * - tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash); -int *tracecmd_filter_ids(struct tracecmd_filter_id *hash); -int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1, - struct tracecmd_filter_id *hash2); - -static inline int tracecmd_filter_task_count(struct tracecmd_filter_id *hash) -{ - return hash->count; -} - -#endif /* _TRACE_FILTER_HASH_H */ diff --git a/include/trace-cmd/trace-hash.h b/include/trace-cmd/trace-hash.h deleted file mode 100644 index aa92cdf..0000000 --- a/include/trace-cmd/trace-hash.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (C) 2014 Red Hat Inc, Steven Rostedt - * - */ -#ifndef _TRACE_HASH_H -#define _TRACE_HASH_H - -struct trace_hash_item { - struct trace_hash_item *next; - struct trace_hash_item *prev; - unsigned long long key; -}; - -struct trace_hash { - struct trace_hash_item **buckets; - int nr_buckets; - int power; -}; - -int trace_hash_init(struct trace_hash *hash, int buckets); -void trace_hash_free(struct trace_hash *hash); -int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item); -int trace_hash_empty(struct trace_hash *hash); - -static inline void trace_hash_del(struct trace_hash_item *item) -{ - struct trace_hash_item *prev = item->prev; - - prev->next = item->next; - if (item->next) - item->next->prev = prev; -} - -#define trace_hash_for_each_bucket(bucket, hash) \ - for (bucket = (hash)->buckets; \ - (bucket) < (hash)->buckets + (hash)->nr_buckets; (bucket)++) - -#define trace_hash_for_each_item(item, bucket) \ - for ((item = *(bucket)); item; item = (item)->next) - -#define trace_hash_for_each_item_safe(item, n, bucket) \ - for ((item = *(bucket)), n = item ? item->next : NULL; item; \ - item = n, n = item ? (item)->next : NULL) - -#define trace_hash_while_item(item, bucket) \ - while ((item = *(bucket))) - -typedef int (*trace_hash_func)(struct trace_hash_item *item, void *data); - -struct trace_hash_item * -trace_hash_find(struct trace_hash *hash, unsigned long long key, - trace_hash_func match, void *data); - -#endif /* _TRACE_HASH_H */ diff --git a/include/trace-cmd/trace-msg.h b/include/trace-cmd/trace-msg.h deleted file mode 100644 index aab8a69..0000000 --- a/include/trace-cmd/trace-msg.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _TRACE_MSG_H_ -#define _TRACE_MSG_H_ - -#include - -#define UDP_MAX_PACKET (65536 - 20) -#define V3_MAGIC "766679\0" -#define V3_CPU "-1V3" - -#define V1_PROTOCOL 1 -#define V3_PROTOCOL 3 - -extern unsigned int page_size; - -#endif /* _TRACE_MSG_H_ */ diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h new file mode 100644 index 0000000..458760e --- /dev/null +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -0,0 +1,480 @@ +/* SPDX-License-Identifier: LGPL-2.1 */ +/* + * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt + * + */ +#ifndef _TRACE_CMD_PRIVATE_H +#define _TRACE_CMD_PRIVATE_H + +#include "traceevent/event-parse.h" +#include "trace-cmd/trace-cmd.h" + +#define TRACECMD_MAGIC { 23, 8, 68 } + +#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0])) +#define __weak __attribute__((weak)) +#define __noreturn __attribute__((noreturn)) + +#define TRACECMD_ERR_MSK ((unsigned long)(-1) & ~((1UL << 14) - 1)) +#define TRACECMD_ISERR(ptr) ((unsigned long)(ptr) > TRACECMD_ERR_MSK) +#define TRACECMD_ERROR(ret) ((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK)) +#define TRACECMD_PTR2ERR(ptr) ((unisgned long)(ptr) & ~TRACECMD_ERR_MSK) + +void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size); +void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); +void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); +struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep); + +int *tracecmd_add_id(int *list, int id, int len); + +enum { + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +void tracecmd_record_ref(struct tep_record *record); + +void tracecmd_set_debug(bool set_debug); +bool tracecmd_get_debug(void); + +struct tracecmd_output; +struct tracecmd_recorder; +struct hook_list; + +/* --- tracecmd plugins --- */ + +extern int tracecmd_disable_sys_plugins; +extern int tracecmd_disable_plugins; + +enum tracecmd_context { + TRACECMD_INPUT, + TRACECMD_OUTPUT, +}; + +enum tracecmd_plugin_flag { + TRACECMD_DISABLE_SYS_PLUGINS = 1, + TRACECMD_DISABLE_PLUGINS = 1 << 1, +}; + +struct trace_plugin_context; + +struct trace_plugin_context * +tracecmd_plugin_context_create(enum tracecmd_context context, void *data); + +void tracecmd_plugin_set_flag(struct trace_plugin_context *context, + enum tracecmd_plugin_flag flag); + +#define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader +#define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader +#define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias +#define _MAKE_STR(x) #x +#define MAKE_STR(x) _MAKE_STR(x) +#define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER) +#define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER) +#define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS) + +typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace); +typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace); + +struct tracecmd_input * +tracecmd_plugin_context_input(struct trace_plugin_context *trace_context); +struct tracecmd_output * +tracecmd_plugin_context_output(struct trace_plugin_context *trace_context); + +void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet); +bool tracecmd_get_quiet(struct tracecmd_output *handle); + +static inline int tracecmd_host_bigendian(void) +{ + unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; + unsigned int *ptr; + + ptr = (unsigned int *)str; + return *ptr == 0x01020304; +} + +/* --- Opening and Reading the trace.dat file --- */ + +enum { + TRACECMD_OPTION_DONE, + TRACECMD_OPTION_DATE, + TRACECMD_OPTION_CPUSTAT, + TRACECMD_OPTION_BUFFER, + TRACECMD_OPTION_TRACECLOCK, + TRACECMD_OPTION_UNAME, + TRACECMD_OPTION_HOOK, + TRACECMD_OPTION_OFFSET, + TRACECMD_OPTION_CPUCOUNT, + TRACECMD_OPTION_VERSION, + TRACECMD_OPTION_PROCMAPS, + TRACECMD_OPTION_TRACEID, + TRACECMD_OPTION_TIME_SHIFT, + TRACECMD_OPTION_GUEST, +}; + +enum { + TRACECMD_FL_IGNORE_DATE = (1 << 0), + TRACECMD_FL_BUFFER_INSTANCE = (1 << 1), + TRACECMD_FL_LATENCY = (1 << 2), + TRACECMD_FL_IN_USECS = (1 << 3), + TRACECMD_FL_FLYRECORD = (1 << 4), +}; + +struct tracecmd_ftrace { + struct tracecmd_input *handle; + struct tep_event *fgraph_ret_event; + int fgraph_ret_id; + int long_size; +}; + +struct tracecmd_proc_addr_map { + unsigned long long start; + unsigned long long end; + char *lib_name; +}; + +typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle, + struct tep_record *record); +typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle, + struct hook_list *hook, int global); + +struct tracecmd_input *tracecmd_alloc(const char *file); +struct tracecmd_input *tracecmd_alloc_fd(int fd); +struct tracecmd_input *tracecmd_open(const char *file); +struct tracecmd_input *tracecmd_open_fd(int fd); +void tracecmd_unpair_peer(struct tracecmd_input *handle); +void tracecmd_ref(struct tracecmd_input *handle); +int tracecmd_read_headers(struct tracecmd_input *handle); +int tracecmd_get_parsing_failures(struct tracecmd_input *handle); +int tracecmd_long_size(struct tracecmd_input *handle); +int tracecmd_page_size(struct tracecmd_input *handle); +int tracecmd_cpus(struct tracecmd_input *handle); +int tracecmd_copy_headers(struct tracecmd_input *handle, int fd); +void tracecmd_set_flag(struct tracecmd_input *handle, int flag); +void tracecmd_clear_flag(struct tracecmd_input *handle, int flag); +unsigned long tracecmd_get_flags(struct tracecmd_input *handle); +unsigned long long tracecmd_get_tsync_peer(struct tracecmd_input *handle); +int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable); + +void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size); + +int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus); + +int tracecmd_is_buffer_instance(struct tracecmd_input *handle); + +void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset); +void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz); + +void tracecmd_print_events(struct tracecmd_input *handle, const char *regex); + +struct hook_list *tracecmd_hooks(struct tracecmd_input *handle); + +void tracecmd_print_stats(struct tracecmd_input *handle); +void tracecmd_print_uname(struct tracecmd_input *handle); +void tracecmd_print_version(struct tracecmd_input *handle); + +struct tep_record * +tracecmd_peek_data(struct tracecmd_input *handle, int cpu); + +static inline struct tep_record * +tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu) +{ + struct tep_record *rec = tracecmd_peek_data(handle, cpu); + if (rec) + rec->ref_count++; + return rec; +} + +struct tep_record * +tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record); + +struct tep_record * +tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu); + +struct tep_record * +tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu); + +struct tep_record * +tracecmd_translate_data(struct tracecmd_input *handle, + void *ptr, int size); +struct tep_record * +tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu); +int tracecmd_refresh_record(struct tracecmd_input *handle, + struct tep_record *record); + +int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle, + int cpu, unsigned long long ts); +void +tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle, + unsigned long long time); + +int tracecmd_set_cursor(struct tracecmd_input *handle, + int cpu, unsigned long long offset); +unsigned long long +tracecmd_get_cursor(struct tracecmd_input *handle, int cpu); + +int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo); +bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle); +tracecmd_show_data_func +tracecmd_get_show_data_func(struct tracecmd_input *handle); +void tracecmd_set_show_data_func(struct tracecmd_input *handle, + tracecmd_show_data_func func); + +int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record); +unsigned long long tracecmd_page_ts(struct tracecmd_input *handle, + struct tep_record *record); +unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle, + struct tep_record *record); + +struct tracecmd_proc_addr_map * +tracecmd_search_task_map(struct tracecmd_input *handle, + int pid, unsigned long long addr); +#ifndef SWIG +/* hack for function graph work around */ +extern __thread struct tracecmd_input *tracecmd_curr_thread_handle; +#endif + + +/* --- Creating and Writing the trace.dat file --- */ + +struct tracecmd_event_list { + struct tracecmd_event_list *next; + const char *glob; +}; + +struct tracecmd_option; +struct tracecmd_msg_handle; + +struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus); +struct tracecmd_output *tracecmd_create_file(const char *output_file, + int cpus, char * const *cpu_data_files); +struct tracecmd_output * +tracecmd_create_file_glob(const char *output_file, + int cpus, char * const *cpu_data_files, + struct tracecmd_event_list *event_globs); +struct tracecmd_output * +tracecmd_create_init_file_glob(const char *output_file, + struct tracecmd_event_list *list); +struct tracecmd_output *tracecmd_create_init_fd(int fd); +struct tracecmd_output * +tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list); +struct tracecmd_output * +tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle, + struct tracecmd_event_list *list); +struct tracecmd_output *tracecmd_create_init_file(const char *output_file); +struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file, + const char *tracing_dir, + const char *kallsyms); +struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle, + unsigned short id, int size, + const void *data); +struct tracecmd_option * +tracecmd_add_option_v(struct tracecmd_output *handle, + unsigned short id, const struct iovec *vector, int count); + +struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle, + const char *name, int cpus); + +int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus); +int tracecmd_write_options(struct tracecmd_output *handle); +int tracecmd_append_options(struct tracecmd_output *handle); +int tracecmd_update_option(struct tracecmd_output *handle, + struct tracecmd_option *option, int size, + const void *data); +void tracecmd_output_close(struct tracecmd_output *handle); +void tracecmd_output_free(struct tracecmd_output *handle); +struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle, + const char *file); + +int tracecmd_write_cpu_data(struct tracecmd_output *handle, + int cpus, char * const *cpu_data_files); +int tracecmd_append_cpu_data(struct tracecmd_output *handle, + int cpus, char * const *cpu_data_files); +int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle, + struct tracecmd_option *option, + int cpus, char * const *cpu_data_files); + +struct tracecmd_output *tracecmd_get_output_handle_fd(int fd); + +/* --- Reading the Fly Recorder Trace --- */ + +enum { + TRACECMD_RECORD_NOSPLICE = (1 << 0), /* Use read instead of splice */ + TRACECMD_RECORD_SNAPSHOT = (1 << 1), /* Extract from snapshot */ + TRACECMD_RECORD_BLOCK = (1 << 2), /* Block on splice write */ + TRACECMD_RECORD_NOBRASS = (1 << 3), /* Splice directly without a brass pipe */ +}; + +void tracecmd_free_recorder(struct tracecmd_recorder *recorder); +struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags); +struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags); +struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd); +struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb); +struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer); +struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer); +struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb); + +int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep); +void tracecmd_stop_recording(struct tracecmd_recorder *recorder); +long tracecmd_flush_recording(struct tracecmd_recorder *recorder); + +enum tracecmd_msg_flags { + TRACECMD_MSG_FL_USE_TCP = 1 << 0, +}; + +/* for both client and server */ +struct tracecmd_msg_handle { + int fd; + short cpu_count; + short version; /* Current protocol version */ + unsigned long flags; + bool done; +}; + +struct tracecmd_msg_handle * +tracecmd_msg_handle_alloc(int fd, unsigned long flags); + +/* Closes the socket and frees the handle */ +void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle); + +/* for clients */ +int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle, + unsigned int **client_ports); +int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle, + const char *buf, int size); +int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle); + +/* for server */ +int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle, + unsigned *ports); +int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd); +int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd); +bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle); +void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle); + +int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, + int argc, char **argv, bool use_fifos, + unsigned long long trace_id, + char *tsync_protos, + int tsync_protos_size); +int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, + int *argc, char ***argv, bool *use_fifos, + unsigned long long *trace_id, + char **tsync_protos, + unsigned int *tsync_protos_size); + +int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, + int nr_cpus, int page_size, + unsigned int *ports, bool use_fifos, + unsigned long long trace_id, + unsigned int tsync_proto, + unsigned int tsync_port); +int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, + int *nr_cpus, int *page_size, + unsigned int **ports, bool *use_fifos, + unsigned long long *trace_id, + unsigned int *tsync_proto, + unsigned int *tsync_port); + +int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle, + unsigned int sync_protocol, + unsigned int sync_msg_id, + unsigned int payload_size, char *payload); +int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle, + unsigned int *sync_protocol, + unsigned int *sync_msg_id, + unsigned int *payload_size, char **payload); + +/* --- Timestamp synchronization --- */ + +enum{ + TRACECMD_TIME_SYNC_PROTO_NONE = 0, +}; +enum{ + TRACECMD_TIME_SYNC_CMD_PROBE = 1, + TRACECMD_TIME_SYNC_CMD_STOP = 2, +}; + +#define TRACECMD_TIME_SYNC_PROTO_PTP_WEIGHT 10 + +struct tracecmd_time_sync { + unsigned int sync_proto; + int loop_interval; + pthread_mutex_t lock; + pthread_cond_t cond; + char *clock_str; + struct tracecmd_msg_handle *msg_handle; + void *context; +}; + +void tracecmd_tsync_init(void); +int tracecmd_tsync_proto_getall(char **proto_mask, int *words); +unsigned int tracecmd_tsync_proto_select(char *proto_mask, int words); +bool tsync_proto_is_supported(unsigned int proto_id); +void tracecmd_tsync_with_host(struct tracecmd_time_sync *tsync); +void tracecmd_tsync_with_guest(struct tracecmd_time_sync *tsync); +int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync, + int *count, + long long **ts, long long **offsets); +void tracecmd_tsync_free(struct tracecmd_time_sync *tsync); + +/* --- Plugin handling --- */ +extern struct tep_plugin_option trace_ftrace_options[]; + +char **trace_util_find_plugin_files(const char *suffix); +void trace_util_free_plugin_files(char **files); + +/* Used for trace-cmd list */ +void tracecmd_ftrace_load_options(void); + +/* event hooks */ + +struct hook_list { + struct hook_list *next; + struct buffer_instance *instance; + const char *hook; + char *str; + char *start_system; + char *start_event; + char *start_match; + char *end_system; + char *end_event; + char *end_match; + char *pid; + int migrate; + int global; + int stack; +}; + +struct hook_list *tracecmd_create_event_hook(const char *arg); +void tracecmd_free_hooks(struct hook_list *hooks); + +void tracecmd_plog(const char *fmt, ...); +void tracecmd_plog_error(const char *fmt, ...); +int tracecmd_set_logfile(char *logfile); + +/* --- System --- */ +unsigned long long tracecmd_generate_traceid(void); +int tracecmd_count_cpus(void); + +/* --- Hack! --- */ +int tracecmd_blk_hack(struct tracecmd_input *handle); + +/* --- Stack tracer functions --- */ +int tracecmd_stack_tracer_status(int *status); + +/* --- Debugging --- */ +struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle, + struct tep_record *record); +void *tracecmd_record_page(struct tracecmd_input *handle, + struct tep_record *record); +void *tracecmd_record_offset(struct tracecmd_input *handle, + struct tep_record *record); + +#endif /* _TRACE_CMD_PRIVATE_H */ diff --git a/lib/trace-cmd/include/private/trace-filter-hash.h b/lib/trace-cmd/include/private/trace-filter-hash.h new file mode 100644 index 0000000..4111c41 --- /dev/null +++ b/lib/trace-cmd/include/private/trace-filter-hash.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: LGPL-2.1 */ +/* + * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt + * Copyright (C) 2018 VMware Inc, Steven Rostedt + * + */ +#ifndef _TRACE_FILTER_HASH_H +#define _TRACE_FILTER_HASH_H + +#include + +struct tracecmd_filter_id_item { + struct tracecmd_filter_id_item *next; + int id; +}; + +struct tracecmd_filter_id { + struct tracecmd_filter_id_item **hash; + int count; +}; + +/** + * tracecmd_quick_hash - A quick (non secured) hash alogirthm + * @val: The value to perform the hash on + * @bits: The size in bits you need to return + * + * This is a quick hashing function adapted from Donald E. Knuth's 32 + * bit multiplicative hash. See The Art of Computer Programming (TAOCP). + * Multiplication by the Prime number, closest to the golden ratio of + * 2^32. + * + * @bits is used to max the result for use cases that require + * a power of 2 return value that is less than 32 bits. Any value + * of @bits greater than 31 (or zero), will simply return the full hash on @val. + */ +static inline uint32_t tracecmd_quick_hash(uint32_t val, unsigned int bits) +{ + val *= UINT32_C(2654435761); + + if (!bits || bits > 31) + return val; + + return val & ((1 << bits) - 1); +} + +struct tracecmd_filter_id_item * + tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id); +void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id); +void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id); +void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash); +struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void); +void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash); +struct tracecmd_filter_id * + tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash); +int *tracecmd_filter_ids(struct tracecmd_filter_id *hash); +int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1, + struct tracecmd_filter_id *hash2); + +static inline int tracecmd_filter_task_count(struct tracecmd_filter_id *hash) +{ + return hash->count; +} + +#endif /* _TRACE_FILTER_HASH_H */ diff --git a/lib/trace-cmd/include/private/trace-hash.h b/lib/trace-cmd/include/private/trace-hash.h new file mode 100644 index 0000000..aa92cdf --- /dev/null +++ b/lib/trace-cmd/include/private/trace-hash.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2014 Red Hat Inc, Steven Rostedt + * + */ +#ifndef _TRACE_HASH_H +#define _TRACE_HASH_H + +struct trace_hash_item { + struct trace_hash_item *next; + struct trace_hash_item *prev; + unsigned long long key; +}; + +struct trace_hash { + struct trace_hash_item **buckets; + int nr_buckets; + int power; +}; + +int trace_hash_init(struct trace_hash *hash, int buckets); +void trace_hash_free(struct trace_hash *hash); +int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item); +int trace_hash_empty(struct trace_hash *hash); + +static inline void trace_hash_del(struct trace_hash_item *item) +{ + struct trace_hash_item *prev = item->prev; + + prev->next = item->next; + if (item->next) + item->next->prev = prev; +} + +#define trace_hash_for_each_bucket(bucket, hash) \ + for (bucket = (hash)->buckets; \ + (bucket) < (hash)->buckets + (hash)->nr_buckets; (bucket)++) + +#define trace_hash_for_each_item(item, bucket) \ + for ((item = *(bucket)); item; item = (item)->next) + +#define trace_hash_for_each_item_safe(item, n, bucket) \ + for ((item = *(bucket)), n = item ? item->next : NULL; item; \ + item = n, n = item ? (item)->next : NULL) + +#define trace_hash_while_item(item, bucket) \ + while ((item = *(bucket))) + +typedef int (*trace_hash_func)(struct trace_hash_item *item, void *data); + +struct trace_hash_item * +trace_hash_find(struct trace_hash *hash, unsigned long long key, + trace_hash_func match, void *data); + +#endif /* _TRACE_HASH_H */ diff --git a/lib/trace-cmd/include/private/trace-msg.h b/lib/trace-cmd/include/private/trace-msg.h new file mode 100644 index 0000000..aab8a69 --- /dev/null +++ b/lib/trace-cmd/include/private/trace-msg.h @@ -0,0 +1,15 @@ +#ifndef _TRACE_MSG_H_ +#define _TRACE_MSG_H_ + +#include + +#define UDP_MAX_PACKET (65536 - 20) +#define V3_MAGIC "766679\0" +#define V3_CPU "-1V3" + +#define V1_PROTOCOL 1 +#define V3_PROTOCOL 3 + +extern unsigned int page_size; + +#endif /* _TRACE_MSG_H_ */ diff --git a/lib/trace-cmd/include/trace-cmd-local.h b/lib/trace-cmd/include/trace-cmd-local.h index 95dce66..d0a7365 100644 --- a/lib/trace-cmd/include/trace-cmd-local.h +++ b/lib/trace-cmd/include/trace-cmd-local.h @@ -6,6 +6,8 @@ #ifndef _TRACE_CMD_LOCAL_H #define _TRACE_CMD_LOCAL_H +#include "trace-cmd-private.h" + /* Can be overridden */ void warning(const char *fmt, ...); diff --git a/lib/trace-cmd/trace-ftrace.c b/lib/trace-cmd/trace-ftrace.c index 20bf71f..df7335f 100644 --- a/lib/trace-cmd/trace-ftrace.c +++ b/lib/trace-cmd/trace-ftrace.c @@ -8,7 +8,7 @@ #include #include -#include "trace-cmd.h" +#include "trace-cmd-private.h" struct tep_plugin_option trace_ftrace_options[] = { { diff --git a/lib/trace-cmd/trace-hooks.c b/lib/trace-cmd/trace-hooks.c index 8c969a6..2dadf61 100644 --- a/lib/trace-cmd/trace-hooks.c +++ b/lib/trace-cmd/trace-hooks.c @@ -8,7 +8,7 @@ #include #include -#include "trace-cmd.h" +#include "trace-cmd-private.h" #include "event-utils.h" struct hook_list *tracecmd_create_event_hook(const char *arg) diff --git a/lib/trace-cmd/trace-recorder.c b/lib/trace-cmd/trace-recorder.c index 2a6e2b6..6b647d6 100644 --- a/lib/trace-cmd/trace-recorder.c +++ b/lib/trace-cmd/trace-recorder.c @@ -13,7 +13,7 @@ #include #include "tracefs.h" -#include "trace-cmd.h" +#include "trace-cmd-private.h" #include "event-utils.h" /* F_GETPIPE_SZ was introduced in 2.6.35, older systems don't have it */ diff --git a/lib/trace-cmd/trace-timesync.c b/lib/trace-cmd/trace-timesync.c index 7a6a7eb..390e9d9 100644 --- a/lib/trace-cmd/trace-timesync.c +++ b/lib/trace-cmd/trace-timesync.c @@ -17,7 +17,7 @@ #include #include -#include "trace-cmd.h" +#include "trace-cmd-private.h" #include "tracefs.h" #include "event-utils.h" #include "trace-tsync-local.h" diff --git a/lib/trace-cmd/trace-util.c b/lib/trace-cmd/trace-util.c index 0ead96e..6b5d872 100644 --- a/lib/trace-cmd/trace-util.c +++ b/lib/trace-cmd/trace-util.c @@ -21,7 +21,7 @@ #include #include -#include "trace-cmd.h" +#include "trace-cmd-private.h" #include "event-utils.h" #define LOCAL_PLUGIN_DIR ".trace-cmd/plugins" diff --git a/lib/traceevent/plugins/plugin_python_loader.c b/lib/traceevent/plugins/plugin_python_loader.c index 776bf12..01bdfad 100644 --- a/lib/traceevent/plugins/plugin_python_loader.c +++ b/lib/traceevent/plugins/plugin_python_loader.c @@ -1,6 +1,7 @@ #include #include -#include "trace-cmd.h" +#include "event-parse.h" +#include "trace-cmd-private.h" #ifndef PYTHON_DIR #define PYTHON_DIR "." diff --git a/python/ctracecmd.i b/python/ctracecmd.i index 01cd0d5..5f7181c 100644 --- a/python/ctracecmd.i +++ b/python/ctracecmd.i @@ -15,6 +15,7 @@ %{ #include "trace-cmd.h" +#include "event-parse.h" #include "event-utils.h" #include %} diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h index 207aa68..28d1b4e 100644 --- a/tracecmd/include/trace-local.h +++ b/tracecmd/include/trace-local.h @@ -9,7 +9,7 @@ #include #include /* for DIR */ -#include "trace-cmd.h" +#include "trace-cmd-private.h" #include "event-utils.h" #define TRACE_AGENT_DEFAULT_PORT 823 -- 2.29.2