package/trace-cmd: fix build with musl
authorFabrice Fontaine <fontaine.fabrice@gmail.com>
Mon, 4 Jan 2021 07:39:20 +0000 (08:39 +0100)
committerThomas Petazzoni <thomas.petazzoni@bootlin.com>
Mon, 25 Jan 2021 21:40:50 +0000 (22:40 +0100)
Fixes:
 - http://autobuild.buildroot.org/results/85ba0718f51eea348472dba89c566c136314a61e

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
package/trace-cmd/0001-trace-cmd-libtracecmd-API-cleanup.patch [new file with mode: 0644]
package/trace-cmd/0002-trace-cmd-make-it-build-against-musl-C-library.patch [new file with mode: 0644]

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 (file)
index 0000000..a0dee21
--- /dev/null
@@ -0,0 +1,1486 @@
+From 4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2 Mon Sep 17 00:00:00 2001
+From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
+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) <tz.stoyanov@gmail.com>
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+[Retrieved from:
+https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/commit/?id=4b6e124d8b5a0dfd21aedf21d2c347fc5f0705a2]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ 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 <srostedt@redhat.com>
+- * Copyright (C) 2018 VMware Inc, Steven Rostedt <rostedt@goodmis.org>
+- *
+- */
+-#ifndef _TRACE_FILTER_HASH_H
+-#define _TRACE_FILTER_HASH_H
+-
+-#include <stdint.h>
+-
+-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 <srostedt@redhat.com>
+- *
+- */
+-#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 <stdbool.h>
+-
+-#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 <srostedt@redhat.com>
++ *
++ */
++#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 <srostedt@redhat.com>
++ * Copyright (C) 2018 VMware Inc, Steven Rostedt <rostedt@goodmis.org>
++ *
++ */
++#ifndef _TRACE_FILTER_HASH_H
++#define _TRACE_FILTER_HASH_H
++
++#include <stdint.h>
++
++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 <srostedt@redhat.com>
++ *
++ */
++#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 <stdbool.h>
++
++#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 <string.h>
+ #include <sys/param.h>
+-#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 <stdlib.h>
+ #include <ctype.h>
+-#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 <errno.h>
+ #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 <errno.h>
+ #include <pthread.h>
+-#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 <sys/sysinfo.h>
+ #include <time.h>
+-#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 <Python.h>
+ #include <stdio.h>
+-#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 <Python.h>
+ %}
+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 <sys/types.h>
+ #include <dirent.h>   /* 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 (file)
index 0000000..6402124
--- /dev/null
@@ -0,0 +1,140 @@
+From 1a000636c1828eecdcec5360a51623ef4ffbff04 Mon Sep 17 00:00:00 2001
+From: Beniamin Sandu <beniaminsandu@gmail.com>
+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) <tz.stoyanov@gmail.com>
+Signed-off-by: Beniamin Sandu <beniaminsandu@gmail.com>
+[ Fixed a whitespace issue ]
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+[Retrieved from:
+https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/commit/?id=1a000636c1828eecdcec5360a51623ef4ffbff04]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ .../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 <sys/types.h>
+ #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 <byteswap.h>
+ #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 <errno.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
++#include <limits.h>
+ #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 <sys/types.h>
+ #include <dirent.h>   /* for DIR */
++#include <limits.h>
+ #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);