]>
Commit | Line | Data |
---|---|---|
5351d7ec GKH |
1 | From foo@baz Fri Mar 9 14:18:36 PST 2018 |
2 | From: Daniel Borkmann <daniel@iogearbox.net> | |
3 | Date: Thu, 8 Mar 2018 13:14:45 +0100 | |
4 | Subject: bpf: add schedule points in percpu arrays management | |
5 | To: gregkh@linuxfoundation.org | |
6 | Cc: ast@kernel.org, daniel@iogearbox.net, stable@vger.kernel.org, Eric Dumazet <edumazet@google.com> | |
7 | Message-ID: <498449c87b8c123b6ab6ffe2882a9b108473e256.1520504748.git.daniel@iogearbox.net> | |
8 | ||
9 | From: Eric Dumazet <edumazet@google.com> | |
10 | ||
11 | [ upstream commit 32fff239de37ef226d5b66329dd133f64d63b22d ] | |
12 | ||
13 | syszbot managed to trigger RCU detected stalls in | |
14 | bpf_array_free_percpu() | |
15 | ||
16 | It takes time to allocate a huge percpu map, but even more time to free | |
17 | it. | |
18 | ||
19 | Since we run in process context, use cond_resched() to yield cpu if | |
20 | needed. | |
21 | ||
22 | Fixes: a10423b87a7e ("bpf: introduce BPF_MAP_TYPE_PERCPU_ARRAY map") | |
23 | Signed-off-by: Eric Dumazet <edumazet@google.com> | |
24 | Reported-by: syzbot <syzkaller@googlegroups.com> | |
25 | Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> | |
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
27 | --- | |
28 | kernel/bpf/arraymap.c | 5 ++++- | |
29 | 1 file changed, 4 insertions(+), 1 deletion(-) | |
30 | ||
31 | --- a/kernel/bpf/arraymap.c | |
32 | +++ b/kernel/bpf/arraymap.c | |
33 | @@ -23,8 +23,10 @@ static void bpf_array_free_percpu(struct | |
34 | { | |
35 | int i; | |
36 | ||
37 | - for (i = 0; i < array->map.max_entries; i++) | |
38 | + for (i = 0; i < array->map.max_entries; i++) { | |
39 | free_percpu(array->pptrs[i]); | |
40 | + cond_resched(); | |
41 | + } | |
42 | } | |
43 | ||
44 | static int bpf_array_alloc_percpu(struct bpf_array *array) | |
45 | @@ -40,6 +42,7 @@ static int bpf_array_alloc_percpu(struct | |
46 | return -ENOMEM; | |
47 | } | |
48 | array->pptrs[i] = ptr; | |
49 | + cond_resched(); | |
50 | } | |
51 | ||
52 | return 0; |