mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
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
This commit is contained in:
parent
d99317f214
commit
6a070573f2
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user