From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org
Subject: [PATCH v6 16/45] trace-cmd dump: Add support for trace files version 7
Date: Mon, 14 Jun 2021 10:50:00 +0300 [thread overview]
Message-ID: <20210614075029.598048-17-tz.stoyanov@gmail.com> (raw)
In-Reply-To: <20210614075029.598048-1-tz.stoyanov@gmail.com>
Added support to read and dump information of trace files version 7.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
tracecmd/trace-dump.c | 125 +++++++++++++++++++++++++++++++++++-------
1 file changed, 105 insertions(+), 20 deletions(-)
diff --git a/tracecmd/trace-dump.c b/tracecmd/trace-dump.c
index 03cc82b4..ed82104b 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,46 +55,62 @@ enum dump_items verbosity;
tracecmd_plog(fmt, ##__VA_ARGS__); \
} while (0)
-static int read_file_string(int fd, char *dst, int len)
+static int read_fd(int fd, char *dst, int len)
{
size_t size = 0;
int r;
do {
- r = read(fd, dst+size, 1);
+ r = read(fd, dst+size, len);
if (r > 0) {
- size++;
- len--;
+ size += r;
+ len -= r;
} else
break;
- if (!dst[size - 1])
- break;
- } while (r > 0 && len);
+ } while (r > 0);
- if (!size || dst[size - 1])
+ if (len)
return -1;
- return 0;
+ return size;
}
-static int read_file_bytes(int fd, char *dst, int len)
+static int read_compressed(int fd, char *dst, int len)
+{
+
+ if (read_compress)
+ return tracecmd_compress_read(compress, dst, len);
+ return read_fd(fd, dst, len);
+}
+
+static int read_file_string(int fd, char *dst, int len)
{
size_t size = 0;
int r;
do {
- r = read(fd, dst+size, len);
+ r = read_compressed(fd, dst+size, 1);
if (r > 0) {
- size += r;
- len -= r;
+ size++;
+ len--;
} else
break;
- } while (r > 0);
+ if (!dst[size - 1])
+ break;
+ } while (r > 0 && len);
- if (len)
+ if (!size || dst[size - 1])
return -1;
return 0;
}
+static int read_file_bytes(int fd, char *dst, int len)
+{
+ int ret;
+
+ ret = read_compressed(fd, dst, len);
+ return ret < 0 ? ret : 0;
+}
+
static void read_dump_string(int fd, int size, enum dump_items id)
{
char buf[DUMP_SIZE];
@@ -146,7 +165,6 @@ static void dump_initial_format(int fd)
char magic[] = TRACECMD_MAGIC;
char buf[DUMP_SIZE];
int val4;
- unsigned long ver;
do_print(SUMMARY, "\t[Initial format]\n");
@@ -168,11 +186,11 @@ static void dump_initial_format(int fd)
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))
@@ -192,6 +210,29 @@ static void dump_initial_format(int fd)
do_print(SUMMARY, "\t\t%d\t[Page size, bytes]\n", val4);
}
+static void dump_compress(int fd)
+{
+ char compr[DUMP_SIZE];
+ char *ver = NULL;
+
+ if (file_version < 7)
+ return;
+
+ /* get compression header */
+ if (read_file_string(fd, compr, DUMP_SIZE))
+ die("no compression header");
+ ver = strchr(compr, ' ');
+ if (!ver)
+ die("no compression version");
+ *ver = '\0';
+ do_print((SUMMARY), "\t\t%s\t[Compression algorithm]\n", compr);
+ do_print((SUMMARY), "\t\t%s\t[Compression version]\n", ver + 1);
+
+ compress = tracecmd_compress_alloc(compr, ver + 1, fd, tep, NULL);
+ if (!compress)
+ die("cannot uncomress the file");
+}
+
static void dump_header_page(int fd)
{
unsigned long long size;
@@ -234,11 +275,34 @@ static void dump_header_event(int fd)
read_dump_string(fd, size, HEAD_EVENT);
}
+static void uncompress_reset(void)
+{
+ if (compress && file_version >= 7) {
+ read_compress = false;
+ tracecmd_compress_reset(compress);
+ }
+}
+
+static int uncompress_block(void)
+{
+ int ret = 0;
+
+ if (compress && file_version >= 7) {
+ ret = tracecmd_uncompress_block(compress);
+ if (!ret)
+ read_compress = true;
+
+ }
+ return ret;
+}
+
static void dump_ftrace_events_format(int fd)
{
unsigned long long size;
unsigned int count;
+ if (uncompress_block())
+ die("cannot uncompress file block");
do_print((SUMMARY | FTRACE_FORMAT), "\t[Ftrace format, ");
if (read_file_number(fd, &count, 4))
die("cannot read the count of the ftrace events");
@@ -251,6 +315,7 @@ static void dump_ftrace_events_format(int fd)
read_dump_string(fd, size, FTRACE_FORMAT);
count--;
}
+ uncompress_reset();
}
static void dump_events_format(int fd)
@@ -262,6 +327,9 @@ static void dump_events_format(int fd)
do_print((SUMMARY | EVENT_FORMAT | EVENT_SYSTEMS), "\t[Events format, ");
+ if (uncompress_block())
+ die("cannot uncompress file block");
+
if (read_file_number(fd, &systems, 4))
die("cannot read the count of the event systems");
@@ -284,6 +352,7 @@ static void dump_events_format(int fd)
}
systems--;
}
+ uncompress_reset();
}
static void dump_kallsyms(int fd)
@@ -292,12 +361,17 @@ static void dump_kallsyms(int fd)
do_print((SUMMARY | KALLSYMS), "\t[Kallsyms, ");
+ if (uncompress_block())
+ die("cannot uncompress file block");
+
if (read_file_number(fd, &size, 4))
die("cannot read the size of the kallsyms");
do_print((SUMMARY | KALLSYMS), "%d bytes]\n", size);
read_dump_string(fd, size, KALLSYMS);
+
+ uncompress_reset();
}
static void dump_printk(int fd)
@@ -306,12 +380,17 @@ static void dump_printk(int fd)
do_print((SUMMARY | TRACE_PRINTK), "\t[Trace printk, ");
+ if (uncompress_block())
+ die("cannot uncompress file block");
+
if (read_file_number(fd, &size, 4))
die("cannot read the size of the trace printk");
do_print((SUMMARY | TRACE_PRINTK), "%d bytes]\n", size);
read_dump_string(fd, size, TRACE_PRINTK);
+
+ uncompress_reset();
}
static void dump_cmdlines(int fd)
@@ -320,12 +399,17 @@ static void dump_cmdlines(int fd)
do_print((SUMMARY | CMDLINES), "\t[Saved command lines, ");
+ if (uncompress_block())
+ die("cannot uncompress file block");
+
if (read_file_number(fd, &size, 8))
die("cannot read the size of the saved command lines");
do_print((SUMMARY | CMDLINES), "%d bytes]\n", size);
read_dump_string(fd, size, CMDLINES);
+
+ uncompress_reset();
}
static void dump_cpus_count(int fd)
@@ -669,6 +753,7 @@ static void dump_file(const char *file)
do_print(SUMMARY, "\n Tracing meta data in file %s:\n", file);
dump_initial_format(fd);
+ dump_compress(fd);
dump_header_page(fd);
dump_header_event(fd);
dump_ftrace_events_format(fd);
--
2.31.1
next prev parent reply other threads:[~2021-06-14 7:51 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-14 7:49 [PATCH v6 00/45] Add trace file compression Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 01/45] trace-cmd library: Remove unused private APIs for creating trace files Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 02/45] trace-cmd library: Remove unused API tracecmd_update_option Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 03/45] trace-cmd: Check if file version is supported Tzvetomir Stoyanov (VMware)
2021-06-21 22:27 ` Steven Rostedt
2021-06-21 22:36 ` Steven Rostedt
2021-06-14 7:49 ` [PATCH v6 04/45] trace-cmd library: Add new API to get file version of input handler Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 05/45] trace-cmd library: Select the file version when writing trace file Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 06/45] trace-cmd: Add APIs for library initialization and free Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 07/45] trace-cmd library: Add support for compression algorithms Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 08/45] trace-cmd list: Show supported " Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 09/45] trace-cmd library: Bump the trace file version to 7 Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 10/45] trace-cmd library: Compress part of the trace file Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 11/45] trace-cmd library: Read compressed " Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 12/45] trace-cmd library: Add new API to get compression of input handler Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 13/45] trace-cmd library: Inherit compression algorithm from input file Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 14/45] trace-cmd library: Extend the create file APIs to support different compression Tzvetomir Stoyanov (VMware)
2021-06-14 7:49 ` [PATCH v6 15/45] trace-cmd record: Add new parameter --compression Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` Tzvetomir Stoyanov (VMware) [this message]
2021-06-14 7:50 ` [PATCH v6 17/45] trace-cmd library: Add support for zlib compression library Tzvetomir Stoyanov (VMware)
2021-06-22 1:26 ` Steven Rostedt
2021-06-22 10:29 ` Tzvetomir Stoyanov
2021-06-22 13:31 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 18/45] trace-cmd library: Hide the logic for updating buffer offset Tzvetomir Stoyanov (VMware)
2021-06-22 2:10 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 19/45] trace-cmd: Move buffers description outside of options Tzvetomir Stoyanov (VMware)
2021-06-21 23:07 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 20/45] trace-cmd library: Track the offset in the option section in the trace file Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 21/45] trace-cmd library: Add compression of the option section of " Tzvetomir Stoyanov (VMware)
2021-06-21 23:10 ` Steven Rostedt
2021-06-22 10:43 ` Tzvetomir Stoyanov
2021-06-14 7:50 ` [PATCH v6 22/45] trace-cmd library: Refactor the logic for writing trace data in the file Tzvetomir Stoyanov (VMware)
2021-06-21 23:12 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 23/45] trace-cmd library: Add APIs for read and write compressed data in chunks Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 24/45] trace-cmd: Compress trace data Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 25/45] trace-cmd: Read compressed " Tzvetomir Stoyanov (VMware)
2021-06-21 23:23 ` Steven Rostedt
2021-06-22 10:50 ` Tzvetomir Stoyanov
2021-06-22 13:51 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 26/45] trace-cmd library: Compress latency " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 27/45] trace-cmd: Read compressed " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 28/45] trace-cmd library: Reuse within the library the function that checks file state Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 29/45] trace-cmd library: Make tracecmd_copy_headers() to work with output handler Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 30/45] trace-cmd: Do not use trace file compression with streams Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 31/45] trace-cmd library: Add new API to get file version of output handler Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 32/45] trace-cmd: Add file state parameter to tracecmd_copy Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 33/45] trace-cmd: Copy CPU count in tracecmd_copy Tzvetomir Stoyanov (VMware)
2021-06-21 23:27 ` Steven Rostedt
2021-06-14 7:50 ` [PATCH v6 34/45] trace-cmd: Copy buffers description " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 35/45] trace-cmd: Copy options " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 36/45] trace-cmd library: Refactor the logic for writing CPU trace data Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 37/45] trace-cmd library: Refactor the logic for writing CPU instance " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 38/45] trace-cmd: Copy trace data in tracecmd_copy Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 39/45] trace-cmd: Add compression parameter to tracecmd_copy Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 40/45] trace-cmd: Add new command "trace-cmd convert" Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 41/45] trace-cmd record: Update man page Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 42/45] trace-cmd: Add convert " Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 43/45] trace-cmd: Update bash completion Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 44/45] trace-cmd list: Update the man page Tzvetomir Stoyanov (VMware)
2021-06-14 7:50 ` [PATCH v6 45/45] trace-cmd: Update trace.dat " Tzvetomir Stoyanov (VMware)
2021-06-22 0:37 ` Steven Rostedt
2021-06-22 11:05 ` Tzvetomir Stoyanov
2021-06-22 13:58 ` Steven Rostedt
2021-06-22 2:22 ` [PATCH v6 00/45] Add trace file compression Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210614075029.598048-17-tz.stoyanov@gmail.com \
--to=tz.stoyanov@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).