diff options
| author | Jesse Gross <jesse@nicira.com> | 2011-01-09 01:23:33 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-01-10 02:35:34 -0500 |
| commit | 91ecb63c074d802f8cf103f1dafb4aed24d0f24c (patch) | |
| tree | b35dd6b8de64ceeeee22dad0ee8f2794a662d401 /net/core | |
| parent | fc741216db156994c554ac31c1151fe0e00d8f0e (diff) | |
net offloading: Convert dev_gso_segment() to use precomputed features.
This switches dev_gso_segment() to use the device features computed
by the centralized routine. In doing so, it fixes a problem where
it would always use dev->features, instead of those appropriate
to the number of vlan tags if any are present.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 1444ed3861a..4cd3e84e129 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1971,16 +1971,14 @@ static void dev_gso_skb_destructor(struct sk_buff *skb) | |||
| 1971 | /** | 1971 | /** |
| 1972 | * dev_gso_segment - Perform emulated hardware segmentation on skb. | 1972 | * dev_gso_segment - Perform emulated hardware segmentation on skb. |
| 1973 | * @skb: buffer to segment | 1973 | * @skb: buffer to segment |
| 1974 | * @features: device features as applicable to this skb | ||
| 1974 | * | 1975 | * |
| 1975 | * This function segments the given skb and stores the list of segments | 1976 | * This function segments the given skb and stores the list of segments |
| 1976 | * in skb->next. | 1977 | * in skb->next. |
| 1977 | */ | 1978 | */ |
| 1978 | static int dev_gso_segment(struct sk_buff *skb) | 1979 | static int dev_gso_segment(struct sk_buff *skb, int features) |
| 1979 | { | 1980 | { |
| 1980 | struct net_device *dev = skb->dev; | ||
| 1981 | struct sk_buff *segs; | 1981 | struct sk_buff *segs; |
| 1982 | int features = dev->features & ~(illegal_highdma(dev, skb) ? | ||
| 1983 | NETIF_F_SG : 0); | ||
| 1984 | 1982 | ||
| 1985 | segs = skb_gso_segment(skb, features); | 1983 | segs = skb_gso_segment(skb, features); |
| 1986 | 1984 | ||
| @@ -2112,7 +2110,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 2112 | } | 2110 | } |
| 2113 | 2111 | ||
| 2114 | if (netif_needs_gso(skb, features)) { | 2112 | if (netif_needs_gso(skb, features)) { |
| 2115 | if (unlikely(dev_gso_segment(skb))) | 2113 | if (unlikely(dev_gso_segment(skb, features))) |
| 2116 | goto out_kfree_skb; | 2114 | goto out_kfree_skb; |
| 2117 | if (skb->next) | 2115 | if (skb->next) |
| 2118 | goto gso; | 2116 | goto gso; |
