mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
perf kmem: Add --sort hit and --sort frag
This patch adds support for "--sort hit" and "--sort frag" to the "perf kmem" tool. The former was already mentioned in the help text and the latter is useful for finding call-sites that exhibit worst case behavior for SLAB allocators. Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro> Cc: linux-mm@kvack.org <linux-mm@kvack.org> LKML-Reference: <1258883880-7149-1-git-send-email-penberg@cs.helsinki.fi> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
96b02d78a7
commit
f3ced7cdb2
1 changed files with 28 additions and 1 deletions
|
@ -443,6 +443,15 @@ static int callsite_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hit_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
||||||
|
{
|
||||||
|
if (l->hit < r->hit)
|
||||||
|
return -1;
|
||||||
|
else if (l->hit > r->hit)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int bytes_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
static int bytes_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
||||||
{
|
{
|
||||||
if (l->bytes_alloc < r->bytes_alloc)
|
if (l->bytes_alloc < r->bytes_alloc)
|
||||||
|
@ -452,6 +461,20 @@ static int bytes_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int frag_cmp(struct alloc_stat *l, struct alloc_stat *r)
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
x = fragmentation(l->bytes_req, l->bytes_alloc);
|
||||||
|
y = fragmentation(r->bytes_req, r->bytes_alloc);
|
||||||
|
|
||||||
|
if (x < y)
|
||||||
|
return -1;
|
||||||
|
else if (x > y)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_sort_opt(const struct option *opt __used,
|
static int parse_sort_opt(const struct option *opt __used,
|
||||||
const char *arg, int unset __used)
|
const char *arg, int unset __used)
|
||||||
{
|
{
|
||||||
|
@ -464,8 +487,12 @@ static int parse_sort_opt(const struct option *opt __used,
|
||||||
sort_fn = ptr_cmp;
|
sort_fn = ptr_cmp;
|
||||||
else if (strcmp(arg, "call_site") == 0)
|
else if (strcmp(arg, "call_site") == 0)
|
||||||
sort_fn = callsite_cmp;
|
sort_fn = callsite_cmp;
|
||||||
|
else if (strcmp(arg, "hit") == 0)
|
||||||
|
sort_fn = hit_cmp;
|
||||||
else if (strcmp(arg, "bytes") == 0)
|
else if (strcmp(arg, "bytes") == 0)
|
||||||
sort_fn = bytes_cmp;
|
sort_fn = bytes_cmp;
|
||||||
|
else if (strcmp(arg, "frag") == 0)
|
||||||
|
sort_fn = frag_cmp;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -517,7 +544,7 @@ static const struct option kmem_options[] = {
|
||||||
"stat selector, Pass 'alloc' or 'caller'.",
|
"stat selector, Pass 'alloc' or 'caller'.",
|
||||||
parse_stat_opt),
|
parse_stat_opt),
|
||||||
OPT_CALLBACK('s', "sort", NULL, "key",
|
OPT_CALLBACK('s', "sort", NULL, "key",
|
||||||
"sort by key: ptr, call_site, hit, bytes",
|
"sort by key: ptr, call_site, hit, bytes, frag",
|
||||||
parse_sort_opt),
|
parse_sort_opt),
|
||||||
OPT_CALLBACK('l', "line", NULL, "num",
|
OPT_CALLBACK('l', "line", NULL, "num",
|
||||||
"show n lins",
|
"show n lins",
|
||||||
|
|
Loading…
Reference in a new issue