Headers are added before these file secrtions, in trace file version 7: - ftrace events format - format of recorded events - information of the mapping of function addresses to the function names - trace_printk() format strings - information of the mapping a PID to a process name New options are defined for each of these sections, holding the section's offset into the trace file. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- .../include/private/trace-cmd-private.h | 6 ++ lib/trace-cmd/trace-output.c | 69 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h index 77948fbb..b193d6de 100644 --- a/lib/trace-cmd/include/private/trace-cmd-private.h +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -135,6 +135,12 @@ enum { TRACECMD_OPTION_TIME_SHIFT, TRACECMD_OPTION_GUEST, TRACECMD_OPTION_TSC2NSEC, + TRACECMD_OPTION_HEADER_INFO, + TRACECMD_OPTION_FTRACE_EVENTS, + TRACECMD_OPTION_EVENT_FORMATS, + TRACECMD_OPTION_KALLSYMS, + TRACECMD_OPTION_PRINTK, + TRACECMD_OPTION_CMDLINES, TRACECMD_OPTION_MAX, }; diff --git a/lib/trace-cmd/trace-output.c b/lib/trace-cmd/trace-output.c index 74192ea2..a5c11eba 100644 --- a/lib/trace-cmd/trace-output.c +++ b/lib/trace-cmd/trace-output.c @@ -438,8 +438,10 @@ __hidden int out_update_section_header(struct tracecmd_output *handle, unsigned static int read_header_files(struct tracecmd_output *handle, bool compress) { + enum tracecmd_section_flags flags = 0; tsize_t size, check_size, endian8; struct stat st; + tsize_t offset; char *path; int fd = -1; int ret; @@ -454,6 +456,13 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) if (!path) return -1; + if (compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_HEADER_INFO, + "headers", flags, true); + if (offset == (off_t)-1) + return -1; + if (compress) out_compression_start(handle); ret = stat(path, &st); @@ -469,6 +478,8 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) goto out_close; if (do_write_check(handle, &size, 8)) goto out_close; + if (out_update_section_header(handle, offset)) + goto out_close; if (compress && out_compression_end(handle)) goto out_close; return 0; @@ -523,6 +534,8 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) put_tracing_file(path); if (compress && out_compression_end(handle)) goto out_close; + if (out_update_section_header(handle, offset)) + goto out_close; handle->file_state = TRACECMD_FILE_HEADERS; return 0; @@ -759,8 +772,10 @@ create_event_list_item(struct tracecmd_output *handle, static int read_ftrace_files(struct tracecmd_output *handle, bool compress) { + enum tracecmd_section_flags flags = 0; struct list_event_system *systems = NULL; struct tracecmd_event_list list = { .glob = "ftrace/*" }; + tsize_t offset; int ret; if (!check_out_state(handle, TRACECMD_FILE_FTRACE_EVENTS)) { @@ -769,6 +784,13 @@ static int read_ftrace_files(struct tracecmd_output *handle, bool compress) return -1; } + if (compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_FTRACE_EVENTS, + "ftrace events", flags, true); + if (offset == (off_t)-1) + return -1; + create_event_list_item(handle, &systems, &list); if (compress) out_compression_start(handle); @@ -780,6 +802,10 @@ static int read_ftrace_files(struct tracecmd_output *handle, bool compress) out_compression_reset(handle); } free_list_events(systems); + if (ret) + return ret; + if (out_update_section_header(handle, offset)) + return -1; handle->file_state = TRACECMD_FILE_FTRACE_EVENTS; @@ -802,11 +828,13 @@ create_event_list(struct tracecmd_output *handle, static int read_event_files(struct tracecmd_output *handle, struct tracecmd_event_list *event_list, bool compress) { + enum tracecmd_section_flags flags = 0; struct list_event_system *systems; struct list_event_system *slist; struct tracecmd_event_list *list; struct tracecmd_event_list all_events = { .glob = "*/*" }; int count = 0; + tsize_t offset; int endian4; int ret; @@ -815,6 +843,13 @@ static int read_event_files(struct tracecmd_output *handle, handle->file_state); return -1; } + + if (compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_EVENT_FORMATS, + "events format", flags, true); + if (offset == (off64_t)-1) + return -1; /* * If any of the list is the special keyword "all" then * just do all files. @@ -854,6 +889,8 @@ static int read_event_files(struct tracecmd_output *handle, if (ret) goto out_free; } + ret = out_update_section_header(handle, offset); + out_free: if (!ret) handle->file_state = TRACECMD_FILE_ALL_EVENTS; @@ -907,8 +944,10 @@ err: static int read_proc_kallsyms(struct tracecmd_output *handle, bool compress) { + enum tracecmd_section_flags flags = 0; unsigned int size, check_size, endian4; const char *path = "/proc/kallsyms"; + tsize_t offset; struct stat st; int ret; @@ -921,6 +960,13 @@ static int read_proc_kallsyms(struct tracecmd_output *handle, bool compress) if (handle->kallsyms) path = handle->kallsyms; + if (compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_KALLSYMS, + "kallsyms", flags, true); + if (offset == (off64_t)-1) + return -1; + if (compress) out_compression_start(handle); ret = stat(path, &st); @@ -953,6 +999,7 @@ static int read_proc_kallsyms(struct tracecmd_output *handle, bool compress) if (ret) goto out; } + ret = out_update_section_header(handle, offset); out: if (!ret) handle->file_state = TRACECMD_FILE_KALLSYMS; @@ -963,7 +1010,9 @@ out: static int read_ftrace_printk(struct tracecmd_output *handle, bool compress) { + enum tracecmd_section_flags flags = 0; unsigned int size, check_size, endian4; + tsize_t offset; struct stat st; char *path; int ret; @@ -978,6 +1027,12 @@ static int read_ftrace_printk(struct tracecmd_output *handle, bool compress) if (!path) return -1; + if (compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_PRINTK, "printk", flags, true); + if (offset == (off64_t)-1) + return -1; + if (compress) out_compression_start(handle); ret = stat(path, &st); @@ -1004,6 +1059,8 @@ static int read_ftrace_printk(struct tracecmd_output *handle, bool compress) put_tracing_file(path); if (compress && out_compression_end(handle)) return -1; + if (out_update_section_header(handle, offset)) + return -1; handle->file_state = TRACECMD_FILE_PRINTK; return 0; fail: @@ -1636,6 +1693,8 @@ tracecmd_add_buffer_option(struct tracecmd_output *handle, const char *name, int tracecmd_write_cmdlines(struct tracecmd_output *handle) { + enum tracecmd_section_flags flags = 0; + tsize_t offset; int ret; if (!check_out_state(handle, TRACECMD_FILE_CMD_LINES)) { @@ -1644,6 +1703,13 @@ int tracecmd_write_cmdlines(struct tracecmd_output *handle) return -1; } + if (handle->compress) + flags |= TRACECMD_SEC_FL_COMPRESS; + offset = out_write_section_header(handle, TRACECMD_OPTION_CMDLINES, + "command lines", flags, true); + if (offset == (off_t)-1) + return -1; + if (handle->compress) out_compression_start(handle); @@ -1656,6 +1722,9 @@ int tracecmd_write_cmdlines(struct tracecmd_output *handle) if (handle->compress && out_compression_end(handle)) return -1; + if (out_update_section_header(handle, offset)) + return -1; + handle->file_state = TRACECMD_FILE_CMD_LINES; return 0; } -- 2.31.1