perf lock: Add --map-nr-entries option
authorNamhyung Kim <namhyung@kernel.org>
Tue, 2 Aug 2022 19:10:03 +0000 (12:10 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 2 Aug 2022 21:02:59 +0000 (18:02 -0300)
The --map-nr-entries option is to control number of max entries in the
perf lock contention BPF maps.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Blake Jones <blakejones@google.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Waiman Long <longman@redhat.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20220802191004.347740-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-lock.txt
tools/perf/builtin-lock.c
tools/perf/util/bpf_lock_contention.c
tools/perf/util/lock-contention.h

index 7949d2e6891b72e1aef93409ef1ba4fd9dacfc35..193c5d8b8db924d166c60c85901c880f3da207b6 100644 (file)
@@ -145,6 +145,9 @@ CONTENTION OPTIONS
 --tid=::
         Record events on existing thread ID (comma separated list).
 
+--map-nr-entries::
+       Maximum number of BPF map entries (default: 10240).
+
 
 SEE ALSO
 --------
index 4bc521adbd609930415ebaa98da0a45bb6b7b2a6..c6cc6c2964196f0fc9452ef8296c053e549c6c35 100644 (file)
@@ -56,6 +56,7 @@ static struct rb_root         thread_stats;
 static bool combine_locks;
 static bool show_thread_stats;
 static bool use_bpf;
+static unsigned long bpf_map_entries = 10240;
 
 static enum {
        LOCK_AGGR_ADDR,
@@ -1598,6 +1599,7 @@ static int __cmd_contention(int argc, const char **argv)
        struct lock_contention con = {
                .target = &target,
                .result = &lockhash_table[0],
+               .map_nr_entries = bpf_map_entries,
        };
 
        session = perf_session__new(use_bpf ? NULL : &data, &eops);
@@ -1787,6 +1789,24 @@ setup_args:
        return ret;
 }
 
+static int parse_map_entry(const struct option *opt, const char *str,
+                           int unset __maybe_unused)
+{
+       unsigned long *len = (unsigned long *)opt->value;
+       unsigned long val;
+       char *endptr;
+
+       errno = 0;
+       val = strtoul(str, &endptr, 0);
+       if (*endptr != '\0' || errno != 0) {
+               pr_err("invalid BPF map length: %s\n", str);
+               return -1;
+       }
+
+       *len = val;
+       return 0;
+}
+
 int cmd_lock(int argc, const char **argv)
 {
        const struct option lock_options[] = {
@@ -1836,9 +1856,10 @@ int cmd_lock(int argc, const char **argv)
                    "List of cpus to monitor"),
        OPT_STRING('p', "pid", &target.pid, "pid",
                   "Trace on existing process id"),
-       /* TODO: Add short option -t after -t/--tracer can be removed. */
        OPT_STRING(0, "tid", &target.tid, "tid",
                   "Trace on existing thread id (exclusive to --pid)"),
+       OPT_CALLBACK(0, "map-nr-entries", &bpf_map_entries, "num",
+                    "Max number of BPF map entries", parse_map_entry),
        OPT_PARENT(lock_options)
        };
 
index f5e2b4f19a72bf48ac4095064ba84b9097f66b9c..0556cf4469ff79be320e29f41be4461cdc34e5ec 100644 (file)
@@ -40,6 +40,9 @@ int lock_contention_prepare(struct lock_contention *con)
                return -1;
        }
 
+       bpf_map__set_max_entries(skel->maps.stacks, con->map_nr_entries);
+       bpf_map__set_max_entries(skel->maps.lock_stat, con->map_nr_entries);
+
        if (target__has_cpu(target))
                ncpus = perf_cpu_map__nr(evlist->core.user_requested_cpus);
        if (target__has_task(target))
index a0df5308cca4662dae6dbe945565868e8c8d5cf5..8de8550f5ef8992d5df3a158f4f8d2f33e42df7b 100644 (file)
@@ -112,6 +112,7 @@ struct lock_contention {
        struct target *target;
        struct machine *machine;
        struct hlist_head *result;
+       unsigned long map_nr_entries;
 };
 
 #ifdef HAVE_BPF_SKEL