2022-09-24 00:54:35

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 1/3] perf lock: Add -E/--entries option

Like 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 <[email protected]>
---
tools/perf/Documentation/perf-lock.txt | 10 ++++++++++
tools/perf/builtin-lock.c | 20 +++++++++++++++-----
2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
index 5f2dc634258e..b23e76200ac2 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=<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
--------
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 25d75fa09b90..1c0d52384d9e 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)
};

--
2.37.3.998.g577e59143f-goog


2022-09-24 00:56:26

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 2/3] perf lock: Add -q/--quiet option

Like perf report, this option is to suppress header and debug messages.

Signed-off-by: Namhyung Kim <[email protected]>
---
tools/perf/Documentation/perf-lock.txt | 4 ++++
tools/perf/builtin-lock.c | 27 +++++++++++++++-----------
2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
index b23e76200ac2..3b1e16563b79 100644
--- a/tools/perf/Documentation/perf-lock.txt
+++ b/tools/perf/Documentation/perf-lock.txt
@@ -40,6 +40,10 @@ COMMON OPTIONS
--verbose::
Be more verbose (show symbol address, etc).

+-q::
+--quiet::
+ Do not show any message. (Suppress -v)
+
-D::
--dump-raw-trace::
Dump raw trace in ASCII.
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 1c0d52384d9e..9722d4ab2e55 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -1250,7 +1250,7 @@ static void print_bad_events(int bad, int total)
for (i = 0; i < BROKEN_MAX; i++)
broken += bad_hist[i];

- if (broken == 0 && !verbose)
+ if (quiet || (broken == 0 && !verbose))
return;

pr_info("\n=== output for debug===\n\n");
@@ -1269,10 +1269,12 @@ static void print_result(void)
char cut_name[20];
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");
+ if (!quiet) {
+ 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 = printed = 0;
while ((st = pop_from_result())) {
@@ -1482,13 +1484,15 @@ static void print_contention_result(struct lock_contention *con)
struct lock_key *key;
int bad, total, printed;

- list_for_each_entry(key, &lock_keys, list)
- pr_info("%*s ", key->len, key->header);
+ if (!quiet) {
+ list_for_each_entry(key, &lock_keys, list)
+ pr_info("%*s ", key->len, key->header);

- if (show_thread_stats)
- pr_info(" %10s %s\n\n", "pid", "comm");
- else
- pr_info(" %10s %s\n\n", "type", "caller");
+ if (show_thread_stats)
+ pr_info(" %10s %s\n\n", "pid", "comm");
+ else
+ pr_info(" %10s %s\n\n", "type", "caller");
+ }

bad = total = printed = 0;
if (use_bpf)
@@ -1865,6 +1869,7 @@ int cmd_lock(int argc, const char **argv)
"file", "vmlinux pathname"),
OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
"file", "kallsyms pathname"),
+ OPT_BOOLEAN('q', "quiet", &quiet, "Do not show any message"),
OPT_END()
};

--
2.37.3.998.g577e59143f-goog

2022-09-24 03:11:35

by Ian Rogers

[permalink] [raw]
Subject: Re: [PATCH 2/3] perf lock: Add -q/--quiet option

On Fri, Sep 23, 2022 at 5:42 PM Namhyung Kim <[email protected]> wrote:
>
> Like perf report, this option is to suppress header and debug messages.
>
> Signed-off-by: Namhyung Kim <[email protected]>

Acked-by: Ian Rogers <[email protected]>

Thanks,
Ian

> ---
> tools/perf/Documentation/perf-lock.txt | 4 ++++
> tools/perf/builtin-lock.c | 27 +++++++++++++++-----------
> 2 files changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
> index b23e76200ac2..3b1e16563b79 100644
> --- a/tools/perf/Documentation/perf-lock.txt
> +++ b/tools/perf/Documentation/perf-lock.txt
> @@ -40,6 +40,10 @@ COMMON OPTIONS
> --verbose::
> Be more verbose (show symbol address, etc).
>
> +-q::
> +--quiet::
> + Do not show any message. (Suppress -v)
> +
> -D::
> --dump-raw-trace::
> Dump raw trace in ASCII.
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 1c0d52384d9e..9722d4ab2e55 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -1250,7 +1250,7 @@ static void print_bad_events(int bad, int total)
> for (i = 0; i < BROKEN_MAX; i++)
> broken += bad_hist[i];
>
> - if (broken == 0 && !verbose)
> + if (quiet || (broken == 0 && !verbose))
> return;
>
> pr_info("\n=== output for debug===\n\n");
> @@ -1269,10 +1269,12 @@ static void print_result(void)
> char cut_name[20];
> 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");
> + if (!quiet) {
> + 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 = printed = 0;
> while ((st = pop_from_result())) {
> @@ -1482,13 +1484,15 @@ static void print_contention_result(struct lock_contention *con)
> struct lock_key *key;
> int bad, total, printed;
>
> - list_for_each_entry(key, &lock_keys, list)
> - pr_info("%*s ", key->len, key->header);
> + if (!quiet) {
> + list_for_each_entry(key, &lock_keys, list)
> + pr_info("%*s ", key->len, key->header);
>
> - if (show_thread_stats)
> - pr_info(" %10s %s\n\n", "pid", "comm");
> - else
> - pr_info(" %10s %s\n\n", "type", "caller");
> + if (show_thread_stats)
> + pr_info(" %10s %s\n\n", "pid", "comm");
> + else
> + pr_info(" %10s %s\n\n", "type", "caller");
> + }
>
> bad = total = printed = 0;
> if (use_bpf)
> @@ -1865,6 +1869,7 @@ int cmd_lock(int argc, const char **argv)
> "file", "vmlinux pathname"),
> OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
> "file", "kallsyms pathname"),
> + OPT_BOOLEAN('q', "quiet", &quiet, "Do not show any message"),
> OPT_END()
> };
>
> --
> 2.37.3.998.g577e59143f-goog
>

2022-09-24 03:14:16

by Ian Rogers

[permalink] [raw]
Subject: Re: [PATCH 1/3] perf lock: Add -E/--entries option

On Fri, Sep 23, 2022 at 5:42 PM Namhyung Kim <[email protected]> wrote:
>
> Like 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 <[email protected]>

Acked-by: Ian Rogers <[email protected]>

Thanks,
Ian

> ---
> tools/perf/Documentation/perf-lock.txt | 10 ++++++++++
> tools/perf/builtin-lock.c | 20 +++++++++++++++-----
> 2 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
> index 5f2dc634258e..b23e76200ac2 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=<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
> --------
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 25d75fa09b90..1c0d52384d9e 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)
> };
>
> --
> 2.37.3.998.g577e59143f-goog
>

2022-09-26 20:11:09

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH 1/3] perf lock: Add -E/--entries option

Em Fri, Sep 23, 2022 at 05:42:19PM -0700, Namhyung Kim escreveu:
> Like 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.

Thanks, applied.

- Arnaldo


> Signed-off-by: Namhyung Kim <[email protected]>
> ---
> tools/perf/Documentation/perf-lock.txt | 10 ++++++++++
> tools/perf/builtin-lock.c | 20 +++++++++++++++-----
> 2 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
> index 5f2dc634258e..b23e76200ac2 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=<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
> --------
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 25d75fa09b90..1c0d52384d9e 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)
> };
>
> --
> 2.37.3.998.g577e59143f-goog

--

- Arnaldo