]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Sat, 20 Jan 2018 03:59:33 +0000 (22:59 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sat, 20 Jan 2018 03:59:33 +0000 (22:59 -0500)
The BPF verifier conflict was some minor contextual issue.

The TUN conflict was less trivial.  Cong Wang fixed a memory leak of
tfile->tx_array in 'net'.  This is an skb_array.  But meanwhile in
net-next tun changed tfile->tx_arry into tfile->tx_ring which is a
ptr_ring.

Signed-off-by: David S. Miller <davem@davemloft.net>
18 files changed:
1  2 
arch/arm/net/bpf_jit_32.c
arch/arm64/net/bpf_jit_comp.c
drivers/net/can/usb/peak_usb/pcan_usb_fd.c
drivers/net/ethernet/ibm/ibmvnic.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/tun.c
drivers/ssb/Kconfig
kernel/bpf/core.c
kernel/bpf/verifier.c
net/can/af_can.c
net/core/filter.c
net/core/flow_dissector.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_gre.c
net/netlink/af_netlink.c
net/sched/cls_bpf.c
net/wireless/nl80211.c
tools/testing/selftests/bpf/test_verifier.c

Simple merge
Simple merge
Simple merge
index 170a3e89b5af6ac87ac57dff0003d7fad2dbfefb,a8ec589d1359a86614e9ed829b91fd145494cd00..698874684b4e51801e4531f581ccff3ed46bef5a
@@@ -679,6 -611,14 +679,15 @@@ static void tun_queue_purge(struct tun_
        skb_queue_purge(&tfile->sk.sk_error_queue);
  }
  
 -static void tun_cleanup_tx_array(struct tun_file *tfile)
++static void tun_cleanup_tx_ring(struct tun_file *tfile)
+ {
 -      if (tfile->tx_array.ring.queue) {
 -              skb_array_cleanup(&tfile->tx_array);
 -              memset(&tfile->tx_array, 0, sizeof(tfile->tx_array));
++      if (tfile->tx_ring.queue) {
++              ptr_ring_cleanup(&tfile->tx_ring, tun_ptr_free);
++              xdp_rxq_info_unreg(&tfile->xdp_rxq);
++              memset(&tfile->tx_ring, 0, sizeof(tfile->tx_ring));
+       }
+ }
  static void __tun_detach(struct tun_file *tfile, bool clean)
  {
        struct tun_file *ntfile;
                            tun->dev->reg_state == NETREG_REGISTERED)
                                unregister_netdevice(tun->dev);
                }
-               if (tun) {
-                       ptr_ring_cleanup(&tfile->tx_ring, tun_ptr_free);
-                       xdp_rxq_info_unreg(&tfile->xdp_rxq);
-               }
 -              tun_cleanup_tx_array(tfile);
++              tun_cleanup_tx_ring(tfile);
                sock_put(&tfile->sk);
        }
  }
@@@ -768,14 -706,14 +774,16 @@@ static void tun_detach_all(struct net_d
                tun_napi_del(tun, tfile);
                /* Drop read queue */
                tun_queue_purge(tfile);
 +              xdp_rxq_info_unreg(&tfile->xdp_rxq);
                sock_put(&tfile->sk);
 -              tun_cleanup_tx_array(tfile);
++              tun_cleanup_tx_ring(tfile);
        }
        list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) {
                tun_enable_queue(tfile);
                tun_queue_purge(tfile);
 +              xdp_rxq_info_unreg(&tfile->xdp_rxq);
                sock_put(&tfile->sk);
 -              tun_cleanup_tx_array(tfile);
++              tun_cleanup_tx_ring(tfile);
        }
        BUG_ON(tun->numdisabled != 0);
  
@@@ -3145,6 -2860,8 +3153,8 @@@ static int tun_chr_open(struct inode *i
  
        sock_set_flag(&tfile->sk, SOCK_ZEROCOPY);
  
 -      memset(&tfile->tx_array, 0, sizeof(tfile->tx_array));
++      memset(&tfile->tx_ring, 0, sizeof(tfile->tx_ring));
        return 0;
  }
  
Simple merge
Simple merge
index 2e7a43edf264b8b841969510dfe5e9e4d573ebc5,13551e62350148942949006100a1b66b71b7b8e8..8063dffd91a8a86d708e29d89333b2738c9dd764
@@@ -5330,10 -4469,26 +5354,28 @@@ static int fixup_bpf_calls(struct bpf_v
        int i, cnt, delta = 0;
  
        for (i = 0; i < insn_cnt; i++, insn++) {
+               if (insn->code == (BPF_ALU | BPF_MOD | BPF_X) ||
+                   insn->code == (BPF_ALU | BPF_DIV | BPF_X)) {
+                       /* due to JIT bugs clear upper 32-bits of src register
+                        * before div/mod operation
+                        */
+                       insn_buf[0] = BPF_MOV32_REG(insn->src_reg, insn->src_reg);
+                       insn_buf[1] = *insn;
+                       cnt = 2;
+                       new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
+                       if (!new_prog)
+                               return -ENOMEM;
+                       delta    += cnt - 1;
+                       env->prog = prog = new_prog;
+                       insn      = new_prog->insnsi + i + delta;
+                       continue;
+               }
                if (insn->code != (BPF_JMP | BPF_CALL))
                        continue;
 +              if (insn->src_reg == BPF_PSEUDO_CALL)
 +                      continue;
  
                if (insn->imm == BPF_FUNC_get_route_realm)
                        prog->dst_needed = 1;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge