Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Feb 2018 23:34:18 +0000 (15:34 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Feb 2018 23:34:18 +0000 (15:34 -0800)
Pull networking fixes from David Miller:

 1) Make allocations less aggressive in x_tables, from Minchal Hocko.

 2) Fix netfilter flowtable Kconfig deps, from Pablo Neira Ayuso.

 3) Fix connection loss problems in rtlwifi, from Larry Finger.

 4) Correct DRAM dump length for some chips in ath10k driver, from Yu
    Wang.

 5) Fix ABORT handling in rxrpc, from David Howells.

 6) Add SPDX tags to Sun networking drivers, from Shannon Nelson.

 7) Some ipv6 onlink handling fixes, from David Ahern.

 8) Netem packet scheduler interval calcualtion fix from Md. Islam.

 9) Don't put crypto buffers on-stack in rxrpc, from David Howells.

10) Fix handling of error non-delivery status in netlink multicast
    delivery over multiple namespaces, from Nicolas Dichtel.

11) Missing xdp flush in tuntap driver, from Jason Wang.

12) Synchonize RDS protocol netns/module teardown with rds object
    management, from Sowini Varadhan.

13) Add nospec annotations to mpls, from Dan Williams.

14) Fix SKB truesize handling in TIPC, from Hoang Le.

15) Interrupt masking fixes in stammc from Niklas Cassel.

16) Don't allow ptr_ring objects to be sized outside of kmalloc's
    limits, from Jason Wang.

17) Don't allow SCTP chunks to be built which will have a length
    exceeding the chunk header's 16-bit length field, from Alexey
    Kodanev.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (82 commits)
  ibmvnic: Remove skb->protocol checks in ibmvnic_xmit
  bpf: fix rlimit in reuseport net selftest
  sctp: verify size of a new chunk in _sctp_make_chunk()
  s390/qeth: fix SETIP command handling
  s390/qeth: fix underestimated count of buffer elements
  ptr_ring: try vmalloc() when kmalloc() fails
  ptr_ring: fail early if queue occupies more than KMALLOC_MAX_SIZE
  net: stmmac: remove redundant enable of PMT irq
  net: stmmac: rename GMAC_INT_DEFAULT_MASK for dwmac4
  net: stmmac: discard disabled flags in interrupt status register
  ibmvnic: Reset long term map ID counter
  tools/libbpf: handle issues with bpf ELF objects containing .eh_frames
  selftests/bpf: add selftest that use test_libbpf_open
  selftests/bpf: add test program for loading BPF ELF files
  tools/libbpf: improve the pr_debug statements to contain section numbers
  bpf: Sync kernel ABI header with tooling header for bpf_common.h
  net: phy: fix phy_start to consider PHY_IGNORE_INTERRUPT
  net: thunder: change q_len's type to handle max ring size
  tipc: fix skb truesize/datasize ratio control
  net/sched: cls_u32: fix cls_u32 on filter replace
  ...

1  2 
net/sched/cls_u32.c

diff --combined net/sched/cls_u32.c
index c07e8abc3d527b7210476129ccf5023914fc4fcf,c75e68e839c7e4e5ecdadeb67f53fbe8e5304f8c..6c7601a530e35489d38de939264a854209399676
@@@ -316,13 -316,19 +316,13 @@@ static void *u32_get(struct tcf_proto *
        return u32_lookup_key(ht, handle);
  }
  
 +/* Protected by rtnl lock */
  static u32 gen_new_htid(struct tc_u_common *tp_c, struct tc_u_hnode *ptr)
  {
 -      unsigned long idr_index;
 -      int err;
 -
 -      /* This is only used inside rtnl lock it is safe to increment
 -       * without read _copy_ update semantics
 -       */
 -      err = idr_alloc_ext(&tp_c->handle_idr, ptr, &idr_index,
 -                          1, 0x7FF, GFP_KERNEL);
 -      if (err)
 +      int id = idr_alloc_cyclic(&tp_c->handle_idr, ptr, 1, 0x7FF, GFP_KERNEL);
 +      if (id < 0)
                return 0;
 -      return (u32)(idr_index | 0x800) << 20;
 +      return (id | 0x800U) << 20;
  }
  
  static struct hlist_head *tc_u_common_hash;
