Commit d8873315065f1f527c7c380402cf59b1e1d0ae36

Authored by Neil Horman
Committed by David S. Miller
1 parent 894dc24ce7

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>

Showing 3 changed files with 8 additions and 3 deletions Side-by-side Diff

... ... @@ -76,6 +76,8 @@
76 76 #define IFF_BRIDGE_PORT 0x4000 /* device used as bridge port */
77 77 #define IFF_OVS_DATAPATH 0x8000 /* device used as Open vSwitch
78 78 * datapath port */
  79 +#define IFF_TX_SKB_SHARING 0x10000 /* The interface supports sharing
  80 + * skbs on transmit */
79 81  
80 82 #define IF_GET_IFACE 0x0001 /* for querying only */
81 83 #define IF_GET_PROTO 0x0002
... ... @@ -1070,7 +1070,9 @@
1070 1070 len = num_arg(&user_buffer[i], 10, &value);
1071 1071 if (len < 0)
1072 1072 return len;
1073   -
  1073 + if ((value > 0) &&
  1074 + (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)))
  1075 + return -ENOTSUPP;
1074 1076 i += len;
1075 1077 pkt_dev->clone_skb = value;
1076 1078  
... ... @@ -3555,7 +3557,6 @@
3555 3557 pkt_dev->min_pkt_size = ETH_ZLEN;
3556 3558 pkt_dev->max_pkt_size = ETH_ZLEN;
3557 3559 pkt_dev->nfrags = 0;
3558   - pkt_dev->clone_skb = pg_clone_skb_d;
3559 3560 pkt_dev->delay = pg_delay_d;
3560 3561 pkt_dev->count = pg_count_d;
3561 3562 pkt_dev->sofar = 0;
... ... @@ -3563,7 +3564,6 @@
3563 3564 pkt_dev->udp_src_max = 9;
3564 3565 pkt_dev->udp_dst_min = 9;
3565 3566 pkt_dev->udp_dst_max = 9;
3566   -
3567 3567 pkt_dev->vlan_p = 0;
3568 3568 pkt_dev->vlan_cfi = 0;
3569 3569 pkt_dev->vlan_id = 0xffff;
... ... @@ -3575,6 +3575,8 @@
3575 3575 err = pktgen_setup_dev(pkt_dev, ifname);
3576 3576 if (err)
3577 3577 goto out1;
  3578 + if (pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING)
  3579 + pkt_dev->clone_skb = pg_clone_skb_d;
3578 3580  
3579 3581 pkt_dev->entry = proc_create_data(ifname, 0600, pg_proc_dir,
3580 3582 &pktgen_if_fops, pkt_dev);
... ... @@ -340,6 +340,7 @@
340 340 dev->addr_len = ETH_ALEN;
341 341 dev->tx_queue_len = 1000; /* Ethernet wants good queues */
342 342 dev->flags = IFF_BROADCAST|IFF_MULTICAST;
  343 + dev->priv_flags = IFF_TX_SKB_SHARING;
343 344  
344 345 memset(dev->broadcast, 0xFF, ETH_ALEN);
345 346