diff options
author | Krishna Kumar <krkumar2@in.ibm.com> | 2010-01-21 04:26:29 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-21 04:26:29 -0500 |
commit | 4b258461c0b31ded170a1a56b944b0fded1c887b (patch) | |
tree | ce1fa90ec4fc8ea8e5fb4646f3e5a8d88f98dac3 /net/core | |
parent | 5f8cbc13225eadd981c817f7d14b8deab61ebfaa (diff) |
net: Optimize non-gso test checks
Avoid checking twice whether skb needs to be linearized, if one
skb_linearize was already done.
Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 5747b9edc1b..4fad9db417b 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1982,6 +1982,21 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, | |||
1982 | return rc; | 1982 | return rc; |
1983 | } | 1983 | } |
1984 | 1984 | ||
1985 | /* | ||
1986 | * Returns true if either: | ||
1987 | * 1. skb has frag_list and the device doesn't support FRAGLIST, or | ||
1988 | * 2. skb is fragmented and the device does not support SG, or if | ||
1989 | * at least one of fragments is in highmem and device does not | ||
1990 | * support DMA from it. | ||
1991 | */ | ||
1992 | static inline int skb_needs_linearize(struct sk_buff *skb, | ||
1993 | struct net_device *dev) | ||
1994 | { | ||
1995 | return (skb_has_frags(skb) && !(dev->features & NETIF_F_FRAGLIST)) || | ||
1996 | (skb_shinfo(skb)->nr_frags && (!(dev->features & NETIF_F_SG) || | ||
1997 | illegal_highdma(dev, skb))); | ||
1998 | } | ||
1999 | |||
1985 | /** | 2000 | /** |
1986 | * dev_queue_xmit - transmit a buffer | 2001 | * dev_queue_xmit - transmit a buffer |
1987 | * @skb: buffer to transmit | 2002 | * @skb: buffer to transmit |
@@ -2018,18 +2033,8 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
2018 | if (netif_needs_gso(dev, skb)) | 2033 | if (netif_needs_gso(dev, skb)) |
2019 | goto gso; | 2034 | goto gso; |
2020 | 2035 | ||
2021 | if (skb_has_frags(skb) && | 2036 | /* Convert a paged skb to linear, if required */ |
2022 | !(dev->features & NETIF_F_FRAGLIST) && | 2037 | if (skb_needs_linearize(skb, dev) && __skb_linearize(skb)) |
2023 | __skb_linearize(skb)) | ||
2024 | goto out_kfree_skb; | ||
2025 | |||
2026 | /* Fragmented skb is linearized if device does not support SG, | ||
2027 | * or if at least one of fragments is in highmem and device | ||
2028 | * does not support DMA from it. | ||
2029 | */ | ||
2030 | if (skb_shinfo(skb)->nr_frags && | ||
2031 | (!(dev->features & NETIF_F_SG) || illegal_highdma(dev, skb)) && | ||
2032 | __skb_linearize(skb)) | ||
2033 | goto out_kfree_skb; | 2038 | goto out_kfree_skb; |
2034 | 2039 | ||
2035 | /* If packet is not checksummed and device does not support | 2040 | /* If packet is not checksummed and device does not support |