@@ -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);
@@ -3201,6 +3201,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;
@@ -3263,6 +3281,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;
@@ -3277,7 +3301,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)
@@ -1786,7 +1786,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;
@@ -1801,6 +1802,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))
@@ -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)
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(-)