perf evsel: Introduce perf_evlist
Killing two more perf wide global variables: nr_counters and evsel_list as a list_head. There are more operations that will need more fields in perf_evlist, like the pollfd for polling all the fds in a list of evsel instances. Use option->value to pass the evsel_list to parse_{events,filters}. LKML-Reference: <new-submission> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "../../../include/linux/hw_breakpoint.h"
|
||||
#include "util.h"
|
||||
#include "../perf.h"
|
||||
#include "evlist.h"
|
||||
#include "evsel.h"
|
||||
#include "parse-options.h"
|
||||
#include "parse-events.h"
|
||||
@@ -11,10 +12,6 @@
|
||||
#include "header.h"
|
||||
#include "debugfs.h"
|
||||
|
||||
int nr_counters;
|
||||
|
||||
LIST_HEAD(evsel_list);
|
||||
|
||||
struct event_symbol {
|
||||
u8 type;
|
||||
u64 config;
|
||||
@@ -778,8 +775,9 @@ modifier:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int parse_events(const struct option *opt __used, const char *str, int unset __used)
|
||||
int parse_events(const struct option *opt, const char *str, int unset __used)
|
||||
{
|
||||
struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
|
||||
struct perf_event_attr attr;
|
||||
enum event_result ret;
|
||||
|
||||
@@ -794,12 +792,10 @@ int parse_events(const struct option *opt __used, const char *str, int unset __u
|
||||
|
||||
if (ret != EVT_HANDLED_ALL) {
|
||||
struct perf_evsel *evsel;
|
||||
evsel = perf_evsel__new(&attr,
|
||||
nr_counters);
|
||||
evsel = perf_evsel__new(&attr, evlist->nr_entries);
|
||||
if (evsel == NULL)
|
||||
return -1;
|
||||
list_add_tail(&evsel->node, &evsel_list);
|
||||
++nr_counters;
|
||||
perf_evlist__add(evlist, evsel);
|
||||
}
|
||||
|
||||
if (*str == 0)
|
||||
@@ -813,13 +809,14 @@ int parse_events(const struct option *opt __used, const char *str, int unset __u
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_filter(const struct option *opt __used, const char *str,
|
||||
int parse_filter(const struct option *opt, const char *str,
|
||||
int unset __used)
|
||||
{
|
||||
struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
|
||||
struct perf_evsel *last = NULL;
|
||||
|
||||
if (!list_empty(&evsel_list))
|
||||
last = list_entry(evsel_list.prev, struct perf_evsel, node);
|
||||
if (evlist->nr_entries > 0)
|
||||
last = list_entry(evlist->entries.prev, struct perf_evsel, node);
|
||||
|
||||
if (last == NULL || last->attr.type != PERF_TYPE_TRACEPOINT) {
|
||||
fprintf(stderr,
|
||||
@@ -981,33 +978,3 @@ void print_events(void)
|
||||
|
||||
exit(129);
|
||||
}
|
||||
|
||||
int perf_evsel_list__create_default(void)
|
||||
{
|
||||
struct perf_evsel *evsel;
|
||||
struct perf_event_attr attr;
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.type = PERF_TYPE_HARDWARE;
|
||||
attr.config = PERF_COUNT_HW_CPU_CYCLES;
|
||||
|
||||
evsel = perf_evsel__new(&attr, 0);
|
||||
|
||||
if (evsel == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
list_add(&evsel->node, &evsel_list);
|
||||
++nr_counters;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void perf_evsel_list__delete(void)
|
||||
{
|
||||
struct perf_evsel *pos, *n;
|
||||
|
||||
list_for_each_entry_safe(pos, n, &evsel_list, node) {
|
||||
list_del_init(&pos->node);
|
||||
perf_evsel__delete(pos);
|
||||
}
|
||||
nr_counters = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user