Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 5 Sep 2013 21:54:29 +0000 (14:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 5 Sep 2013 21:54:29 +0000 (14:54 -0700)
Pull networking changes from David Miller:
 "Noteworthy changes this time around:

   1) Multicast rejoin support for team driver, from Jiri Pirko.

   2) Centralize and simplify TCP RTT measurement handling in order to
      reduce the impact of bad RTO seeding from SYN/ACKs.  Also, when
      both timestamps and local RTT measurements are available prefer
      the later because there are broken middleware devices which
      scramble the timestamp.

      From Yuchung Cheng.

   3) Add TCP_NOTSENT_LOWAT socket option to limit the amount of kernel
      memory consumed to queue up unsend user data.  From Eric Dumazet.

   4) Add a "physical port ID" abstraction for network devices, from
      Jiri Pirko.

   5) Add a "suppress" operation to influence fib_rules lookups, from
      Stefan Tomanek.

   6) Add a networking development FAQ, from Paul Gortmaker.

   7) Extend the information provided by tcp_probe and add ipv6 support,
      from Daniel Borkmann.

   8) Use RCU locking more extensively in openvswitch data paths, from
      Pravin B Shelar.

   9) Add SCTP support to openvswitch, from Joe Stringer.

  10) Add EF10 chip support to SFC driver, from Ben Hutchings.

  11) Add new SYNPROXY netfilter target, from Patrick McHardy.

  12) Compute a rate approximation for sending in TCP sockets, and use
      this to more intelligently coalesce TSO frames.  Furthermore, add
      a new packet scheduler which takes advantage of this estimate when
      available.  From Eric Dumazet.

  13) Allow AF_PACKET fanouts with random selection, from Daniel
      Borkmann.

  14) Add ipv6 support to vxlan driver, from Cong Wang"

Resolved conflicts as per discussion.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1218 commits)
  openvswitch: Fix alignment of struct sw_flow_key.
  netfilter: Fix build errors with xt_socket.c
  tcp: Add missing braces to do_tcp_setsockopt
  caif: Add missing braces to multiline if in cfctrl_linkup_request
  bnx2x: Add missing braces in bnx2x:bnx2x_link_initialize
  vxlan: Fix kernel panic on device delete.
  net: mvneta: implement ->ndo_do_ioctl() to support PHY ioctls
  net: mvneta: properly disable HW PHY polling and ensure adjust_link() works
  icplus: Use netif_running to determine device state
  ethernet/arc/arc_emac: Fix huge delays in large file copies
  tuntap: orphan frags before trying to set tx timestamp
  tuntap: purge socket error queue on detach
  qlcnic: use standard NAPI weights
  ipv6:introduce function to find route for redirect
  bnx2x: VF RSS support - VF side
  bnx2x: VF RSS support - PF side
  vxlan: Notify drivers for listening UDP port changes
  net: usbnet: update addr_assign_type if appropriate
  driver/net: enic: update enic maintainers and driver
  driver/net: enic: Exposing symbols for Cisco's low latency driver
  ...

19 files changed:
1  2 
MAINTAINERS
arch/arm/mach-shmobile/board-bockw.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/sun/niu.c
drivers/net/usb/ax88179_178a.c
drivers/net/usb/usbnet.c
drivers/pci/pci.c
drivers/pci/pci.h
drivers/pci/probe.c
drivers/scsi/bnx2i/57xx_iscsi_hsi.h
drivers/scsi/bnx2i/bnx2i_init.c
include/linux/mlx4/device.h
include/linux/pci.h
include/linux/pci_hotplug.h
include/linux/usb/usbnet.h
include/net/cls_cgroup.h
include/net/netprio_cgroup.h
net/core/net-sysfs.c

diff --cc MAINTAINERS
Simple merge
Simple merge
index 038df4b9613988d4fd030760be6a378e9e53555e,5a3256b083f23f7e69d8013c4ca1ac0585ec33c4..79ac77cf62d90665dd05d180570a3a30bb38b717
@@@ -3927,169 -3809,6 +3927,168 @@@ int cxgb4_unregister_uld(enum cxgb4_ul
  }
  EXPORT_SYMBOL(cxgb4_unregister_uld);
  
