perf parse events: Demystify memory allocations
List heads are currently allocated way down the function chain in __add_event and add_tracepoint and then freed when the scanner code calls parse_events_update_lists. Be more explicit with where memory is allocated and who should free it. With this patch the list_head is allocated in the scanner code and freed when the scanner code calls parse_events_update_lists. Signed-off-by: David Ahern <dsahern@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1372793245-4136-7-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
c549aca501
commit
c5cd8ac07e
@@ -22,6 +22,13 @@ do { \
|
||||
YYABORT; \
|
||||
} while (0)
|
||||
|
||||
#define ALLOC_LIST(list) \
|
||||
do { \
|
||||
list = malloc(sizeof(*list)); \
|
||||
ABORT_ON(!list); \
|
||||
INIT_LIST_HEAD(list); \
|
||||
} while (0)
|
||||
|
||||
static inc_group_count(struct list_head *list,
|
||||
struct parse_events_evlist *data)
|
||||
{
|
||||
@@ -196,9 +203,10 @@ event_pmu:
|
||||
PE_NAME '/' event_config '/'
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_pmu(&list, &data->idx, $1, $3));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_pmu(list, &data->idx, $1, $3));
|
||||
parse_events__free_terms($3);
|
||||
$$ = list;
|
||||
}
|
||||
@@ -212,11 +220,12 @@ event_legacy_symbol:
|
||||
value_sym '/' event_config '/'
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
int type = $1 >> 16;
|
||||
int config = $1 & 255;
|
||||
|
||||
ABORT_ON(parse_events_add_numeric(&list, &data->idx,
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_numeric(list, &data->idx,
|
||||
type, config, $3));
|
||||
parse_events__free_terms($3);
|
||||
$$ = list;
|
||||
@@ -225,11 +234,12 @@ value_sym '/' event_config '/'
|
||||
value_sym sep_slash_dc
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
int type = $1 >> 16;
|
||||
int config = $1 & 255;
|
||||
|
||||
ABORT_ON(parse_events_add_numeric(&list, &data->idx,
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_numeric(list, &data->idx,
|
||||
type, config, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
@@ -238,27 +248,30 @@ event_legacy_cache:
|
||||
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, $5));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5));
|
||||
$$ = list;
|
||||
}
|
||||
|
|
||||
PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, $3, NULL));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
|
|
||||
PE_NAME_CACHE_TYPE
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_cache(&list, &data->idx, $1, NULL, NULL));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
|
||||
@@ -266,9 +279,10 @@ event_legacy_mem:
|
||||
PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
||||
(void *) $2, $4));
|
||||
$$ = list;
|
||||
}
|
||||
@@ -276,9 +290,10 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
|
||||
PE_PREFIX_MEM PE_VALUE sep_dc
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_breakpoint(&list, &data->idx,
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
|
||||
(void *) $2, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
@@ -287,9 +302,10 @@ event_legacy_tracepoint:
|
||||
PE_NAME ':' PE_NAME
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_tracepoint(&list, &data->idx, $1, $3));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_tracepoint(list, &data->idx, $1, $3));
|
||||
$$ = list;
|
||||
}
|
||||
|
||||
@@ -297,9 +313,10 @@ event_legacy_numeric:
|
||||
PE_VALUE ':' PE_VALUE
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_numeric(&list, &data->idx, (u32)$1, $3, NULL));
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_numeric(list, &data->idx, (u32)$1, $3, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
|
||||
@@ -307,9 +324,10 @@ event_legacy_raw:
|
||||
PE_RAW
|
||||
{
|
||||
struct parse_events_evlist *data = _data;
|
||||
struct list_head *list = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
ABORT_ON(parse_events_add_numeric(&list, &data->idx,
|
||||
ALLOC_LIST(list);
|
||||
ABORT_ON(parse_events_add_numeric(list, &data->idx,
|
||||
PERF_TYPE_RAW, $1, NULL));
|
||||
$$ = list;
|
||||
}
|
||||
|
Reference in New Issue
Block a user