Commit 6a070573 authored by Namhyung Kim's avatar Namhyung Kim

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: default avatarNamhyung Kim <namhyung@kernel.org>
Acked-by: default avatarIan 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
parent d99317f2
...@@ -328,7 +328,11 @@ int contention_begin(u64 *ctx) ...@@ -328,7 +328,11 @@ int contention_begin(u64 *ctx)
if (pelem == NULL) { if (pelem == NULL) {
struct tstamp_data zero = {}; 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); pelem = bpf_map_lookup_elem(&tstamp, &pid);
if (pelem == NULL) { if (pelem == NULL) {
__sync_fetch_and_add(&task_fail, 1); __sync_fetch_and_add(&task_fail, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment