On Thu, Apr 25, 2024 at 2:05 PM Yonghong Song <yonghong.song@xxxxxxxxx> wrote: > > > On 4/24/24 10:36 PM, Yafang Shao wrote: > > On Thu, Apr 25, 2024 at 8:34 AM Andrii Nakryiko > > <andrii.nakryiko@xxxxxxxxx> wrote: > >> On Thu, Apr 11, 2024 at 6:51 AM Yafang Shao <laoar.shao@xxxxxxxxx> wrote: > >>> On Thu, Apr 11, 2024 at 9:11 PM Yafang Shao <laoar.shao@xxxxxxxxx> wrote: > >>>> Three new kfuncs, namely bpf_iter_bits_{new,next,destroy}, have been > >>>> added for the new bpf_iter_bits functionality. These kfuncs enable the > >>>> iteration of the bits from a given address and a given number of bits. > >>>> > >>>> - bpf_iter_bits_new > >>>> Initialize a new bits iterator for a given memory area. Due to the > >>>> limitation of bpf memalloc, the max number of bits to be iterated > >>>> over is (4096 * 8). > >>>> - bpf_iter_bits_next > >>>> Get the next bit in a bpf_iter_bits > >>>> - bpf_iter_bits_destroy > >>>> Destroy a bpf_iter_bits > >>>> > >>>> The bits iterator can be used in any context and on any address. > >>>> > >>>> Changes: > >>>> - v5->v6: > >>>> - Add positive tests (Andrii) > >>>> - v4->v5: > >>>> - Simplify test cases (Andrii) > >>>> - v3->v4: > >>>> - Fix endianness error on s390x (Andrii) > >>>> - zero-initialize kit->bits_copy and zero out nr_bits (Andrii) > >>>> - v2->v3: > >>>> - Optimization for u64/u32 mask (Andrii) > >>>> - v1->v2: > >>>> - Simplify the CPU number verification code to avoid the failure on s390x > >>>> (Eduard) > >>>> - bpf: Add bpf_iter_cpumask > >>>> https://lwn.net/Articles/961104/ > >>>> - bpf: Add new bpf helper bpf_for_each_cpu > >>>> https://lwn.net/Articles/939939/ > >>>> > >>>> Yafang Shao (2): > >>>> bpf: Add bits iterator > >>>> selftests/bpf: Add selftest for bits iter > >>>> > >>>> kernel/bpf/helpers.c | 120 +++++++++++++++++ > >>>> .../selftests/bpf/prog_tests/verifier.c | 2 + > >>>> .../selftests/bpf/progs/verifier_bits_iter.c | 127 ++++++++++++++++++ > >>>> 3 files changed, 249 insertions(+) > >>>> create mode 100644 tools/testing/selftests/bpf/progs/verifier_bits_iter.c > >>>> > >>>> -- > >>>> 2.39.1 > >>>> > >>> It appears that the test case failed on s390x when the data is > >>> a u32 value because we need to set the higher 32 bits. > >>> will analyze it. > >>> > >> Hey Yafang, did you get a chance to debug and fix the issue? > >> > > Hi Andrii, > > > > Apologies for the delay; I recently returned from an extended holiday. > > > > The issue stems from the limitations of bpf_probe_read_kernel() on > > s390 architecture. The attachment provides a straightforward example > > to illustrate this issue. The observed results are as follows: > > > > Error: #463/1 verifier_probe_read/probe read 4 bytes > > 8897 run_subtest:PASS:obj_open_mem 0 nsec > > 8898 run_subtest:PASS:unexpected_load_failure 0 nsec > > 8899 do_prog_test_run:PASS:bpf_prog_test_run 0 nsec > > 8900 run_subtest:FAIL:659 Unexpected retval: 2817064 != 512 > > > > Error: #463/2 verifier_probe_read/probe read 8 bytes > > 8903 run_subtest:PASS:obj_open_mem 0 nsec > > 8904 run_subtest:PASS:unexpected_load_failure 0 nsec > > 8905 do_prog_test_run:PASS:bpf_prog_test_run 0 nsec > > 8906 run_subtest:FAIL:659 Unexpected retval: 0 != 512 > > > > More details can be found at: https://github.com/kernel-patches/bpf/pull/6872 > > > > Should we consider this behavior of bpf_probe_read_kernel() as > > expected, or is it something that requires fixing? > > Maybe to guard the result with macros like __s390x__ to differentiate > s390 vs. arm64/x86_64? There are some examples in prog_tests/* having > such guards. probe_user.c:#if defined(__s390x__) > test_bpf_syscall_macro.c:#if defined(__aarch64__) || defined(__s390__) > xdp_adjust_tail.c:#if defined(__s390x__) xdp_do_redirect.c:#if > defined(__s390x__) > That's feasible. Thank you for your suggestion. I'll make the necessary changes. -- Regards Yafang