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

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.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 84838712
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -94,6 +94,11 @@ REPORT OPTIONS
         EventManager_De       1845          1             636
         futex-default-S       1609          0               0

-E::
--entries=<value>::
	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=<value>::
	Display this many entries.


SEE ALSO
--------
+15 −5
Original line number Diff line number Diff line
@@ -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)
	};