This patch migrate dead code remove pass to new list patching infrastructure. Signed-off-by: Jiong Wang <jiong.wang@xxxxxxxxxxxxx> --- kernel/bpf/verifier.c | 59 +++++++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 40 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 58d6bbe..abe11fd 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -8500,49 +8500,30 @@ verifier_linearize_list_insn(struct bpf_verifier_env *env, return ret_env; } -static int opt_remove_dead_code(struct bpf_verifier_env *env) +static int opt_remove_useless_code(struct bpf_verifier_env *env) { - struct bpf_insn_aux_data *aux_data = env->insn_aux_data; - int insn_cnt = env->prog->len; - int i, err; - - for (i = 0; i < insn_cnt; i++) { - int j; - - j = 0; - while (i + j < insn_cnt && !aux_data[i + j].seen) - j++; - if (!j) - continue; - - err = verifier_remove_insns(env, i, j); - if (err) - return err; - insn_cnt = env->prog->len; - } - - return 0; -} - -static int opt_remove_nops(struct bpf_verifier_env *env) -{ - const struct bpf_insn ja = BPF_JMP_IMM(BPF_JA, 0, 0, 0); - struct bpf_insn *insn = env->prog->insnsi; - int insn_cnt = env->prog->len; - int i, err; + struct bpf_insn_aux_data *auxs = env->insn_aux_data; + const struct bpf_insn nop = + BPF_JMP_IMM(BPF_JA, 0, 0, 0); + struct bpf_list_insn *list, *elem; + int ret = 0; - for (i = 0; i < insn_cnt; i++) { - if (memcmp(&insn[i], &ja, sizeof(ja))) + list = bpf_create_list_insn(env->prog); + if (IS_ERR(list)) + return PTR_ERR(list); + for (elem = list; elem; elem = elem->next) { + if (auxs[elem->orig_idx - 1].seen && + memcmp(&elem->insn, &nop, sizeof(nop))) continue; - err = verifier_remove_insns(env, i, 1); - if (err) - return err; - insn_cnt--; - i--; + elem->flag |= LIST_INSN_FLAG_REMOVED; } - return 0; + env = verifier_linearize_list_insn(env, list); + if (IS_ERR(env)) + ret = PTR_ERR(env); + bpf_destroy_list_insn(list); + return ret; } static int opt_subreg_zext_lo32_rnd_hi32(struct bpf_verifier_env *env, @@ -9488,9 +9469,7 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, if (ret == 0) opt_hard_wire_dead_code_branches(env); if (ret == 0) - ret = opt_remove_dead_code(env); - if (ret == 0) - ret = opt_remove_nops(env); + ret = opt_remove_useless_code(env); } else { if (ret == 0) sanitize_dead_code(env); -- 2.7.4