bpf: Add support for bpf iterator programs to use sleepable helpers
authorKenny Yu <kennyyu@fb.com>
Mon, 24 Jan 2022 18:54:00 +0000 (10:54 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 25 Jan 2022 03:55:40 +0000 (19:55 -0800)
This patch allows bpf iterator programs to use sleepable helpers by
changing `bpf_iter_run_prog` to use the appropriate synchronization.
With sleepable bpf iterator programs, we can no longer use
`rcu_read_lock()` and must use `rcu_read_lock_trace()` instead
to protect the bpf program.

Signed-off-by: Kenny Yu <kennyyu@fb.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20220124185403.468466-2-kennyyu@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/bpf_iter.c

index b7aef5b..110029e 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/anon_inodes.h>
 #include <linux/filter.h>
 #include <linux/bpf.h>
+#include <linux/rcupdate_trace.h>
 
 struct bpf_iter_target_info {
        struct list_head list;
@@ -684,11 +685,20 @@ int bpf_iter_run_prog(struct bpf_prog *prog, void *ctx)
 {
        int ret;
 
-       rcu_read_lock();
-       migrate_disable();
-       ret = bpf_prog_run(prog, ctx);
-       migrate_enable();
-       rcu_read_unlock();
+       if (prog->aux->sleepable) {
+               rcu_read_lock_trace();
+               migrate_disable();
+               might_fault();
+               ret = bpf_prog_run(prog, ctx);
+               migrate_enable();
+               rcu_read_unlock_trace();
+       } else {
+               rcu_read_lock();
+               migrate_disable();
+               ret = bpf_prog_run(prog, ctx);
+               migrate_enable();
+               rcu_read_unlock();
+       }
 
        /* bpf program can only return 0 or 1:
         *  0 : okay