aboutsummaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorKrishna Kumar <krkumar2@in.ibm.com>2010-01-21 04:26:29 -0500
committerDavid S. Miller <davem@davemloft.net>2010-01-21 04:26:29 -0500
commit4b258461c0b31ded170a1a56b944b0fded1c887b (patch)
treece1fa90ec4fc8ea8e5fb4646f3e5a8d88f98dac3 /net/core
parent5f8cbc13225eadd981c817f7d14b8deab61ebfaa (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.c29
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 */
1992static 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