• Hengqi Chen's avatar
    LoongArch: BPF: Support 64-bit pointers to kfuncs · 21c5ae5c
    Hengqi Chen authored
    Like commit 1cf3bfc6 ("bpf: Support 64-bit pointers to kfuncs")
    for s390x, add support for 64-bit pointers to kfuncs for LoongArch.
    Since the infrastructure is already implemented in BPF core, the only
    thing need to be done is to override bpf_jit_supports_far_kfunc_call().
    
    Before this change, several test_verifier tests failed:
    
      # ./test_verifier | grep # | grep FAIL
      #119/p calls: invalid kfunc call: ptr_to_mem to struct with non-scalar FAIL
      #120/p calls: invalid kfunc call: ptr_to_mem to struct with nesting depth > 4 FAIL
      #121/p calls: invalid kfunc call: ptr_to_mem to struct with FAM FAIL
      #122/p calls: invalid kfunc call: reg->type != PTR_TO_CTX FAIL
      #123/p calls: invalid kfunc call: void * not allowed in func proto without mem size arg FAIL
      #124/p calls: trigger reg2btf_ids[reg->type] for reg->type > __BPF_REG_TYPE_MAX FAIL
      #125/p calls: invalid kfunc call: reg->off must be zero when passed to release kfunc FAIL
      #126/p calls: invalid kfunc call: don't match first member type when passed to release kfunc FAIL
      #127/p calls: invalid kfunc call: PTR_TO_BTF_ID with negative offset FAIL
      #128/p calls: invalid kfunc call: PTR_TO_BTF_ID with variable offset FAIL
      #129/p calls: invalid kfunc call: referenced arg needs refcounted PTR_TO_BTF_ID FAIL
      #130/p calls: valid kfunc call: referenced arg needs refcounted PTR_TO_BTF_ID FAIL
      #486/p map_kptr: ref: reference state created and released on xchg FAIL
    
    This is because the kfuncs in the loaded module are far away from
    __bpf_call_base:
    
      ffff800002009440 t bpf_kfunc_call_test_fail1    [bpf_testmod]
      9000000002e128d8 T __bpf_call_base
    
    The offset relative to __bpf_call_base does NOT fit in s32, which breaks
    the assumption in BPF core. Enable bpf_jit_supports_far_kfunc_call() lifts
    this limit.
    
    Note that to reproduce the above result, tools/testing/selftests/bpf/config
    should be applied, and run the test with JIT enabled, unpriv BPF enabled.
    
    With this change, the test_verifier tests now all passed:
    
      # ./test_verifier
      ...
      Summary: 777 PASSED, 0 SKIPPED, 0 FAILED
    Tested-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: default avatarHengqi Chen <hengqi.chen@gmail.com>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    21c5ae5c
bpf_jit.c 33.5 KB