mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 02:15:57 +00:00
perf annotate-data: Add 'typecln' sort key
Sometimes it's useful to organize member fields in cache-line boundary. The 'typecln' sort key is short for type-cacheline and to show samples in each cacheline. The cacheline size is fixed to 64 for now, but it can read the actual size once it saves the value from sysfs. For example, you maybe want to which cacheline in a target is hot or cold. The following shows members in the cfs_rq's first cache line. $ perf report -s type,typecln,typeoff -H ... - 2.67% struct cfs_rq + 1.23% struct cfs_rq: cache-line 2 + 0.57% struct cfs_rq: cache-line 4 + 0.46% struct cfs_rq: cache-line 6 - 0.41% struct cfs_rq: cache-line 0 0.39% struct cfs_rq +0x14 (h_nr_running) 0.02% struct cfs_rq +0x38 (tasks_timeline.rb_leftmost) ... Committer testing: # root@number:~# perf report -s type,typecln,typeoff -H --stdio # Total Lost Samples: 0 # # Samples: 5K of event 'cpu_atom/mem-loads,ldlat=5/P' # Event count (approx.): 312251 # # Overhead Data Type / Data Type Cacheline / Data Type Offset # .............. .................................................. # <SNIP> 0.07% struct sigaction 0.05% struct sigaction: cache-line 1 0.02% struct sigaction +0x58 (sa_mask) 0.02% struct sigaction +0x78 (sa_mask) 0.03% struct sigaction: cache-line 0 0.02% struct sigaction +0x38 (sa_mask) 0.01% struct sigaction +0x8 (sa_mask) <SNIP> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20240819233603.54941-2-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
7a5c217024
commit
fd45d52eae
@ -86,6 +86,7 @@ enum hist_column {
|
||||
HISTC_TYPE,
|
||||
HISTC_TYPE_OFFSET,
|
||||
HISTC_SYMBOL_OFFSET,
|
||||
HISTC_TYPE_CACHELINE,
|
||||
HISTC_NR_COLS, /* Last entry */
|
||||
};
|
||||
|
||||
|
@ -2326,6 +2326,57 @@ struct sort_entry sort_type_offset = {
|
||||
.se_width_idx = HISTC_TYPE_OFFSET,
|
||||
};
|
||||
|
||||
/* --sort typecln */
|
||||
|
||||
/* TODO: use actual value in the system */
|
||||
#define TYPE_CACHELINE_SIZE 64
|
||||
|
||||
static int64_t
|
||||
sort__typecln_sort(struct hist_entry *left, struct hist_entry *right)
|
||||
{
|
||||
struct annotated_data_type *left_type = left->mem_type;
|
||||
struct annotated_data_type *right_type = right->mem_type;
|
||||
int64_t left_cln, right_cln;
|
||||
int64_t ret;
|
||||
|
||||
if (!left_type) {
|
||||
sort__type_init(left);
|
||||
left_type = left->mem_type;
|
||||
}
|
||||
|
||||
if (!right_type) {
|
||||
sort__type_init(right);
|
||||
right_type = right->mem_type;
|
||||
}
|
||||
|
||||
ret = strcmp(left_type->self.type_name, right_type->self.type_name);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
left_cln = left->mem_type_off / TYPE_CACHELINE_SIZE;
|
||||
right_cln = right->mem_type_off / TYPE_CACHELINE_SIZE;
|
||||
return left_cln - right_cln;
|
||||
}
|
||||
|
||||
static int hist_entry__typecln_snprintf(struct hist_entry *he, char *bf,
|
||||
size_t size, unsigned int width __maybe_unused)
|
||||
{
|
||||
struct annotated_data_type *he_type = he->mem_type;
|
||||
|
||||
return repsep_snprintf(bf, size, "%s: cache-line %d", he_type->self.type_name,
|
||||
he->mem_type_off / TYPE_CACHELINE_SIZE);
|
||||
}
|
||||
|
||||
struct sort_entry sort_type_cacheline = {
|
||||
.se_header = "Data Type Cacheline",
|
||||
.se_cmp = sort__type_cmp,
|
||||
.se_collapse = sort__typecln_sort,
|
||||
.se_sort = sort__typecln_sort,
|
||||
.se_init = sort__type_init,
|
||||
.se_snprintf = hist_entry__typecln_snprintf,
|
||||
.se_width_idx = HISTC_TYPE_CACHELINE,
|
||||
};
|
||||
|
||||
|
||||
struct sort_dimension {
|
||||
const char *name;
|
||||
@ -2384,6 +2435,7 @@ static struct sort_dimension common_sort_dimensions[] = {
|
||||
DIM(SORT_ANNOTATE_DATA_TYPE, "type", sort_type),
|
||||
DIM(SORT_ANNOTATE_DATA_TYPE_OFFSET, "typeoff", sort_type_offset),
|
||||
DIM(SORT_SYM_OFFSET, "symoff", sort_sym_offset),
|
||||
DIM(SORT_ANNOTATE_DATA_TYPE_CACHELINE, "typecln", sort_type_cacheline),
|
||||
};
|
||||
|
||||
#undef DIM
|
||||
|
@ -71,6 +71,7 @@ enum sort_type {
|
||||
SORT_ANNOTATE_DATA_TYPE,
|
||||
SORT_ANNOTATE_DATA_TYPE_OFFSET,
|
||||
SORT_SYM_OFFSET,
|
||||
SORT_ANNOTATE_DATA_TYPE_CACHELINE,
|
||||
|
||||
/* branch stack specific sort keys */
|
||||
__SORT_BRANCH_STACK,
|
||||
|
Loading…
x
Reference in New Issue
Block a user