Message ID | 20091015055702.30145.41799.sendpatchset@localhost.localdomain |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
Krishna Kumar a écrit : > From: Krishna Kumar <krkumar2@in.ibm.com> > > 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 skb rx was recorded, or if the device has a queue select > handler. Next iterations of dev_pick_tx uses the cached value of > sk_tx_queue_mapping. > > Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com> > --- > net/core/dev.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff -ruNp org/net/core/dev.c new/net/core/dev.c > --- org/net/core/dev.c 2009-10-14 17:59:40.000000000 +0530 > +++ new/net/core/dev.c 2009-10-14 18:00:04.000000000 +0530 > @@ -1791,13 +1791,25 @@ EXPORT_SYMBOL(skb_tx_hash); > static struct netdev_queue *dev_pick_tx(struct net_device *dev, > struct sk_buff *skb) > { > - const struct net_device_ops *ops = dev->netdev_ops; > - u16 queue_index = 0; > + u16 queue_index; > + struct sock *sk = skb->sk; > + > + if (sk_tx_queue_recorded(sk)) { > + queue_index = sk_get_tx_queue(sk); > + } else { > + const struct net_device_ops *ops = dev->netdev_ops; > > - if (ops->ndo_select_queue) > - queue_index = ops->ndo_select_queue(dev, skb); > - else if (dev->real_num_tx_queues > 1) > - queue_index = skb_tx_hash(dev, skb); > + if (ops->ndo_select_queue) { > + queue_index = ops->ndo_select_queue(dev, skb); > + } else { > + queue_index = 0; > + if (dev->real_num_tx_queues > 1) > + queue_index = skb_tx_hash(dev, skb); > + > + if (sk && sk->sk_dst_cache) > + sk_record_tx_queue(sk, queue_index); > + } > + } > > skb_set_queue_mapping(skb, queue_index); > return netdev_get_tx_queue(dev, queue_index); > > Hmm, why not cache ops->ndo_select_queue(dev, skb) choice too ? if (ops->ndo_select_queue) queue_index = ops->ndo_select_queue(dev, skb); else { queue_index = 0; if (dev->real_num_tx_queues > 1) queue_index = skb_tx_hash(dev, skb); } if (sk && sk->sk_dst_cache) sk_record_tx_queue(sk, queue_index); Or should ndo_select_queue() method take care of calling sk_record_tx_queue() itself ? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff -ruNp org/net/core/dev.c new/net/core/dev.c --- org/net/core/dev.c 2009-10-14 17:59:40.000000000 +0530 +++ new/net/core/dev.c 2009-10-14 18:00:04.000000000 +0530 @@ -1791,13 +1791,25 @@ EXPORT_SYMBOL(skb_tx_hash); static struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb) { - const struct net_device_ops *ops = dev->netdev_ops; - u16 queue_index = 0; + u16 queue_index; + struct sock *sk = skb->sk; + + if (sk_tx_queue_recorded(sk)) { + queue_index = sk_get_tx_queue(sk); + } else { + const struct net_device_ops *ops = dev->netdev_ops; - if (ops->ndo_select_queue) - queue_index = ops->ndo_select_queue(dev, skb); - else if (dev->real_num_tx_queues > 1) - queue_index = skb_tx_hash(dev, skb); + if (ops->ndo_select_queue) { + queue_index = ops->ndo_select_queue(dev, skb); + } else { + queue_index = 0; + if (dev->real_num_tx_queues > 1) + queue_index = skb_tx_hash(dev, skb); + + if (sk && sk->sk_dst_cache) + sk_record_tx_queue(sk, queue_index); + } + } skb_set_queue_mapping(skb, queue_index); return netdev_get_tx_queue(dev, queue_index);