Skip to content

Commit

Permalink
perf tools: Use allocated list for each parsed event
Browse files Browse the repository at this point in the history
Switch from using static temporary event list into dynamically allocated
one. This way we dont need to pass temp list to the parse_events_parse
which makes the interface more clear.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1337584373-2741-4-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Jiri Olsa authored and Arnaldo Carvalho de Melo committed May 22, 2012
1 parent 82ba1f2 commit b847cbd
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 41 deletions.
39 changes: 24 additions & 15 deletions tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ struct event_symbol {
#ifdef PARSER_DEBUG
extern int parse_events_debug;
#endif
int parse_events_parse(struct list_head *list, struct list_head *list_tmp,
int *idx);
int parse_events_parse(struct list_head *list, int *idx);

#define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x
#define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x
Expand Down Expand Up @@ -358,20 +357,30 @@ const char *__event_name(int type, u64 config)
return "unknown";
}

static int add_event(struct list_head *list, int *idx,
static int add_event(struct list_head **_list, int *idx,
struct perf_event_attr *attr, char *name)
{
struct perf_evsel *evsel;
struct list_head *list = *_list;

if (!list) {
list = malloc(sizeof(*list));
if (!list)
return -ENOMEM;
INIT_LIST_HEAD(list);
}

event_attr_init(attr);

evsel = perf_evsel__new(attr, (*idx)++);
if (!evsel)
if (!evsel) {
free(list);
return -ENOMEM;

list_add_tail(&evsel->node, list);
}

evsel->name = strdup(name);
list_add_tail(&evsel->node, list);
*_list = list;
return 0;
}

Expand All @@ -393,7 +402,7 @@ static int parse_aliases(char *str, const char *names[][MAX_ALIASES], int size)
return -1;
}

int parse_events_add_cache(struct list_head *list, int *idx,
int parse_events_add_cache(struct list_head **list, int *idx,
char *type, char *op_result1, char *op_result2)
{
struct perf_event_attr attr;
Expand Down Expand Up @@ -454,7 +463,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
return add_event(list, idx, &attr, name);
}

static int add_tracepoint(struct list_head *list, int *idx,
static int add_tracepoint(struct list_head **list, int *idx,
char *sys_name, char *evt_name)
{
struct perf_event_attr attr;
Expand Down Expand Up @@ -491,7 +500,7 @@ static int add_tracepoint(struct list_head *list, int *idx,
return add_event(list, idx, &attr, name);
}

static int add_tracepoint_multi(struct list_head *list, int *idx,
static int add_tracepoint_multi(struct list_head **list, int *idx,
char *sys_name, char *evt_name)
{
char evt_path[MAXPATHLEN];
Expand Down Expand Up @@ -522,7 +531,7 @@ static int add_tracepoint_multi(struct list_head *list, int *idx,
return ret;
}

int parse_events_add_tracepoint(struct list_head *list, int *idx,
int parse_events_add_tracepoint(struct list_head **list, int *idx,
char *sys, char *event)
{
int ret;
Expand Down Expand Up @@ -566,7 +575,7 @@ parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
return 0;
}

int parse_events_add_breakpoint(struct list_head *list, int *idx,
int parse_events_add_breakpoint(struct list_head **list, int *idx,
void *ptr, char *type)
{
struct perf_event_attr attr;
Expand Down Expand Up @@ -645,7 +654,7 @@ static int config_attr(struct perf_event_attr *attr,
return 0;
}

int parse_events_add_numeric(struct list_head *list, int *idx,
int parse_events_add_numeric(struct list_head **list, int *idx,
unsigned long type, unsigned long config,
struct list_head *head_config)
{
Expand All @@ -663,7 +672,7 @@ int parse_events_add_numeric(struct list_head *list, int *idx,
(char *) __event_name(type, config));
}

int parse_events_add_pmu(struct list_head *list, int *idx,
int parse_events_add_pmu(struct list_head **list, int *idx,
char *name, struct list_head *head_config)
{
struct perf_event_attr attr;
Expand Down Expand Up @@ -696,7 +705,7 @@ void parse_events_update_lists(struct list_head *list_event,
* list, for next event definition.
*/
list_splice_tail(list_event, list_all);
INIT_LIST_HEAD(list_event);
free(list_event);
}

int parse_events_modifier(struct list_head *list, char *str)
Expand Down Expand Up @@ -774,7 +783,7 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used)
#ifdef PARSER_DEBUG
parse_events_debug = 1;
#endif
ret = parse_events_parse(&list, &list_tmp, &idx);
ret = parse_events_parse(&list, &idx);

parse_events__flush_buffer(buffer);
parse_events__delete_buffer(buffer);
Expand Down
16 changes: 6 additions & 10 deletions tools/perf/util/parse-events.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,25 +68,21 @@ int parse_events__term_num(struct parse_events__term **_term,
int parse_events__term_str(struct parse_events__term **_term,
int type_term, char *config, char *str);
void parse_events__free_terms(struct list_head *terms);
int parse_events_modifier(struct list_head *list __used, char *str __used);
int parse_events_add_tracepoint(struct list_head *list, int *idx,
int parse_events_modifier(struct list_head *list, char *str);
int parse_events_add_tracepoint(struct list_head **list, int *idx,
char *sys, char *event);
int parse_events_add_raw(struct perf_evlist *evlist, unsigned long config,
unsigned long config1, unsigned long config2,
char *mod);
int parse_events_add_numeric(struct list_head *list, int *idx,
int parse_events_add_numeric(struct list_head **list, int *idx,
unsigned long type, unsigned long config,
struct list_head *head_config);
int parse_events_add_cache(struct list_head *list, int *idx,
int parse_events_add_cache(struct list_head **list, int *idx,
char *type, char *op_result1, char *op_result2);
int parse_events_add_breakpoint(struct list_head *list, int *idx,
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,
int parse_events_add_pmu(struct list_head **list, int *idx,
char *pmu , struct list_head *head_config);
void parse_events_update_lists(struct list_head *list_event,
struct list_head *list_all);
void parse_events_error(struct list_head *list_all,
struct list_head *list_event,
int *idx, char const *msg);
int parse_events__test(void);

Expand Down
69 changes: 53 additions & 16 deletions tools/perf/util/parse-events.y
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@

%name-prefix "parse_events_"
%parse-param {struct list_head *list_all}
%parse-param {struct list_head *list_event}
%parse-param {int *idx}

%{
Expand Down Expand Up @@ -41,6 +40,14 @@ do { \
%type <str> PE_MODIFIER_BP
%type <head> event_config
%type <term> event_term
%type <head> event_pmu
%type <head> event_legacy_symbol
%type <head> event_legacy_cache
%type <head> event_legacy_mem
%type <head> event_legacy_tracepoint
%type <head> event_legacy_numeric
%type <head> event_legacy_raw
%type <head> event_def

%union
{
Expand All @@ -62,13 +69,13 @@ event_def PE_MODIFIER_EVENT
* (there could be more events added for multiple tracepoint
* definitions via '*?'.
*/
ABORT_ON(parse_events_modifier(list_event, $2));
parse_events_update_lists(list_event, list_all);
ABORT_ON(parse_events_modifier($1, $2));
parse_events_update_lists($1, list_all);
}
|
event_def
{
parse_events_update_lists(list_event, list_all);
parse_events_update_lists($1, list_all);
}

event_def: event_pmu |
Expand All @@ -82,71 +89,102 @@ event_def: event_pmu |
event_pmu:
PE_NAME '/' event_config '/'
{
ABORT_ON(parse_events_add_pmu(list_event, idx, $1, $3));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_pmu(&list, idx, $1, $3));
parse_events__free_terms($3);
$$ = list;
}

event_legacy_symbol:
PE_VALUE_SYM '/' event_config '/'
{
struct list_head *list = NULL;
int type = $1 >> 16;
int config = $1 & 255;

ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, $3));
ABORT_ON(parse_events_add_numeric(&list, idx, type, config, $3));
parse_events__free_terms($3);
$$ = list;
}
|
PE_VALUE_SYM sep_slash_dc
{
struct list_head *list = NULL;
int type = $1 >> 16;
int config = $1 & 255;

ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, NULL));
ABORT_ON(parse_events_add_numeric(&list, idx, type, config, NULL));
$$ = list;
}

event_legacy_cache:
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
{
ABORT_ON(parse_events_add_cache(list_event, idx, $1, $3, $5));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_cache(&list, idx, $1, $3, $5));
$$ = list;
}
|
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
{
ABORT_ON(parse_events_add_cache(list_event, idx, $1, $3, NULL));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_cache(&list, idx, $1, $3, NULL));
$$ = list;
}
|
PE_NAME_CACHE_TYPE
{
ABORT_ON(parse_events_add_cache(list_event, idx, $1, NULL, NULL));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_cache(&list, idx, $1, NULL, NULL));
$$ = list;
}

event_legacy_mem:
PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
{
ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) $2, $4));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_breakpoint(&list, idx, (void *) $2, $4));
$$ = list;
}
|
PE_PREFIX_MEM PE_VALUE sep_dc
{
ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) $2, NULL));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_breakpoint(&list, idx, (void *) $2, NULL));
$$ = list;
}

event_legacy_tracepoint:
PE_NAME ':' PE_NAME
{
ABORT_ON(parse_events_add_tracepoint(list_event, idx, $1, $3));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_tracepoint(&list, idx, $1, $3));
$$ = list;
}

event_legacy_numeric:
PE_VALUE ':' PE_VALUE
{
ABORT_ON(parse_events_add_numeric(list_event, idx, $1, $3, NULL));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_numeric(&list, idx, $1, $3, NULL));
$$ = list;
}

event_legacy_raw:
PE_RAW
{
ABORT_ON(parse_events_add_numeric(list_event, idx, PERF_TYPE_RAW, $1, NULL));
struct list_head *list = NULL;

ABORT_ON(parse_events_add_numeric(&list, idx, PERF_TYPE_RAW, $1, NULL));
$$ = list;
}

event_config:
Expand Down Expand Up @@ -222,7 +260,6 @@ sep_slash_dc: '/' | ':' |
%%

void parse_events_error(struct list_head *list_all __used,
struct list_head *list_event __used,
int *idx __used,
char const *msg __used)
{
Expand Down

0 comments on commit b847cbd

Please sign in to comment.