trace-cmd dump: Add helpers for processing trace file version 7
New global variables are added, that hold trace file context:
- trace file version
- compression context
Also a few helper functions for reading compressed data.
Link: https://lore.kernel.org/linux-trace-devel/20220126095337.570867-2-tz.stoyanov@gmail.com
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
diff --git a/tracecmd/trace-dump.c b/tracecmd/trace-dump.c
index 2408a4a..a99dbde 100644
--- a/tracecmd/trace-dump.c
+++ b/tracecmd/trace-dump.c
@@ -26,6 +26,9 @@
static struct tep_handle *tep;
static unsigned int trace_cpus;
static int has_clock;
+static unsigned long file_version;
+static bool read_compress;
+static struct tracecmd_compression *compress;
enum dump_items {
SUMMARY = (1 << 0),
@@ -52,13 +55,49 @@
tracecmd_plog(fmt, ##__VA_ARGS__); \
} while (0)
+static int read_fd(int fd, char *dst, int len)
+{
+ size_t size = 0;
+ int r;
+
+ do {
+ r = read(fd, dst+size, len);
+ if (r > 0) {
+ size += r;
+ len -= r;
+ } else
+ break;
+ } while (r > 0);
+
+ if (len)
+ return -1;
+ return size;
+}
+
+static int read_compressed(int fd, char *dst, int len)
+{
+
+ if (read_compress)
+ return tracecmd_compress_buffer_read(compress, dst, len);
+
+ return read_fd(fd, dst, len);
+}
+
+static int do_lseek(int fd, int offset, int whence)
+{
+ if (read_compress)
+ return tracecmd_compress_lseek(compress, offset, whence);
+
+ return lseek64(fd, offset, whence);
+}
+
static int read_file_string(int fd, char *dst, int len)
{
size_t size = 0;
int r;
do {
- r = read(fd, dst+size, 1);
+ r = read_compressed(fd, dst+size, 1);
if (r > 0) {
size++;
len--;
@@ -75,21 +114,10 @@
static int read_file_bytes(int fd, char *dst, int len)
{
- size_t size = 0;
- int r;
+ int ret;
- do {
- r = read(fd, dst+size, len);
- if (r > 0) {
- size += r;
- len -= r;
- } else
- break;
- } while (r > 0);
-
- if (len)
- return -1;
- return 0;
+ ret = read_compressed(fd, dst, len);
+ return ret < 0 ? ret : 0;
}
static void read_dump_string(int fd, int size, enum dump_items id)
@@ -146,7 +174,6 @@
char magic[] = TRACECMD_MAGIC;
char buf[DUMP_SIZE];
int val4;
- unsigned long ver;
do_print(SUMMARY, "\t[Initial format]\n");
@@ -168,11 +195,11 @@
die("no version string");
do_print(SUMMARY, "\t\t%s\t[Version]\n", buf);
- ver = strtol(buf, NULL, 10);
- if (!ver && errno)
+ file_version = strtol(buf, NULL, 10);
+ if (!file_version && errno)
die("Invalid file version string %s", buf);
- if (!tracecmd_is_version_supported(ver))
- die("Unsupported file version %lu", ver);
+ if (!tracecmd_is_version_supported(file_version))
+ die("Unsupported file version %lu", file_version);
/* get file endianness*/
if (read_file_bytes(fd, buf, 1))
@@ -234,6 +261,28 @@
read_dump_string(fd, size, HEAD_EVENT);
}
+static void uncompress_reset(void)
+{
+ if (compress && file_version >= FILE_VERSION_COMPRESSION) {
+ read_compress = false;
+ tracecmd_compress_reset(compress);
+ }
+}
+
+static int uncompress_block(void)
+{
+ int ret = 0;
+
+ if (compress && file_version >= FILE_VERSION_COMPRESSION) {
+ ret = tracecmd_uncompress_block(compress);
+ if (!ret)
+ read_compress = true;
+
+ }
+
+ return ret;
+}
+
static void dump_ftrace_events_format(int fd)
{
unsigned long long size;
@@ -623,7 +672,7 @@
default:
do_print(OPTIONS, " %d %d\t[Unknown option, size - skipping]\n",
option, size);
- lseek64(fd, size, SEEK_CUR);
+ do_lseek(fd, size, SEEK_CUR);
break;
}
}