@@@ -592,7 -598,7 +592,7 @@@ static void u32_clear_hnode(struct tcf_
                                         rtnl_dereference(n->next));
                        tcf_unbind_filter(tp, &n->res);
                        u32_remove_hw_knode(tp, n, extack);
 -                      idr_remove_ext(&ht->handle_idr, n->handle);
 +                      idr_remove(&ht->handle_idr, n->handle);
                        if (tcf_exts_get_net(&n->exts))
                                call_rcu(&n->rcu, u32_delete_key_freepf_rcu);
                        else
@@@ -619,7 -625,7 +619,7 @@@ static int u32_destroy_hnode(struct tcf
                if (phn == ht) {
                        u32_clear_hw_hnode(tp, ht, extack);
                        idr_destroy(&ht->handle_idr);
 -                      idr_remove_ext(&tp_c->handle_idr, ht->handle);
 +                      idr_remove(&tp_c->handle_idr, ht->handle);
                        RCU_INIT_POINTER(*hn, ht->next);
                        kfree_rcu(ht, rcu);
                        return 0;
@@@ -741,17 -747,19 +741,17 @@@ ret
  
  static u32 gen_new_kid(struct tc_u_hnode *ht, u32 htid)
  {
 -      unsigned long idr_index;
 -      u32 start = htid | 0x800;
 +      u32 index = htid | 0x800;
        u32 max = htid | 0xFFF;
 -      u32 min = htid;
  
 -      if (idr_alloc_ext(&ht->handle_idr, NULL, &idr_index,
 -                        start, max + 1, GFP_KERNEL)) {
 -              if (idr_alloc_ext(&ht->handle_idr, NULL, &idr_index,
 -                                min + 1, max + 1, GFP_KERNEL))
 -                      return max;
 +      if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max, GFP_KERNEL)) {
 +              index = htid + 1;
 +              if (idr_alloc_u32(&ht->handle_idr, NULL, &index, max,
 +                               GFP_KERNEL))
 +                      index = max;
        }
  
 -      return (u32)idr_index;
 +      return index;
  }
  
  static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = {
@@@ -841,7 -849,7 +841,7 @@@ static void u32_replace_knode(struct tc
                if (pins->handle == n->handle)
                        break;
  
 -      idr_replace_ext(&ht->handle_idr, n, n->handle);
 +      idr_replace(&ht->handle_idr, n, n->handle);
        RCU_INIT_POINTER(n->next, pins->next);
        rcu_assign_pointer(*ins, n);
  }
@@@ -947,7 -955,8 +947,8 @@@ static int u32_change(struct net *net, 
                        return -EINVAL;
                }
  
-               if (n->flags != flags) {
+               if ((n->flags ^ flags) &
+                   ~(TCA_CLS_FLAGS_IN_HW | TCA_CLS_FLAGS_NOT_IN_HW)) {
                        NL_SET_ERR_MSG_MOD(extack, "Key node flags do not match passed flags");
                        return -EINVAL;
                }
                                return -ENOMEM;
                        }
                } else {
 -                      err = idr_alloc_ext(&tp_c->handle_idr, ht, NULL,
 -                                          handle, handle + 1, GFP_KERNEL);
 +                      err = idr_alloc_u32(&tp_c->handle_idr, ht, &handle,
 +                                          handle, GFP_KERNEL);
                        if (err) {
                                kfree(ht);
                                return err;
  
                err = u32_replace_hw_hnode(tp, ht, flags, extack);
                if (err) {
 -                      idr_remove_ext(&tp_c->handle_idr, handle);
 +                      idr_remove(&tp_c->handle_idr, handle);
                        kfree(ht);
                        return err;
                }
                        return -EINVAL;
                }
                handle = htid | TC_U32_NODE(handle);
 -              err = idr_alloc_ext(&ht->handle_idr, NULL, NULL,
 -                                  handle, handle + 1,
 +              err = idr_alloc_u32(&ht->handle_idr, NULL, &handle, handle,
                                    GFP_KERNEL);
                if (err)
                        return err;
@@@ -1154,7 -1164,7 +1155,7 @@@ errfree
  #endif
        kfree(n);
  erridr:
 -      idr_remove_ext(&ht->handle_idr, handle);
 +      idr_remove(&ht->handle_idr, handle);
        return err;
  }