mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net: add IFF_SKB_TX_SHARED flag to priv_flags
Pktgen attempts to transmit shared skbs to net devices, which can't be used by some drivers as they keep state information in skbs. This patch adds a flag marking drivers as being able to handle shared skbs in their tx path. Drivers are defaulted to being unable to do so, but calling ether_setup enables this flag, as 90% of the drivers calling ether_setup touch real hardware and can handle shared skbs. A subsequent patch will audit drivers to ensure that the flag is set properly Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Reported-by: Jiri Pirko <jpirko@redhat.com> CC: Robert Olsson <robert.olsson@its.uu.se> CC: Eric Dumazet <eric.dumazet@gmail.com> CC: Alexey Dobriyan <adobriyan@gmail.com> CC: David S. Miller <davem@davemloft.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									894dc24ce7
								
							
						
					
					
						commit
						d887331506
					
				
					 3 changed files with 8 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -76,6 +76,8 @@
 | 
			
		|||
#define IFF_BRIDGE_PORT	0x4000		/* device used as bridge port */
 | 
			
		||||
#define IFF_OVS_DATAPATH	0x8000	/* device used as Open vSwitch
 | 
			
		||||
					 * datapath port */
 | 
			
		||||
#define IFF_TX_SKB_SHARING	0x10000	/* The interface supports sharing
 | 
			
		||||
					 * skbs on transmit */
 | 
			
		||||
 | 
			
		||||
#define IF_GET_IFACE	0x0001		/* for querying only */
 | 
			
		||||
#define IF_GET_PROTO	0x0002
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1070,7 +1070,9 @@ static ssize_t pktgen_if_write(struct file *file,
 | 
			
		|||
		len = num_arg(&user_buffer[i], 10, &value);
 | 
			
		||||
		if (len < 0)
 | 
			
		||||
			return len;
 | 
			
		||||
 | 
			
		||||
		if ((value > 0) &&
 | 
			
		||||
		    (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)))
 | 
			
		||||
			return -ENOTSUPP;
 | 
			
		||||
		i += len;
 | 
			
		||||
		pkt_dev->clone_skb = value;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3555,7 +3557,6 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 | 
			
		|||
	pkt_dev->min_pkt_size = ETH_ZLEN;
 | 
			
		||||
	pkt_dev->max_pkt_size = ETH_ZLEN;
 | 
			
		||||
	pkt_dev->nfrags = 0;
 | 
			
		||||
	pkt_dev->clone_skb = pg_clone_skb_d;
 | 
			
		||||
	pkt_dev->delay = pg_delay_d;
 | 
			
		||||
	pkt_dev->count = pg_count_d;
 | 
			
		||||
	pkt_dev->sofar = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -3563,7 +3564,6 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 | 
			
		|||
	pkt_dev->udp_src_max = 9;
 | 
			
		||||
	pkt_dev->udp_dst_min = 9;
 | 
			
		||||
	pkt_dev->udp_dst_max = 9;
 | 
			
		||||
 | 
			
		||||
	pkt_dev->vlan_p = 0;
 | 
			
		||||
	pkt_dev->vlan_cfi = 0;
 | 
			
		||||
	pkt_dev->vlan_id = 0xffff;
 | 
			
		||||
| 
						 | 
				
			
			@ -3575,6 +3575,8 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
 | 
			
		|||
	err = pktgen_setup_dev(pkt_dev, ifname);
 | 
			
		||||
	if (err)
 | 
			
		||||
		goto out1;
 | 
			
		||||
	if (pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)
 | 
			
		||||
		pkt_dev->clone_skb = pg_clone_skb_d;
 | 
			
		||||
 | 
			
		||||
	pkt_dev->entry = proc_create_data(ifname, 0600, pg_proc_dir,
 | 
			
		||||
					  &pktgen_if_fops, pkt_dev);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -340,6 +340,7 @@ void ether_setup(struct net_device *dev)
 | 
			
		|||
	dev->addr_len		= ETH_ALEN;
 | 
			
		||||
	dev->tx_queue_len	= 1000;	/* Ethernet wants good queues */
 | 
			
		||||
	dev->flags		= IFF_BROADCAST|IFF_MULTICAST;
 | 
			
		||||
	dev->priv_flags		= IFF_TX_SKB_SHARING;
 | 
			
		||||
 | 
			
		||||
	memset(dev->broadcast, 0xFF, ETH_ALEN);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue