@@ -92,7 +92,7 @@ struct list_event_system {
#define HAS_SECTIONS(H) ((H)->file_version >= FILE_VERSION_SECTIONS)
static int write_options_v7(struct tracecmd_output *handle);
-static int save_string_section(struct tracecmd_output *handle);
+static int save_string_section(struct tracecmd_output *handle, bool compress);
static stsize_t
do_write_check(struct tracecmd_output *handle, const void *data, tsize_t size)
@@ -272,7 +272,7 @@ void tracecmd_output_close(struct tracecmd_output *handle)
write_options_v7(handle);
/* write strings section */
- save_string_section(handle);
+ save_string_section(handle, true);
}
if (handle->fd >= 0) {
@@ -428,6 +428,8 @@ out_write_section_header(struct tracecmd_output *handle, unsigned short header_i
return -1;
if (!HAS_SECTIONS(handle))
return 0;
+ if (!handle->compress)
+ flags &= ~TRACECMD_SEC_FL_COMPRESS;
offset = do_lseek(handle, 0, SEEK_CUR);
if (option) {
endian8 = convert_endian_8(handle, offset);
@@ -489,7 +491,7 @@ __hidden int out_update_section_header(struct tracecmd_output *handle, tsize_t o
return 0;
}
-static int save_string_section(struct tracecmd_output *handle)
+static int save_string_section(struct tracecmd_output *handle, bool compress)
{
enum tracecmd_section_flags flags = 0;
tsize_t offset;
@@ -503,13 +505,20 @@ static int save_string_section(struct tracecmd_output *handle)
return -1;
}
+ if (compress)
+ flags |= TRACECMD_SEC_FL_COMPRESS;
offset = out_write_section_header(handle, TRACECMD_OPTION_STRINGS, "strings", flags, false);
if (offset == (off64_t)-1)
return -1;
+ out_compression_start(handle, compress);
+
if (do_write_check(handle, handle->strings, handle->strings_p))
goto error;
+ if (out_compression_end(handle, compress))
+ goto error;
+
if (out_update_section_header(handle, offset))
return -1;
@@ -521,10 +530,11 @@ static int save_string_section(struct tracecmd_output *handle)
return 0;
error:
+ out_compression_reset(handle, compress);
return -1;
}
-static int read_header_files(struct tracecmd_output *handle)
+static int read_header_files(struct tracecmd_output *handle, bool compress)
{
enum tracecmd_section_flags flags = 0;
tsize_t size, check_size, endian8;
@@ -544,11 +554,14 @@ static int read_header_files(struct tracecmd_output *handle)
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 == (off64_t)-1)
return -1;
+ out_compression_start(handle, compress);
ret = stat(path, &st);
if (ret < 0) {
/* old style did not show this info, just add zero */
@@ -562,6 +575,8 @@ static int read_header_files(struct tracecmd_output *handle)
goto out_close;
if (do_write_check(handle, &size, 8))
goto out_close;
+ if (out_compression_end(handle, compress))
+ goto out_close;
if (out_update_section_header(handle, offset))
goto out_close;
return 0;
@@ -614,6 +629,8 @@ static int read_header_files(struct tracecmd_output *handle)
goto out_close;
}
put_tracing_file(path);
+ if (out_compression_end(handle, compress))
+ goto out_close;
if (out_update_section_header(handle, offset))
goto out_close;
handle->file_state = TRACECMD_FILE_HEADERS;
@@ -621,6 +638,7 @@ static int read_header_files(struct tracecmd_output *handle)
return 0;
out_close:
+ out_compression_reset(handle, compress);
if (fd >= 0)
close(fd);
return -1;
@@ -849,7 +867,7 @@ create_event_list_item(struct tracecmd_output *handle,
tracecmd_warning("Insufficient memory");
}
-static int read_ftrace_files(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;
@@ -863,15 +881,20 @@ static int read_ftrace_files(struct tracecmd_output *handle)
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 == (off64_t)-1)
return -1;
create_event_list_item(handle, &systems, &list);
-
+ out_compression_start(handle, compress);
ret = copy_event_system(handle, systems);
-
+ if (!ret)
+ ret = out_compression_end(handle, compress);
+ else
+ out_compression_reset(handle, compress);
free_list_events(systems);
if (ret)
return ret;
@@ -897,7 +920,7 @@ create_event_list(struct tracecmd_output *handle,
}
static int read_event_files(struct tracecmd_output *handle,
- struct tracecmd_event_list *event_list)
+ struct tracecmd_event_list *event_list, bool compress)
{
enum tracecmd_section_flags flags = 0;
struct list_event_system *systems;
@@ -915,6 +938,8 @@ static int read_event_files(struct tracecmd_output *handle,
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)
@@ -935,7 +960,7 @@ static int read_event_files(struct tracecmd_output *handle,
for (slist = systems; slist; slist = slist->next)
count++;
-
+ out_compression_start(handle, compress);
ret = -1;
endian4 = convert_endian_4(handle, count);
if (do_write_check(handle, &endian4, 4))
@@ -950,6 +975,9 @@ static int read_event_files(struct tracecmd_output *handle,
}
ret = copy_event_system(handle, slist);
}
+ if (ret)
+ goto out_free;
+ ret = out_compression_end(handle, compress);
if (ret)
goto out_free;
ret = out_update_section_header(handle, offset);
@@ -957,6 +985,8 @@ static int read_event_files(struct tracecmd_output *handle,
out_free:
if (!ret)
handle->file_state = TRACECMD_FILE_ALL_EVENTS;
+ else
+ out_compression_reset(handle, compress);
free_list_events(systems);
@@ -1003,7 +1033,7 @@ err:
tracecmd_warning("can't set kptr_restrict");
}
-static int read_proc_kallsyms(struct tracecmd_output *handle)
+static int read_proc_kallsyms(struct tracecmd_output *handle, bool compress)
{
enum tracecmd_section_flags flags = 0;
unsigned int size, check_size, endian4;
@@ -1021,11 +1051,14 @@ static int read_proc_kallsyms(struct tracecmd_output *handle)
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;
+ out_compression_start(handle, compress);
ret = stat(path, &st);
if (ret < 0) {
/* not found */
@@ -1051,14 +1084,19 @@ static int read_proc_kallsyms(struct tracecmd_output *handle)
}
set_proc_kptr_restrict(1);
+ ret = out_compression_end(handle, compress);
+ if (ret)
+ goto out;
ret = out_update_section_header(handle, offset);
out:
if (!ret)
handle->file_state = TRACECMD_FILE_KALLSYMS;
+ else
+ out_compression_reset(handle, compress);
return ret;
}
-static int read_ftrace_printk(struct tracecmd_output *handle)
+static int read_ftrace_printk(struct tracecmd_output *handle, bool compress)
{
enum tracecmd_section_flags flags = 0;
unsigned int size, check_size, endian4;
@@ -1077,10 +1115,13 @@ static int read_ftrace_printk(struct tracecmd_output *handle)
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;
+ out_compression_start(handle, compress);
ret = stat(path, &st);
if (ret < 0) {
/* not found */
@@ -1103,12 +1144,15 @@ static int read_ftrace_printk(struct tracecmd_output *handle)
out:
put_tracing_file(path);
+ if (out_compression_end(handle, compress))
+ return -1;
if (out_update_section_header(handle, offset))
return -1;
handle->file_state = TRACECMD_FILE_PRINTK;
return 0;
fail:
put_tracing_file(path);
+ out_compression_reset(handle, compress);
return -1;
}
@@ -1495,21 +1539,25 @@ static int output_write_init(struct tracecmd_output *handle)
int tracecmd_output_write_headers(struct tracecmd_output *handle,
struct tracecmd_event_list *list)
{
+ bool compress = false;
+
if (!handle || handle->file_state < TRACECMD_FILE_ALLOCATED)
return -1;
/* Write init data, if not written yet */
if (handle->file_state < TRACECMD_FILE_INIT && output_write_init(handle))
return -1;
- if (read_header_files(handle))
+ if (handle->compress)
+ compress = true;
+ if (read_header_files(handle, compress))
return -1;
- if (read_ftrace_files(handle))
+ if (read_ftrace_files(handle, compress))
return -1;
- if (read_event_files(handle, list))
+ if (read_event_files(handle, list, compress))
return -1;
- if (read_proc_kallsyms(handle))
+ if (read_proc_kallsyms(handle, compress))
return -1;
- if (read_ftrace_printk(handle))
+ if (read_ftrace_printk(handle, compress))
return -1;
return 0;
}
@@ -1738,7 +1786,7 @@ int tracecmd_write_meta_strings(struct tracecmd_output *handle)
if (!HAS_SECTIONS(handle))
return 0;
- return save_string_section(handle);
+ return save_string_section(handle, true);
}
int tracecmd_write_options(struct tracecmd_output *handle)
@@ -1887,6 +1935,7 @@ static tsize_t get_buffer_file_offset(struct tracecmd_output *handle, const char
int tracecmd_write_cmdlines(struct tracecmd_output *handle)
{
enum tracecmd_section_flags flags = 0;
+ bool compress = false;
tsize_t offset;
int ret;
@@ -1896,14 +1945,26 @@ int tracecmd_write_cmdlines(struct tracecmd_output *handle)
return -1;
}
+ if (handle->compress)
+ compress = true;
+
+ if (compress)
+ flags |= TRACECMD_SEC_FL_COMPRESS;
offset = out_write_section_header(handle, TRACECMD_OPTION_CMDLINES,
"command lines", flags, true);
if (offset == (off64_t)-1)
return -1;
+ out_compression_start(handle, compress);
+
ret = save_tracing_file_data(handle, "saved_cmdlines");
- if (ret < 0)
+ if (ret < 0) {
+ out_compression_reset(handle, compress);
return ret;
+ }
+
+ if (out_compression_end(handle, compress))
+ return -1;
if (out_update_section_header(handle, offset))
return -1;
Compress part of the trace.dat file metadata. If there is compression support, compress these parts of the file: - 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 - strings Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-output.c | 97 +++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 18 deletions(-)