Commit ea1900e5 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

perf_counter tools: Normalize data using per sample period data

When we use variable period sampling, add the period to the sample
data and use that to normalize the samples.
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 66fff224
...@@ -350,8 +350,9 @@ static void create_counter(int counter, int cpu, pid_t pid) ...@@ -350,8 +350,9 @@ static void create_counter(int counter, int cpu, pid_t pid)
struct perf_counter_attr *attr = attrs + counter; struct perf_counter_attr *attr = attrs + counter;
int track = 1; int track = 1;
attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_PERIOD; attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;
if (freq) { if (freq) {
attr->sample_type |= PERF_SAMPLE_PERIOD;
attr->freq = 1; attr->freq = 1;
attr->sample_freq = freq; attr->sample_freq = freq;
} }
......
...@@ -456,7 +456,7 @@ struct hist_entry { ...@@ -456,7 +456,7 @@ struct hist_entry {
uint64_t ip; uint64_t ip;
char level; char level;
uint32_t count; uint64_t count;
}; };
/* /*
...@@ -726,7 +726,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, uint64_t total_samples) ...@@ -726,7 +726,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, uint64_t total_samples)
static int static int
hist_entry__add(struct thread *thread, struct map *map, struct dso *dso, hist_entry__add(struct thread *thread, struct map *map, struct dso *dso,
struct symbol *sym, uint64_t ip, char level) struct symbol *sym, uint64_t ip, char level, uint64_t count)
{ {
struct rb_node **p = &hist.rb_node; struct rb_node **p = &hist.rb_node;
struct rb_node *parent = NULL; struct rb_node *parent = NULL;
...@@ -738,7 +738,7 @@ hist_entry__add(struct thread *thread, struct map *map, struct dso *dso, ...@@ -738,7 +738,7 @@ hist_entry__add(struct thread *thread, struct map *map, struct dso *dso,
.sym = sym, .sym = sym,
.ip = ip, .ip = ip,
.level = level, .level = level,
.count = 1, .count = count,
}; };
int cmp; int cmp;
...@@ -749,7 +749,7 @@ hist_entry__add(struct thread *thread, struct map *map, struct dso *dso, ...@@ -749,7 +749,7 @@ hist_entry__add(struct thread *thread, struct map *map, struct dso *dso,
cmp = hist_entry__cmp(&entry, he); cmp = hist_entry__cmp(&entry, he);
if (!cmp) { if (!cmp) {
he->count++; he->count += count;
return 0; return 0;
} }
...@@ -942,15 +942,19 @@ process_overflow_event(event_t *event, unsigned long offset, unsigned long head) ...@@ -942,15 +942,19 @@ process_overflow_event(event_t *event, unsigned long offset, unsigned long head)
struct dso *dso = NULL; struct dso *dso = NULL;
struct thread *thread = threads__findnew(event->ip.pid); struct thread *thread = threads__findnew(event->ip.pid);
uint64_t ip = event->ip.ip; uint64_t ip = event->ip.ip;
uint64_t period = 1;
struct map *map = NULL; struct map *map = NULL;
if (event->header.type & PERF_SAMPLE_PERIOD)
period = event->ip.period;
dprintf("%p [%p]: PERF_EVENT (IP, %d): %d: %p period: %Ld\n", dprintf("%p [%p]: PERF_EVENT (IP, %d): %d: %p period: %Ld\n",
(void *)(offset + head), (void *)(offset + head),
(void *)(long)(event->header.size), (void *)(long)(event->header.size),
event->header.misc, event->header.misc,
event->ip.pid, event->ip.pid,
(void *)(long)ip, (void *)(long)ip,
(long long)event->ip.period); (long long)period);
dprintf(" ... thread: %s:%d\n", thread->comm, thread->pid); dprintf(" ... thread: %s:%d\n", thread->comm, thread->pid);
...@@ -1001,13 +1005,13 @@ process_overflow_event(event_t *event, unsigned long offset, unsigned long head) ...@@ -1001,13 +1005,13 @@ process_overflow_event(event_t *event, unsigned long offset, unsigned long head)
if (dso) if (dso)
sym = dso->find_symbol(dso, ip); sym = dso->find_symbol(dso, ip);
if (hist_entry__add(thread, map, dso, sym, ip, level)) { if (hist_entry__add(thread, map, dso, sym, ip, level, period)) {
fprintf(stderr, fprintf(stderr,
"problem incrementing symbol count, skipping event\n"); "problem incrementing symbol count, skipping event\n");
return -1; return -1;
} }
} }
total++; total += period;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment