]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: test bpf_for within spin lock section
authorEmil Tsalapatis <emil@etsalapatis.com>
Sat, 4 Jan 2025 20:25:28 +0000 (15:25 -0500)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 6 Jan 2025 18:59:49 +0000 (10:59 -0800)
Add a selftest to ensure BPF for loops within critical sections are
accepted by the verifier.

Signed-off-by: Emil Tsalapatis (Meta) <emil@etsalapatis.com>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250104202528.882482-3-emil@etsalapatis.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_spin_lock.c

index 25599eac9a7029fcce2df4a8e43f037482b56d6a..d9d7b05cf6d25c868976a3f2dfe8f583fbc4601b 100644 (file)
@@ -530,4 +530,30 @@ l1_%=:     exit;                                           \
        : __clobber_all);
 }
 
+SEC("tc")
+__description("spin_lock: loop within a locked region")
+__success __failure_unpriv __msg_unpriv("")
+__retval(0)
+int bpf_loop_inside_locked_region(void)
+{
+       const int zero = 0;
+       struct val *val;
+       int i, j = 0;
+
+       val = bpf_map_lookup_elem(&map_spin_lock, &zero);
+       if (!val)
+               return -1;
+
+       bpf_spin_lock(&val->l);
+       bpf_for(i, 0, 10) {
+               j++;
+               /* Silence "unused variable" warnings. */
+               if (j == 10)
+                       break;
+       }
+       bpf_spin_unlock(&val->l);
+
+       return 0;
+}
+
 char _license[] SEC("license") = "GPL";