On 25/11/21 8:18 am, Athira Rajeev wrote:
Sort key p_stage_cyc is used to present the latency
cycles spend in pipeline stages. perf tool has local
p_stage_cyc sort key to display this info. There is no
global variant available for this sort key. local variant
shows latency in a sinlge sample, whereas, global value
will be useful to present the total latency (sum of
latencies) in the hist entry. It represents 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 the
local_p_stage_cyc as default option for "mem" sort mode.
Also add this to list of dynamic sort keys.

Signed-off-by: Athira Rajeev <atraj...@linux.vnet.ibm.com>
Reported-by: Namhyung Kim <namhy...@kernel.org>

Tested the patch on Power10 LPAR and could see the required data.

# Overhead Samples Command Shared Object Symbol Dispatch Cyc # ........ ............ ....... .......................... .................................... .............
#
9.41% 156 dd [kernel.vmlinux] [k] system_call_common 1 4.91% 82 dd [kernel.vmlinux] [k] __fget_light 1
...

# Overhead Samples Command Shared Object Symbol Dispatch Cyc Global Dispatch_cyc # ........ ............ ....... .......................... .................................... ............. ...................
#
9.41% 156 dd [kernel.vmlinux] [k] system_call_common 1 156 4.91% 82 dd [kernel.vmlinux] [k] __fget_light 1 82
...

Tested-by: Nageswara R Sastry <rnsas...@linux.ibm.com>

---
  tools/perf/util/hist.c |  4 +++-
  tools/perf/util/hist.h |  3 ++-
  tools/perf/util/sort.c | 34 +++++++++++++++++++++++++---------
  tools/perf/util/sort.h |  3 ++-
  4 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index b776465e04ef..0a8033b09e28 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -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_LOCAL_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)
                hists__new_col_len(hists, HISTC_TIME, 16);
        else
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 5343b62476e6..2752ce681108 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -75,7 +75,8 @@ enum hist_column {
        HISTC_MEM_BLOCKED,
        HISTC_LOCAL_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 */
  };
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index e9216a292a04..e978f7883e07 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -37,7 +37,7 @@ const char    default_parent_pattern[] = 
"^sys_|^do_page_fault";
  const char    *parent_pattern = default_parent_pattern;
  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_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_diff_sort_order[] = "dso,symbol";
  const char    default_tracepoint_sort_order[] = "trace";
@@ -46,8 +46,8 @@ const char    *field_order;
  regex_t               ignore_callees_regex;
  int           have_ignore_callees = 0;
  enum sort_mode        sort__mode = SORT_MODE__NORMAL;
-const char     *dynamic_headers[] = {"local_ins_lat", "p_stage_cyc"};
-const char     *arch_specific_sort_keys[] = {"p_stage_cyc"};
+const char     *dynamic_headers[] = {"local_ins_lat", "ins_lat", "local_p_stage_cyc", 
"p_stage_cyc"};
+const char     *arch_specific_sort_keys[] = {"local_p_stage_cyc", 
"p_stage_cyc"};
/*
   * Replaces all occurrences of a char used with the:
@@ -1392,22 +1392,37 @@ struct sort_entry sort_global_ins_lat = {
  };
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;
  }
+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,
                                        size_t size, unsigned int width)
  {
        return repsep_snprintf(bf, size, "%-*u", width, he->p_stage_cyc);
  }
-struct sort_entry sort_p_stage_cyc = {
-       .se_header      = "Pipeline Stage Cycle",
-       .se_cmp         = sort__global_p_stage_cyc_cmp,
+struct sort_entry sort_local_p_stage_cyc = {
+       .se_header      = "Local Pipeline Stage Cycle",
+       .se_cmp         = sort__p_stage_cyc_cmp,
        .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 = {
@@ -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_LOCAL_INS_LAT, "local_ins_lat", sort_local_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
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 3c7518378d62..83abe5e6812a 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -235,7 +235,8 @@ enum sort_type {
        SORT_CODE_PAGE_SIZE,
        SORT_LOCAL_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 */
        __SORT_BRANCH_STACK,


--
Thanks and Regards
R.Nageswara Sastry

Reply via email to