-       int cnt;
 +/* Check if netdev on which event is occured belongs to us or not. Return
 + * suceess (1) if it belongs otherwise failure (0).
 + */
 +static int cxgb4_netdev(struct net_device *netdev)
 +{
 +      struct adapter *adap;
 +      int i;
 +
 +      spin_lock(&adap_rcu_lock);
 +      list_for_each_entry_rcu(adap, &adap_rcu_list, rcu_node)
 +              for (i = 0; i < MAX_NPORTS; i++)
 +                      if (adap->port[i] == netdev) {
 +                              spin_unlock(&adap_rcu_lock);
 +                              return 1;
 +                      }
 +      spin_unlock(&adap_rcu_lock);
 +      return 0;
 +}
 +
 +static int clip_add(struct net_device *event_dev, struct inet6_ifaddr *ifa,
 +                  unsigned long event)
 +{
 +      int ret = NOTIFY_DONE;
 +
 +      rcu_read_lock();
 +      if (cxgb4_netdev(event_dev)) {
 +              switch (event) {
 +              case NETDEV_UP:
 +                      ret = cxgb4_clip_get(event_dev,
 +                              (const struct in6_addr *)ifa->addr.s6_addr);
 +                      if (ret < 0) {
 +                              rcu_read_unlock();
 +                              return ret;
 +                      }
 +                      ret = NOTIFY_OK;
 +                      break;
 +              case NETDEV_DOWN:
 +                      cxgb4_clip_release(event_dev,
 +                              (const struct in6_addr *)ifa->addr.s6_addr);
 +                      ret = NOTIFY_OK;
 +                      break;
 +              default:
 +                      break;
 +              }
 +      }
 +      rcu_read_unlock();
 +      return ret;
 +}
 +
 +static int cxgb4_inet6addr_handler(struct notifier_block *this,
 +              unsigned long event, void *data)
 +{
 +      struct inet6_ifaddr *ifa = data;
 +      struct net_device *event_dev;
 +      int ret = NOTIFY_DONE;
-               bond_for_each_slave(bond, slave, cnt) {
 +      struct bonding *bond = netdev_priv(ifa->idev->dev);
 +      struct slave *slave;
 +      struct pci_dev *first_pdev = NULL;
 +
 +      if (ifa->idev->dev->priv_flags & IFF_802_1Q_VLAN) {
 +              event_dev = vlan_dev_real_dev(ifa->idev->dev);
 +              ret = clip_add(event_dev, ifa, event);
 +      } else if (ifa->idev->dev->flags & IFF_MASTER) {
 +              /* It is possible that two different adapters are bonded in one
 +               * bond. We need to find such different adapters and add clip
 +               * in all of them only once.
 +               */
 +              read_lock(&bond->lock);
++              bond_for_each_slave(bond, slave) {
 +                      if (!first_pdev) {
 +                              ret = clip_add(slave->dev, ifa, event);
 +                              /* If clip_add is success then only initialize
 +                               * first_pdev since it means it is our device
 +                               */
 +                              if (ret == NOTIFY_OK)
 +                                      first_pdev = to_pci_dev(
 +                                                      slave->dev->dev.parent);
 +                      } else if (first_pdev !=
 +                                 to_pci_dev(slave->dev->dev.parent))
 +                                      ret = clip_add(slave->dev, ifa, event);
 +              }
 +              read_unlock(&bond->lock);
 +      } else
 +              ret = clip_add(ifa->idev->dev, ifa, event);
 +
 +      return ret;
 +}
 +
 +static struct notifier_block cxgb4_inet6addr_notifier = {
 +      .notifier_call = cxgb4_inet6addr_handler
 +};
 +
 +/* Retrieves IPv6 addresses from a root device (bond, vlan) associated with
 + * a physical device.
 + * The physical device reference is needed to send the actul CLIP command.
 + */
 +static int update_dev_clip(struct net_device *root_dev, struct net_device *dev)
 +{
 +      struct inet6_dev *idev = NULL;
 +      struct inet6_ifaddr *ifa;
 +      int ret = 0;
 +
 +      idev = __in6_dev_get(root_dev);
 +      if (!idev)
 +              return ret;
 +
 +      read_lock_bh(&idev->lock);
 +      list_for_each_entry(ifa, &idev->addr_list, if_list) {
 +              ret = cxgb4_clip_get(dev,
 +                              (const struct in6_addr *)ifa->addr.s6_addr);
 +              if (ret < 0)
 +                      break;
 +      }
 +      read_unlock_bh(&idev->lock);
 +
 +      return ret;
 +}
 +
 +static int update_root_dev_clip(struct net_device *dev)
 +{
 +      struct net_device *root_dev = NULL;
 +      int i, ret = 0;
 +
 +      /* First populate the real net device's IPv6 addresses */
 +      ret = update_dev_clip(dev, dev);
 +      if (ret)
 +              return ret;
 +
 +      /* Parse all bond and vlan devices layered on top of the physical dev */
 +      for (i = 0; i < VLAN_N_VID; i++) {
 +              root_dev = __vlan_find_dev_deep(dev, htons(ETH_P_8021Q), i);
 +              if (!root_dev)
 +                      continue;
 +
 +              ret = update_dev_clip(root_dev, dev);
 +              if (ret)
 +                      break;
 +      }
 +      return ret;
 +}
 +
 +static void update_clip(const struct adapter *adap)
 +{
 +      int i;
 +      struct net_device *dev;
 +      int ret;
 +
 +      rcu_read_lock();
 +
 +      for (i = 0; i < MAX_NPORTS; i++) {
 +              dev = adap->port[i];
 +              ret = 0;
 +
 +              if (dev)
 +                      ret = update_root_dev_clip(dev);
 +
 +              if (ret < 0)
 +                      break;
 +      }
 +      rcu_read_unlock();
 +}
 +
  /**
   *    cxgb_up - enable the adapter
   *    @adap: adapter being enabled
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 2b47e6364e3697ff1fbd684b923da5cd6ec65e82,8fbc008e183e33704ddbc0f8cc63c3cd69b5f753..9cb2fe8ca944d5095043dd7b7ce71116a3fc21eb
@@@ -34,7 -34,7 +34,8 @@@ struct usbnet 
        struct mutex            phy_mutex;
        unsigned char           suspend_count;
        unsigned char           pkt_cnt, pkt_err;
+       unsigned short          rx_qlen, tx_qlen;
 +      unsigned                can_dma_sg:1;
  
        /* i/o info: pipes etc */
        unsigned                in, out;
Simple merge
index a24f8bb3ca4763a7c9a6551f9eb5684f59fe6d29,379dd5db0f2f3d08955a2632c90a0d9633732c31..099d02782e22274fb9f7b52abe296cb17d14e45d
@@@ -25,7 -25,11 +25,7 @@@ struct netprio_map 
        u32 priomap[];
  };
  
