Commit 6282a1f4 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf lock: Add -E/--entries option

Like in 'perf top', the -E option can limit number of entries to print.

It can be useful when users want to see top N contended locks only.
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Acked-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220924004221.841024-1-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 84838712
...@@ -94,6 +94,11 @@ REPORT OPTIONS ...@@ -94,6 +94,11 @@ REPORT OPTIONS
EventManager_De 1845 1 636 EventManager_De 1845 1 636
futex-default-S 1609 0 0 futex-default-S 1609 0 0
-E::
--entries=<value>::
Display this many entries.
INFO OPTIONS INFO OPTIONS
------------ ------------
...@@ -105,6 +110,7 @@ INFO OPTIONS ...@@ -105,6 +110,7 @@ INFO OPTIONS
--map:: --map::
dump map of lock instances (address:name table) dump map of lock instances (address:name table)
CONTENTION OPTIONS CONTENTION OPTIONS
-------------- --------------
...@@ -154,6 +160,10 @@ CONTENTION OPTIONS ...@@ -154,6 +160,10 @@ CONTENTION OPTIONS
--stack-skip --stack-skip
Number of stack depth to skip when finding a lock caller (default: 3). Number of stack depth to skip when finding a lock caller (default: 3).
-E::
--entries=<value>::
Display this many entries.
SEE ALSO SEE ALSO
-------- --------
......
...@@ -58,6 +58,7 @@ static bool use_bpf; ...@@ -58,6 +58,7 @@ static bool use_bpf;
static unsigned long bpf_map_entries = 10240; static unsigned long bpf_map_entries = 10240;
static int max_stack_depth = CONTENTION_STACK_DEPTH; static int max_stack_depth = CONTENTION_STACK_DEPTH;
static int stack_skip = CONTENTION_STACK_SKIP; static int stack_skip = CONTENTION_STACK_SKIP;
static int print_nr_entries = INT_MAX / 2;
static enum { static enum {
LOCK_AGGR_ADDR, LOCK_AGGR_ADDR,
...@@ -1266,14 +1267,14 @@ static void print_result(void) ...@@ -1266,14 +1267,14 @@ static void print_result(void)
struct lock_stat *st; struct lock_stat *st;
struct lock_key *key; struct lock_key *key;
char cut_name[20]; char cut_name[20];
int bad, total; int bad, total, printed;
pr_info("%20s ", "Name"); pr_info("%20s ", "Name");
list_for_each_entry(key, &lock_keys, list) list_for_each_entry(key, &lock_keys, list)
pr_info("%*s ", key->len, key->header); pr_info("%*s ", key->len, key->header);
pr_info("\n\n"); pr_info("\n\n");
bad = total = 0; bad = total = printed = 0;
while ((st = pop_from_result())) { while ((st = pop_from_result())) {
total++; total++;
if (st->broken) if (st->broken)
...@@ -1311,6 +1312,9 @@ static void print_result(void) ...@@ -1311,6 +1312,9 @@ static void print_result(void)
pr_info(" "); pr_info(" ");
} }
pr_info("\n"); pr_info("\n");
if (++printed >= print_nr_entries)
break;
} }
print_bad_events(bad, total); print_bad_events(bad, total);
...@@ -1476,7 +1480,7 @@ static void print_contention_result(struct lock_contention *con) ...@@ -1476,7 +1480,7 @@ static void print_contention_result(struct lock_contention *con)
{ {
struct lock_stat *st; struct lock_stat *st;
struct lock_key *key; struct lock_key *key;
int bad, total; int bad, total, printed;
list_for_each_entry(key, &lock_keys, list) list_for_each_entry(key, &lock_keys, list)
pr_info("%*s ", key->len, key->header); pr_info("%*s ", key->len, key->header);
...@@ -1486,7 +1490,7 @@ static void print_contention_result(struct lock_contention *con) ...@@ -1486,7 +1490,7 @@ static void print_contention_result(struct lock_contention *con)
else else
pr_info(" %10s %s\n\n", "type", "caller"); pr_info(" %10s %s\n\n", "type", "caller");
bad = total = 0; bad = total = printed = 0;
if (use_bpf) if (use_bpf)
bad = bad_hist[BROKEN_CONTENDED]; bad = bad_hist[BROKEN_CONTENDED];
...@@ -1507,7 +1511,7 @@ static void print_contention_result(struct lock_contention *con) ...@@ -1507,7 +1511,7 @@ static void print_contention_result(struct lock_contention *con)
/* st->addr contains tid of thread */ /* st->addr contains tid of thread */
t = perf_session__findnew(session, pid); t = perf_session__findnew(session, pid);
pr_info(" %10d %s\n", pid, thread__comm_str(t)); pr_info(" %10d %s\n", pid, thread__comm_str(t));
continue; goto next;
} }
pr_info(" %10s %s\n", get_type_str(st), st->name); pr_info(" %10s %s\n", get_type_str(st), st->name);
...@@ -1527,6 +1531,10 @@ static void print_contention_result(struct lock_contention *con) ...@@ -1527,6 +1531,10 @@ static void print_contention_result(struct lock_contention *con)
pr_info("\t\t\t%#lx %s\n", (unsigned long)ip, buf); pr_info("\t\t\t%#lx %s\n", (unsigned long)ip, buf);
} }
} }
next:
if (++printed >= print_nr_entries)
break;
} }
print_bad_events(bad, total); print_bad_events(bad, total);
...@@ -1878,6 +1886,7 @@ int cmd_lock(int argc, const char **argv) ...@@ -1878,6 +1886,7 @@ int cmd_lock(int argc, const char **argv)
"combine locks in the same class"), "combine locks in the same class"),
OPT_BOOLEAN('t', "threads", &show_thread_stats, OPT_BOOLEAN('t', "threads", &show_thread_stats,
"show per-thread lock stats"), "show per-thread lock stats"),
OPT_INTEGER('E', "entries", &print_nr_entries, "display this many functions"),
OPT_PARENT(lock_options) OPT_PARENT(lock_options)
}; };
...@@ -1905,6 +1914,7 @@ int cmd_lock(int argc, const char **argv) ...@@ -1905,6 +1914,7 @@ int cmd_lock(int argc, const char **argv)
OPT_INTEGER(0, "stack-skip", &stack_skip, OPT_INTEGER(0, "stack-skip", &stack_skip,
"Set the number of stack depth to skip when finding a lock caller, " "Set the number of stack depth to skip when finding a lock caller, "
"Default: " __stringify(CONTENTION_STACK_SKIP)), "Default: " __stringify(CONTENTION_STACK_SKIP)),
OPT_INTEGER('E', "entries", &print_nr_entries, "display this many functions"),
OPT_PARENT(lock_options) OPT_PARENT(lock_options)
}; };
......
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