* [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files
@ 2021-11-11 15:11 Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 21/25] trace-cmd library: Handle latency trace in version 7 files Tzvetomir Stoyanov (VMware)
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
In version 7 trace files, CPU trace data is written in slightly
different way than in version 6 files. Added new CPU data initialization
flow, to handle version 7 files:
- the top trace instance is saved in the same way as the other trace
instances.
- per CPU trace metadata is stored in the buffer option.
- trace data section has section header.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
lib/trace-cmd/trace-input.c | 178 +++++++++++++++++++++++++-----------
1 file changed, 123 insertions(+), 55 deletions(-)
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 06f31679..5d9f24e8 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -3193,34 +3193,18 @@ static int read_options_type(struct tracecmd_input *handle)
return 0;
}
-static int read_cpu_data(struct tracecmd_input *handle)
+static int init_cpu_data(struct tracecmd_input *handle)
{
- struct tep_handle *pevent = handle->pevent;
enum kbuffer_long_size long_size;
enum kbuffer_endian endian;
- unsigned long long size;
unsigned long long max_size = 0;
unsigned long long pages;
- int cpus;
int cpu;
- /*
- * Check if this is a latency report or not.
- */
- if (handle->file_state == TRACECMD_FILE_CPU_LATENCY)
- return 1;
-
/* We expect this to be flyrecord */
if (handle->file_state != TRACECMD_FILE_CPU_FLYRECORD)
return -1;
- cpus = handle->cpus;
-
- handle->cpu_data = malloc(sizeof(*handle->cpu_data) * handle->cpus);
- if (!handle->cpu_data)
- return -1;
- memset(handle->cpu_data, 0, sizeof(*handle->cpu_data) * handle->cpus);
-
if (force_read)
handle->read_page = true;
@@ -3235,32 +3219,14 @@ static int read_cpu_data(struct tracecmd_input *handle)
endian = KBUFFER_ENDIAN_LITTLE;
for (cpu = 0; cpu < handle->cpus; cpu++) {
- unsigned long long offset;
-
- handle->cpu_data[cpu].cpu = cpu;
-
handle->cpu_data[cpu].kbuf = kbuffer_alloc(long_size, endian);
if (!handle->cpu_data[cpu].kbuf)
goto out_free;
- if (tep_is_old_format(pevent))
+ if (tep_is_old_format(handle->pevent))
kbuffer_set_old_format(handle->cpu_data[cpu].kbuf);
- read8(handle, &offset);
- read8(handle, &size);
-
- handle->cpu_data[cpu].file_offset = offset;
- handle->cpu_data[cpu].file_size = size;
- if (size > max_size)
- max_size = size;
-
- if (size && (offset + size > handle->total_file_size)) {
- /* this happens if the file got truncated */
- printf("File possibly truncated. "
- "Need at least %llu, but file size is %zu.\n",
- offset + size, handle->total_file_size);
- errno = EINVAL;
- goto out_free;
- }
+ if (handle->cpu_data[cpu].file_size > max_size)
+ max_size = handle->cpu_data[cpu].file_size;
}
/* Calculate about a meg of pages for buffering */
@@ -3278,6 +3244,101 @@ static int read_cpu_data(struct tracecmd_input *handle)
goto out_free;
}
+ return 0;
+
+ out_free:
+ for ( ; cpu >= 0; cpu--) {
+ free_page(handle, cpu);
+ kbuffer_free(handle->cpu_data[cpu].kbuf);
+ handle->cpu_data[cpu].kbuf = NULL;
+ }
+ return -1;
+}
+
+static int init_buffer_cpu_data(struct tracecmd_input *handle, struct input_buffer_instance *buffer)
+{
+ unsigned long long offset;
+ unsigned long long size;
+ unsigned short id, flags;
+ int cpu;
+
+ if (handle->cpu_data)
+ return -1;
+
+ if (lseek64(handle->fd, buffer->offset, SEEK_SET) == (off_t)-1)
+ return -1;
+ if (read_section_header(handle, &id, &flags, NULL, NULL))
+ return -1;
+
+ handle->file_state = TRACECMD_FILE_CPU_FLYRECORD;
+ handle->cpus = buffer->cpus;
+ if (handle->max_cpu < handle->cpus)
+ handle->max_cpu = handle->cpus;
+
+ handle->cpu_data = calloc(handle->cpus, sizeof(*handle->cpu_data));
+ if (!handle->cpu_data)
+ return -1;
+
+ for (cpu = 0; cpu < handle->cpus; cpu++) {
+ handle->cpu_data[cpu].cpu = buffer->cpu_data[cpu].cpu;
+ offset = buffer->cpu_data[cpu].offset;
+ size = buffer->cpu_data[cpu].size;
+ handle->cpu_data[cpu].file_offset = offset;
+ handle->cpu_data[cpu].file_size = size;
+ if (size && (offset + size > handle->total_file_size)) {
+ /* this happens if the file got truncated */
+ printf("File possibly truncated. "
+ "Need at least %llu, but file size is %zu.\n",
+ offset + size, handle->total_file_size);
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
+ return init_cpu_data(handle);
+}
+
+static int read_cpu_data(struct tracecmd_input *handle)
+{
+ unsigned long long size;
+ int cpus;
+ int cpu;
+
+ /*
+ * Check if this is a latency report or not.
+ */
+ if (handle->file_state == TRACECMD_FILE_CPU_LATENCY)
+ return 1;
+
+ /* We expect this to be flyrecord */
+ if (handle->file_state != TRACECMD_FILE_CPU_FLYRECORD)
+ return -1;
+
+ cpus = handle->cpus;
+
+ handle->cpu_data = malloc(sizeof(*handle->cpu_data) * handle->cpus);
+ if (!handle->cpu_data)
+ return -1;
+ memset(handle->cpu_data, 0, sizeof(*handle->cpu_data) * handle->cpus);
+
+ for (cpu = 0; cpu < handle->cpus; cpu++) {
+ unsigned long long offset;
+
+ handle->cpu_data[cpu].cpu = cpu;
+ read8(handle, &offset);
+ read8(handle, &size);
+ handle->cpu_data[cpu].file_offset = offset;
+ handle->cpu_data[cpu].file_size = size;
+ if (size && (offset + size > handle->total_file_size)) {
+ /* this happens if the file got truncated */
+ printf("File possibly truncated. "
+ "Need at least %llu, but file size is %zu.\n",
+ offset + size, handle->total_file_size);
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
/*
* It is possible that an option changed the number of CPUs.
* If that happened, then there's "empty" cpu data saved for
@@ -3297,15 +3358,7 @@ static int read_cpu_data(struct tracecmd_input *handle)
}
}
- return 0;
-
- out_free:
- for ( ; cpu >= 0; cpu--) {
- free_page(handle, cpu);
- kbuffer_free(handle->cpu_data[cpu].kbuf);
- handle->cpu_data[cpu].kbuf = NULL;
- }
- return -1;
+ return init_cpu_data(handle);
}
static int read_data_and_size(struct tracecmd_input *handle,
@@ -3403,14 +3456,7 @@ static int read_and_parse_trace_clock(struct tracecmd_input *handle,
return 0;
}
-/**
- * tracecmd_init_data - prepare reading the data from trace.dat
- * @handle: input handle for the trace.dat file
- *
- * This prepares reading the data from trace.dat. This is called
- * after tracecmd_read_headers() and before tracecmd_read_data().
- */
-int tracecmd_init_data(struct tracecmd_input *handle)
+static int init_data_v6(struct tracecmd_input *handle)
{
struct tep_handle *pevent = handle->pevent;
int ret;
@@ -3432,7 +3478,29 @@ int tracecmd_init_data(struct tracecmd_input *handle)
tracecmd_parse_trace_clock(handle, clock, 8);
}
}
+ return ret;
+}
+
+static int init_data_v7(struct tracecmd_input *handle)
+{
+ return init_buffer_cpu_data(handle, &handle->top_buffer);
+}
+/**
+ * tracecmd_init_data - prepare reading the data from trace.dat
+ * @handle: input handle for the trace.dat file
+ *
+ * This prepares reading the data from trace.dat. This is called
+ * after tracecmd_read_headers() and before tracecmd_read_data().
+ */
+int tracecmd_init_data(struct tracecmd_input *handle)
+{
+ int ret;
+
+ if (!HAS_SECTIONS(handle))
+ ret = init_data_v6(handle);
+ else
+ ret = init_data_v7(handle);
tracecmd_blk_hack(handle);
return ret;
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 21/25] trace-cmd library: Handle latency trace in version 7 files
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
@ 2021-11-11 15:11 ` Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 22/25] trace-cmd library: Handle buffer trace data init for " Tzvetomir Stoyanov (VMware)
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
Latency trace data is saved the same was as flyrecord buffer data
in trace files version 7. There is a BUFFER_TEXT option which holds the
latency specific trace metadata and points to the section in the file
with the trace data. A new API is added to read latency data:
tracecmd_latency_data_read()
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
.../include/private/trace-cmd-private.h | 5 +++-
lib/trace-cmd/trace-input.c | 29 ++++++++++++++++++-
lib/trace-cmd/trace-output.c | 5 +++-
tracecmd/trace-record.c | 3 +-
4 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h
index 1a43b7e3..879640ac 100644
--- a/lib/trace-cmd/include/private/trace-cmd-private.h
+++ b/lib/trace-cmd/include/private/trace-cmd-private.h
@@ -221,6 +221,8 @@ tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu)
return rec;
}
+int tracecmd_latency_data_read(struct tracecmd_input *handle, char **buf, size_t *size);
+
struct tep_record *
tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record);
@@ -295,7 +297,8 @@ int tracecmd_output_write_init(struct tracecmd_output *handler);
int tracecmd_output_write_headers(struct tracecmd_output *handler,
struct tracecmd_event_list *list);
-struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus);
+struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus,
+ int file_version);
struct tracecmd_output *tracecmd_create_init_fd(int fd);
struct tracecmd_output *tracecmd_create_init_file(const char *output_file);
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 5d9f24e8..5efa4859 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -3193,6 +3193,24 @@ static int read_options_type(struct tracecmd_input *handle)
return 0;
}
+int tracecmd_latency_data_read(struct tracecmd_input *handle, char **buf, size_t *size)
+{
+ if (!handle || !buf || !size)
+ return -1;
+ if (handle->file_state != TRACECMD_FILE_CPU_LATENCY)
+ return -1;
+
+ /* Read data from a file */
+ if (!(*buf)) {
+ *size = BUFSIZ;
+ *buf = malloc(*size);
+ if (!(*buf))
+ return -1;
+ }
+
+ return do_read(handle, *buf, *size);
+}
+
static int init_cpu_data(struct tracecmd_input *handle)
{
enum kbuffer_long_size long_size;
@@ -3255,6 +3273,12 @@ static int init_cpu_data(struct tracecmd_input *handle)
return -1;
}
+int init_latency_data(struct tracecmd_input *handle)
+{
+ /* To do */
+ return 0;
+}
+
static int init_buffer_cpu_data(struct tracecmd_input *handle, struct input_buffer_instance *buffer)
{
unsigned long long offset;
@@ -3269,7 +3293,10 @@ static int init_buffer_cpu_data(struct tracecmd_input *handle, struct input_buff
return -1;
if (read_section_header(handle, &id, &flags, NULL, NULL))
return -1;
-
+ if (buffer->latency) {
+ handle->file_state = TRACECMD_FILE_CPU_LATENCY;
+ return init_latency_data(handle) == 0 ? 1 : -1;
+ }
handle->file_state = TRACECMD_FILE_CPU_FLYRECORD;
handle->cpus = buffer->cpus;
if (handle->max_cpu < handle->cpus)
diff --git a/lib/trace-cmd/trace-output.c b/lib/trace-cmd/trace-output.c
index 1d666775..e06931ce 100644
--- a/lib/trace-cmd/trace-output.c
+++ b/lib/trace-cmd/trace-output.c
@@ -1778,7 +1778,8 @@ out_add_buffer_option_v7(struct tracecmd_output *handle, const char *name,
return option;
}
-struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus)
+struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus,
+ int file_version)
{
enum tracecmd_section_flags flags = 0;
struct tracecmd_output *handle;
@@ -1793,6 +1794,8 @@ struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, in
handle = tracecmd_output_allocate(fd);
if (!handle)
goto out_free;
+ if (file_version && tracecmd_output_set_version(handle, file_version))
+ goto out_free;
if (tracecmd_output_write_init(handle))
goto out_free;
if (tracecmd_output_write_headers(handle, NULL))
diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c
index 32270e20..0b1dc508 100644
--- a/tracecmd/trace-record.c
+++ b/tracecmd/trace-record.c
@@ -4505,7 +4505,8 @@ static void record_data(struct common_record_context *ctx)
return;
if (latency) {
- handle = tracecmd_create_file_latency(ctx->output, local_cpu_count);
+ handle = tracecmd_create_file_latency(ctx->output, local_cpu_count,
+ ctx->file_version);
tracecmd_set_quiet(handle, quiet);
} else {
if (!local_cpu_count)
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 22/25] trace-cmd library: Handle buffer trace data init for version 7 files
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 21/25] trace-cmd library: Handle latency trace in version 7 files Tzvetomir Stoyanov (VMware)
@ 2021-11-11 15:11 ` Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 23/25] trace-cmd report: Use the new latency API to read data Tzvetomir Stoyanov (VMware)
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
CPU data initialization is different for trace files version 6 and 7.
When a new input handler to trace buffer is created, initialize the CPU
data according to the file version.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
lib/trace-cmd/trace-input.c | 55 +++++++++++++++++++------------------
1 file changed, 29 insertions(+), 26 deletions(-)
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 5efa4859..f9978dde 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -4466,34 +4466,37 @@ tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx)
new_handle->flags |= TRACECMD_FL_BUFFER_INSTANCE;
new_handle->pid_maps = NULL;
+ if (!HAS_SECTIONS(handle)) {
+ /* Save where we currently are */
+ offset = lseek64(handle->fd, 0, SEEK_CUR);
- /* Save where we currently are */
- offset = lseek64(handle->fd, 0, SEEK_CUR);
-
- ret = lseek64(handle->fd, buffer->offset, SEEK_SET);
- if (ret < 0) {
- tracecmd_warning("could not seek to buffer %s offset %ld\n",
- buffer->name, buffer->offset);
- goto error;
- }
-
- /*
- * read_options_type() is called right after the CPU count so update
- * file state accordingly.
- */
- new_handle->file_state = TRACECMD_FILE_CPU_COUNT;
- ret = read_options_type(new_handle);
- if (!ret)
- ret = read_cpu_data(new_handle);
- if (ret < 0) {
- tracecmd_warning("failed to read sub buffer %s\n", buffer->name);
- goto error;
- }
+ ret = lseek64(handle->fd, buffer->offset, SEEK_SET);
+ if (ret == (off64_t)-1) {
+ tracecmd_warning("could not seek to buffer %s offset %ld\n",
+ buffer->name, buffer->offset);
+ goto error;
+ }
+ /*
+ * read_options_type() is called right after the CPU count so update
+ * file state accordingly.
+ */
+ new_handle->file_state = TRACECMD_FILE_CPU_COUNT;
+ ret = read_options_type(new_handle);
+ if (!ret)
+ ret = read_cpu_data(new_handle);
- ret = lseek64(handle->fd, offset, SEEK_SET);
- if (ret < 0) {
- tracecmd_warning("could not seek to back to offset %ld\n", offset);
- goto error;
+ if (ret < 0) {
+ tracecmd_warning("failed to read sub buffer %s\n", buffer->name);
+ goto error;
+ }
+ ret = lseek64(handle->fd, offset, SEEK_SET);
+ if (ret < 0) {
+ tracecmd_warning("could not seek to back to offset %ld\n", offset);
+ goto error;
+ }
+ } else {
+ if (init_buffer_cpu_data(new_handle, buffer) < 0)
+ goto error;
}
return new_handle;
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 23/25] trace-cmd report: Use the new latency API to read data
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 21/25] trace-cmd library: Handle latency trace in version 7 files Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 22/25] trace-cmd library: Handle buffer trace data init for " Tzvetomir Stoyanov (VMware)
@ 2021-11-11 15:11 ` Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 25/25] trace-cmd report: Add new parameter for trace file version Tzvetomir Stoyanov (VMware)
4 siblings, 0 replies; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
When reading latency trace data, use the new API
tracecmd_latency_data_read()
It handles reading latency trace data from both version 6 and 7 trace
files.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
tracecmd/trace-read.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/tracecmd/trace-read.c b/tracecmd/trace-read.c
index f7ffb89e..cafceffe 100644
--- a/tracecmd/trace-read.c
+++ b/tracecmd/trace-read.c
@@ -948,18 +948,20 @@ void trace_show_data(struct tracecmd_input *handle, struct tep_record *record)
printf("\n");
}
-static void read_rest(void)
+static void read_latency(struct tracecmd_input *handle)
{
- char buf[BUFSIZ + 1];
+ char *buf = NULL;
+ size_t size = 0;
int r;
do {
- r = read(input_fd, buf, BUFSIZ);
- if (r > 0) {
- buf[r] = 0;
- printf("%s", buf);
- }
+ r = tracecmd_latency_data_read(handle, &buf, &size);
+ if (r > 0)
+ printf("%.*s", r, buf);
} while (r > 0);
+
+ printf("\n");
+ free(buf);
}
static int
@@ -1243,7 +1245,7 @@ static void read_data_info(struct list_head *handle_list, enum output_type otype
if (ret > 0) {
if (multi_inputs)
die("latency traces do not work with multiple inputs");
- read_rest();
+ read_latency(handles->handle);
return;
}
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
` (2 preceding siblings ...)
2021-11-11 15:11 ` [PATCH v5 23/25] trace-cmd report: Use the new latency API to read data Tzvetomir Stoyanov (VMware)
@ 2021-11-11 15:11 ` Tzvetomir Stoyanov (VMware)
2021-11-24 19:51 ` Steven Rostedt
2021-11-11 15:11 ` [PATCH v5 25/25] trace-cmd report: Add new parameter for trace file version Tzvetomir Stoyanov (VMware)
4 siblings, 1 reply; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
When creating a trace file, two more APIs should be called, compared to
the old flow:
- tracecmd_write_buffer_info(), to write version 6 buffers metadata in
the file.
- tracecmd_write_options() after the trace data is written, for version
7 trace files, as the buffer metadata is appended to the options at
the end.
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
tracecmd/trace-listen.c | 6 ++++++
tracecmd/trace-record.c | 4 ++++
tracecmd/trace-restore.c | 3 ++-
tracecmd/trace-split.c | 3 +++
4 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/tracecmd/trace-listen.c b/tracecmd/trace-listen.c
index 45ba1211..28be6e7b 100644
--- a/tracecmd/trace-listen.c
+++ b/tracecmd/trace-listen.c
@@ -604,6 +604,9 @@ static int put_together_file(int cpus, int ofd, const char *node,
if (write_options) {
ret = tracecmd_write_cpus(handle, cpus);
+ if (ret)
+ goto out;
+ ret = tracecmd_write_buffer_info(handle);
if (ret)
goto out;
ret = tracecmd_write_options(handle);
@@ -612,6 +615,9 @@ static int put_together_file(int cpus, int ofd, const char *node,
}
ret = tracecmd_write_cpu_data(handle, cpus, temp_files, NULL);
+ if (!ret && tracecmd_get_out_file_version(handle) >= FILE_VERSION_SECTIONS)
+ tracecmd_write_options(handle);
+
out:
tracecmd_output_close(handle);
for (cpu--; cpu >= 0; cpu--) {
diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c
index 0b1dc508..338a6a8a 100644
--- a/tracecmd/trace-record.c
+++ b/tracecmd/trace-record.c
@@ -3729,6 +3729,9 @@ setup_connection(struct buffer_instance *instance, struct common_record_context
if (ret)
goto error;
ret = tracecmd_write_cpus(network_handle, instance->cpu_count);
+ if (ret)
+ goto error;
+ ret = tracecmd_write_buffer_info(network_handle);
if (ret)
goto error;
ret = tracecmd_write_options(network_handle);
@@ -4092,6 +4095,7 @@ static void setup_agent(struct buffer_instance *instance,
add_options(network_handle, ctx);
tracecmd_write_cmdlines(network_handle);
tracecmd_write_cpus(network_handle, instance->cpu_count);
+ tracecmd_write_buffer_info(network_handle);
tracecmd_write_options(network_handle);
tracecmd_msg_finish_sending_data(instance->msg_handle);
instance->network_handle = network_handle;
diff --git a/tracecmd/trace-restore.c b/tracecmd/trace-restore.c
index 8d2fcae8..a903c21a 100644
--- a/tracecmd/trace-restore.c
+++ b/tracecmd/trace-restore.c
@@ -163,6 +163,7 @@ void trace_restore (int argc, char **argv)
if (tracecmd_append_cpu_data(handle, args, &argv[first_arg]) < 0)
die("failed to append data");
-
+ if (tracecmd_get_out_file_version(handle) >= FILE_VERSION_SECTIONS)
+ tracecmd_write_options(handle);
return;
}
diff --git a/tracecmd/trace-split.c b/tracecmd/trace-split.c
index e4a0c3b3..671d6e9f 100644
--- a/tracecmd/trace-split.c
+++ b/tracecmd/trace-split.c
@@ -391,6 +391,9 @@ static double parse_file(struct tracecmd_input *handle,
if (tracecmd_append_cpu_data(ohandle, cpus, cpu_list) < 0)
die("Failed to append tracing data\n");
+ if (tracecmd_get_out_file_version(ohandle) >= FILE_VERSION_SECTIONS)
+ tracecmd_write_options(ohandle);
+
current = end;
for (cpu = 0; cpu < cpus; cpu++) {
/* Set the tracecmd cursor to the next set of records */
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 25/25] trace-cmd report: Add new parameter for trace file version
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
` (3 preceding siblings ...)
2021-11-11 15:11 ` [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file Tzvetomir Stoyanov (VMware)
@ 2021-11-11 15:11 ` Tzvetomir Stoyanov (VMware)
4 siblings, 0 replies; 7+ messages in thread
From: Tzvetomir Stoyanov (VMware) @ 2021-11-11 15:11 UTC (permalink / raw)
To: rostedt; +Cc: linux-trace-devel
By default, "trace-cmd report" writes in trace file version 6.
A new parameter is added, which can be used to set desired version
the output trace file.
"trace-cmd report --file-version <version>"
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
---
tracecmd/trace-record.c | 21 +++++++++++++++++++++
tracecmd/trace-usage.c | 2 +-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c
index 338a6a8a..fab34361 100644
--- a/tracecmd/trace-record.c
+++ b/tracecmd/trace-record.c
@@ -3698,6 +3698,8 @@ static struct tracecmd_output *create_net_output(struct common_record_context *c
out = tracecmd_output_allocate(-1);
if (!out)
return NULL;
+ if (ctx->file_version && tracecmd_output_set_version(out, ctx->file_version))
+ goto error;
if (tracecmd_output_set_msg(out, msg_handle))
goto error;
if (tracecmd_output_write_headers(out, listed_events))
@@ -3744,6 +3746,8 @@ setup_connection(struct buffer_instance *instance, struct common_record_context
network_handle = tracecmd_output_allocate(msg_handle->fd);
if (!network_handle)
goto error;
+ if (tracecmd_output_set_version(network_handle, ctx->file_version))
+ goto error;
if (tracecmd_output_write_headers(network_handle, listed_events))
goto error;
tracecmd_set_quiet(network_handle, quiet);
@@ -4475,6 +4479,8 @@ static struct tracecmd_output *create_output(struct common_record_context *ctx)
out = tracecmd_output_allocate(fd);
if (!out)
goto error;
+ if (ctx->file_version && tracecmd_output_set_version(out, ctx->file_version))
+ goto error;
if (tracecmd_output_write_headers(out, listed_events))
goto error;
return out;
@@ -5785,6 +5791,7 @@ void init_top_instance(void)
}
enum {
+ OPT_file_ver = 238,
OPT_verbose = 239,
OPT_tsc2nsec = 240,
OPT_fork = 241,
@@ -6224,6 +6231,7 @@ static void parse_record_options(int argc,
{"tsc2nsec", no_argument, NULL, OPT_tsc2nsec},
{"poll", no_argument, NULL, OPT_poll},
{"verbose", optional_argument, NULL, OPT_verbose},
+ {"file-version", required_argument, NULL, OPT_file_ver},
{NULL, 0, NULL, 0}
};
@@ -6649,6 +6657,19 @@ static void parse_record_options(int argc,
cmd_check_die(ctx, CMD_set, *(argv+1), "--poll");
recorder_flags |= TRACECMD_RECORD_POLL;
break;
+ case OPT_file_ver:
+ cmd_check_die(ctx, CMD_start, *(argv+1), "--file_version");
+ cmd_check_die(ctx, CMD_set, *(argv+1), "--file_version");
+ cmd_check_die(ctx, CMD_extract, *(argv+1), "--file_version");
+ cmd_check_die(ctx, CMD_stream, *(argv+1), "--file_version");
+ cmd_check_die(ctx, CMD_profile, *(argv+1), "--file_version");
+ ctx->file_version = atoi(optarg);
+ if (ctx->file_version < FILE_VERSION_MIN ||
+ ctx->file_version > FILE_VERSION_MAX)
+ die("Unsupported file version %d, "
+ "supported versions are from %d to %d",
+ ctx->file_version, FILE_VERSION_MIN, FILE_VERSION_MAX);
+ break;
case OPT_quiet:
case 'q':
quiet = true;
diff --git a/tracecmd/trace-usage.c b/tracecmd/trace-usage.c
index 32b38bfd..ac12b066 100644
--- a/tracecmd/trace-usage.c
+++ b/tracecmd/trace-usage.c
@@ -69,7 +69,7 @@ static struct usage_help usage_help[] = {
" If 0 is specified, no loop is performed - timestamps offset is calculated only twice,"
" at the beginnig and at the end of the trace\n"
" --poll don't block while reading from the trace buffer\n"
- " --verbose 'level' Set the desired log level\n"
+ " --file-version set the desired trace file version\n"
},
{
"set",
--
2.33.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file
2021-11-11 15:11 ` [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file Tzvetomir Stoyanov (VMware)
@ 2021-11-24 19:51 ` Steven Rostedt
0 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2021-11-24 19:51 UTC (permalink / raw)
To: Tzvetomir Stoyanov (VMware); +Cc: linux-trace-devel
On Thu, 11 Nov 2021 17:11:32 +0200
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:
> diff --git a/tracecmd/trace-restore.c b/tracecmd/trace-restore.c
> index 8d2fcae8..a903c21a 100644
> --- a/tracecmd/trace-restore.c
> +++ b/tracecmd/trace-restore.c
> @@ -163,6 +163,7 @@ void trace_restore (int argc, char **argv)
>
> if (tracecmd_append_cpu_data(handle, args, &argv[first_arg]) < 0)
> die("failed to append data");
> -
> + if (tracecmd_get_out_file_version(handle) >= FILE_VERSION_SECTIONS)
> + tracecmd_write_options(handle);
I wonder if we are just missing a tracecmd_output_close() here?
And that will write the options as I mentioned before.
> return;
> }
> diff --git a/tracecmd/trace-split.c b/tracecmd/trace-split.c
> index e4a0c3b3..671d6e9f 100644
> --- a/tracecmd/trace-split.c
> +++ b/tracecmd/trace-split.c
> @@ -391,6 +391,9 @@ static double parse_file(struct tracecmd_input *handle,
> if (tracecmd_append_cpu_data(ohandle, cpus, cpu_list) < 0)
> die("Failed to append tracing data\n");
>
> + if (tracecmd_get_out_file_version(ohandle) >= FILE_VERSION_SECTIONS)
> + tracecmd_write_options(ohandle);
> +
And no more is written here to ohandle, and the close should fix it as well.
-- Steve
> current = end;
> for (cpu = 0; cpu < cpus; cpu++) {
> /* Set the tracecmd cursor to the next set of records */
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-11-24 19:51 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-11 15:11 [PATCH v5 20/25] trace-cmd library: Initialize CPU data for reading from version 7 trace files Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 21/25] trace-cmd library: Handle latency trace in version 7 files Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 22/25] trace-cmd library: Handle buffer trace data init for " Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 23/25] trace-cmd report: Use the new latency API to read data Tzvetomir Stoyanov (VMware)
2021-11-11 15:11 ` [PATCH v5 24/25] trace-cmd: Call additional APIs when creating trace file Tzvetomir Stoyanov (VMware)
2021-11-24 19:51 ` Steven Rostedt
2021-11-11 15:11 ` [PATCH v5 25/25] trace-cmd report: Add new parameter for trace file version Tzvetomir Stoyanov (VMware)
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).