From: Namhyung Kim Date: Sat, 24 Sep 2022 00:42:19 +0000 (-0700) Subject: perf lock: Add -E/--entries option X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=6282a1f4f846fda21b16065a2ef094c7b71b2771;p=linux.git 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: Namhyung Kim Acked-by: Ian Rogers Cc: Adrian Hunter Cc: Ingo Molnar Cc: Jiri Olsa Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20220924004221.841024-1-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt index 5f2dc634258e9..b23e76200ac2c 100644 --- a/tools/perf/Documentation/perf-lock.txt +++ b/tools/perf/Documentation/perf-lock.txt @@ -94,6 +94,11 @@ REPORT OPTIONS EventManager_De 1845 1 636 futex-default-S 1609 0 0 +-E:: +--entries=:: + Display this many entries. + + INFO OPTIONS ------------ @@ -105,6 +110,7 @@ INFO OPTIONS --map:: dump map of lock instances (address:name table) + CONTENTION OPTIONS -------------- @@ -154,6 +160,10 @@ CONTENTION OPTIONS --stack-skip Number of stack depth to skip when finding a lock caller (default: 3). +-E:: +--entries=:: + Display this many entries. + SEE ALSO -------- diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 25d75fa09b906..1c0d52384d9e9 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -58,6 +58,7 @@ static bool use_bpf; static unsigned long bpf_map_entries = 10240; static int max_stack_depth = CONTENTION_STACK_DEPTH; static int stack_skip = CONTENTION_STACK_SKIP; +static int print_nr_entries = INT_MAX / 2; static enum { LOCK_AGGR_ADDR, @@ -1266,14 +1267,14 @@ static void print_result(void) struct lock_stat *st; struct lock_key *key; char cut_name[20]; - int bad, total; + int bad, total, printed; pr_info("%20s ", "Name"); list_for_each_entry(key, &lock_keys, list) pr_info("%*s ", key->len, key->header); pr_info("\n\n"); - bad = total = 0; + bad = total = printed = 0; while ((st = pop_from_result())) { total++; if (st->broken) @@ -1311,6 +1312,9 @@ static void print_result(void) pr_info(" "); } pr_info("\n"); + + if (++printed >= print_nr_entries) + break; } print_bad_events(bad, total); @@ -1476,7 +1480,7 @@ static void print_contention_result(struct lock_contention *con) { struct lock_stat *st; struct lock_key *key; - int bad, total; + int bad, total, printed; list_for_each_entry(key, &lock_keys, list) pr_info("%*s ", key->len, key->header); @@ -1486,7 +1490,7 @@ static void print_contention_result(struct lock_contention *con) else pr_info(" %10s %s\n\n", "type", "caller"); - bad = total = 0; + bad = total = printed = 0; if (use_bpf) bad = bad_hist[BROKEN_CONTENDED]; @@ -1507,7 +1511,7 @@ static void print_contention_result(struct lock_contention *con) /* st->addr contains tid of thread */ t = perf_session__findnew(session, pid); pr_info(" %10d %s\n", pid, thread__comm_str(t)); - continue; + goto next; } pr_info(" %10s %s\n", get_type_str(st), st->name); @@ -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); } } + +next: + if (++printed >= print_nr_entries) + break; } print_bad_events(bad, total); @@ -1878,6 +1886,7 @@ int cmd_lock(int argc, const char **argv) "combine locks in the same class"), OPT_BOOLEAN('t', "threads", &show_thread_stats, "show per-thread lock stats"), + OPT_INTEGER('E', "entries", &print_nr_entries, "display this many functions"), OPT_PARENT(lock_options) }; @@ -1905,6 +1914,7 @@ int cmd_lock(int argc, const char **argv) OPT_INTEGER(0, "stack-skip", &stack_skip, "Set the number of stack depth to skip when finding a lock caller, " "Default: " __stringify(CONTENTION_STACK_SKIP)), + OPT_INTEGER('E', "entries", &print_nr_entries, "display this many functions"), OPT_PARENT(lock_options) };