@@ -321,6 +321,41 @@ static tsize_t copy_file(struct tracecmd_output *handle,
return size;
}
+#define COMPRESS_CHUNK_SIZE (1*1024*1024)
+static tsize_t copy_file_compress(struct tracecmd_output *handle,
+ const char *file, unsigned long long *write_size)
+{
+ unsigned long long rsize = 0;
+ unsigned long long wsize = 0;
+ tsize_t size;
+ int ret;
+ int fd;
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0) {
+ tracecmd_warning("Can't read '%s'", file);
+ return 0;
+ }
+
+ if (handle->file_version >= 7) {
+ ret = tracecmd_compress_copy_from(handle->compress, fd,
+ COMPRESS_CHUNK_SIZE, &rsize, &wsize);
+ if (ret < 0) {
+ tracecmd_warning("Can't compress '%s'", file);
+ close(fd);
+ return 0;
+ }
+ size = rsize;
+ *write_size = wsize;
+ } else {
+ size = copy_file_fd(handle, fd);
+ *write_size = size;
+ }
+
+ close(fd);
+ return size;
+}
+
/*
* Finds the path to the debugfs/tracing
* Allocates the string and stores it.
@@ -1685,8 +1720,9 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle,
struct data_file_write *data_files = NULL;
off64_t offset;
unsigned long long endian8;
+ unsigned long long read_size;
+ unsigned long long write_size;
char *clock = NULL;
- off64_t check_size;
char *file;
struct stat st;
int ret;
@@ -1742,11 +1778,11 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle,
fprintf(stderr, "CPU%d data recorded at offset=0x%llx\n",
i, (unsigned long long) data_files[i].data_offset);
- check_size = copy_file(handle, cpu_data_files[i]);
- if (check_size != data_files[i].file_size) {
+ read_size = copy_file_compress(handle, cpu_data_files[i], &write_size);
+ if (read_size != data_files[i].file_size) {
errno = EINVAL;
tracecmd_warning("did not match size of %lld to %lld",
- check_size, data_files[i].file_size);
+ read_size, data_files[i].file_size);
goto out_free;
}
/* Write the real CPU data offset inthe file */
@@ -1756,14 +1792,14 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle,
goto out_free;
/* Write the real CPU data size in the file */
offset = lseek64(handle->fd, data_files[i].soffset, SEEK_SET);
- endian8 = convert_endian_8(handle, check_size);
+ endian8 = convert_endian_8(handle, write_size);
if (do_write_check(handle, &endian8, 8))
goto out_free;
- offset = data_files[i].data_offset + check_size;
+ offset = data_files[i].data_offset + write_size;
offset = lseek64(handle->fd, offset, SEEK_SET);
if (!tracecmd_get_quiet(handle))
fprintf(stderr, " %llu bytes in size\n",
- (unsigned long long)check_size);
+ (unsigned long long)write_size);
}
if (lseek64(handle->fd, 0, SEEK_END) == (off64_t)-1)
When creating a trace.dat file of version 7, compress the trace data. The data is compressed in chunks. The chunk size is a compile time parameter, set by default to 1MB. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-output.c | 50 +++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 7 deletions(-)