Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b372ca5 authored by Yoshihiro YUNOMAE's avatar Yoshihiro YUNOMAE Committed by Arnaldo Carvalho de Melo
Browse files

tools lib traceevent: Add support for extracting trace_clock in report



If trace-cmd extracts trace_clock, trace-cmd reads trace_clock data from
the trace.dat and switches outputting format of timestamp for each
trace_clock.

Signed-off-by: default avatarYoshihiro YUNOMAE <yoshihiro.yunomae.ez@hitachi.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20130424231305.14877.86147.stgit@yunodevel


Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent cc03c542
Loading
Loading
Loading
Loading
+39 −11
Original line number Original line Diff line number Diff line
@@ -305,6 +305,11 @@ int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
	return 0;
	return 0;
}
}


void pevent_register_trace_clock(struct pevent *pevent, char *trace_clock)
{
	pevent->trace_clock = trace_clock;
}

struct func_map {
struct func_map {
	unsigned long long		addr;
	unsigned long long		addr;
	char				*func;
	char				*func;
@@ -4443,8 +4448,21 @@ void pevent_event_info(struct trace_seq *s, struct event_format *event,
	trace_seq_terminate(s);
	trace_seq_terminate(s);
}
}


static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
{
	if (!use_trace_clock)
		return true;

	if (!strcmp(trace_clock, "local") || !strcmp(trace_clock, "global")
	    || !strcmp(trace_clock, "uptime") || !strcmp(trace_clock, "perf"))
		return true;

	/* trace_clock is setting in tsc or counter mode */
	return false;
}

void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			struct pevent_record *record)
			struct pevent_record *record, bool use_trace_clock)
{
{
	static const char *spaces = "                    "; /* 20 spaces */
	static const char *spaces = "                    "; /* 20 spaces */
	struct event_format *event;
	struct event_format *event;
@@ -4457,9 +4475,14 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
	int pid;
	int pid;
	int len;
	int len;
	int p;
	int p;
	bool use_usec_format;


	use_usec_format = is_timestamp_in_us(pevent->trace_clock,
							use_trace_clock);
	if (use_usec_format) {
		secs = record->ts / NSECS_PER_SEC;
		secs = record->ts / NSECS_PER_SEC;
		nsecs = record->ts - secs * NSECS_PER_SEC;
		nsecs = record->ts - secs * NSECS_PER_SEC;
	}


	if (record->size < 0) {
	if (record->size < 0) {
		do_warning("ug! negative record size %d", record->size);
		do_warning("ug! negative record size %d", record->size);
@@ -4484,6 +4507,7 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
	} else
	} else
		trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
		trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);


	if (use_usec_format) {
		if (pevent->flags & PEVENT_NSEC_OUTPUT) {
		if (pevent->flags & PEVENT_NSEC_OUTPUT) {
			usecs = nsecs;
			usecs = nsecs;
			p = 9;
			p = 9;
@@ -4492,7 +4516,11 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			p = 6;
			p = 6;
		}
		}


	trace_seq_printf(s, " %5lu.%0*lu: %s: ", secs, p, usecs, event->name);
		trace_seq_printf(s, " %5lu.%0*lu: %s: ",
					secs, p, usecs, event->name);
	} else
		trace_seq_printf(s, " %12llu: %s: ",
					record->ts, event->name);


	/* Space out the event names evenly. */
	/* Space out the event names evenly. */
	len = strlen(event->name);
	len = strlen(event->name);
+5 −1
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#ifndef _PARSE_EVENTS_H
#ifndef _PARSE_EVENTS_H
#define _PARSE_EVENTS_H
#define _PARSE_EVENTS_H


#include <stdbool.h>
#include <stdarg.h>
#include <stdarg.h>
#include <regex.h>
#include <regex.h>


@@ -450,6 +451,8 @@ struct pevent {


	/* cache */
	/* cache */
	struct event_format *last_event;
	struct event_format *last_event;

	char *trace_clock;
};
};


static inline void pevent_set_flag(struct pevent *pevent, int flag)
static inline void pevent_set_flag(struct pevent *pevent, int flag)
@@ -527,6 +530,7 @@ enum trace_flag_type {
};
};


int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
void pevent_register_trace_clock(struct pevent *pevent, char *trace_clock);
int pevent_register_function(struct pevent *pevent, char *name,
int pevent_register_function(struct pevent *pevent, char *name,
			     unsigned long long addr, char *mod);
			     unsigned long long addr, char *mod);
int pevent_register_print_string(struct pevent *pevent, char *fmt,
int pevent_register_print_string(struct pevent *pevent, char *fmt,
@@ -534,7 +538,7 @@ int pevent_register_print_string(struct pevent *pevent, char *fmt,
int pevent_pid_is_registered(struct pevent *pevent, int pid);
int pevent_pid_is_registered(struct pevent *pevent, int pid);


void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			struct pevent_record *record);
			struct pevent_record *record, bool use_trace_clock);


int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
			     int long_size);
			     int long_size);