On Wed, Aug 19, 2020 at 03:40:23PM -0700, Hao Luo wrote:
/* verify BPF_LD_IMM64 instruction */ static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn) { @@ -7234,6 +7296,9 @@ static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn) return 0; }
- if (insn->src_reg == BPF_PSEUDO_BTF_ID)
return check_pseudo_btf_id(env, insn);
- map = env->used_maps[aux->map_index]; mark_reg_known_zero(env, regs, insn->dst_reg); regs[insn->dst_reg].map_ptr = map;
@@ -9255,6 +9320,9 @@ static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) /* valid generic load 64-bit imm */ goto next_insn;
if (insn[0].src_reg == BPF_PSEUDO_BTF_ID)
goto next_insn;
Why did you choose to do it during main do_check() walk instead of this pre-pass ? check_ld_imm() can be called multiple times for the same insn, so it's faster and less surprising to do it during replace_map_fd_with_map_ptr(). BTF needs to be parsed first, of course. You can either move check_btf_info() before replace_map_fd_with_map_ptr() or move replace_map_fd_with_map_ptr() after check_btf_info(). The latter is probably cleaner.