[PATCH 1/8] perf, tool: Add support to parse event group syntax

From: Jiri Olsa
Date: Wed Apr 04 2012 - 17:16:38 EST


Adding scanner/parser bits to add group event support into the
event syntax.

The grammar for group is:
start: groups
groups: groups ';' group
group: 'group=' events

It is possible to specify group assignement in event syntax like:
perf record -e group=cycles,faults ls

Creating multiple events within one '-e' option with the ';' separator:
perf record -e 'group=cycles,faults;group=instructions,cache-misses' ls

The grouping functionality itself is comming in shortly.

Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
---
tools/perf/util/parse-events.c | 5 +++
tools/perf/util/parse-events.h | 1 +
tools/perf/util/parse-events.l | 2 +
tools/perf/util/parse-events.y | 55 ++++++++++++++++++++++++++++++++++-----
4 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index d4abd00..53c7505 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -791,6 +791,11 @@ int parse_events_add_pmu(struct list_head **list, int *idx,
return add_event(list, idx, &attr, name);
}

+int parse_events__group(struct list_head *list __used)
+{
+ return 0;
+}
+
void parse_events_update_lists(struct list_head *list_event,
struct list_head *list_all)
{
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 8651757..a5e1adf 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -99,6 +99,7 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx,
void *ptr, char *type);
int parse_events_add_pmu(struct list_head **list, int *idx,
char *pmu , struct list_head *head_config);
+int parse_events__group(struct list_head *list);
void parse_events_update_lists(struct list_head *list_event,
struct list_head *list_all);
void parse_events_error(struct list_head *list_all,
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index cd6614d..c867b34 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -107,6 +107,7 @@ period { return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
branch_type { return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }

mem: { return PE_PREFIX_MEM; }
+group= { return PE_PREFIX_GROUP; }
r{num_raw_hex} { return raw(); }
{num_dec} { return value(10); }
{num_hex} { return value(16); }
@@ -118,6 +119,7 @@ r{num_raw_hex} { return raw(); }
- { return '-'; }
, { return ','; }
: { return ':'; }
+; { return ';'; }
= { return '='; }
\| { return '|'; }

diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 5899a0e..a3898d6 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -27,7 +27,7 @@ do { \
%token PE_NAME
%token PE_MODIFIER_EVENT PE_MODIFIER_BP
%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
-%token PE_PREFIX_MEM PE_PREFIX_RAW
+%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
%token PE_ERROR
%type <num> PE_VALUE
%type <num> PE_VALUE_SYM
@@ -50,6 +50,10 @@ do { \
%type <head> event_legacy_numeric
%type <head> event_legacy_raw
%type <head> event_def
+%type <head> event
+%type <head> events
+%type <head> group
+%type <head> groups

%union
{
@@ -61,25 +65,62 @@ do { \
}
%%

+start: groups
+{
+ struct list_head *groups = $1;
+
+ parse_events_update_lists(groups, list_all);
+}
+
+groups:
+groups ';' group
+{
+ struct list_head *group = $3;
+ struct list_head *list = $1;
+
+ parse_events_update_lists(group, list);
+ $$ = list;
+}
+|
+group
+
+group:
+PE_PREFIX_GROUP events
+{
+ struct list_head *list = $2;
+
+ ABORT_ON(parse_events__group(list));
+ $$ = list;
+}
+|
+events
+
events:
-events ',' event | event
+events ',' event
+{
+ struct list_head *event = $3;
+ struct list_head *list = $1;
+
+ parse_events_update_lists(event, list);
+ $$ = list;
+}
+|
+event

event:
event_def PE_MODIFIER_EVENT
{
+ struct list_head *list = $1;
/*
* Apply modifier on all events added by single event definition
* (there could be more events added for multiple tracepoint
* definitions via '*?'.
*/
- ABORT_ON(parse_events_modifier($1, $2));
- parse_events_update_lists($1, list_all);
+ ABORT_ON(parse_events_modifier(list, $2));
+ $$ = list;
}
|
event_def
-{
- parse_events_update_lists($1, list_all);
-}

event_def: event_pmu |
event_legacy_symbol |
--
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/