Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Fri, 12 Jan 2018 02:27:54 +0000 (21:27 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Jan 2018 03:13:42 +0000 (22:13 -0500)
BPF alignment tests got a conflict because the registers
are output as Rn_w instead of just Rn in net-next, and
in net a fixup for a testcase prohibits logical operations
on pointers before using them.

Also, we should attempt to patch BPF call args if JIT always on is
enabled.  Instead, if we fail to JIT the subprogs we should pass
an error back up and fail immediately.

Signed-off-by: David S. Miller <davem@davemloft.net>
14 files changed:
1  2 
drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/wireless/ath/wcn36xx/main.c
drivers/of/of_mdio.c
include/linux/bpf.h
kernel/bpf/core.c
kernel/bpf/sockmap.c
kernel/bpf/verifier.c
net/core/filter.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_output.c
net/sctp/socket.c
net/socket.c
tools/testing/selftests/bpf/test_align.c

Simple merge
Simple merge
@@@ -1358,25 -1317,15 +1359,33 @@@ EVAL6(PROG_NAME_LIST, 32, 64, 96, 128, 
  EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384)
  EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
  };
 +#undef PROG_NAME_LIST
 +#define PROG_NAME_LIST(stack_size) PROG_NAME_ARGS(stack_size),
 +static u64 (*interpreters_args[])(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5,
 +                                const struct bpf_insn *insn) = {
 +EVAL6(PROG_NAME_LIST, 32, 64, 96, 128, 160, 192)
 +EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384)
 +EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
 +};
 +#undef PROG_NAME_LIST
 +
 +void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
 +{
 +      stack_depth = max_t(u32, stack_depth, 1);
 +      insn->off = (s16) insn->imm;
 +      insn->imm = interpreters_args[(round_up(stack_depth, 32) / 32) - 1] -
 +              __bpf_call_base_args;
 +      insn->code = BPF_JMP | BPF_CALL_ARGS;
 +}
  
+ #else
+ static unsigned int __bpf_prog_ret0(const void *ctx,
+                                   const struct bpf_insn *insn)
+ {
+       return 0;
+ }
+ #endif
  bool bpf_prog_array_compatible(struct bpf_array *array,
                               const struct bpf_prog *fp)
  {
Simple merge
@@@ -1443,101 -1072,6 +1443,103 @@@ static int check_ptr_alignment(struct b
                                           strict);
  }
  
 +static int update_stack_depth(struct bpf_verifier_env *env,
 +                            const struct bpf_func_state *func,
 +                            int off)
 +{
 +      u16 stack = env->subprog_stack_depth[func->subprogno];
 +
 +      if (stack >= -off)
 +              return 0;
 +
 +      /* update known max for given subprogram */
 +      env->subprog_stack_depth[func->subprogno] = -off;
 +      return 0;
 +}
 +
 +/* starting from main bpf function walk all instructions of the function
 + * and recursively walk all callees that given function can call.
 + * Ignore jump and exit insns.
 + * Since recursion is prevented by check_cfg() this algorithm
 + * only needs a local stack of MAX_CALL_FRAMES to remember callsites
 + */
 +static int check_max_stack_depth(struct bpf_verifier_env *env)
 +{
 +      int depth = 0, frame = 0, subprog = 0, i = 0, subprog_end;
 +      struct bpf_insn *insn = env->prog->insnsi;
 +      int insn_cnt = env->prog->len;
 +      int ret_insn[MAX_CALL_FRAMES];
 +      int ret_prog[MAX_CALL_FRAMES];
 +
 +process_func:
 +      /* round up to 32-bytes, since this is granularity
 +       * of interpreter stack size
 +       */
 +      depth += round_up(max_t(u32, env->subprog_stack_depth[subprog], 1), 32);
 +      if (depth > MAX_BPF_STACK) {
 +              verbose(env, "combined stack size of %d calls is %d. Too large\n",
 +                      frame + 1, depth);
 +              return -EACCES;
 +      }
 +continue_func:
 +      if (env->subprog_cnt == subprog)
 +              subprog_end = insn_cnt;
 +      else
 +              subprog_end = env->subprog_starts[subprog];
 +      for (; i < subprog_end; i++) {
 +              if (insn[i].code != (BPF_JMP | BPF_CALL))
 +                      continue;
 +              if (insn[i].src_reg != BPF_PSEUDO_CALL)
 +                      continue;
 +              /* remember insn and function to return to */
 +              ret_insn[frame] = i + 1;
 +              ret_prog[frame] = subprog;
 +
 +              /* find the callee */
 +              i = i + insn[i].imm + 1;
 +              subprog = find_subprog(env, i);
 +              if (subprog < 0) {
 +                      WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
 +                                i);
 +                      return -EFAULT;
 +              }
 +              subprog++;
 +              frame++;
 +              if (frame >= MAX_CALL_FRAMES) {
 +                      WARN_ONCE(1, "verifier bug. Call stack is too deep\n");
 +                      return -EFAULT;
 +              }
 +              goto process_func;
 +      }
 +      /* end of for() loop means the last insn of the 'subprog'
 +       * was reached. Doesn't matter whether it was JA or EXIT
 +       */
 +      if (frame == 0)
 +              return 0;
 +      depth -= round_up(max_t(u32, env->subprog_stack_depth[subprog], 1), 32);
 +      frame--;
 +      i = ret_insn[frame];
 +      subprog = ret_prog[frame];
 +      goto continue_func;
 +}
 +
