perf sort: Introduce sort__mode variable
It's used for determining current sort mode which can be one of NORMAL, BRANCH and new MEMORY. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Andi Kleen <andi@firstfloor.org> Cc: David Ahern <dsahern@gmail.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/1364816125-12212-5-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
ded19d57a6
commit
55369fc179
4 changed files with 24 additions and 15 deletions
|
@ -311,7 +311,7 @@ static int process_sample_event(struct perf_tool *tool,
|
||||||
if (rep->cpu_list && !test_bit(sample->cpu, rep->cpu_bitmap))
|
if (rep->cpu_list && !test_bit(sample->cpu, rep->cpu_bitmap))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
if (perf_report__add_branch_hist_entry(tool, &al, sample,
|
if (perf_report__add_branch_hist_entry(tool, &al, sample,
|
||||||
evsel, machine)) {
|
evsel, machine)) {
|
||||||
pr_debug("problem adding lbr entry, skipping event\n");
|
pr_debug("problem adding lbr entry, skipping event\n");
|
||||||
|
@ -387,7 +387,7 @@ static int perf_report__setup_sample_type(struct perf_report *rep)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
if (!self->fd_pipe &&
|
if (!self->fd_pipe &&
|
||||||
!(sample_type & PERF_SAMPLE_BRANCH_STACK)) {
|
!(sample_type & PERF_SAMPLE_BRANCH_STACK)) {
|
||||||
ui__error("Selected -b but no branch data. "
|
ui__error("Selected -b but no branch data. "
|
||||||
|
@ -694,7 +694,9 @@ static int
|
||||||
parse_branch_mode(const struct option *opt __maybe_unused,
|
parse_branch_mode(const struct option *opt __maybe_unused,
|
||||||
const char *str __maybe_unused, int unset)
|
const char *str __maybe_unused, int unset)
|
||||||
{
|
{
|
||||||
sort__branch_mode = !unset;
|
int *branch_mode = opt->value;
|
||||||
|
|
||||||
|
*branch_mode = !unset;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,6 +705,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
bool has_br_stack = false;
|
bool has_br_stack = false;
|
||||||
|
int branch_mode = -1;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
char callchain_default_opt[] = "fractal,0.5,callee";
|
char callchain_default_opt[] = "fractal,0.5,callee";
|
||||||
const char * const report_usage[] = {
|
const char * const report_usage[] = {
|
||||||
|
@ -799,7 +802,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
"Show a column with the sum of periods"),
|
"Show a column with the sum of periods"),
|
||||||
OPT_BOOLEAN(0, "group", &symbol_conf.event_group,
|
OPT_BOOLEAN(0, "group", &symbol_conf.event_group,
|
||||||
"Show event group information together"),
|
"Show event group information together"),
|
||||||
OPT_CALLBACK_NOOPT('b', "branch-stack", &sort__branch_mode, "",
|
OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "",
|
||||||
"use branch records for histogram filling", parse_branch_mode),
|
"use branch records for histogram filling", parse_branch_mode),
|
||||||
OPT_STRING(0, "objdump", &objdump_path, "path",
|
OPT_STRING(0, "objdump", &objdump_path, "path",
|
||||||
"objdump binary to use for disassembly and annotations"),
|
"objdump binary to use for disassembly and annotations"),
|
||||||
|
@ -849,11 +852,11 @@ repeat:
|
||||||
has_br_stack = perf_header__has_feat(&session->header,
|
has_br_stack = perf_header__has_feat(&session->header,
|
||||||
HEADER_BRANCH_STACK);
|
HEADER_BRANCH_STACK);
|
||||||
|
|
||||||
if (sort__branch_mode == -1 && has_br_stack)
|
if (branch_mode == -1 && has_br_stack)
|
||||||
sort__branch_mode = 1;
|
sort__mode = SORT_MODE__BRANCH;
|
||||||
|
|
||||||
/* sort__branch_mode could be 0 if --no-branch-stack */
|
/* sort__mode could be NORMAL if --no-branch-stack */
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
/*
|
/*
|
||||||
* if no sort_order is provided, then specify
|
* if no sort_order is provided, then specify
|
||||||
* branch-mode specific order
|
* branch-mode specific order
|
||||||
|
@ -864,7 +867,7 @@ repeat:
|
||||||
|
|
||||||
}
|
}
|
||||||
if (report.mem_mode) {
|
if (report.mem_mode) {
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
fprintf(stderr, "branch and mem mode incompatible\n");
|
fprintf(stderr, "branch and mem mode incompatible\n");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -934,7 +937,7 @@ repeat:
|
||||||
|
|
||||||
sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list, "comm", stdout);
|
sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list, "comm", stdout);
|
||||||
|
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
sort_entry__setup_elide(&sort_dso_from, symbol_conf.dso_from_list, "dso_from", stdout);
|
sort_entry__setup_elide(&sort_dso_from, symbol_conf.dso_from_list, "dso_from", stdout);
|
||||||
sort_entry__setup_elide(&sort_dso_to, symbol_conf.dso_to_list, "dso_to", stdout);
|
sort_entry__setup_elide(&sort_dso_to, symbol_conf.dso_to_list, "dso_to", stdout);
|
||||||
sort_entry__setup_elide(&sort_sym_from, symbol_conf.sym_from_list, "sym_from", stdout);
|
sort_entry__setup_elide(&sort_sym_from, symbol_conf.sym_from_list, "sym_from", stdout);
|
||||||
|
|
|
@ -1155,7 +1155,7 @@ static struct hist_browser *hist_browser__new(struct hists *hists)
|
||||||
browser->b.refresh = hist_browser__refresh;
|
browser->b.refresh = hist_browser__refresh;
|
||||||
browser->b.seek = ui_browser__hists_seek;
|
browser->b.seek = ui_browser__hists_seek;
|
||||||
browser->b.use_navkeypressed = true;
|
browser->b.use_navkeypressed = true;
|
||||||
if (sort__branch_mode == 1)
|
if (sort__mode == SORT_MODE__BRANCH)
|
||||||
browser->has_symbols = sort_sym_from.list.next != NULL;
|
browser->has_symbols = sort_sym_from.list.next != NULL;
|
||||||
else
|
else
|
||||||
browser->has_symbols = sort_sym.list.next != NULL;
|
browser->has_symbols = sort_sym.list.next != NULL;
|
||||||
|
@ -1488,7 +1488,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||||
if (!browser->has_symbols)
|
if (!browser->has_symbols)
|
||||||
goto add_exit_option;
|
goto add_exit_option;
|
||||||
|
|
||||||
if (sort__branch_mode == 1) {
|
if (sort__mode == SORT_MODE__BRANCH) {
|
||||||
bi = browser->he_selection->branch_info;
|
bi = browser->he_selection->branch_info;
|
||||||
if (browser->selection != NULL &&
|
if (browser->selection != NULL &&
|
||||||
bi &&
|
bi &&
|
||||||
|
|
|
@ -9,7 +9,7 @@ const char *sort_order = default_sort_order;
|
||||||
int sort__need_collapse = 0;
|
int sort__need_collapse = 0;
|
||||||
int sort__has_parent = 0;
|
int sort__has_parent = 0;
|
||||||
int sort__has_sym = 0;
|
int sort__has_sym = 0;
|
||||||
int sort__branch_mode = -1; /* -1 = means not set */
|
enum sort_mode sort__mode = SORT_MODE__NORMAL;
|
||||||
|
|
||||||
enum sort_type sort__first_dimension;
|
enum sort_type sort__first_dimension;
|
||||||
|
|
||||||
|
@ -943,7 +943,7 @@ int sort_dimension__add(const char *tok)
|
||||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sort__branch_mode != 1)
|
if (sort__mode != SORT_MODE__BRANCH)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to)
|
if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to)
|
||||||
|
|
|
@ -32,7 +32,7 @@ extern const char default_sort_order[];
|
||||||
extern int sort__need_collapse;
|
extern int sort__need_collapse;
|
||||||
extern int sort__has_parent;
|
extern int sort__has_parent;
|
||||||
extern int sort__has_sym;
|
extern int sort__has_sym;
|
||||||
extern int sort__branch_mode;
|
extern enum sort_mode sort__mode;
|
||||||
extern struct sort_entry sort_comm;
|
extern struct sort_entry sort_comm;
|
||||||
extern struct sort_entry sort_dso;
|
extern struct sort_entry sort_dso;
|
||||||
extern struct sort_entry sort_sym;
|
extern struct sort_entry sort_sym;
|
||||||
|
@ -123,6 +123,12 @@ static inline void hist_entry__add_pair(struct hist_entry *he,
|
||||||
list_add_tail(&he->pairs.head, &pair->pairs.node);
|
list_add_tail(&he->pairs.head, &pair->pairs.node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum sort_mode {
|
||||||
|
SORT_MODE__NORMAL,
|
||||||
|
SORT_MODE__BRANCH,
|
||||||
|
SORT_MODE__MEMORY,
|
||||||
|
};
|
||||||
|
|
||||||
enum sort_type {
|
enum sort_type {
|
||||||
/* common sort keys */
|
/* common sort keys */
|
||||||
SORT_PID,
|
SORT_PID,
|
||||||
|
|
Loading…
Add table
Reference in a new issue