diff options
| author | Eric Dumazet <edumazet@google.com> | 2017-04-19 12:59:26 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-04-21 13:24:06 -0400 |
| commit | 39fba7835aacda65284a86e611774cbba71dac20 (patch) | |
| tree | cc445a8119f1eee88c561ee3bb8b0339b98f66c5 | |
| parent | 6bc6895bdd6744e0136eaa4a11fbdb20a7db4e40 (diff) | |
kaweth: use skb_cow_head() to deal with cloned skbs
We can use skb_cow_head() to properly deal with clones,
especially the ones coming from TCP stack that allow their head being
modified. This avoids a copy.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: James Hughes <james.hughes@raspberrypi.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/usb/kaweth.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 876f02f4945e..2a2c3edb6bad 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
| @@ -803,18 +803,12 @@ static netdev_tx_t kaweth_start_xmit(struct sk_buff *skb, | |||
| 803 | } | 803 | } |
| 804 | 804 | ||
| 805 | /* We now decide whether we can put our special header into the sk_buff */ | 805 | /* We now decide whether we can put our special header into the sk_buff */ |
| 806 | if (skb_cloned(skb) || skb_headroom(skb) < 2) { | 806 | if (skb_cow_head(skb, 2)) { |
| 807 | /* no such luck - we make our own */ | 807 | kaweth->stats.tx_errors++; |
| 808 | struct sk_buff *copied_skb; | 808 | netif_start_queue(net); |
| 809 | copied_skb = skb_copy_expand(skb, 2, 0, GFP_ATOMIC); | 809 | spin_unlock_irq(&kaweth->device_lock); |
| 810 | dev_kfree_skb_irq(skb); | 810 | dev_kfree_skb_any(skb); |
| 811 | skb = copied_skb; | 811 | return NETDEV_TX_OK; |
| 812 | if (!copied_skb) { | ||
| 813 | kaweth->stats.tx_errors++; | ||
| 814 | netif_start_queue(net); | ||
| 815 | spin_unlock_irq(&kaweth->device_lock); | ||
| 816 | return NETDEV_TX_OK; | ||
| 817 | } | ||
| 818 | } | 812 | } |
| 819 | 813 | ||
| 820 | private_header = (__le16 *)__skb_push(skb, 2); | 814 | private_header = (__le16 *)__skb_push(skb, 2); |
