From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org
Subject: [PATCH v8 04/11] trace-cmd dump: Read recursively all options sections
Date: Wed, 26 Jan 2022 11:53:30 +0200 [thread overview]
Message-ID: <20220126095337.570867-5-tz.stoyanov@gmail.com> (raw)
In-Reply-To: <20220126095337.570867-1-tz.stoyanov@gmail.com>
Trace file version 7 supports multiple options sections in the file. The
DONE option is extended to hold the offset to the next options section.
A new logic for handling the extended DONE option and to read recursively
all options sections is added.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
tracecmd/trace-dump.c | 85 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 77 insertions(+), 8 deletions(-)
diff --git a/tracecmd/trace-dump.c b/tracecmd/trace-dump.c
index c4ad6c5b..e04e275a 100644
--- a/tracecmd/trace-dump.c
+++ b/tracecmd/trace-dump.c
@@ -427,6 +427,33 @@ static void dump_option_string(int fd, int size, char *desc)
read_dump_string(fd, size, OPTIONS);
}
+static void dump_section_header(int fd, enum dump_items v, unsigned short *flags)
+{
+ unsigned long long offset, size;
+ unsigned short fl;
+ unsigned short id;
+ int desc_id;
+
+ offset = lseek64(fd, 0, SEEK_CUR);
+ if (read_file_number(fd, &id, 2))
+ die("cannot read the section id");
+
+ if (read_file_number(fd, &fl, 2))
+ die("cannot read the section flags");
+
+ if (read_file_number(fd, &desc_id, 4))
+ die("no section description");
+
+ if (read_file_number(fd, &size, 8))
+ die("cannot read section size");
+
+ do_print(v, "\t[Section %d @ %lld, flags 0x%X, %lld bytes]\n",
+ id, offset, fl, size);
+
+ if (flags)
+ *flags = fl;
+}
+
static void dump_option_buffer(int fd, int size)
{
unsigned long long offset;
@@ -641,25 +668,54 @@ void dump_option_tsc2nsec(int fd, int size)
do_print(OPTIONS, "%d %d %llu [multiplier, shift, offset]\n", mult, shift, offset);
}
-static void dump_options(int fd)
+static int dump_options_read(int fd);
+
+static int dump_option_done(int fd, int size)
{
+ unsigned long long offset;
+
+ do_print(OPTIONS, "\t\t[Option DONE, %d bytes]\n", size);
+
+ if (file_version < FILE_VERSION_SECTIONS || size < 8)
+ return 0;
+
+ if (read_file_number(fd, &offset, 8))
+ die("cannot read the next options offset");
+
+ do_print(OPTIONS, "%lld\n", offset);
+ if (!offset)
+ return 0;
+
+ if (lseek64(fd, offset, SEEK_SET) == (off_t)-1)
+ die("cannot goto next options offset %lld", offset);
+
+ do_print(OPTIONS, "\n\n");
+
+ return dump_options_read(fd);
+}
+
+static int dump_options_read(int fd)
+{
+ unsigned short flags = 0;
unsigned short option;
unsigned int size;
int count = 0;
+ if (file_version >= FILE_VERSION_SECTIONS)
+ dump_section_header(fd, OPTIONS, &flags);
+
+ if ((flags & TRACECMD_SEC_FL_COMPRESS) && uncompress_block())
+ die("cannot uncompress file block");
+
for (;;) {
if (read_file_number(fd, &option, 2))
die("cannot read the option id");
- if (!option)
+ if (option == TRACECMD_OPTION_DONE && file_version < FILE_VERSION_SECTIONS)
break;
if (read_file_number(fd, &size, 4))
die("cannot read the option size");
count++;
- if (!DUMP_CHECK(OPTIONS) && !DUMP_CHECK(CLOCK) && !DUMP_CHECK(SUMMARY)) {
- lseek64(fd, size, SEEK_CUR);
- continue;
- }
switch (option) {
case TRACECMD_OPTION_DATE:
dump_option_string(fd, size, "DATE");
@@ -671,7 +727,8 @@ static void dump_options(int fd)
dump_option_buffer(fd, size);
break;
case TRACECMD_OPTION_TRACECLOCK:
- dump_option_string(fd, size, "TRACECLOCK");
+ do_print(OPTIONS, "\t\t[Option TRACECLOCK, %d bytes]\n", size);
+ read_dump_string(fd, size, OPTIONS | CLOCK);
has_clock = 1;
break;
case TRACECMD_OPTION_UNAME:
@@ -704,6 +761,10 @@ static void dump_options(int fd)
case TRACECMD_OPTION_TSC2NSEC:
dump_option_tsc2nsec(fd, size);
break;
+ case TRACECMD_OPTION_DONE:
+ uncompress_reset();
+ count += dump_option_done(fd, size);
+ return count;
default:
do_print(OPTIONS, " %d %d\t[Unknown option, size - skipping]\n",
option, size);
@@ -711,8 +772,16 @@ static void dump_options(int fd)
break;
}
}
- do_print(SUMMARY, "\t[%d options]\n", count);
+ uncompress_reset();
+ return count;
+}
+
+static void dump_options(int fd)
+{
+ int count;
+ count = dump_options_read(fd);
+ do_print(SUMMARY|OPTIONS, "\t[%d options]\n", count);
}
static void dump_latency(int fd)
--
2.34.1
next prev parent reply other threads:[~2022-01-26 9:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-26 9:53 [PATCH v8 00/11]trace-cmd dump - v7 update Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 01/11] trace-cmd dump: Add helpers for processing trace file version 7 Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 02/11] trace-cmd dump: Print compression header Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 03/11] trace-cmd dump: Add helpers for processing trace file sections Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` Tzvetomir Stoyanov (VMware) [this message]
2022-01-26 9:53 ` [PATCH v8 05/11] trace-cmd dump: Read extended BUFFER option Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 06/11] trace-cmd dump: Dump sections Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 07/11] trace-cmd dump: Dump trace file version 7 Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 08/11] trace-cmd dump: Read strings sections from v7 trace files Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 09/11] trace-cmd dump: Dump sections content Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 10/11] trace-cmd dump: Add new argument --sections Tzvetomir Stoyanov (VMware)
2022-01-26 9:53 ` [PATCH v8 11/11] trace-cmd dump: Align better the output of flyrecord dump Tzvetomir Stoyanov (VMware)
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=20220126095337.570867-5-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).