Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Linus Torvalds [Mon, 9 Jan 2012 22:46:52 +0000 (14:46 -0800)]
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  igmp: Avoid zero delay when receiving odd mixture of IGMP queries
  netdev: make net_device_ops const
  bcm63xx: make ethtool_ops const
  usbnet: make ethtool_ops const
  net: Fix build with INET disabled.
  net: introduce netif_addr_lock_nested() and call if when appropriate
  net: correct lock name in dev_[uc/mc]_sync documentations.
  net: sk_update_clone is only used in net/core/sock.c
  8139cp: fix missing napi_gro_flush.
  pktgen: set correct max and min in pktgen_setup_inject()
  smsc911x: Unconditionally include linux/smscphy.h in smsc911x.h
  asix: fix infinite loop in rx_fixup()
  net: Default UDP and UNIX diag to 'n'.
  r6040: fix typo in use of MCR0 register bits
  net: fix sock_clone reference mismatch with tcp memcontrol

19 files changed:
drivers/net/ethernet/broadcom/bcm63xx_enet.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/rdc/r6040.c
drivers/net/ethernet/realtek/8139cp.c
drivers/net/ethernet/smsc/smsc911x.h
drivers/net/ethernet/tile/tilepro.c
drivers/net/usb/asix.c
drivers/net/usb/cdc_ncm.c
drivers/net/usb/ipheth.c
drivers/net/usb/sierra_net.c
include/linux/memcontrol.h
include/linux/netdevice.h
mm/memcontrol.c
net/core/dev_addr_lists.c
net/core/pktgen.c
net/core/sock.c
net/ipv4/Kconfig
net/ipv4/igmp.c
net/unix/Kconfig

index a11a8ad..d44331e 100644 (file)
@@ -1469,7 +1469,7 @@ static int bcm_enet_set_pauseparam(struct net_device *dev,
        return 0;
 }
 