- extern void sock_update_netprioidx(struct sock *sk);
 -struct cgroup_netprio_state {
 -      struct cgroup_subsys_state css;
 -};
 -
+ void sock_update_netprioidx(struct sock *sk);
  
  #if IS_BUILTIN(CONFIG_NETPRIO_CGROUP)
  
index 707c3134ddf2f6a85ef46356a6a9a806a74b5383,8826b0d1e0cc4f6d9db1ebf7d7c54811432c008d..3f40ea9de8149d9dc56f09b884160ff43a53a3d0
@@@ -344,32 -333,52 +344,55 @@@ static ssize_t group_store(struct devic
  {
        return netdev_store(dev, attr, buf, len, change_group);
  }
 +NETDEVICE_SHOW(group, fmt_dec);
 +static DEVICE_ATTR(netdev_group, S_IRUGO | S_IWUSR, group_show, group_store);
  
 -static ssize_t show_phys_port_id(struct device *dev,
++static ssize_t phys_port_id_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+ {
+       struct net_device *netdev = to_net_dev(dev);
+       ssize_t ret = -EINVAL;
+       if (!rtnl_trylock())
+               return restart_syscall();
+       if (dev_isalive(netdev)) {
+               struct netdev_phys_port_id ppid;
+               ret = dev_get_phys_port_id(netdev, &ppid);
+               if (!ret)
+                       ret = sprintf(buf, "%*phN\n", ppid.id_len, ppid.id);
+       }
+       rtnl_unlock();
+       return ret;
+ }
 -
 -static struct device_attribute net_class_attributes[] = {
 -      __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL),
 -      __ATTR(addr_len, S_IRUGO, show_addr_len, NULL),
 -      __ATTR(dev_id, S_IRUGO, show_dev_id, NULL),
 -      __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias),
 -      __ATTR(iflink, S_IRUGO, show_iflink, NULL),
 -      __ATTR(ifindex, S_IRUGO, show_ifindex, NULL),
 -      __ATTR(type, S_IRUGO, show_type, NULL),
 -      __ATTR(link_mode, S_IRUGO, show_link_mode, NULL),
 -      __ATTR(address, S_IRUGO, show_address, NULL),
 -      __ATTR(broadcast, S_IRUGO, show_broadcast, NULL),
 -      __ATTR(carrier, S_IRUGO | S_IWUSR, show_carrier, store_carrier),
 -      __ATTR(speed, S_IRUGO, show_speed, NULL),
 -      __ATTR(duplex, S_IRUGO, show_duplex, NULL),
 -      __ATTR(dormant, S_IRUGO, show_dormant, NULL),
 -      __ATTR(operstate, S_IRUGO, show_operstate, NULL),
 -      __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu),
 -      __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags),
 -      __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len,
 -             store_tx_queue_len),
 -      __ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group),
 -      __ATTR(phys_port_id, S_IRUGO, show_phys_port_id, NULL),
 -      {}
++static DEVICE_ATTR_RO(phys_port_id);
++
 +static struct attribute *net_class_attrs[] = {
 +      &dev_attr_netdev_group.attr,
 +      &dev_attr_type.attr,
 +      &dev_attr_dev_id.attr,
 +      &dev_attr_iflink.attr,
 +      &dev_attr_ifindex.attr,
 +      &dev_attr_addr_assign_type.attr,
 +      &dev_attr_addr_len.attr,
 +      &dev_attr_link_mode.attr,
 +      &dev_attr_address.attr,
 +      &dev_attr_broadcast.attr,
 +      &dev_attr_speed.attr,
 +      &dev_attr_duplex.attr,
 +      &dev_attr_dormant.attr,
 +      &dev_attr_operstate.attr,
 +      &dev_attr_ifalias.attr,
 +      &dev_attr_carrier.attr,
 +      &dev_attr_mtu.attr,
 +      &dev_attr_flags.attr,
 +      &dev_attr_tx_queue_len.attr,
++      &dev_attr_phys_port_id.attr,
 +      NULL,
  };
 +ATTRIBUTE_GROUPS(net_class);
  
  /* Show a given an attribute in the statistics group */
  static ssize_t netstat_show(const struct device *d,