Trace clock, used for curent trace sessions is saved in the trace.dat file. This information is used when displaying timestamps of the events. However, only the selected clock is needed. A new API is added: tracecmd_set_out_clock(); that can be used to set the trace clock on the output handle. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- .../include/private/trace-cmd-private.h | 1 + lib/trace-cmd/trace-output.c | 66 +++++++++++++++---- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h index 27f4c9c3..a4637046 100644 --- a/lib/trace-cmd/include/private/trace-cmd-private.h +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -83,6 +83,7 @@ tracecmd_plugin_context_output(struct trace_plugin_context *trace_context); void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet); bool tracecmd_get_quiet(struct tracecmd_output *handle); +void tracecmd_set_out_clock(struct tracecmd_output *handle, char *clock); static inline int tracecmd_host_bigendian(void) { diff --git a/lib/trace-cmd/trace-output.c b/lib/trace-cmd/trace-output.c index 54ddcb54..ea6d1ba3 100644 --- a/lib/trace-cmd/trace-output.c +++ b/lib/trace-cmd/trace-output.c @@ -59,6 +59,7 @@ struct tracecmd_output { unsigned long file_state; struct list_head options; struct tracecmd_msg_handle *msg_handle; + char *trace_clock; }; struct list_event { @@ -118,6 +119,12 @@ void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet) handle->quiet = set_quiet; } +void tracecmd_set_out_clock(struct tracecmd_output *handle, char *clock) +{ + if (handle && clock) + handle->trace_clock = strdup(clock); +} + /** * tracecmd_get_quiet - Get if to print output to the screen * Returns non zero, if no output to the screen should be printed @@ -150,7 +157,7 @@ void tracecmd_output_free(struct tracecmd_output *handle) free(option->data); free(option); } - + free(handle->trace_clock); free(handle); } @@ -1359,6 +1366,46 @@ out_free: return NULL; } +static int save_clock(struct tracecmd_output *handle, char *clock) +{ + unsigned long long endian8; + char *str = NULL; + int ret; + + ret = asprintf(&str, "[%s]", clock); + if (ret < 0) + return -1; + + endian8 = convert_endian_8(handle, strlen(str)); + ret = do_write_check(handle, &endian8, 8); + if (ret) + goto out; + ret = do_write_check(handle, str, strlen(str)); + +out: + free(str); + return ret; +} + +static char *get_clock(struct tracecmd_output *handle) +{ + struct tracefs_instance *inst; + + if (handle->trace_clock) + return handle->trace_clock; + + /* + * If no clock is set on this handle, get the trace clock of + * the top instance in the handle's tracing dir + */ + inst = tracefs_instance_alloc(handle->tracing_dir, NULL); + if (!inst) + return NULL; + handle->trace_clock = tracefs_get_clock(inst); + tracefs_instance_free(inst); + return handle->trace_clock; +} + int tracecmd_write_cpu_data(struct tracecmd_output *handle, int cpus, char * const *cpu_data_files) { @@ -1366,6 +1413,7 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle, unsigned long long *sizes = NULL; off64_t offset; unsigned long long endian8; + char *clock = NULL; off64_t check_size; char *file; struct stat st; @@ -1403,18 +1451,14 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle, * we need to find the size of it before we define the final * offsets. */ - file = get_tracing_file(handle, "trace_clock"); - if (!file) + clock = get_clock(handle); + if (!clock) goto out_free; - /* Save room for storing the size */ offset += 8; - - ret = stat(file, &st); - if (ret >= 0) - offset += get_size(file); - - put_tracing_file(file); + offset += strlen(clock); + /* 2 bytes for [] around the clock */ + offset += 2; /* Page align offset */ offset = (offset + (handle->page_size - 1)) & ~(handle->page_size - 1); @@ -1439,7 +1483,7 @@ int tracecmd_write_cpu_data(struct tracecmd_output *handle, goto out_free; } - if (save_tracing_file_data(handle, "trace_clock") < 0) + if (save_clock(handle, clock)) goto out_free; for (i = 0; i < cpus; i++) { -- 2.30.2