perf: Add support to the perf tool to specify extra values
PATCH v2 3/4 perf: Add support to the perf tool to specify extra values
From: Andi Kleen <[email protected]>
Change logs:
- Use ":" to specify extra value since "," was already used for multiple events.
Add support to the perf tool to specify extra values for raw events and pass them to the kernel.
The new format is -e rXXXX[:YYYY]
Signed-off-by Andi Kleen <[email protected]>
Signed-off-by Lin Ming <[email protected]>
--- tools/perf/builtin-report.c | 7 ++++--- tools/perf/util/parse-events.c | 24 +++++++++++++++++++----- tools/perf/util/parse-events.h | 2 +- tools/perf/util/ui/browsers/hists.c | 3 ++- 4 files changed, 26 insertions(+), 10 deletions(-)
tools/perf/builtin-report.c +4 -3
@@ -201,7 +201,8 @@ static int process_read_event(union perf_event *event, attr =perf_header__find_attr (event->read.id, &session->header);if (show_threads) { -const char *name = attr ?__event_name (attr->type, attr->config) +const char *name = attr ?__event_name (attr->type, attr->config, +0 ) :"unknown" ; perf_read_values_add_value(&show_threads_values, event->read.pid, event->read.tid,
@@ -211,7 +212,7 @@ static int process_read_event(union perf_event *event, }dump_printf (": %d %d %s %" PRIu64"\n" , event->read.pid, event->read.tid, - attr ?__event_name (attr->type, attr->config) :"FAIL" , + attr ?__event_name (attr->type, attr->config,0 ) :"FAIL" , event->read.value);return 0 ;
@@ -291,7 +292,7 @@ static int hists__tty_browse_tree(struct rb_root *tree, const char *help)const char *evname =NULL ;if (rb_first (&hists->entries) !=rb_last (&hists->entries)) - evname =__event_name (hists->type, hists->config); + evname =__event_name (hists->type, hists->config,0 );hists__fprintf_nr_sample_events (hists, evname, stdout);hists__fprintf (hists,NULL , false, stdout);
tools/perf/util/parse-events.c +19 -5
@@ -271,15 +271,18 @@ const char *event_name(struct perf_evsel *evsel)if (evsel->name)return evsel->name; -return __event_name (type, config); +return __event_name (type, config, evsel->attr.config1); } -const char *__event_name (int type,u64 config) +const char *__event_name (int type,u64 config,u64 extra) {static char buf[32 ]; +int n;if (type ==PERF_TYPE_RAW ) { -sprintf (buf,"raw 0x%" PRIx64, config); + n =sprintf (buf,"raw 0x%" PRIx64, config); +if (extra) +sprintf (buf + n,":%#" PRIx64, extra);return buf; }
@@ -666,9 +669,20 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr)return EVT_FAILED ; n =hex2u64 (str +1 , &config);if (n >0 ) { - *strp = str + n +1 ; + str += n +1 ; + *strp = str; attr->type =PERF_TYPE_RAW ; attr->config = config; + +if (*str++ ==':' ) { + n =hex2u64 (str +1 , &config); +if (n >0 ) { + attr->config1 = config; + str += n +1 ; + *strp = str; + } + } +return EVT_HANDLED ; }return EVT_FAILED ;
@@ -1035,7 +1049,7 @@ void print_events(const char *event_glob)printf ("\n" );printf (" %-42s [%s]\n" , -"rNNN (see 'perf list --help' on how to encode it)" , +"rNNN[:EEE] (see 'perf list --help' on how to encode it)" , event_type_descriptors[PERF_TYPE_RAW ]);printf ("\n" );
tools/perf/util/parse-events.h +1 -1
@@ -21,7 +21,7 @@ extern struct tracepoint_path *tracepoint_id_to_path(u64 config);extern bool have_tracepoints (struct list_head *evlist);const char *event_name (struct perf_evsel *event); -extern const char *__event_name (int type,u64 config); +extern const char *__event_name (int type,u64 config,u64 extra);extern int parse_events (const struct option *opt,const char *str,int unset);extern int parse_filter (const struct option *opt,const char *str,int unset);
tools/perf/util/ui/browsers/hists.c +2 -1
@@ -984,7 +984,8 @@ int hists__tui_browse_tree(struct rb_root *self, const char *help, int evidx)while (nd) { struct hists *hists = rb_entry(nd, struct hists, rb_node); -const char *ev_name =__event_name (hists->type, hists->config); +const char *ev_name =__event_name (hists->type, hists->config, +0 ); key =hists__browse (hists, help, ev_name, evidx);switch (key) {
Signature · 1 line
1.7.3