diff options
-rw-r--r-- | drivers/net/xen-netfront.c | 2 | ||||
-rw-r--r-- | include/linux/netdevice.h | 12 | ||||
-rw-r--r-- | net/core/dev.c | 8 |
3 files changed, 10 insertions, 12 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index cdbeec9f83ea..546de5749824 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -488,7 +488,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
488 | 488 | ||
489 | if (unlikely(!netif_carrier_ok(dev) || | 489 | if (unlikely(!netif_carrier_ok(dev) || |
490 | (frags > 1 && !xennet_can_sg(dev)) || | 490 | (frags > 1 && !xennet_can_sg(dev)) || |
491 | netif_needs_gso(dev, skb))) { | 491 | netif_needs_gso(skb, netif_skb_features(skb)))) { |
492 | spin_unlock_irq(&np->tx_lock); | 492 | spin_unlock_irq(&np->tx_lock); |
493 | goto drop; | 493 | goto drop; |
494 | } | 494 | } |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d4dac09a5ad2..de2bfe6da359 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -2317,16 +2317,10 @@ static inline int skb_gso_ok(struct sk_buff *skb, int features) | |||
2317 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); | 2317 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); |
2318 | } | 2318 | } |
2319 | 2319 | ||
2320 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | 2320 | static inline int netif_needs_gso(struct sk_buff *skb, int features) |
2321 | { | 2321 | { |
2322 | if (skb_is_gso(skb)) { | 2322 | return skb_is_gso(skb) && (!skb_gso_ok(skb, features) || |
2323 | int features = netif_skb_features(skb); | 2323 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); |
2324 | |||
2325 | return (!skb_gso_ok(skb, features) || | ||
2326 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | ||
2327 | } | ||
2328 | |||
2329 | return 0; | ||
2330 | } | 2324 | } |
2331 | 2325 | ||
2332 | static inline void netif_set_gso_max_size(struct net_device *dev, | 2326 | static inline void netif_set_gso_max_size(struct net_device *dev, |
diff --git a/net/core/dev.c b/net/core/dev.c index a51dfd7b56fb..1444ed3861a0 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2086,6 +2086,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
2086 | int rc = NETDEV_TX_OK; | 2086 | int rc = NETDEV_TX_OK; |
2087 | 2087 | ||
2088 | if (likely(!skb->next)) { | 2088 | if (likely(!skb->next)) { |
2089 | int features; | ||
2090 | |||
2089 | /* | 2091 | /* |
2090 | * If device doesnt need skb->dst, release it right now while | 2092 | * If device doesnt need skb->dst, release it right now while |
2091 | * its hot in this cpu cache | 2093 | * its hot in this cpu cache |
@@ -2098,8 +2100,10 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
2098 | 2100 | ||
2099 | skb_orphan_try(skb); | 2101 | skb_orphan_try(skb); |
2100 | 2102 | ||
2103 | features = netif_skb_features(skb); | ||
2104 | |||
2101 | if (vlan_tx_tag_present(skb) && | 2105 | if (vlan_tx_tag_present(skb) && |
2102 | !(dev->features & NETIF_F_HW_VLAN_TX)) { | 2106 | !(features & NETIF_F_HW_VLAN_TX)) { |
2103 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); | 2107 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); |
2104 | if (unlikely(!skb)) | 2108 | if (unlikely(!skb)) |
2105 | goto out; | 2109 | goto out; |
@@ -2107,7 +2111,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
2107 | skb->vlan_tci = 0; | 2111 | skb->vlan_tci = 0; |
2108 | } | 2112 | } |
2109 | 2113 | ||
2110 | if (netif_needs_gso(dev, skb)) { | 2114 | if (netif_needs_gso(skb, features)) { |
2111 | if (unlikely(dev_gso_segment(skb))) | 2115 | if (unlikely(dev_gso_segment(skb))) |
2112 | goto out_kfree_skb; | 2116 | goto out_kfree_skb; |
2113 | if (skb->next) | 2117 | if (skb->next) |