mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bonding, net: Move last_rx update into bonding recv logic
The only user of the net_device->last_rx field is bonding. This patch adds a conditional update of last_rx to the bonding special logic in skb_bond_should_drop, causing last_rx to only be updated when the ARP monitor is running. This frees network device drivers from the necessity of updating last_rx, which can have cache line thrash issues. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									24f8b2385e
								
							
						
					
					
						commit
						6cf3f41e6c
					
				
					 4 changed files with 23 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -4564,6 +4564,8 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
 | 
			
		|||
	bond_dev->tx_queue_len = 0;
 | 
			
		||||
	bond_dev->flags |= IFF_MASTER|IFF_MULTICAST;
 | 
			
		||||
	bond_dev->priv_flags |= IFF_BONDING;
 | 
			
		||||
	if (bond->params.arp_interval)
 | 
			
		||||
		bond_dev->priv_flags |= IFF_MASTER_ARPMON;
 | 
			
		||||
 | 
			
		||||
	/* At first, we block adding VLANs. That's the only way to
 | 
			
		||||
	 * prevent problems that occur when adding VLANs over an
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -620,6 +620,8 @@ static ssize_t bonding_store_arp_interval(struct device *d,
 | 
			
		|||
	       ": %s: Setting ARP monitoring interval to %d.\n",
 | 
			
		||||
	       bond->dev->name, new_value);
 | 
			
		||||
	bond->params.arp_interval = new_value;
 | 
			
		||||
	if (bond->params.arp_interval)
 | 
			
		||||
		bond->dev->priv_flags |= IFF_MASTER_ARPMON;
 | 
			
		||||
	if (bond->params.miimon) {
 | 
			
		||||
		printk(KERN_INFO DRV_NAME
 | 
			
		||||
		       ": %s: ARP monitoring cannot be used with MII monitoring. "
 | 
			
		||||
| 
						 | 
				
			
			@ -1039,6 +1041,7 @@ static ssize_t bonding_store_miimon(struct device *d,
 | 
			
		|||
			       "ARP monitoring. Disabling ARP monitoring...\n",
 | 
			
		||||
			       bond->dev->name);
 | 
			
		||||
			bond->params.arp_interval = 0;
 | 
			
		||||
			bond->dev->priv_flags &= ~IFF_MASTER_ARPMON;
 | 
			
		||||
			if (bond->params.arp_validate) {
 | 
			
		||||
				bond_unregister_arp(bond);
 | 
			
		||||
				bond->params.arp_validate =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,6 +65,7 @@
 | 
			
		|||
#define IFF_BONDING	0x20		/* bonding master or slave	*/
 | 
			
		||||
#define IFF_SLAVE_NEEDARP 0x40		/* need ARPs for validation	*/
 | 
			
		||||
#define IFF_ISATAP	0x80		/* ISATAP interface (RFC4214)	*/
 | 
			
		||||
#define IFF_MASTER_ARPMON 0x100		/* bonding master, ARP mon in use */
 | 
			
		||||
 | 
			
		||||
#define IF_GET_IFACE	0x0001		/* for querying only */
 | 
			
		||||
#define IF_GET_PROTO	0x0002
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1742,22 +1742,26 @@ static inline int skb_bond_should_drop(struct sk_buff *skb)
 | 
			
		|||
	struct net_device *dev = skb->dev;
 | 
			
		||||
	struct net_device *master = dev->master;
 | 
			
		||||
 | 
			
		||||
	if (master &&
 | 
			
		||||
	    (dev->priv_flags & IFF_SLAVE_INACTIVE)) {
 | 
			
		||||
		if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
 | 
			
		||||
		    skb->protocol == __constant_htons(ETH_P_ARP))
 | 
			
		||||
			return 0;
 | 
			
		||||
	if (master) {
 | 
			
		||||
		if (master->priv_flags & IFF_MASTER_ARPMON)
 | 
			
		||||
			dev->last_rx = jiffies;
 | 
			
		||||
 | 
			
		||||
		if (master->priv_flags & IFF_MASTER_ALB) {
 | 
			
		||||
			if (skb->pkt_type != PACKET_BROADCAST &&
 | 
			
		||||
			    skb->pkt_type != PACKET_MULTICAST)
 | 
			
		||||
		if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
 | 
			
		||||
			if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
 | 
			
		||||
			    skb->protocol == __constant_htons(ETH_P_ARP))
 | 
			
		||||
				return 0;
 | 
			
		||||
		}
 | 
			
		||||
		if (master->priv_flags & IFF_MASTER_8023AD &&
 | 
			
		||||
		    skb->protocol == __constant_htons(ETH_P_SLOW))
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
			if (master->priv_flags & IFF_MASTER_ALB) {
 | 
			
		||||
				if (skb->pkt_type != PACKET_BROADCAST &&
 | 
			
		||||
				    skb->pkt_type != PACKET_MULTICAST)
 | 
			
		||||
					return 0;
 | 
			
		||||
			}
 | 
			
		||||
			if (master->priv_flags & IFF_MASTER_8023AD &&
 | 
			
		||||
			    skb->protocol == __constant_htons(ETH_P_SLOW))
 | 
			
		||||
				return 0;
 | 
			
		||||
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue