diff options
author | Namhyung Kim <namhyung@kernel.org> | 2023-10-20 22:47:40 +0200 |
---|---|---|
committer | Namhyung Kim <namhyung@kernel.org> | 2023-10-25 19:02:47 +0200 |
commit | 6a070573f290f99a6129ac3e13b9df521a1a65de (patch) | |
tree | 61889f17e90cc264f7645ecbdf1a5065622a68eb /tools/perf | |
parent | perf lock contention: Clear lock addr after use (diff) | |
download | linux-6a070573f290f99a6129ac3e13b9df521a1a65de.tar.xz linux-6a070573f290f99a6129ac3e13b9df521a1a65de.zip |
perf lock contention: Check race in tstamp elem creation
When pelem is NULL, it'd create a new entry with zero data. But it
might be preempted by IRQ/NMI just before calling bpf_map_update_elem()
then there's a chance to call it twice for the same pid. So it'd be
better to use BPF_NOEXIST flag and check the return value to prevent
the race.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Song Liu <song@kernel.org>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20231020204741.1869520-2-namhyung@kernel.org
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/bpf_skel/lock_contention.bpf.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/tools/perf/util/bpf_skel/lock_contention.bpf.c b/tools/perf/util/bpf_skel/lock_contention.bpf.c index b11179452e19..69d31fd77cd0 100644 --- a/tools/perf/util/bpf_skel/lock_contention.bpf.c +++ b/tools/perf/util/bpf_skel/lock_contention.bpf.c @@ -328,7 +328,11 @@ int contention_begin(u64 *ctx) if (pelem == NULL) { struct tstamp_data zero = {}; - bpf_map_update_elem(&tstamp, &pid, &zero, BPF_ANY); + if (bpf_map_update_elem(&tstamp, &pid, &zero, BPF_NOEXIST) < 0) { + __sync_fetch_and_add(&task_fail, 1); + return 0; + } + pelem = bpf_map_lookup_elem(&tstamp, &pid); if (pelem == NULL) { __sync_fetch_and_add(&task_fail, 1); |