Commit e3304c21 authored by Athira Rajeev's avatar Athira Rajeev Committed by Arnaldo Carvalho de Melo

perf sort: Include global and local variants for p_stage_cyc sort key

Sort key 'p_stage_cyc' is used to present the latency cycles spent in
pipeline stages.

perf has local 'p_stage_cyc' sort key to display this info. There is no
global variant available for this sort key. The local variant shows
latency in a single sample, whereas the global value will be useful to
present the total latency (sum of latencies) in the hist entry. It
represents the latency number multiplied by the number of samples.

Add global ('p_stage_cyc') and local variant ('local_p_stage_cyc') for
this sort key. Use 'local_p_stage_cyc' as default option for "mem" sort
mode.

Also add this to the list of dynamic sort keys and made the
"dynamic_headers" and "arch_specific_sort_keys" as static.
Reported-by: default avatarNamhyung Kim <namhyung@kernel.org>
Signed-off-by: default avatarAthira Jajeev <atrajeev@linux.vnet.ibm.com>
Tested-by: default avatarNageswara R Sastry <rnsastry@linux.ibm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
Link: https://lore.kernel.org/r/20211203022038.48240-1-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent debe70e4
...@@ -211,7 +211,9 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h) ...@@ -211,7 +211,9 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
hists__new_col_len(hists, HISTC_MEM_BLOCKED, 10); hists__new_col_len(hists, HISTC_MEM_BLOCKED, 10);
hists__new_col_len(hists, HISTC_LOCAL_INS_LAT, 13); hists__new_col_len(hists, HISTC_LOCAL_INS_LAT, 13);
hists__new_col_len(hists, HISTC_GLOBAL_INS_LAT, 13); hists__new_col_len(hists, HISTC_GLOBAL_INS_LAT, 13);
hists__new_col_len(hists, HISTC_P_STAGE_CYC, 13); hists__new_col_len(hists, HISTC_LOCAL_P_STAGE_CYC, 13);
hists__new_col_len(hists, HISTC_GLOBAL_P_STAGE_CYC, 13);
if (symbol_conf.nanosecs) if (symbol_conf.nanosecs)
hists__new_col_len(hists, HISTC_TIME, 16); hists__new_col_len(hists, HISTC_TIME, 16);
else else
......
...@@ -75,7 +75,8 @@ enum hist_column { ...@@ -75,7 +75,8 @@ enum hist_column {
HISTC_MEM_BLOCKED, HISTC_MEM_BLOCKED,
HISTC_LOCAL_INS_LAT, HISTC_LOCAL_INS_LAT,
HISTC_GLOBAL_INS_LAT, HISTC_GLOBAL_INS_LAT,
HISTC_P_STAGE_CYC, HISTC_LOCAL_P_STAGE_CYC,
HISTC_GLOBAL_P_STAGE_CYC,
HISTC_NR_COLS, /* Last entry */ HISTC_NR_COLS, /* Last entry */
}; };
......
...@@ -37,7 +37,7 @@ const char default_parent_pattern[] = "^sys_|^do_page_fault"; ...@@ -37,7 +37,7 @@ const char default_parent_pattern[] = "^sys_|^do_page_fault";
const char *parent_pattern = default_parent_pattern; const char *parent_pattern = default_parent_pattern;
const char *default_sort_order = "comm,dso,symbol"; const char *default_sort_order = "comm,dso,symbol";
const char default_branch_sort_order[] = "comm,dso_from,symbol_from,symbol_to,cycles"; const char default_branch_sort_order[] = "comm,dso_from,symbol_from,symbol_to,cycles";
const char default_mem_sort_order[] = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked,blocked,local_ins_lat,p_stage_cyc"; const char default_mem_sort_order[] = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked,blocked,local_ins_lat,local_p_stage_cyc";
const char default_top_sort_order[] = "dso,symbol"; const char default_top_sort_order[] = "dso,symbol";
const char default_diff_sort_order[] = "dso,symbol"; const char default_diff_sort_order[] = "dso,symbol";
const char default_tracepoint_sort_order[] = "trace"; const char default_tracepoint_sort_order[] = "trace";
...@@ -46,8 +46,8 @@ const char *field_order; ...@@ -46,8 +46,8 @@ const char *field_order;
regex_t ignore_callees_regex; regex_t ignore_callees_regex;
int have_ignore_callees = 0; int have_ignore_callees = 0;
enum sort_mode sort__mode = SORT_MODE__NORMAL; enum sort_mode sort__mode = SORT_MODE__NORMAL;
const char *dynamic_headers[] = {"local_ins_lat", "p_stage_cyc"}; static const char *const dynamic_headers[] = {"local_ins_lat", "ins_lat", "local_p_stage_cyc", "p_stage_cyc"};
const char *arch_specific_sort_keys[] = {"p_stage_cyc"}; static const char *const arch_specific_sort_keys[] = {"local_p_stage_cyc", "p_stage_cyc"};
/* /*
* Replaces all occurrences of a char used with the: * Replaces all occurrences of a char used with the:
...@@ -1392,22 +1392,37 @@ struct sort_entry sort_global_ins_lat = { ...@@ -1392,22 +1392,37 @@ struct sort_entry sort_global_ins_lat = {
}; };
static int64_t static int64_t
sort__global_p_stage_cyc_cmp(struct hist_entry *left, struct hist_entry *right) sort__p_stage_cyc_cmp(struct hist_entry *left, struct hist_entry *right)
{ {
return left->p_stage_cyc - right->p_stage_cyc; return left->p_stage_cyc - right->p_stage_cyc;
} }
static int hist_entry__global_p_stage_cyc_snprintf(struct hist_entry *he, char *bf,
size_t size, unsigned int width)
{
return repsep_snprintf(bf, size, "%-*u", width,
he->p_stage_cyc * he->stat.nr_events);
}
static int hist_entry__p_stage_cyc_snprintf(struct hist_entry *he, char *bf, static int hist_entry__p_stage_cyc_snprintf(struct hist_entry *he, char *bf,
size_t size, unsigned int width) size_t size, unsigned int width)
{ {
return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc); return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc);
} }
struct sort_entry sort_p_stage_cyc = { struct sort_entry sort_local_p_stage_cyc = {
.se_header = "Pipeline Stage Cycle", .se_header = "Local Pipeline Stage Cycle",
.se_cmp = sort__global_p_stage_cyc_cmp, .se_cmp = sort__p_stage_cyc_cmp,
.se_snprintf = hist_entry__p_stage_cyc_snprintf, .se_snprintf = hist_entry__p_stage_cyc_snprintf,
.se_width_idx = HISTC_P_STAGE_CYC, .se_width_idx = HISTC_LOCAL_P_STAGE_CYC,
};
struct sort_entry sort_global_p_stage_cyc = {
.se_header = "Pipeline Stage Cycle",
.se_cmp = sort__p_stage_cyc_cmp,
.se_snprintf = hist_entry__global_p_stage_cyc_snprintf,
.se_width_idx = HISTC_GLOBAL_P_STAGE_CYC,
}; };
struct sort_entry sort_mem_daddr_sym = { struct sort_entry sort_mem_daddr_sym = {
...@@ -1858,7 +1873,8 @@ static struct sort_dimension common_sort_dimensions[] = { ...@@ -1858,7 +1873,8 @@ static struct sort_dimension common_sort_dimensions[] = {
DIM(SORT_CODE_PAGE_SIZE, "code_page_size", sort_code_page_size), DIM(SORT_CODE_PAGE_SIZE, "code_page_size", sort_code_page_size),
DIM(SORT_LOCAL_INS_LAT, "local_ins_lat", sort_local_ins_lat), DIM(SORT_LOCAL_INS_LAT, "local_ins_lat", sort_local_ins_lat),
DIM(SORT_GLOBAL_INS_LAT, "ins_lat", sort_global_ins_lat), DIM(SORT_GLOBAL_INS_LAT, "ins_lat", sort_global_ins_lat),
DIM(SORT_PIPELINE_STAGE_CYC, "p_stage_cyc", sort_p_stage_cyc), DIM(SORT_LOCAL_PIPELINE_STAGE_CYC, "local_p_stage_cyc", sort_local_p_stage_cyc),
DIM(SORT_GLOBAL_PIPELINE_STAGE_CYC, "p_stage_cyc", sort_global_p_stage_cyc),
}; };
#undef DIM #undef DIM
......
...@@ -235,7 +235,8 @@ enum sort_type { ...@@ -235,7 +235,8 @@ enum sort_type {
SORT_CODE_PAGE_SIZE, SORT_CODE_PAGE_SIZE,
SORT_LOCAL_INS_LAT, SORT_LOCAL_INS_LAT,
SORT_GLOBAL_INS_LAT, SORT_GLOBAL_INS_LAT,
SORT_PIPELINE_STAGE_CYC, SORT_LOCAL_PIPELINE_STAGE_CYC,
SORT_GLOBAL_PIPELINE_STAGE_CYC,
/* branch stack specific sort keys */ /* branch stack specific sort keys */
__SORT_BRANCH_STACK, __SORT_BRANCH_STACK,
......
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