OSDN Git Service

bpf: refactor "check_reg_arg" to eliminate code redundancy
authorJiong Wang <jiong.wang@netronome.com>
Fri, 12 Apr 2019 21:59:37 +0000 (22:59 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 13 Apr 2019 00:06:33 +0000 (17:06 -0700)
There are a few "regs[regno]" here are there across "check_reg_arg", this
patch factor it out into a simple "reg" pointer. The intention is to
simplify code indentation and make the later patches in this set look
cleaner.

Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 3fdb301..c722015 100644 (file)
@@ -1177,30 +1177,32 @@ static int check_reg_arg(struct bpf_verifier_env *env, u32 regno,
 {
        struct bpf_verifier_state *vstate = env->cur_state;
        struct bpf_func_state *state = vstate->frame[vstate->curframe];
-       struct bpf_reg_state *regs = state->regs;
+       struct bpf_reg_state *reg, *regs = state->regs;
 
        if (regno >= MAX_BPF_REG) {
                verbose(env, "R%d is invalid\n", regno);
                return -EINVAL;
        }
 
+       reg = &regs[regno];
        if (t == SRC_OP) {
                /* check whether register used as source operand can be read */
-               if (regs[regno].type == NOT_INIT) {
+               if (reg->type == NOT_INIT) {
                        verbose(env, "R%d !read_ok\n", regno);
                        return -EACCES;
                }
                /* We don't need to worry about FP liveness because it's read-only */
-               if (regno != BPF_REG_FP)
-                       return mark_reg_read(env, &regs[regno],
-                                            regs[regno].parent);
+               if (regno == BPF_REG_FP)
+                       return 0;
+
+               return mark_reg_read(env, reg, reg->parent);
        } else {
                /* check whether register used as dest operand can be written to */
                if (regno == BPF_REG_FP) {
                        verbose(env, "frame pointer is read only\n");
                        return -EACCES;
                }
-               regs[regno].live |= REG_LIVE_WRITTEN;
+               reg->live |= REG_LIVE_WRITTEN;
                if (t == DST_OP)
                        mark_reg_unknown(env, regs, regno);
        }