On Fri, 2025-02-07 at 02:06 +0000, Peilin Ye wrote: > Add several ./test_progs tests: > > - arena_atomics/load_acquire > - arena_atomics/store_release > - verifier_load_acquire/* > - verifier_store_release/* > - verifier_precision/bpf_load_acquire > - verifier_precision/bpf_store_release > > The last two tests are added to check if backtrack_insn() handles the > new instructions correctly. > > Additionally, the last test also makes sure that the verifier > "remembers" the value (in src_reg) we store-release into e.g. a stack > slot. For example, if we take a look at the test program: > > #0: r1 = 8; > /* store_release((u64 *)(r10 - 8), r1); */ > #1: .8byte %[store_release]; > #2: r1 = *(u64 *)(r10 - 8); > #3: r2 = r10; > #4: r2 += r1; > #5: r0 = 0; > #6: exit; > > At #1, if the verifier doesn't remember that we wrote 8 to the stack, > then later at #4 we would be adding an unbounded scalar value to the > stack pointer, which would cause the program to be rejected: > > VERIFIER LOG: > ============= > ... > math between fp pointer and register with unbounded min value is not allowed > > All new tests depend on #ifdef ENABLE_ATOMICS_TESTS. Currently they > only run for arm64. > > Signed-off-by: Peilin Ye <yepeilin@xxxxxxxxxx> > --- Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> [...] > +++ b/tools/testing/selftests/bpf/progs/verifier_load_acquire.c > @@ -0,0 +1,190 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > +#include "../../../include/linux/filter.h" > +#include "bpf_misc.h" > + > +#if defined(ENABLE_ATOMICS_TESTS) && defined(__TARGET_ARCH_arm64) [...] > +#else > + > +SEC("socket") > +__description("load-acquire is not supported by compiler or jit, use a dummy test") > +__success > +int dummy_test(void) > +{ > + return 0; > +} Nit: why is dummy_test() necessary? > + > +#endif > + > +char _license[] SEC("license") = "GPL"; [...]