Message ID | 20210322095945.259300-9-tz.stoyanov@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | TSC trace clock to nanosecond conversion | expand |
On Mon, 22 Mar 2021 11:59:35 +0200 "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote: > @@ -4168,7 +4167,8 @@ static void write_guest_file(struct buffer_instance *instance) > handle = tracecmd_get_output_handle_fd(fd); > if (!handle) > die("error writing to %s", file); > - > + if (instance->flags & BUFFER_FL_TSC2NSEC) > + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); > temp_files = malloc(sizeof(*temp_files) * cpu_count); > if (!temp_files) > die("failed to allocate temp_files for %d cpus", > @@ -4290,9 +4290,10 @@ static void record_data(struct common_record_context *ctx) > add_guest_info(handle, instance); > } > > - if (ctx->tsc2nsec.mult) > + if (ctx->tsc2nsec.mult) { > add_tsc2nsec(handle, &ctx->tsc2nsec); > - > + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); > + } > if (tracecmd_write_cmdlines(handle)) > die("Writing cmdlines"); > OK, I see why you wanted to clean up the writing of all clocks. But I still find that information valuable as for the reasons I stated in the other email. I wonder if we can still read all the clocks, parse them out (remove the '[' and ']') and have tracecmd_set_out_clock() still write them. Hmm? Or at least save them in a new option (like I save uname). -- Steve
On Wed, Mar 24, 2021 at 3:34 AM Steven Rostedt <rostedt@goodmis.org> wrote: > > On Mon, 22 Mar 2021 11:59:35 +0200 > "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote: > > > @@ -4168,7 +4167,8 @@ static void write_guest_file(struct buffer_instance *instance) > > handle = tracecmd_get_output_handle_fd(fd); > > if (!handle) > > die("error writing to %s", file); > > - > > + if (instance->flags & BUFFER_FL_TSC2NSEC) > > + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); > > temp_files = malloc(sizeof(*temp_files) * cpu_count); > > if (!temp_files) > > die("failed to allocate temp_files for %d cpus", > > @@ -4290,9 +4290,10 @@ static void record_data(struct common_record_context *ctx) > > add_guest_info(handle, instance); > > } > > > > - if (ctx->tsc2nsec.mult) > > + if (ctx->tsc2nsec.mult) { > > add_tsc2nsec(handle, &ctx->tsc2nsec); > > - > > + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); > > + } > > if (tracecmd_write_cmdlines(handle)) > > die("Writing cmdlines"); > > > > OK, I see why you wanted to clean up the writing of all clocks. But I > still find that information valuable as for the reasons I stated in the > other email. I wonder if we can still read all the clocks, parse them > out (remove the '[' and ']') and have tracecmd_set_out_clock() still > write them. Hmm? Or at least save them in a new option (like I save > uname). The TRACECMD_OPTION_TRACECLOCK option can be extended to hold the content of the "trace_clock" file. It is an empty option now, adding more bytes will not break the old logic. > > -- Steve
diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h index ce3d8dc0..c33d067a 100644 --- a/lib/trace-cmd/include/private/trace-cmd-private.h +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -22,6 +22,8 @@ #define TRACECMD_ERROR(ret) ((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK)) #define TRACECMD_PTR2ERR(ptr) ((unisgned long)(ptr) & ~TRACECMD_ERR_MSK) +#define TSCNSEC_CLOCK "tsc2nsec" + void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size); void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index ebc28f7b..67915f25 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -2906,7 +2906,7 @@ static void extract_trace_clock(struct tracecmd_input *handle, char *line) /* Clear usecs if not one of the specified clocks */ if (strcmp(clock, "local") && strcmp(clock, "global") && strcmp(clock, "uptime") && strcmp(clock, "perf") && - strncmp(clock, "mono", 4)) + strncmp(clock, "mono", 4) && strcmp(clock, TSCNSEC_CLOCK)) handle->flags &= ~TRACECMD_FL_IN_USECS; } diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index 37a0f486..9ae6e032 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -58,7 +58,6 @@ #define STAMP "stamp" #define FUNC_STACK_TRACE "func_stack_trace" #define TSC_CLOCK "x86-tsc" -#define TSCNSEC_CLOCK "tsc2nsec" enum trace_type { TRACE_TYPE_RECORD = 1, @@ -4168,7 +4167,8 @@ static void write_guest_file(struct buffer_instance *instance) handle = tracecmd_get_output_handle_fd(fd); if (!handle) die("error writing to %s", file); - + if (instance->flags & BUFFER_FL_TSC2NSEC) + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); temp_files = malloc(sizeof(*temp_files) * cpu_count); if (!temp_files) die("failed to allocate temp_files for %d cpus", @@ -4290,9 +4290,10 @@ static void record_data(struct common_record_context *ctx) add_guest_info(handle, instance); } - if (ctx->tsc2nsec.mult) + if (ctx->tsc2nsec.mult) { add_tsc2nsec(handle, &ctx->tsc2nsec); - + tracecmd_set_out_clock(handle, TSCNSEC_CLOCK); + } if (tracecmd_write_cmdlines(handle)) die("Writing cmdlines");
When tsc2nsec clock is used, save it as selected clock in the trace.dat file. When reading the file, in case of tsc2nsec clock show timestamps in usec / nsec. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/include/private/trace-cmd-private.h | 2 ++ lib/trace-cmd/trace-input.c | 2 +- tracecmd/trace-record.c | 9 +++++---- 3 files changed, 8 insertions(+), 5 deletions(-)