Эх сурвалжийг харах

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

* 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
Linus Torvalds 13 жил өмнө
parent
commit
38e5781bbf

+ 1 - 1
drivers/net/ethernet/broadcom/bcm63xx_enet.c

@@ -1469,7 +1469,7 @@ static int bcm_enet_set_pauseparam(struct net_device *dev,
 	return 0;
 	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_strings		= bcm_enet_get_strings,
 	.get_sset_count		= bcm_enet_get_sset_count,
 	.get_sset_count		= bcm_enet_get_sset_count,
 	.get_ethtool_stats      = bcm_enet_get_ethtool_stats,
 	.get_ethtool_stats      = bcm_enet_get_ethtool_stats,

+ 1 - 1
drivers/net/ethernet/emulex/benet/be_main.c

@@ -3080,7 +3080,7 @@ fw_exit:
 	return status;
 	return status;
 }
 }
 
 
-static struct net_device_ops be_netdev_ops = {
+static const struct net_device_ops be_netdev_ops = {
 	.ndo_open		= be_open,
 	.ndo_open		= be_open,
 	.ndo_stop		= be_close,
 	.ndo_stop		= be_close,
 	.ndo_start_xmit		= be_xmit,
 	.ndo_start_xmit		= be_xmit,

+ 1 - 1
drivers/net/ethernet/rdc/r6040.c

@@ -1160,7 +1160,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
 	lp->dev = dev;
 	lp->dev = dev;
 
 
 	/* Init RDC private data */
 	/* Init RDC private data */
-	lp->mcr0 = MCR0_XMTEN | MCR0;
+	lp->mcr0 = MCR0_XMTEN | MCR0_RCVEN;
 
 
 	/* The RDC-specific entries in the device structure. */
 	/* The RDC-specific entries in the device structure. */
 	dev->netdev_ops = &r6040_netdev_ops;
 	dev->netdev_ops = &r6040_netdev_ops;

+ 1 - 0
drivers/net/ethernet/realtek/8139cp.c

@@ -563,6 +563,7 @@ rx_next:
 		if (cpr16(IntrStatus) & cp_rx_intr_mask)
 		if (cpr16(IntrStatus) & cp_rx_intr_mask)
 			goto rx_status_loop;
 			goto rx_status_loop;
 
 
+		napi_gro_flush(napi);
 		spin_lock_irqsave(&cp->lock, flags);
 		spin_lock_irqsave(&cp->lock, flags);
 		__napi_complete(napi);
 		__napi_complete(napi);
 		cpw16_f(IntrMask, cp_intr_mask);
 		cpw16_f(IntrMask, cp_intr_mask);

+ 0 - 2
drivers/net/ethernet/smsc/smsc911x.h

@@ -401,8 +401,6 @@
 #include <asm/smsc911x.h>
 #include <asm/smsc911x.h>
 #endif
 #endif
 
 
-#ifdef CONFIG_SMSC_PHY
 #include <linux/smscphy.h>
 #include <linux/smscphy.h>
-#endif
 
 
 #endif				/* __SMSC911X_H__ */
 #endif				/* __SMSC911X_H__ */

+ 1 - 2
drivers/net/ethernet/tile/tilepro.c

@@ -2260,8 +2260,7 @@ static int tile_net_get_mac(struct net_device *dev)
 	return 0;
 	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_open = tile_net_open,
 	.ndo_stop = tile_net_stop,
 	.ndo_stop = tile_net_stop,
 	.ndo_start_xmit = tile_net_tx,
 	.ndo_start_xmit = tile_net_tx,

+ 2 - 2
drivers/net/usb/asix.c

@@ -376,7 +376,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 
 
 		skb_pull(skb, (size + 1) & 0xfffe);
 		skb_pull(skb, (size + 1) & 0xfffe);
 
 
-		if (skb->len == 0)
+		if (skb->len < sizeof(header))
 			break;
 			break;
 
 
 		head = (u8 *) skb->data;
 		head = (u8 *) skb->data;
@@ -1152,7 +1152,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 	return 0;
 	return 0;
 }
 }
 
 
