From 17c7f3d51753a4df2166dbb3477d0c20e87a4206 Mon Sep 17 00:00:00 2001 From: Fabrice Fontaine Date: Mon, 4 Jan 2021 08:39:20 +0100 Subject: [PATCH] package/trace-cmd: fix build with musl Fixes: - http://autobuild.buildroot.org/results/85ba0718f51eea348472dba89c566c136314a61e Signed-off-by: Fabrice Fontaine Signed-off-by: Thomas Petazzoni --- ...01-trace-cmd-libtracecmd-API-cleanup.patch | 1486 +++++++++++++++++ ...make-it-build-against-musl-C-library.patch | 140 ++ 2 files changed, 1626 insertions(+) create mode 100644 package/trace-cmd/0001-trace-cmd-libtracecmd-API-cleanup.patch create mode 100644 package/trace-cmd/0002-trace-cmd-make-it-build-against-musl-C-library.patch diff --git a/package/trace-cmd/0001-trace-cmd-libtracecmd-API-cleanup.patch b/package/trace-cmd/0001-trace-cmd-libtracecmd-API-cleanup.patch new file mode 100644 index 0000000000..a0dee21020 --- /dev/null +++ b/package/trace-cmd/0001-trace-cmd-libtracecmd-API-cleanup.patch @@ -0,0 +1,1486 @@ +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 + diff --git a/package/trace-cmd/0002-trace-cmd-make-it-build-against-musl-C-library.patch b/package/trace-cmd/0002-trace-cmd-make-it-build-against-musl-C-library.patch new file mode 100644 index 0000000000..64021245dc --- /dev/null +++ b/package/trace-cmd/0002-trace-cmd-make-it-build-against-musl-C-library.patch @@ -0,0 +1,140 @@ +From 1a000636c1828eecdcec5360a51623ef4ffbff04 Mon Sep 17 00:00:00 2001 +From: Beniamin Sandu +Date: Mon, 30 Nov 2020 14:27:55 +0200 +Subject: [PATCH] trace-cmd: make it build against musl C library + +* add some missing headers and macros +* set pthread affinity using pthread_setaffinity_np after creating the thread +instead of pthread_attr_setaffinity_np (which seems to not be implemented +in musl) + +Tested using https://musl.cc/x86_64-linux-musl-native.tgz + +Link: https://lore.kernel.org/linux-trace-devel/20201130122755.31000-1-beniaminsandu@gmail.com + +Reviewed-by: Tzvetomir Stoyanov (VMware) +Signed-off-by: Beniamin Sandu +[ Fixed a whitespace issue ] +Signed-off-by: Steven Rostedt (VMware) +[Retrieved from: +https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/commit/?id=1a000636c1828eecdcec5360a51623ef4ffbff04] +Signed-off-by: Fabrice Fontaine +--- + .../include/private/trace-cmd-private.h | 1 + + lib/trace-cmd/include/trace-cmd-local.h | 1 + + lib/tracefs/include/tracefs-local.h | 12 ++++++++++++ + lib/tracefs/tracefs-events.c | 1 + + tracecmd/include/trace-local.h | 1 + + tracecmd/trace-tsync.c | 16 +++++++++++----- + 6 files changed, 27 insertions(+), 5 deletions(-) + +diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h +index 458760e5..a0dac5da 100644 +--- a/lib/trace-cmd/include/private/trace-cmd-private.h ++++ b/lib/trace-cmd/include/private/trace-cmd-private.h +@@ -6,6 +6,7 @@ + #ifndef _TRACE_CMD_PRIVATE_H + #define _TRACE_CMD_PRIVATE_H + ++#include + #include "traceevent/event-parse.h" + #include "trace-cmd/trace-cmd.h" + +diff --git a/lib/trace-cmd/include/trace-cmd-local.h b/lib/trace-cmd/include/trace-cmd-local.h +index d0a7365a..0cd27441 100644 +--- a/lib/trace-cmd/include/trace-cmd-local.h ++++ b/lib/trace-cmd/include/trace-cmd-local.h +@@ -6,6 +6,7 @@ + #ifndef _TRACE_CMD_LOCAL_H + #define _TRACE_CMD_LOCAL_H + ++#include + #include "trace-cmd-private.h" + + /* Can be overridden */ +diff --git a/lib/tracefs/include/tracefs-local.h b/lib/tracefs/include/tracefs-local.h +index 9cc371b4..bdbf89e8 100644 +--- a/lib/tracefs/include/tracefs-local.h ++++ b/lib/tracefs/include/tracefs-local.h +@@ -13,4 +13,16 @@ void warning(const char *fmt, ...); + int str_read_file(const char *file, char **buffer); + char *trace_append_file(const char *dir, const char *name); + ++#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 ++ + #endif /* _TRACE_FS_LOCAL_H */ +diff --git a/lib/tracefs/tracefs-events.c b/lib/tracefs/tracefs-events.c +index 80a25ee5..a4e5215f 100644 +--- a/lib/tracefs/tracefs-events.c ++++ b/lib/tracefs/tracefs-events.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + + #include "kbuffer.h" + #include "tracefs.h" +diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h +index 28d1b4e0..85c7e03e 100644 +--- a/tracecmd/include/trace-local.h ++++ b/tracecmd/include/trace-local.h +@@ -8,6 +8,7 @@ + + #include + #include /* for DIR */ ++#include + + #include "trace-cmd-private.h" + #include "event-utils.h" +diff --git a/tracecmd/trace-tsync.c b/tracecmd/trace-tsync.c +index e639788d..8b9083ae 100644 +--- a/tracecmd/trace-tsync.c ++++ b/tracecmd/trace-tsync.c +@@ -104,13 +104,16 @@ int tracecmd_host_tsync(struct buffer_instance *instance, + + pthread_attr_init(&attrib); + pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); +- if (!get_first_cpu(&pin_mask, &mask_size)) +- pthread_attr_setaffinity_np(&attrib, mask_size, pin_mask); + + ret = pthread_create(&instance->tsync_thread, &attrib, + tsync_host_thread, &instance->tsync); +- if (!ret) ++ ++ if (!ret) { ++ if (!get_first_cpu(&pin_mask, &mask_size)) ++ pthread_setaffinity_np(instance->tsync_thread, mask_size, pin_mask); + instance->tsync_thread_running = true; ++ } ++ + if (pin_mask) + CPU_FREE(pin_mask); + pthread_attr_destroy(&attrib); +@@ -243,11 +246,14 @@ unsigned int tracecmd_guest_tsync(char *tsync_protos, + pthread_attr_init(&attrib); + tsync->sync_proto = proto; + pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); +- if (!get_first_cpu(&pin_mask, &mask_size)) +- pthread_attr_setaffinity_np(&attrib, mask_size, pin_mask); + + ret = pthread_create(thr_id, &attrib, tsync_agent_thread, tsync); + ++ if (!ret) { ++ if (!get_first_cpu(&pin_mask, &mask_size)) ++ pthread_setaffinity_np(*thr_id, mask_size, pin_mask); ++ } ++ + if (pin_mask) + CPU_FREE(pin_mask); + pthread_attr_destroy(&attrib); -- 2.30.2