aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <stephen@networkplumber.org>2018-03-02 16:49:07 -0500
committerDavid S. Miller <davem@davemloft.net>2018-03-04 22:18:20 -0500
commitb3bf5666a51068ad5ddd89a76ed877101ef3bc16 (patch)
tree14a16259d8d91c8957ba17738b8ca07b62b4adbc
parent68633edaef655ce94e51088ecef5dd4e1d2f6f34 (diff)
hv_netvsc: defer queue selection to VF
When VF is used for accelerated networking it will likely have more queues (and different policy) than the synthetic NIC. This patch defers the queue policy to the VF so that all the queues can be used. This impacts workloads like local generate UDP. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/hyperv/netvsc_drv.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index fa6cf18e7719..5299cfb16ce2 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -298,8 +298,19 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,
298 rcu_read_lock(); 298 rcu_read_lock();
299 vf_netdev = rcu_dereference(ndc->vf_netdev); 299 vf_netdev = rcu_dereference(ndc->vf_netdev);
300 if (vf_netdev) { 300 if (vf_netdev) {
301 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; 301 const struct net_device_ops *vf_ops = vf_netdev->netdev_ops;
302 qdisc_skb_cb(skb)->slave_dev_queue_mapping = skb->queue_mapping; 302
303 if (vf_ops->ndo_select_queue)
304 txq = vf_ops->ndo_select_queue(vf_netdev, skb,
305 accel_priv, fallback);
306 else
307 txq = fallback(vf_netdev, skb);
308
309 /* Record the queue selected by VF so that it can be
310 * used for common case where VF has more queues than
311 * the synthetic device.
312 */
313 qdisc_skb_cb(skb)->slave_dev_queue_mapping = txq;
303 } else { 314 } else {
304 txq = netvsc_pick_tx(ndev, skb); 315 txq = netvsc_pick_tx(ndev, skb);
305 } 316 }