Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 323693
b: refs/heads/master
c: 6a4bb04
h: refs/heads/master
i:
  323691: c8fe913
v: v3
  • Loading branch information
Jiri Olsa authored and Arnaldo Carvalho de Melo committed Aug 14, 2012
1 parent 7e1f860 commit 2abe836
Show file tree
Hide file tree
Showing 12 changed files with 97 additions and 70 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f5b1135bf79557563a814e53ecd610cce663c1e3
refs/heads/master: 6a4bb04caacc8c2d06f345130e9086e3fea38ca7
13 changes: 5 additions & 8 deletions trunk/tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,18 @@ static bool perf_evlist__equal(struct perf_evlist *evlist,

static void perf_record__open(struct perf_record *rec)
{
struct perf_evsel *pos, *first;
struct perf_evsel *pos;
struct perf_evlist *evlist = rec->evlist;
struct perf_session *session = rec->session;
struct perf_record_opts *opts = &rec->opts;

first = list_entry(evlist->entries.next, struct perf_evsel, node);

perf_evlist__config_attrs(evlist, opts);

if (opts->group)
perf_evlist__group(evlist);

list_for_each_entry(pos, &evlist->entries, node) {
struct perf_event_attr *attr = &pos->attr;
struct xyarray *group_fd = NULL;
/*
* Check if parse_single_tracepoint_event has already asked for
* PERF_SAMPLE_TIME.
Expand All @@ -211,16 +211,13 @@ static void perf_record__open(struct perf_record *rec)
*/
bool time_needed = attr->sample_type & PERF_SAMPLE_TIME;

if (opts->group && pos != first)
group_fd = first->fd;
fallback_missing_features:
if (opts->exclude_guest_missing)
attr->exclude_guest = attr->exclude_host = 0;
retry_sample_id:
attr->sample_id_all = opts->sample_id_all_missing ? 0 : 1;
try_again:
if (perf_evsel__open(pos, evlist->cpus, evlist->threads,
opts->group, group_fd) < 0) {
if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) {
int err = errno;

if (err == EPERM || err == EACCES) {
Expand Down
13 changes: 5 additions & 8 deletions trunk/tools/perf/builtin-stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,13 +281,9 @@ static int create_perf_stat_counter(struct perf_evsel *evsel,
struct perf_evsel *first)
{
struct perf_event_attr *attr = &evsel->attr;
struct xyarray *group_fd = NULL;
bool exclude_guest_missing = false;
int ret;

if (group && evsel != first)
group_fd = first->fd;

if (scale)
attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
PERF_FORMAT_TOTAL_TIME_RUNNING;
Expand All @@ -299,8 +295,7 @@ static int create_perf_stat_counter(struct perf_evsel *evsel,
evsel->attr.exclude_guest = evsel->attr.exclude_host = 0;

if (perf_target__has_cpu(&target)) {
ret = perf_evsel__open_per_cpu(evsel, evsel_list->cpus,
group, group_fd);
ret = perf_evsel__open_per_cpu(evsel, evsel_list->cpus);
if (ret)
goto check_ret;
return 0;
Expand All @@ -311,8 +306,7 @@ static int create_perf_stat_counter(struct perf_evsel *evsel,
attr->enable_on_exec = 1;
}

ret = perf_evsel__open_per_thread(evsel, evsel_list->threads,
group, group_fd);
ret = perf_evsel__open_per_thread(evsel, evsel_list->threads);
if (!ret)
return 0;
/* fall through */
Expand Down Expand Up @@ -483,6 +477,9 @@ static int run_perf_stat(int argc __used, const char **argv)
close(child_ready_pipe[0]);
}

if (group)
perf_evlist__group(evsel_list);

first = list_entry(evsel_list->entries.next, struct perf_evsel, node);

list_for_each_entry(counter, &evsel_list->entries, node) {
Expand Down
8 changes: 4 additions & 4 deletions trunk/tools/perf/builtin-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ static int test__open_syscall_event(void)
goto out_thread_map_delete;
}

if (perf_evsel__open_per_thread(evsel, threads, false, NULL) < 0) {
if (perf_evsel__open_per_thread(evsel, threads) < 0) {
pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno));
Expand Down Expand Up @@ -369,7 +369,7 @@ static int test__open_syscall_event_on_all_cpus(void)
goto out_thread_map_delete;
}

if (perf_evsel__open(evsel, cpus, threads, false, NULL) < 0) {
if (perf_evsel__open(evsel, cpus, threads) < 0) {
pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno));
Expand Down Expand Up @@ -533,7 +533,7 @@ static int test__basic_mmap(void)

perf_evlist__add(evlist, evsels[i]);

if (perf_evsel__open(evsels[i], cpus, threads, false, NULL) < 0) {
if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
pr_debug("failed to open counter: %s, "
"tweak /proc/sys/kernel/perf_event_paranoid?\n",
strerror(errno));
Expand Down Expand Up @@ -737,7 +737,7 @@ static int test__PERF_RECORD(void)
* Call sys_perf_event_open on all the fds on all the evsels,
* grouping them if asked to.
*/
err = perf_evlist__open(evlist, opts.group);
err = perf_evlist__open(evlist);
if (err < 0) {
pr_debug("perf_evlist__open: %s\n", strerror(errno));
goto out_delete_evlist;
Expand Down
12 changes: 4 additions & 8 deletions trunk/tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -886,17 +886,14 @@ static void perf_top__mmap_read(struct perf_top *top)

static void perf_top__start_counters(struct perf_top *top)
{
struct perf_evsel *counter, *first;
struct perf_evsel *counter;
struct perf_evlist *evlist = top->evlist;

first = list_entry(evlist->entries.next, struct perf_evsel, node);
if (top->group)
perf_evlist__group(evlist);

list_for_each_entry(counter, &evlist->entries, node) {
struct perf_event_attr *attr = &counter->attr;
struct xyarray *group_fd = NULL;

if (top->group && counter != first)
group_fd = first->fd;

attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;

Expand Down Expand Up @@ -927,8 +924,7 @@ static void perf_top__start_counters(struct perf_top *top)
attr->sample_id_all = top->sample_id_all_missing ? 0 : 1;
try_again:
if (perf_evsel__open(counter, top->evlist->cpus,
top->evlist->threads, top->group,
group_fd) < 0) {
top->evlist->threads) < 0) {
int err = errno;

if (err == EPERM || err == EACCES) {
Expand Down
20 changes: 9 additions & 11 deletions trunk/tools/perf/util/evlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,12 @@ void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
evlist->nr_entries += nr_entries;
}

void perf_evlist__group(struct perf_evlist *evlist)
{
if (evlist->nr_entries)
parse_events__set_leader(&evlist->entries);
}

int perf_evlist__add_default(struct perf_evlist *evlist)
{
struct perf_event_attr attr = {
Expand Down Expand Up @@ -757,21 +763,13 @@ void perf_evlist__set_selected(struct perf_evlist *evlist,
evlist->selected = evsel;
}

int perf_evlist__open(struct perf_evlist *evlist, bool group)
int perf_evlist__open(struct perf_evlist *evlist)
{
struct perf_evsel *evsel, *first;
struct perf_evsel *evsel;
int err, ncpus, nthreads;

first = list_entry(evlist->entries.next, struct perf_evsel, node);

list_for_each_entry(evsel, &evlist->entries, node) {
struct xyarray *group_fd = NULL;

if (group && evsel != first)
group_fd = first->fd;

err = perf_evsel__open(evsel, evlist->cpus, evlist->threads,
group, group_fd);
err = perf_evsel__open(evsel, evlist->cpus, evlist->threads);
if (err < 0)
goto out_err;
}
Expand Down
3 changes: 2 additions & 1 deletion trunk/tools/perf/util/evlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);

union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx);

int perf_evlist__open(struct perf_evlist *evlist, bool group);
int perf_evlist__open(struct perf_evlist *evlist);

void perf_evlist__config_attrs(struct perf_evlist *evlist,
struct perf_record_opts *opts);
Expand Down Expand Up @@ -132,4 +132,5 @@ void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
struct list_head *list,
int nr_entries);

void perf_evlist__group(struct perf_evlist *evlist);
#endif /* __PERF_EVLIST_H */
51 changes: 34 additions & 17 deletions trunk/tools/perf/util/evsel.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include "perf_regs.h"

#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
#define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0))

static int __perf_evsel__sample_size(u64 sample_type)
{
Expand Down Expand Up @@ -493,6 +492,7 @@ void perf_evsel__delete(struct perf_evsel *evsel)
{
perf_evsel__exit(evsel);
close_cgroup(evsel->cgrp);
free(evsel->group_name);
free(evsel->name);
free(evsel);
}
Expand Down Expand Up @@ -568,9 +568,28 @@ int __perf_evsel__read(struct perf_evsel *evsel,
return 0;
}

static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread)
{
struct perf_evsel *leader = evsel->leader;
int fd;

if (!leader)
return -1;

/*
* Leader must be already processed/open,
* if not it's a bug.
*/
BUG_ON(!leader->fd);

fd = FD(leader, cpu, thread);
BUG_ON(fd == -1);

return fd;
}

static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
struct thread_map *threads, bool group,
struct xyarray *group_fds)
struct thread_map *threads)
{
int cpu, thread;
unsigned long flags = 0;
Expand All @@ -586,13 +605,15 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
}

for (cpu = 0; cpu < cpus->nr; cpu++) {
int group_fd = group_fds ? GROUP_FD(group_fds, cpu) : -1;

for (thread = 0; thread < threads->nr; thread++) {
int group_fd;

if (!evsel->cgrp)
pid = threads->map[thread];

group_fd = get_group_fd(evsel, cpu, thread);

FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr,
pid,
cpus->map[cpu],
Expand All @@ -602,8 +623,9 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
goto out_close;
}

if (group && group_fd == -1)
group_fd = FD(evsel, cpu, thread);
pr_debug("event cpu %d, thread %d, fd %d, group %d\n",
cpu, pid, FD(evsel, cpu, thread),
group_fd);
}
}

Expand Down Expand Up @@ -647,8 +669,7 @@ static struct {
};

int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
struct thread_map *threads, bool group,
struct xyarray *group_fd)
struct thread_map *threads)
{
if (cpus == NULL) {
/* Work around old compiler warnings about strict aliasing */
Expand All @@ -658,23 +679,19 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
if (threads == NULL)
threads = &empty_thread_map.map;

return __perf_evsel__open(evsel, cpus, threads, group, group_fd);
return __perf_evsel__open(evsel, cpus, threads);
}

int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
struct cpu_map *cpus, bool group,
struct xyarray *group_fd)
struct cpu_map *cpus)
{
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map, group,
group_fd);
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map);
}

int perf_evsel__open_per_thread(struct perf_evsel *evsel,
struct thread_map *threads, bool group,
struct xyarray *group_fd)
struct thread_map *threads)
{
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads, group,
group_fd);
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
}