-static struct ethtool_ops ax88178_ethtool_ops = {
+static const struct ethtool_ops ax88178_ethtool_ops = {
 	.get_drvinfo		= asix_get_drvinfo,
 	.get_drvinfo		= asix_get_drvinfo,
 	.get_link		= asix_get_link,
 	.get_link		= asix_get_link,
 	.get_msglevel		= usbnet_get_msglevel,
 	.get_msglevel		= usbnet_get_msglevel,

+ 2 - 2
drivers/net/usb/cdc_ncm.c

@@ -138,7 +138,7 @@ struct cdc_ncm_ctx {
 static void cdc_ncm_tx_timeout(unsigned long arg);
 static void cdc_ncm_tx_timeout(unsigned long arg);
 static const struct driver_info cdc_ncm_info;
 static const struct driver_info cdc_ncm_info;
 static struct usb_driver cdc_ncm_driver;
 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[] = {
 static const struct usb_device_id cdc_devs[] = {
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM,
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM,
@@ -1220,7 +1220,7 @@ static struct usb_driver cdc_ncm_driver = {
 	.supports_autosuspend = 1,
 	.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_drvinfo = cdc_ncm_get_drvinfo,
 	.get_link = usbnet_get_link,
 	.get_link = usbnet_get_link,
 	.get_msglevel = usbnet_get_msglevel,
 	.get_msglevel = usbnet_get_msglevel,

+ 1 - 1
drivers/net/usb/ipheth.c

@@ -420,7 +420,7 @@ static u32 ipheth_ethtool_op_get_link(struct net_device *net)
 	return netif_carrier_ok(dev->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
 	.get_link = ipheth_ethtool_op_get_link
 };
 };
 
 

+ 1 - 1
drivers/net/usb/sierra_net.c

@@ -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);
 	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_drvinfo = sierra_net_get_drvinfo,
 	.get_link = sierra_net_get_link,
 	.get_link = sierra_net_get_link,
 	.get_msglevel = usbnet_get_msglevel,
 	.get_msglevel = usbnet_get_msglevel,

+ 0 - 2
include/linux/memcontrol.h

@@ -390,7 +390,6 @@ enum {
 	OVER_LIMIT,
 	OVER_LIMIT,
 };
 };
 
 
-#ifdef CONFIG_INET
 struct sock;
 struct sock;
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
 void sock_update_memcg(struct sock *sk);
 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_CGROUP_MEM_RES_CTLR_KMEM */
-#endif /* CONFIG_INET */
 #endif /* _LINUX_MEMCONTROL_H */
 #endif /* _LINUX_MEMCONTROL_H */
 
 

+ 5 - 0
include/linux/netdevice.h

@@ -2450,6 +2450,11 @@ static inline void netif_addr_lock(struct net_device *dev)
 	spin_lock(&dev->addr_list_lock);
 	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)
 static inline void netif_addr_lock_bh(struct net_device *dev)
 {
 {
 	spin_lock_bh(&dev->addr_list_lock);
 	spin_lock_bh(&dev->addr_list_lock);

+ 14 - 5
mm/memcontrol.c

@@ -381,16 +381,25 @@ static void mem_cgroup_put(struct mem_cgroup *memcg);
 static bool mem_cgroup_is_root(struct mem_cgroup *memcg);
 static bool mem_cgroup_is_root(struct mem_cgroup *memcg);
 void sock_update_memcg(struct sock *sk)
 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)) {
 	if (static_branch(&memcg_socket_limit_enabled)) {
 		struct mem_cgroup *memcg;
 		struct mem_cgroup *memcg;
 
 
 		BUG_ON(!sk->sk_prot->proto_cgroup);
 		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();
 		rcu_read_lock();
 		memcg = mem_cgroup_from_task(current);
 		memcg = mem_cgroup_from_task(current);
 		if (!mem_cgroup_is_root(memcg)) {
 		if (!mem_cgroup_is_root(memcg)) {

+ 8 - 8
net/core/dev_addr_lists.c

@@ -427,7 +427,7 @@ EXPORT_SYMBOL(dev_uc_del);
  *
  *
  *	Add newly added addresses to the destination device and release
  *	Add newly added addresses to the destination device and release
  *	addresses that have no users left. The source device must be
  *	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
  *	This function is intended to be called from the dev->set_rx_mode
  *	function of layered software devices.
  *	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)
 	if (to->addr_len != from->addr_len)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	netif_addr_lock_bh(to);
+	netif_addr_lock_nested(to);
 	err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
 	err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
 	if (!err)
 	if (!err)
 		__dev_set_rx_mode(to);
 		__dev_set_rx_mode(to);
-	netif_addr_unlock_bh(to);
+	netif_addr_unlock(to);
 	return err;
 	return err;
 }
 }
 EXPORT_SYMBOL(dev_uc_sync);
 EXPORT_SYMBOL(dev_uc_sync);
@@ -463,7 +463,7 @@ void dev_uc_unsync(struct net_device *to, struct net_device *from)
 		return;
 		return;
 
 
 	netif_addr_lock_bh(from);
 	netif_addr_lock_bh(from);
-	netif_addr_lock(to);
+	netif_addr_lock_nested(to);
 	__hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
 	__hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
 	__dev_set_rx_mode(to);
 	__dev_set_rx_mode(to);
 	netif_addr_unlock(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
  *	Add newly added addresses to the destination device and release
  *	addresses that have no users left. The source device must be
  *	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
  *	This function is intended to be called from the ndo_set_rx_mode
  *	function of layered software devices.
  *	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)
 	if (to->addr_len != from->addr_len)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	netif_addr_lock_bh(to);
+	netif_addr_lock_nested(to);
 	err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
 	err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len);
 	if (!err)
 	if (!err)
 		__dev_set_rx_mode(to);
 		__dev_set_rx_mode(to);
-	netif_addr_unlock_bh(to);
+	netif_addr_unlock(to);
 	return err;
 	return err;
 }
 }
 EXPORT_SYMBOL(dev_mc_sync);
 EXPORT_SYMBOL(dev_mc_sync);