-static struct ethtool_ops bcm_enet_ethtool_ops = {
+static const struct ethtool_ops bcm_enet_ethtool_ops = {
        .get_strings            = bcm_enet_get_strings,
        .get_sset_count         = bcm_enet_get_sset_count,
        .get_ethtool_stats      = bcm_enet_get_ethtool_stats,
index 6c46753..a6bcdb5 100644 (file)
@@ -3080,7 +3080,7 @@ fw_exit:
        return status;
 }
 
-static struct net_device_ops be_netdev_ops = {
+static const struct net_device_ops be_netdev_ops = {
        .ndo_open               = be_open,
        .ndo_stop               = be_close,
        .ndo_start_xmit         = be_xmit,
index 87aa439..cb0eca8 100644 (file)
@@ -1160,7 +1160,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
        lp->dev = dev;
 
        /* Init RDC private data */
-       lp->mcr0 = MCR0_XMTEN | MCR0;
+       lp->mcr0 = MCR0_XMTEN | MCR0_RCVEN;
 
        /* The RDC-specific entries in the device structure. */
        dev->netdev_ops = &r6040_netdev_ops;
index cc6b391..abc7907 100644 (file)
@@ -563,6 +563,7 @@ rx_next:
                if (cpr16(IntrStatus) & cp_rx_intr_mask)
                        goto rx_status_loop;
 
+               napi_gro_flush(napi);
                spin_lock_irqsave(&cp->lock, flags);
                __napi_complete(napi);
                cpw16_f(IntrMask, cp_intr_mask);
index 938ecf2..9ad5e5d 100644 (file)
 #include <asm/smsc911x.h>
 #endif
 
-#ifdef CONFIG_SMSC_PHY
 #include <linux/smscphy.h>
-#endif
 
 #endif                         /* __SMSC911X_H__ */
index 6b75063..d9951af 100644 (file)
@@ -2260,8 +2260,7 @@ static int tile_net_get_mac(struct net_device *dev)
        return 0;
 }
 
-
-static struct net_device_ops tile_net_ops = {
+static const struct net_device_ops tile_net_ops = {
        .ndo_open = tile_net_open,
        .ndo_stop = tile_net_stop,
        .ndo_start_xmit = tile_net_tx,
index 1ff7163..d0937c4 100644 (file)
@@ -376,7 +376,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 
                skb_pull(skb, (size + 1) & 0xfffe);
 
-               if (skb->len == 0)
+               if (skb->len < sizeof(header))
                        break;
 
                head = (u8 *) skb->data;
@@ -1152,7 +1152,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
        return 0;
 }
 
-static struct ethtool_ops ax88178_ethtool_ops = {
+static const struct ethtool_ops ax88178_ethtool_ops = {
        .get_drvinfo            = asix_get_drvinfo,
        .get_link               = asix_get_link,
        .get_msglevel           = usbnet_get_msglevel,
index cb8e595..3a539a9 100644 (file)
@@ -138,7 +138,7 @@ struct cdc_ncm_ctx {
 static void cdc_ncm_tx_timeout(unsigned long arg);
 static const struct driver_info cdc_ncm_info;
 static struct usb_driver cdc_ncm_driver;
-static struct ethtool_ops cdc_ncm_ethtool_ops;
+static const struct ethtool_ops cdc_ncm_ethtool_ops;
 
 static const struct usb_device_id cdc_devs[] = {
        { USB_INTERFACE_INFO(USB_CLASS_COMM,
@@ -1220,7 +1220,7 @@ static struct usb_driver cdc_ncm_driver = {
        .supports_autosuspend = 1,
 };
 
-static struct ethtool_ops cdc_ncm_ethtool_ops = {
+static const struct ethtool_ops cdc_ncm_ethtool_ops = {
        .get_drvinfo = cdc_ncm_get_drvinfo,
        .get_link = usbnet_get_link,
        .get_msglevel = usbnet_get_msglevel,
index 08a4df2..e84662d 100644 (file)
@@ -420,7 +420,7 @@ static u32 ipheth_ethtool_op_get_link(struct net_device *net)
        return netif_carrier_ok(dev->net);
 }
 
-static struct ethtool_ops ops = {
+static const struct ethtool_ops ops = {
        .get_link = ipheth_ethtool_op_get_link
 };
 
index e45dfdc..b59cf20 100644 (file)
@@ -618,7 +618,7 @@ static u32 sierra_net_get_link(struct net_device *net)
        return sierra_net_get_private(dev)->link_up && netif_running(net);
 }
 
-static struct ethtool_ops sierra_net_ethtool_ops = {
+static const struct ethtool_ops sierra_net_ethtool_ops = {
        .get_drvinfo = sierra_net_get_drvinfo,
        .get_link = sierra_net_get_link,
        .get_msglevel = usbnet_get_msglevel,
index 9b296ea..f944591 100644 (file)
@@ -390,7 +390,6 @@ enum {
        OVER_LIMIT,
 };
 
-#ifdef CONFIG_INET
 struct sock;
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
 void sock_update_memcg(struct sock *sk);
@@ -403,6 +402,5 @@ static inline void sock_release_memcg(struct sock *sk)
 {
 }
 #endif /* CONFIG_CGROUP_MEM_RES_CTLR_KMEM */
-#endif /* CONFIG_INET */
 #endif /* _LINUX_MEMCONTROL_H */
 
index 4c06cc0..0eac07c 100644 (file)
@@ -2450,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev)
        spin_lock(&dev->addr_list_lock);
 }
 
+static inline void netif_addr_lock_nested(struct net_device *dev)
+{
+       spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING);
+}
+
 static inline void netif_addr_lock_bh(struct net_device *dev)
 {
        spin_lock_bh(&dev->addr_list_lock);
index 00d4fa2..d87aa35 100644 (file)
@@ -381,16 +381,25 @@ static void mem_cgroup_put(struct mem_cgroup *memcg);
 static bool mem_cgroup_is_root(struct mem_cgroup *memcg);
 void sock_update_memcg(struct sock *sk)
 {
-       /* A socket spends its whole life in the same cgroup */
-       if (sk->sk_cgrp) {
-               WARN_ON(1);
-               return;
-       }
        if (static_branch(&memcg_socket_limit_enabled)) {
                struct mem_cgroup *memcg;
 
                BUG_ON(!sk->sk_prot->proto_cgroup);
 
+               /* Socket cloning can throw us here with sk_cgrp already
+                * filled. It won't however, necessarily happen from
+                * process context. So the test for root memcg given
+                * the current task's memcg won't help us in this case.
+                *
+                * Respecting the original socket's memcg is a better
+                * decision in this case.
+                */
+               if (sk->sk_cgrp) {
+                       BUG_ON(mem_cgroup_is_root(sk->sk_cgrp->memcg));
+                       mem_cgroup_get(sk->sk_cgrp->memcg);
+                       return;
+               }
+
                rcu_read_lock();
                memcg = mem_cgroup_from_task(current);
                if (!mem_cgroup_is_root(memcg)) {
index febba51..29c07fe 100644 (file)
@@ -427,7 +427,7 @@ EXPORT_SYMBOL(dev_uc_del);
  *
  *     Add newly added addresses to the destination device and release
  *     addresses that have no users left. The source device must be
- *     locked by netif_tx_lock_bh.
+ *     locked by netif_addr_lock_bh.
  *
  *     This function is intended to be called from the dev->set_rx_mode
  *     function of layered software devices.
@@ -439,11 +439,11 @@ int dev_uc_sync(struct net_device *to, struct net_device *from)
        if (to->addr_len != from->addr_len)
                return -EINVAL;
 
-       netif_addr_lock_bh(to);
+       netif_addr_lock_nested(to);
        err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
        if (!err)
                __dev_set_rx_mode(to);
-       netif_addr_unlock_bh(to);
+       netif_addr_unlock(to);
        return err;
 }
 EXPORT_SYMBOL(dev_uc_sync);
@@ -463,7 +463,7 @@ void dev_uc_unsync(struct net_device *to, struct net_device *from)
                return;
 
        netif_addr_lock_bh(from);
-       netif_addr_lock(to);
+       netif_addr_lock_nested(to);
        __hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
        __dev_set_rx_mode(to);
        netif_addr_unlock(to);
@@ -590,7 +590,7 @@ EXPORT_SYMBOL(dev_mc_del_global);
  *
  *     Add newly added addresses to the destination device and release
  *     addresses that have no users left. The source device must be
- *     locked by netif_tx_lock_bh.
+ *     locked by netif_addr_lock_bh.
  *
  *     This function is intended to be called from the ndo_set_rx_mode
  *     function of layered software devices.
@@ -602,11 +602,11 @@ int dev_mc_sync(struct net_device *to, struct net_device *from)
        if (to->addr_len != from->addr_len)
                return -EINVAL;
 
-       netif_addr_lock_bh(to);
+       netif_addr_lock_nested(to);
        err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
        if (!err)
                __dev_set_rx_mode(to);
-       netif_addr_unlock_bh(to);
+       netif_addr_unlock(to);
        return err;
 }
 EXPORT_SYMBOL(dev_mc_sync);
@@ -626,7 +626,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from)
                return;
 
        netif_addr_lock_bh(from);
-       netif_addr_lock(to);
+       netif_addr_lock_nested(to);
        __hw_addr_unsync(&to->mc, &from->mc, to->addr_len);
        __dev_set_rx_mode(to);
        netif_addr_unlock(to);
index 449fe0f..65f80c7 100644 (file)
@@ -2024,13 +2024,13 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
                pr_warning("WARNING: Requested queue_map_min (zero-based) (%d) exceeds valid range [0 - %d] for (%d) queues on %s, resetting\n",
                           pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq,
                           pkt_dev->odevname);
-               pkt_dev->queue_map_min = ntxq - 1;
+               pkt_dev->queue_map_min = (ntxq ?: 1) - 1;
        }
        if (pkt_dev->queue_map_max >= ntxq) {
                pr_warning("WARNING: Requested queue_map_max (zero-based) (%d) exceeds valid range [0 - %d] for (%d) queues on %s, resetting\n",
                           pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq,
                           pkt_dev->odevname);
-               pkt_dev->queue_map_max = ntxq - 1;
+               pkt_dev->queue_map_max = (ntxq ?: 1) - 1;
        }
 
        /* Default to the interface's mac if not explicitly set. */
index 002939c..5c5af99 100644 (file)
 #include <linux/highmem.h>
 #include <linux/user_namespace.h>
 #include <linux/jump_label.h>
+#include <linux/memcontrol.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -1272,6 +1273,12 @@ void sk_release_kernel(struct sock *sk)
 }
 EXPORT_SYMBOL(sk_release_kernel);
 
+static void sk_update_clone(const struct sock *sk, struct sock *newsk)
+{
+       if (mem_cgroup_sockets_enabled && sk->sk_cgrp)
+               sock_update_memcg(newsk);
+}
+
 /**
  *     sk_clone_lock - clone a socket, and lock its clone
  *     @sk: the socket to clone
@@ -1362,6 +1369,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
                sk_set_socket(newsk, NULL);
                newsk->sk_wq = NULL;
 
+               sk_update_clone(sk, newsk);
+
                if (newsk->sk_prot->sockets_allocated)
                        sk_sockets_allocated_inc(newsk);
 
index 335ca7a..aa2a2c7 100644 (file)
@@ -408,8 +408,12 @@ config INET_TCP_DIAG
        def_tristate INET_DIAG
 
 config INET_UDP_DIAG
+       tristate "UDP: socket monitoring interface"
        depends on INET_DIAG
-       def_tristate INET_DIAG && IPV6
+       default n
+       ---help---
+         Support for UDP socket monitoring interface used by the ss tool.
+         If unsure, say Y.
 
 menuconfig TCP_CONG_ADVANCED
        bool "TCP: advanced congestion control"
index fa057d1..5104bc0 100644 (file)
@@ -880,6 +880,8 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
                 * to be intended in a v3 query.
                 */
                max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
+               if (!max_delay)
+                       max_delay = 1;  /* can't mod w/ 0 */
        } else { /* v3 */
                if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
                        return;
index c2128b1..8b31ab8 100644 (file)
@@ -22,7 +22,7 @@ config UNIX
 config UNIX_DIAG
        tristate "UNIX: socket monitoring interface"
        depends on UNIX
-       default UNIX
+       default n
        ---help---
          Support for UNIX socket monitoring interface used by the ss tool.
          If unsure, say Y.