summaryrefslogtreecommitdiffstats
path: root/kernel/bpf/arraymap.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2018-02-22 17:33:24 +0100
committerDaniel Borkmann <daniel@iogearbox.net>2018-02-22 21:27:06 +0100
commit32fff239de37ef226d5b66329dd133f64d63b22d (patch)
tree35ee0de8ea4ebaea6511622d12bbe177f5ed45e1 /kernel/bpf/arraymap.c
parentselftests/bpf/test_maps: exit child process without error in ENOMEM case (diff)
downloadlinux-32fff239de37ef226d5b66329dd133f64d63b22d.tar.xz
linux-32fff239de37ef226d5b66329dd133f64d63b22d.zip
bpf: add schedule points in percpu arrays management
syszbot managed to trigger RCU detected stalls in bpf_array_free_percpu() It takes time to allocate a huge percpu map, but even more time to free it. Since we run in process context, use cond_resched() to yield cpu if needed. Fixes: a10423b87a7e ("bpf: introduce BPF_MAP_TYPE_PERCPU_ARRAY map") Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: syzbot <syzkaller@googlegroups.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to '')
-rw-r--r--kernel/bpf/arraymap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c
index a364c408f25a..14750e7c5ee4 100644
--- a/kernel/bpf/arraymap.c
+++ b/kernel/bpf/arraymap.c
@@ -26,8 +26,10 @@ static void bpf_array_free_percpu(struct bpf_array *array)
{
int i;
- for (i = 0; i < array->map.max_entries; i++)
+ for (i = 0; i < array->map.max_entries; i++) {
free_percpu(array->pptrs[i]);
+ cond_resched();
+ }
}
static int bpf_array_alloc_percpu(struct bpf_array *array)
@@ -43,6 +45,7 @@ static int bpf_array_alloc_percpu(struct bpf_array *array)
return -ENOMEM;
}
array->pptrs[i] = ptr;
+ cond_resched();
}
return 0;