Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 177427
b: refs/heads/master
c: 4e4f06e
h: refs/heads/master
i:
  177425: d63caf2
  177423: 3826f34
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo authored and Ingo Molnar committed Dec 14, 2009
1 parent 31eea15 commit f874305
Show file tree
Hide file tree
Showing 11 changed files with 87 additions and 90 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: b9bf089212d95746ce66482bcdbc7e77a0651088
refs/heads/master: 4e4f06e4c8f17ea96f7dd76251cab99511026401
19 changes: 10 additions & 9 deletions trunk/tools/perf/builtin-annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,12 @@ static void hist_hit(struct hist_entry *he, u64 ip)
h->ip[offset]);
}

static int hist_entry__add(struct addr_location *al, u64 count)
static int perf_session__add_hist_entry(struct perf_session *self,
struct addr_location *al, u64 count)
{
bool hit;
struct hist_entry *he = __hist_entry__add(al, NULL, count, &hit);
struct hist_entry *he = __perf_session__add_hist_entry(self, al, NULL,
count, &hit);
if (he == NULL)
return -ENOMEM;
hist_hit(he, al->addr);
Expand All @@ -144,7 +146,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return -1;
}

if (hist_entry__add(&al, 1)) {
if (perf_session__add_hist_entry(session, &al, 1)) {
fprintf(stderr, "problem incrementing symbol count, "
"skipping event\n");
return -1;
Expand Down Expand Up @@ -428,11 +430,11 @@ static void annotate_sym(struct hist_entry *he)
free_source_line(he, len);
}

static void find_annotations(void)
static void perf_session__find_annotations(struct perf_session *self)
{
struct rb_node *nd;

for (nd = rb_first(&hist); nd; nd = rb_next(nd)) {
for (nd = rb_first(&self->hists); nd; nd = rb_next(nd)) {
struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
struct sym_priv *priv;

Expand Down Expand Up @@ -484,10 +486,9 @@ static int __cmd_annotate(void)
if (verbose > 2)
dsos__fprintf(stdout);

collapse__resort();
output__resort(event__total[0]);

find_annotations();
perf_session__collapse_resort(session);
perf_session__output_resort(session, event__total[0]);
perf_session__find_annotations(session);
out_delete:
perf_session__delete(session);

Expand Down
2 changes: 1 addition & 1 deletion trunk/tools/perf/builtin-kmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return 0;
}

static int sample_type_check(u64 type)
static int sample_type_check(u64 type, struct perf_session *session __used)
{
sample_type = type;

Expand Down
55 changes: 30 additions & 25 deletions trunk/tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ static char *dso_list_str, *comm_list_str, *sym_list_str,
static struct strlist *dso_list, *comm_list, *sym_list;

static int force;
static bool use_callchain;

static int show_nr_samples;

Expand Down Expand Up @@ -312,8 +313,9 @@ hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self,
return ret;
}

static size_t
hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples)
static size_t hist_entry__fprintf(FILE *fp, struct hist_entry *self,
struct perf_session *session,
u64 total_samples)
{
struct sort_entry *se;
size_t ret;
Expand Down Expand Up @@ -345,7 +347,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples)

ret += fprintf(fp, "\n");

if (callchain) {
if (session->use_callchain) {
int left_margin = 0;

if (sort__first_dimension == SORT_COMM) {
Expand Down Expand Up @@ -422,7 +424,7 @@ static struct symbol **resolve_callchain(struct thread *thread,
struct symbol **syms = NULL;
unsigned int i;

if (callchain) {
if (session->use_callchain) {
syms = calloc(chain->nr, sizeof(*syms));
if (!syms) {
fprintf(stderr, "Can't allocate memory for symbols\n");
Expand Down Expand Up @@ -454,7 +456,7 @@ static struct symbol **resolve_callchain(struct thread *thread,
if (sort__has_parent && !*parent &&
call__match(al.sym))
*parent = al.sym;
if (!callchain)
if (!session->use_callchain)
break;
syms[i] = al.sym;
}
Expand All @@ -467,25 +469,25 @@ static struct symbol **resolve_callchain(struct thread *thread,
* collect histogram counts
*/

static int hist_entry__add(struct addr_location *al,
struct perf_session *session,
struct ip_callchain *chain, u64 count)
static int perf_session__add_hist_entry(struct perf_session *self,
struct addr_location *al,
struct ip_callchain *chain, u64 count)
{
struct symbol **syms = NULL, *parent = NULL;
bool hit;
struct hist_entry *he;

if ((sort__has_parent || callchain) && chain)
syms = resolve_callchain(al->thread, session, chain, &parent);
if ((sort__has_parent || self->use_callchain) && chain)
syms = resolve_callchain(al->thread, self, chain, &parent);

he = __hist_entry__add(al, parent, count, &hit);
he = __perf_session__add_hist_entry(self, al, parent, count, &hit);
if (he == NULL)
return -ENOMEM;

if (hit)
he->count += count;

if (callchain) {
if (self->use_callchain) {
if (!hit)
callchain_init(&he->callchain);
append_chain(&he->callchain, chain, syms);
Expand All @@ -495,7 +497,8 @@ static int hist_entry__add(struct addr_location *al,
return 0;
}

static size_t output__fprintf(FILE *fp, u64 total_samples)
static size_t perf_session__fprintf_hist_entries(struct perf_session *self,
u64 total_samples, FILE *fp)
{
struct hist_entry *pos;
struct sort_entry *se;
Expand Down Expand Up @@ -567,9 +570,9 @@ static size_t output__fprintf(FILE *fp, u64 total_samples)
fprintf(fp, "#\n");

print_entries:
for (nd = rb_first(&hist); nd; nd = rb_next(nd)) {
for (nd = rb_first(&self->hists); nd; nd = rb_next(nd)) {
pos = rb_entry(nd, struct hist_entry, rb_node);
ret += hist_entry__fprintf(fp, pos, total_samples);
ret += hist_entry__fprintf(fp, pos, self, total_samples);
}

if (sort_order == default_sort_order &&
Expand Down Expand Up @@ -671,7 +674,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name))
return 0;

if (hist_entry__add(&al, session, data.callchain, data.period)) {
if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) {
pr_debug("problem incrementing symbol count, skipping event\n");
return -1;
}
Expand Down Expand Up @@ -719,7 +722,7 @@ static int process_read_event(event_t *event, struct perf_session *session __use
return 0;
}

static int sample_type_check(u64 type)
static int sample_type_check(u64 type, struct perf_session *session)
{
sample_type = type;

Expand All @@ -730,14 +733,14 @@ static int sample_type_check(u64 type)
" perf record without -g?\n");
return -1;
}
if (callchain) {
if (session->use_callchain) {
fprintf(stderr, "selected -g but no callchain data."
" Did you call perf record without"
" -g?\n");
return -1;
}
} else if (callchain_param.mode != CHAIN_NONE && !callchain) {
callchain = 1;
} else if (callchain_param.mode != CHAIN_NONE && !session->use_callchain) {
session->use_callchain = true;
if (register_callchain_param(&callchain_param) < 0) {
fprintf(stderr, "Can't register callchain"
" params\n");
Expand Down Expand Up @@ -769,6 +772,8 @@ static int __cmd_report(void)
if (session == NULL)
return -ENOMEM;

session->use_callchain = use_callchain;

if (show_threads)
perf_read_values_init(&show_threads_values);

Expand All @@ -787,9 +792,9 @@ static int __cmd_report(void)
if (verbose > 2)
dsos__fprintf(stdout);

collapse__resort();
output__resort(event__stats.total);
output__fprintf(stdout, event__stats.total);
perf_session__collapse_resort(session);
perf_session__output_resort(session, event__stats.total);
perf_session__fprintf_hist_entries(session, event__stats.total, stdout);

if (show_threads)
perf_read_values_destroy(&show_threads_values);
Expand All @@ -805,7 +810,7 @@ parse_callchain_opt(const struct option *opt __used, const char *arg,
char *tok;
char *endptr;

callchain = 1;
use_callchain = true;

if (!arg)
return 0;
Expand All @@ -826,7 +831,7 @@ parse_callchain_opt(const struct option *opt __used, const char *arg,

else if (!strncmp(tok, "none", strlen(arg))) {
callchain_param.mode = CHAIN_NONE;
callchain = 0;
use_callchain = true;

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/tools/perf/builtin-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1655,7 +1655,7 @@ static int process_lost_event(event_t *event __used,
return 0;
}

static int sample_type_check(u64 type)
static int sample_type_check(u64 type, struct perf_session *session __used)
{
sample_type = type;

Expand Down
2 changes: 1 addition & 1 deletion trunk/tools/perf/builtin-timechart.c
Original file line number Diff line number Diff line change
Expand Up @@ -1033,7 +1033,7 @@ static void process_samples(void)
}
}

static int sample_type_check(u64 type)
static int sample_type_check(u64 type, struct perf_session *session __used)
{
sample_type = type;

Expand Down
2 changes: 1 addition & 1 deletion trunk/tools/perf/builtin-trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return 0;
}

static int sample_type_check(u64 type)
static int sample_type_check(u64 type, struct perf_session *session __used)
{
sample_type = type;

Expand Down
2 changes: 1 addition & 1 deletion trunk/tools/perf/util/data_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ int perf_session__process_events(struct perf_session *self,

err = -EINVAL;
if (ops->sample_type_check &&
ops->sample_type_check(sample_type) < 0)
ops->sample_type_check(sample_type, self) < 0)
goto out_err;

if (!ops->full_paths) {
Expand Down
43 changes: 23 additions & 20 deletions trunk/tools/perf/util/hist.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include "hist.h"

struct rb_root hist;
int callchain;
#include "session.h"
#include "sort.h"

struct callchain_param callchain_param = {
.mode = CHAIN_GRAPH_REL,
Expand All @@ -12,11 +11,12 @@ struct callchain_param callchain_param = {
* histogram, sorted on item, collects counts
*/

struct hist_entry *__hist_entry__add(struct addr_location *al,
struct symbol *sym_parent,
u64 count, bool *hit)
struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self,
struct addr_location *al,
struct symbol *sym_parent,
u64 count, bool *hit)
{
struct rb_node **p = &hist.rb_node;
struct rb_node **p = &self->hists.rb_node;
struct rb_node *parent = NULL;
struct hist_entry *he;
struct hist_entry entry = {
Expand Down Expand Up @@ -52,7 +52,7 @@ struct hist_entry *__hist_entry__add(struct addr_location *al,
return NULL;
*he = entry;
rb_link_node(&he->rb_node, parent, p);
rb_insert_color(&he->rb_node, &hist);
rb_insert_color(&he->rb_node, &self->hists);
*hit = false;
return he;
}
Expand Down Expand Up @@ -129,7 +129,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he)
rb_insert_color(&he->rb_node, root);
}

void collapse__resort(void)
void perf_session__collapse_resort(struct perf_session *self)
{
struct rb_root tmp;
struct rb_node *next;
Expand All @@ -139,31 +139,33 @@ void collapse__resort(void)
return;

tmp = RB_ROOT;
next = rb_first(&hist);
next = rb_first(&self->hists);

while (next) {
n = rb_entry(next, struct hist_entry, rb_node);
next = rb_next(&n->rb_node);

rb_erase(&n->rb_node, &hist);
rb_erase(&n->rb_node, &self->hists);
collapse__insert_entry(&tmp, n);
}

hist = tmp;
self->hists = tmp;
}

/*
* reverse the map, sort on count.
*/

static void output__insert_entry(struct rb_root *root, struct hist_entry *he,
u64 min_callchain_hits)
static void perf_session__insert_output_hist_entry(struct perf_session *self,
struct rb_root *root,
struct hist_entry *he,
u64 min_callchain_hits)
{
struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL;
struct hist_entry *iter;

if (callchain)
if (self->use_callchain)
callchain_param.sort(&he->sorted_chain, &he->callchain,
min_callchain_hits, &callchain_param);

Expand All @@ -181,7 +183,7 @@ static void output__insert_entry(struct rb_root *root, struct hist_entry *he,
rb_insert_color(&he->rb_node, root);
}

void output__resort(u64 total_samples)
void perf_session__output_resort(struct perf_session *self, u64 total_samples)
{
struct rb_root tmp;
struct rb_node *next;
Expand All @@ -192,15 +194,16 @@ void output__resort(u64 total_samples)
total_samples * (callchain_param.min_percent / 100);

tmp = RB_ROOT;
next = rb_first(&hist);
next = rb_first(&self->hists);

while (next) {
n = rb_entry(next, struct hist_entry, rb_node);
next = rb_next(&n->rb_node);

rb_erase(&n->rb_node, &hist);
output__insert_entry(&tmp, n, min_callchain_hits);
rb_erase(&n->rb_node, &self->hists);
perf_session__insert_output_hist_entry(self, &tmp, n,
min_callchain_hits);
}

hist = tmp;
self->hists = tmp;
}
Loading

0 comments on commit f874305

Please sign in to comment.