perf util: Save pid-cmdline mapping into tracing header
tip-bot for Namhyung Kim
merge botCommit-ID: cd4ceb63438e9e28299f4352ae7b75d2967a772d Gitweb: http://git.kernel.org/tip/cd4ceb63438e9e28299f4352ae7b75d2967a772d Author: Namhyung Kim <[email protected]> AuthorDate: Thu, 11 Apr 2013 17:25:04 +0900 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 26 Jan 2017 11:42:59 -0300
perf util: Save pid-cmdline mapping into tracing header
Current trace info data lacks the saved cmdline mapping which is needed for pevent to find out the comm of a task. Add this and bump up the version number so that perf can determine its presence when reading.
This is mostly corresponding to trace.dat file version 6, but still lacks 4 byte of number of cpus, and 10 bytes of type string - and I think we don't need those anyway.
Signed-off-by Namhyung Kim <[email protected]>
Tested-by Masami Hiramatsu <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jeremy Eder <[email protected]>
Cc Jiri Olsa <[email protected]>,
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Cc Steven Rostedt <[email protected]>
[ Change version test from == to >= ]
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/trace-event-info.c | 33 ++++++++++++++++++++++++++++++++- tools/perf/util/trace-event-parse.c | 17 +++++++++++++++++ tools/perf/util/trace-event-read.c | 36 ++++++++++++++++++++++++++++++++++-- tools/perf/util/trace-event.h | 1 + 4 files changed, 84 insertions(+), 3 deletions(-)
tools/perf/util/trace-event-info.c +32 -1
@@ -42,7 +42,7 @@#include "evsel.h" #include "debug.h" -#define VERSION "0.5" +#define VERSION "0.6"static int output_fd;
@@ -379,6 +379,34 @@ out:return err; } +static int record_saved_cmdline (void ) +{ +unsigned int size; +char *path; +struct stat st; +int ret, err =0 ; + + path =get_tracing_file ("saved_cmdlines" ); +if (!path) { +pr_debug ("can't get tracing/saved_cmdline" ); +return -ENOMEM ; + } + + ret =stat (path, &st); +if (ret <0 ) { +/* not found */ + size =0 ; +if (write (output_fd, &size,8 ) !=8 ) + err = -EIO ; + goto out; + } + err =record_file (path,8 ); + +out: +put_tracing_file (path); +return err; +} +static void put_tracepoints_path (struct tracepoint_path *tps) {
@@ -539,6 +567,9 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,if (err) goto out; err =record_ftrace_printk (); +if (err) + goto out; + err =record_saved_cmdline (); out:/*
tools/perf/util/trace-event-parse.c +17 -0
@@ -160,6 +160,23 @@ void parse_ftrace_printk(struct pevent *pevent, } } +void parse_saved_cmdline (struct pevent *pevent, +char *file,unsigned int size__maybe_unused ) +{ +char *comm; +char *line; +char *next =NULL ; +int pid; + + line =strtok_r (file,"\n" , &next); +while (line) { +sscanf (line,"%d %ms" , &pid, &comm); +pevent_register_comm (pevent, comm, pid); +free (comm); + line =strtok_r (NULL ,"\n" , &next); + } +} +int parse_ftrace_file (struct pevent *pevent,char *buf,unsigned long size) {return pevent_parse_event (pevent, buf, size,"ftrace" );
tools/perf/util/trace-event-read.c +34 -2
@@ -341,6 +341,31 @@ static int read_event_files(struct pevent *pevent)return 0 ; } +static int read_saved_cmdline (struct pevent *pevent) +{ +unsigned long long size; +char *buf; + +/* it can have 0 size */ + size =read8 (pevent); +if (!size) +return 0 ; + + buf =malloc (size +1 ); +if (buf ==NULL ) +return -1 ; + +if (do_read (buf, size) <0 ) { +free (buf); +return -1 ; + } + +parse_saved_cmdline (pevent, buf, size); + +free (buf); +return 0 ; +} +ssize_t trace_report (int fd,struct trace_event *tevent,bool __repipe) {char buf[BUFSIZ ];
@@ -379,10 +404,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)return -1 ;if (show_version)printf ("version = %s\n" , version); -free (version); -if (do_read (buf,1 ) <0 ) +if (do_read (buf,1 ) <0 ) { +free (version);return -1 ; + } file_bigendian = buf[0 ]; host_bigendian =bigendian ();
@@ -423,6 +449,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe) err =read_ftrace_printk (pevent);if (err) goto out; +if (atof (version) >=0.6 ) { + err =read_saved_cmdline (pevent); +if (err) + goto out; + } size = trace_data_size; repipe = false;
@@ -438,5 +469,6 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe) out:if (pevent)trace_event__cleanup (tevent); +free (version);return size; }
tools/perf/util/trace-event.h +1 -0
@@ -42,6 +42,7 @@ raw_field_value(struct event_format *event, const char *name, void *data);void parse_proc_kallsyms (struct pevent *pevent,char *file,unsigned int size);void parse_ftrace_printk (struct pevent *pevent,char *file,unsigned int size); +void parse_saved_cmdline (struct pevent *pevent,char *file,unsigned int size);ssize_t trace_report (int fd,struct trace_event *tevent,bool repipe);