static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
Expand Down
11 changes: 5 additions & 6 deletions trunk/tools/perf/util/evsel.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ struct perf_evsel {
bool supported;
/* parse modifier helper */
int exclude_GH;
struct perf_evsel *leader;
char *group_name;
};

struct cpu_map;
Expand Down Expand Up @@ -109,14 +111,11 @@ void perf_evsel__free_id(struct perf_evsel *evsel);
void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads);

int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
struct cpu_map *cpus, bool group,
struct xyarray *group_fds);
struct cpu_map *cpus);
int perf_evsel__open_per_thread(struct perf_evsel *evsel,
struct thread_map *threads, bool group,
struct xyarray *group_fds);
struct thread_map *threads);
int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
struct thread_map *threads, bool group,
struct xyarray *group_fds);
struct thread_map *threads);
void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads);

#define perf_evsel__match(evsel, t, c) \
Expand Down
26 changes: 22 additions & 4 deletions trunk/tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -611,14 +611,32 @@ int parse_events_add_pmu(struct list_head **list, int *idx,
pmu_event_name(head_config));
}

int parse_events__modifier_group(struct list_head *list __used,
char *event_mod __used)
struct perf_evsel *parse_events__set_leader(struct list_head *list)
{
return 0;
struct perf_evsel *evsel, *leader;

leader = list_entry(list->next, struct perf_evsel, node);
leader->leader = NULL;

list_for_each_entry(evsel, list, node)
if (evsel != leader)
evsel->leader = leader;

return leader;
}

void parse_events__group(char *name __used, struct list_head *list __used)
int parse_events__modifier_group(struct list_head *list,
char *event_mod)
{
return parse_events__modifier_event(list, event_mod, true);
}

void parse_events__group(char *name, struct list_head *list)
{
struct perf_evsel *leader;

leader = parse_events__set_leader(list);
leader->group_name = name ? strdup(name) : NULL;
}

void parse_events_update_lists(struct list_head *list_event,
Expand Down
1 change: 1 addition & 0 deletions trunk/tools/perf/util/parse-events.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,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);
struct perf_evsel *parse_events__set_leader(struct list_head *list);
void parse_events__group(char *name, struct list_head *list);
void parse_events_update_lists(struct list_head *list_event,
struct list_head *list_all);
Expand Down
Loading

0 comments on commit 2abe836

Please sign in to comment.