Commit d8873315065f1f527c7c380402cf59b1e1d0ae36
Committed by
David S. Miller
1 parent
894dc24ce7
Exists in
master
and in
6 other branches
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
include/linux/if.h
... | ... | @@ -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 |
net/core/pktgen.c
... | ... | @@ -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); |
net/ethernet/eth.c