@@ -626,7 +626,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from)
 		return;
 		return;
 
 
 	netif_addr_lock_bh(from);
 	netif_addr_lock_bh(from);
-	netif_addr_lock(to);
+	netif_addr_lock_nested(to);
 	__hw_addr_unsync(&to->mc, &from->mc, to->addr_len);
 	__hw_addr_unsync(&to->mc, &from->mc, to->addr_len);
 	__dev_set_rx_mode(to);
 	__dev_set_rx_mode(to);
 	netif_addr_unlock(to);
 	netif_addr_unlock(to);

+ 2 - 2
net/core/pktgen.c

@@ -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",
 		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->queue_map_min, (ntxq ?: 1) - 1, ntxq,
 			   pkt_dev->odevname);
 			   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) {
 	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",
 		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->queue_map_max, (ntxq ?: 1) - 1, ntxq,
 			   pkt_dev->odevname);
 			   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. */
 	/* Default to the interface's mac if not explicitly set. */

+ 9 - 0
net/core/sock.c

@@ -112,6 +112,7 @@
 #include <linux/highmem.h>
 #include <linux/highmem.h>
 #include <linux/user_namespace.h>
 #include <linux/user_namespace.h>
 #include <linux/jump_label.h>
 #include <linux/jump_label.h>
+#include <linux/memcontrol.h>
 
 
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/system.h>
@@ -1272,6 +1273,12 @@ void sk_release_kernel(struct sock *sk)
 }
 }
 EXPORT_SYMBOL(sk_release_kernel);
 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_clone_lock - clone a socket, and lock its clone
  *	@sk: the socket to 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);
 		sk_set_socket(newsk, NULL);
 		newsk->sk_wq = NULL;
 		newsk->sk_wq = NULL;
 
 
+		sk_update_clone(sk, newsk);
+
 		if (newsk->sk_prot->sockets_allocated)
 		if (newsk->sk_prot->sockets_allocated)
 			sk_sockets_allocated_inc(newsk);
 			sk_sockets_allocated_inc(newsk);
 
 

+ 5 - 1
net/ipv4/Kconfig

@@ -408,8 +408,12 @@ config INET_TCP_DIAG
 	def_tristate INET_DIAG
 	def_tristate INET_DIAG
 
 
 config INET_UDP_DIAG
 config INET_UDP_DIAG
+	tristate "UDP: socket monitoring interface"
 	depends on INET_DIAG
 	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
 menuconfig TCP_CONG_ADVANCED
 	bool "TCP: advanced congestion control"
 	bool "TCP: advanced congestion control"

+ 2 - 0
net/ipv4/igmp.c

@@ -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.
 		 * to be intended in a v3 query.
 		 */
 		 */
 		max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
 		max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
+		if (!max_delay)
+			max_delay = 1;	/* can't mod w/ 0 */
 	} else { /* v3 */
 	} else { /* v3 */
 		if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
 		if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
 			return;
 			return;

+ 1 - 1
net/unix/Kconfig

@@ -22,7 +22,7 @@ config UNIX
 config UNIX_DIAG
 config UNIX_DIAG
 	tristate "UNIX: socket monitoring interface"
 	tristate "UNIX: socket monitoring interface"
 	depends on UNIX
 	depends on UNIX
-	default UNIX
+	default n
 	---help---
 	---help---
 	  Support for UNIX socket monitoring interface used by the ss tool.
 	  Support for UNIX socket monitoring interface used by the ss tool.
 	  If unsure, say Y.
 	  If unsure, say Y.