aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2025-05-15 11:10:42 -0700
committerArnaldo Carvalho de Melo <acme@redhat.com>2025-05-31 08:45:24 -0300
commit0df14c1f1ed530ba21b603a2e282589c034367da (patch)
tree4a24285744a1a9f95bdeb47f0ccc18df6aa9149b
parentperf trace: Set errpid to false for rseq and set_robust_list (diff)
downloadlinux-rng-0df14c1f1ed530ba21b603a2e282589c034367da.tar.xz
linux-rng-0df14c1f1ed530ba21b603a2e282589c034367da.zip
perf lock contention: Reject more than 10ms delays for safety
Delaying kernel operations can be dangerous and the kernel may kill (non-sleepable) BPF programs running for long in the future. Limit the max delay to 10ms and update the document about it. $ sudo ./perf lock con -abl -J 100000us@cgroup_mutex true lock delay is too long: 100000us (> 10ms) Usage: perf lock contention [<options>] -J, --inject-delay <TIME@FUNC> Inject delays to specific locks Suggested-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20250515181042.555189-1-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/Documentation/perf-lock.txt8
-rw-r--r--tools/perf/builtin-lock.c5
2 files changed, 11 insertions, 2 deletions
diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt
index 2d9aecf63042..c17b3e318169 100644
--- a/tools/perf/Documentation/perf-lock.txt
+++ b/tools/perf/Documentation/perf-lock.txt
@@ -224,8 +224,12 @@ CONTENTION OPTIONS
only with -b/--use-bpf.
The 'time' is specified in nsec but it can have a unit suffix. Available
- units are "ms" and "us". Note that it will busy-wait after it gets the
- lock. Please use it at your own risk.
+ units are "ms", "us" and "ns". Currently it accepts up to 10ms of delays
+ for safety reasons.
+
+ Note that it will busy-wait after it gets the lock. Delaying locks can
+ have significant consequences including potential kernel crashes. Please
+ use it at your own risk.
SEE ALSO
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 41f6f3d2b779..3b3ade7a39ca 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -2537,6 +2537,11 @@ static bool add_lock_delay(char *spec)
return false;
}
+ if (duration > 10 * 1000 * 1000) {
+ pr_err("lock delay is too long: %s (> 10ms)\n", spec);
+ return false;
+ }
+
tmp = realloc(delays, (nr_delays + 1) * sizeof(*delays));
if (tmp == NULL) {
pr_err("Memory allocation failure\n");