forked from Minki/linux
perf tools: Keep group information
Add a few of group-related field in struct perf_{evlist,evsel} so that the group information in a evlist can be known easily. It only counts groups which have more than 1 members since leader-only groups are treated as non-group events. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@redhat.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1358845787-1350-2-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
0de233b9c4
commit
97f63e4a2c
@ -117,6 +117,9 @@ void __perf_evlist__set_leader(struct list_head *list)
|
|||||||
struct perf_evsel *evsel, *leader;
|
struct perf_evsel *evsel, *leader;
|
||||||
|
|
||||||
leader = list_entry(list->next, struct perf_evsel, node);
|
leader = list_entry(list->next, struct perf_evsel, node);
|
||||||
|
evsel = list_entry(list->prev, struct perf_evsel, node);
|
||||||
|
|
||||||
|
leader->nr_members = evsel->idx - leader->idx + 1;
|
||||||
|
|
||||||
list_for_each_entry(evsel, list, node) {
|
list_for_each_entry(evsel, list, node) {
|
||||||
if (evsel != leader)
|
if (evsel != leader)
|
||||||
@ -126,8 +129,10 @@ void __perf_evlist__set_leader(struct list_head *list)
|
|||||||
|
|
||||||
void perf_evlist__set_leader(struct perf_evlist *evlist)
|
void perf_evlist__set_leader(struct perf_evlist *evlist)
|
||||||
{
|
{
|
||||||
if (evlist->nr_entries)
|
if (evlist->nr_entries) {
|
||||||
|
evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
|
||||||
__perf_evlist__set_leader(&evlist->entries);
|
__perf_evlist__set_leader(&evlist->entries);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_evlist__add_default(struct perf_evlist *evlist)
|
int perf_evlist__add_default(struct perf_evlist *evlist)
|
||||||
|
@ -21,6 +21,7 @@ struct perf_evlist {
|
|||||||
struct list_head entries;
|
struct list_head entries;
|
||||||
struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
|
struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
|
||||||
int nr_entries;
|
int nr_entries;
|
||||||
|
int nr_groups;
|
||||||
int nr_fds;
|
int nr_fds;
|
||||||
int nr_mmaps;
|
int nr_mmaps;
|
||||||
int mmap_len;
|
int mmap_len;
|
||||||
|
@ -74,6 +74,7 @@ struct perf_evsel {
|
|||||||
bool needs_swap;
|
bool needs_swap;
|
||||||
/* parse modifier helper */
|
/* parse modifier helper */
|
||||||
int exclude_GH;
|
int exclude_GH;
|
||||||
|
int nr_members;
|
||||||
struct perf_evsel *leader;
|
struct perf_evsel *leader;
|
||||||
char *group_name;
|
char *group_name;
|
||||||
};
|
};
|
||||||
@ -259,4 +260,9 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
|
|||||||
int perf_evsel__open_strerror(struct perf_evsel *evsel,
|
int perf_evsel__open_strerror(struct perf_evsel *evsel,
|
||||||
struct perf_target *target,
|
struct perf_target *target,
|
||||||
int err, char *msg, size_t size);
|
int err, char *msg, size_t size);
|
||||||
|
|
||||||
|
static inline int perf_evsel__group_idx(struct perf_evsel *evsel)
|
||||||
|
{
|
||||||
|
return evsel->idx - evsel->leader->idx;
|
||||||
|
}
|
||||||
#endif /* __PERF_EVSEL_H */
|
#endif /* __PERF_EVSEL_H */
|
||||||
|
@ -884,6 +884,7 @@ int parse_events(struct perf_evlist *evlist, const char *str)
|
|||||||
if (!ret) {
|
if (!ret) {
|
||||||
int entries = data.idx - evlist->nr_entries;
|
int entries = data.idx - evlist->nr_entries;
|
||||||
perf_evlist__splice_list_tail(evlist, &data.list, entries);
|
perf_evlist__splice_list_tail(evlist, &data.list, entries);
|
||||||
|
evlist->nr_groups += data.nr_groups;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ struct parse_events_term {
|
|||||||
struct parse_events_evlist {
|
struct parse_events_evlist {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
int idx;
|
int idx;
|
||||||
|
int nr_groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct parse_events_terms {
|
struct parse_events_terms {
|
||||||
|
@ -23,6 +23,14 @@ do { \
|
|||||||
YYABORT; \
|
YYABORT; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
static inc_group_count(struct list_head *list,
|
||||||
|
struct parse_events_evlist *data)
|
||||||
|
{
|
||||||
|
/* Count groups only have more than 1 members */
|
||||||
|
if (!list_is_last(list->next, list))
|
||||||
|
data->nr_groups++;
|
||||||
|
}
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%token PE_START_EVENTS PE_START_TERMS
|
%token PE_START_EVENTS PE_START_TERMS
|
||||||
@ -123,6 +131,7 @@ PE_NAME '{' events '}'
|
|||||||
{
|
{
|
||||||
struct list_head *list = $3;
|
struct list_head *list = $3;
|
||||||
|
|
||||||
|
inc_group_count(list, _data);
|
||||||
parse_events__set_leader($1, list);
|
parse_events__set_leader($1, list);
|
||||||
$$ = list;
|
$$ = list;
|
||||||
}
|
}
|
||||||
@ -131,6 +140,7 @@ PE_NAME '{' events '}'
|
|||||||
{
|
{
|
||||||
struct list_head *list = $2;
|
struct list_head *list = $2;
|
||||||
|
|
||||||
|
inc_group_count(list, _data);
|
||||||
parse_events__set_leader(NULL, list);
|
parse_events__set_leader(NULL, list);
|
||||||
$$ = list;
|
$$ = list;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user