diff options
author | Krishna Kumar <krkumar2@in.ibm.com> | 2009-10-19 19:50:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-10-20 21:55:47 -0400 |
commit | a4ee3ce3293dc931fab19beb472a8bde1295aebe (patch) | |
tree | ca93936887aaf70a0d6b2cd2152a56c9b93a075e /net/core/dev.c | |
parent | ea94ff3b55188df157a8740bdf3976a87563d705 (diff) |
net: Use sk_tx_queue_mapping for connected sockets
For connected sockets, the first run of dev_pick_tx saves the
calculated txq in sk_tx_queue_mapping. This is not saved if
either the device has a queue select or the socket is not
connected. Next iterations of dev_pick_tx uses the cached value
of sk_tx_queue_mapping.
Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 28b0b9e992a0..fa88dcd476d6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1791,13 +1791,25 @@ EXPORT_SYMBOL(skb_tx_hash); | |||
1791 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, | 1791 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, |
1792 | struct sk_buff *skb) | 1792 | struct sk_buff *skb) |
1793 | { | 1793 | { |
1794 | const struct net_device_ops *ops = dev->netdev_ops; | 1794 | u16 queue_index; |
1795 | u16 queue_index = 0; | 1795 | struct sock *sk = skb->sk; |
1796 | |||
1797 | if (sk_tx_queue_recorded(sk)) { | ||
1798 | queue_index = sk_tx_queue_get(sk); | ||
1799 | } else { | ||
1800 | const struct net_device_ops *ops = dev->netdev_ops; | ||
1796 | 1801 | ||
1797 | if (ops->ndo_select_queue) | 1802 | if (ops->ndo_select_queue) { |
1798 | queue_index = ops->ndo_select_queue(dev, skb); | 1803 | queue_index = ops->ndo_select_queue(dev, skb); |
1799 | else if (dev->real_num_tx_queues > 1) | 1804 | } else { |
1800 | queue_index = skb_tx_hash(dev, skb); | 1805 | queue_index = 0; |
1806 | if (dev->real_num_tx_queues > 1) | ||
1807 | queue_index = skb_tx_hash(dev, skb); | ||
1808 | |||
1809 | if (sk && sk->sk_dst_cache) | ||
1810 | sk_tx_queue_set(sk, queue_index); | ||
1811 | } | ||
1812 | } | ||
1801 | 1813 | ||
1802 | skb_set_queue_mapping(skb, queue_index); | 1814 | skb_set_queue_mapping(skb, queue_index); |
1803 | return netdev_get_tx_queue(dev, queue_index); | 1815 | return netdev_get_tx_queue(dev, queue_index); |