++#ifndef CONFIG_BPF_JIT_ALWAYS_ON
 +static int get_callee_stack_depth(struct bpf_verifier_env *env,
 +                                const struct bpf_insn *insn, int idx)
 +{
 +      int start = idx + insn->imm + 1, subprog;
 +
 +      subprog = find_subprog(env, start);
 +      if (subprog < 0) {
 +              WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
 +                        start);
 +              return -EFAULT;
 +      }
 +      subprog++;
 +      return env->subprog_stack_depth[subprog];
 +}
++#endif
 +
  /* truncate register to smaller size (in bytes)
   * must be called with size < BPF_REG_SIZE
   */
@@@ -5118,172 -4423,6 +5127,180 @@@ static int convert_ctx_accesses(struct 
        return 0;
  }
  
-       if (env->prog->jit_requested)
-               if (jit_subprogs(env) == 0)
 +static int jit_subprogs(struct bpf_verifier_env *env)
 +{
 +      struct bpf_prog *prog = env->prog, **func, *tmp;
 +      int i, j, subprog_start, subprog_end = 0, len, subprog;
 +      struct bpf_insn *insn;
 +      void *old_bpf_func;
 +      int err = -ENOMEM;
 +
 +      if (env->subprog_cnt == 0)
 +              return 0;
 +
 +      for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
 +              if (insn->code != (BPF_JMP | BPF_CALL) ||
 +                  insn->src_reg != BPF_PSEUDO_CALL)
 +                      continue;
 +              subprog = find_subprog(env, i + insn->imm + 1);
 +              if (subprog < 0) {
 +                      WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
 +                                i + insn->imm + 1);
 +                      return -EFAULT;
 +              }
 +              /* temporarily remember subprog id inside insn instead of
 +               * aux_data, since next loop will split up all insns into funcs
 +               */
 +              insn->off = subprog + 1;
 +              /* remember original imm in case JIT fails and fallback
 +               * to interpreter will be needed
 +               */
 +              env->insn_aux_data[i].call_imm = insn->imm;
 +              /* point imm to __bpf_call_base+1 from JITs point of view */
 +              insn->imm = 1;
 +      }
 +
 +      func = kzalloc(sizeof(prog) * (env->subprog_cnt + 1), GFP_KERNEL);
 +      if (!func)
 +              return -ENOMEM;
 +
 +      for (i = 0; i <= env->subprog_cnt; i++) {
 +              subprog_start = subprog_end;
 +              if (env->subprog_cnt == i)
 +                      subprog_end = prog->len;
 +              else
 +                      subprog_end = env->subprog_starts[i];
 +
 +              len = subprog_end - subprog_start;
 +              func[i] = bpf_prog_alloc(bpf_prog_size(len), GFP_USER);
 +              if (!func[i])
 +                      goto out_free;
 +              memcpy(func[i]->insnsi, &prog->insnsi[subprog_start],
 +                     len * sizeof(struct bpf_insn));
 +              func[i]->type = prog->type;
 +              func[i]->len = len;
 +              if (bpf_prog_calc_tag(func[i]))
 +                      goto out_free;
 +              func[i]->is_func = 1;
 +              /* Use bpf_prog_F_tag to indicate functions in stack traces.
 +               * Long term would need debug info to populate names
 +               */
 +              func[i]->aux->name[0] = 'F';
 +              func[i]->aux->stack_depth = env->subprog_stack_depth[i];
 +              func[i]->jit_requested = 1;
 +              func[i] = bpf_int_jit_compile(func[i]);
 +              if (!func[i]->jited) {
 +                      err = -ENOTSUPP;
 +                      goto out_free;
 +              }
 +              cond_resched();
 +      }
 +      /* at this point all bpf functions were successfully JITed
 +       * now populate all bpf_calls with correct addresses and
 +       * run last pass of JIT
 +       */
 +      for (i = 0; i <= env->subprog_cnt; i++) {
 +              insn = func[i]->insnsi;
 +              for (j = 0; j < func[i]->len; j++, insn++) {
 +                      if (insn->code != (BPF_JMP | BPF_CALL) ||
 +                          insn->src_reg != BPF_PSEUDO_CALL)
 +                              continue;
 +                      subprog = insn->off;
 +                      insn->off = 0;
 +                      insn->imm = (u64 (*)(u64, u64, u64, u64, u64))
 +                              func[subprog]->bpf_func -
 +                              __bpf_call_base;
 +              }
 +      }
 +      for (i = 0; i <= env->subprog_cnt; i++) {
 +              old_bpf_func = func[i]->bpf_func;
 +              tmp = bpf_int_jit_compile(func[i]);
 +              if (tmp != func[i] || func[i]->bpf_func != old_bpf_func) {
 +                      verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
 +                      err = -EFAULT;
 +                      goto out_free;
 +              }
 +              cond_resched();
 +      }
 +
 +      /* finally lock prog and jit images for all functions and
 +       * populate kallsysm
 +       */
 +      for (i = 0; i <= env->subprog_cnt; i++) {
 +              bpf_prog_lock_ro(func[i]);
 +              bpf_prog_kallsyms_add(func[i]);
 +      }
 +
 +      /* Last step: make now unused interpreter insns from main
 +       * prog consistent for later dump requests, so they can
 +       * later look the same as if they were interpreted only.
 +       */
 +      for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
 +              unsigned long addr;
 +
 +              if (insn->code != (BPF_JMP | BPF_CALL) ||
 +                  insn->src_reg != BPF_PSEUDO_CALL)
 +                      continue;
 +              insn->off = env->insn_aux_data[i].call_imm;
 +              subprog = find_subprog(env, i + insn->off + 1);
 +              addr  = (unsigned long)func[subprog + 1]->bpf_func;
 +              addr &= PAGE_MASK;
 +              insn->imm = (u64 (*)(u64, u64, u64, u64, u64))
 +                          addr - __bpf_call_base;
 +      }
 +
 +      prog->jited = 1;
 +      prog->bpf_func = func[0]->bpf_func;
 +      prog->aux->func = func;
 +      prog->aux->func_cnt = env->subprog_cnt + 1;
 +      return 0;
 +out_free:
 +      for (i = 0; i <= env->subprog_cnt; i++)
 +              if (func[i])
 +                      bpf_jit_free(func[i]);
 +      kfree(func);
 +      /* cleanup main prog to be interpreted */
 +      prog->jit_requested = 0;
 +      for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
 +              if (insn->code != (BPF_JMP | BPF_CALL) ||
 +                  insn->src_reg != BPF_PSEUDO_CALL)
 +                      continue;
 +              insn->off = 0;
 +              insn->imm = env->insn_aux_data[i].call_imm;
 +      }
 +      return err;
 +}
 +
 +static int fixup_call_args(struct bpf_verifier_env *env)
 +{
++#ifndef CONFIG_BPF_JIT_ALWAYS_ON
 +      struct bpf_prog *prog = env->prog;
 +      struct bpf_insn *insn = prog->insnsi;
 +      int i, depth;
++#endif
++      int err;
 +
++      err = 0;
++      if (env->prog->jit_requested) {
++              err = jit_subprogs(env);
++              if (err == 0)
 +                      return 0;
-       return 0;
++      }
++#ifndef CONFIG_BPF_JIT_ALWAYS_ON
 +      for (i = 0; i < prog->len; i++, insn++) {
 +              if (insn->code != (BPF_JMP | BPF_CALL) ||
 +                  insn->src_reg != BPF_PSEUDO_CALL)
 +                      continue;
 +              depth = get_callee_stack_depth(env, insn, i);
 +              if (depth < 0)
 +                      return depth;
 +              bpf_patch_call_args(insn, depth);
 +      }
++      err = 0;
++#endif
++      return err;
 +}
 +
  /* fixup insn->imm field of bpf_call instructions
   * and inline eligible helpers as explicit sequence of BPF instructions
   *
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/socket.c
Simple merge
@@@ -473,28 -473,8 +473,8 @@@ static struct bpf_align_test tests[] = 
                .prog_type = BPF_PROG_TYPE_SCHED_CLS,
                .result = REJECT,
                .matches = {
 -                      {4, "R5=pkt(id=0,off=0,r=0,imm=0)"},
 +                      {4, "R5_w=pkt(id=0,off=0,r=0,imm=0)"},
-                       /* ptr & 0x40 == either 0 or 0x40 */
-                       {5, "R5_w=inv(id=0,umax_value=64,var_off=(0x0; 0x40))"},
-                       /* ptr << 2 == unknown, (4n) */
-                       {7, "R5_w=inv(id=0,smax_value=9223372036854775804,umax_value=18446744073709551612,var_off=(0x0; 0xfffffffffffffffc))"},
-                       /* (4n) + 14 == (4n+2).  We blow our bounds, because
-                        * the add could overflow.
-                        */
-                       {8, "R5=inv(id=0,var_off=(0x2; 0xfffffffffffffffc))"},
-                       /* Checked s>=0 */
-                       {10, "R5=inv(id=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc))"},
-                       /* packet pointer + nonnegative (4n+2) */
-                       {12, "R6_w=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc))"},
-                       {14, "R4=pkt(id=1,off=4,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc))"},
-                       /* NET_IP_ALIGN + (4n+2) == (4n), alignment is fine.
-                        * We checked the bounds, but it might have been able
-                        * to overflow if the packet pointer started in the
-                        * upper half of the address space.
-                        * So we did not get a 'range' on R6, and the access
-                        * attempt will fail.
-                        */
-                       {16, "R6=pkt(id=1,off=0,r=0,umin_value=2,umax_value=9223372036854775806,var_off=(0x2; 0x7ffffffffffffffc))"},
+                       /* R5 bitwise operator &= on pointer prohibited */
                }
        },
        {