@@ -255,6 +255,8 @@ tracecmd_get_cursor(struct tracecmd_input *handle, int cpu);
unsigned long tracecmd_get_in_file_version(struct tracecmd_input *handle);
size_t tracecmd_get_options_offset(struct tracecmd_input *handle);
+int tracecmd_get_file_compress_proto(struct tracecmd_input *handle,
+ const char **name, const char **version);
int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo);
bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle);
@@ -4593,6 +4593,22 @@ unsigned long tracecmd_get_in_file_version(struct tracecmd_input *handle)
return handle->file_version;
}
+/**
+ * tracecmd_get_file_compress_proto - get name and version of compression algorithm,
+ * used to compress the trace file
+ * @handle: input handle for the trace.dat file
+ * @name: return, name of the compression algorithm.
+ * @version: return, version of the compression algorithm.
+ *
+ * Returns 0 on success, or -1 in case of an error. If 0 is returned, the name and version of the
+ * algorithm are stored in @name and @version. The returned strings must *not* be freed.
+ */
+int tracecmd_get_file_compress_proto(struct tracecmd_input *handle,
+ const char **name, const char **version)
+{
+ return tracecmd_compress_proto_get_name(handle->compress, name, version);
+}
+
/**
* tracecmd_get_use_trace_clock - return use_trace_clock
* @handle: input handle for the trace.dat file
@@ -1209,6 +1209,9 @@ int tracecmd_output_set_kallsyms(struct tracecmd_output *handler, const char *ka
*/
int tracecmd_output_set_from_input(struct tracecmd_output *handler, struct tracecmd_input *ihandle)
{
+ const char *cname = NULL;
+ const char *cver = NULL;
+
if (!handler || !ihandle || handler->file_state != TRACECMD_FILE_ALLOCATED)
return -1;
@@ -1220,6 +1223,15 @@ int tracecmd_output_set_from_input(struct tracecmd_output *handler, struct trace
handler->file_version = tracecmd_get_in_file_version(ihandle);
handler->big_endian = tep_is_file_bigendian(handler->pevent);
+ if (!tracecmd_get_file_compress_proto(ihandle, &cname, &cver)) {
+ handler->compress = tracecmd_compress_alloc(cname, cver, handler->fd,
+ handler->pevent, handler->msg_handle);
+ if (!handler->compress)
+ return -1;
+ if (handler->file_version < FILE_VERSION_COMPRESSION)
+ handler->file_version = FILE_VERSION_COMPRESSION;
+ }
+
return 0;
}
@@ -2170,6 +2182,8 @@ struct tracecmd_output *tracecmd_get_output_handle_fd(int fd)
{
struct tracecmd_output *handle = NULL;
struct tracecmd_input *ihandle;
+ const char *cname = NULL;
+ const char *cver = NULL;
int fd2;
/* Move the file descriptor to the beginning */
@@ -2209,6 +2223,12 @@ struct tracecmd_output *tracecmd_get_output_handle_fd(int fd)
list_head_init(&handle->options);
list_head_init(&handle->buffers);
+ if (!tracecmd_get_file_compress_proto(ihandle, &cname, &cver)) {
+ handle->compress = tracecmd_compress_alloc(cname, cver, handle->fd,
+ handle->pevent, handle->msg_handle);
+ if (!handle->compress)
+ goto out_free;
+ }
tracecmd_close(ihandle);
return handle;
When a new trace file output handler is allocated, based on given trace file input handler - use the same compression algorithm. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- .../include/private/trace-cmd-private.h | 2 ++ lib/trace-cmd/trace-input.c | 16 +++++++++++++++ lib/trace-cmd/trace-output.c | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+)