ixgbe: move TC_PRIO_CONTROL check into ixgbe_select_queue()
Move TC_PRIO_CONTROL check and queue remapping into ixgbe_select_queue(). Remapping queues after the qdisc can result in the wrong qdisc queue being stopped with netif_stop_subqueue(). Even if this is resolved and the correct queue is stopped it can result in a queue being blocked by TC_PRIO_CONTROL frames uneccesarily. Moving this into the select_queue routine maintains alignment between tx_rings and qdisc queues. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Acked-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
da3f5cf1f8
Коммит
2ea186ae53
|
@ -5639,8 +5639,14 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
|
|||
return txq;
|
||||
}
|
||||
#endif
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
||||
return (skb->vlan_tci & IXGBE_TX_FLAGS_VLAN_PRIO_MASK) >> 13;
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
if (skb->priority == TC_PRIO_CONTROL)
|
||||
txq = adapter->ring_feature[RING_F_DCB].indices-1;
|
||||
else
|
||||
txq = (skb->vlan_tci & IXGBE_TX_FLAGS_VLAN_PRIO_MASK)
|
||||
>> 13;
|
||||
return txq;
|
||||
}
|
||||
|
||||
return skb_tx_hash(dev, skb);
|
||||
}
|
||||
|
@ -5667,14 +5673,9 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb,
|
|||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
} else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
if (skb->priority != TC_PRIO_CONTROL) {
|
||||
tx_flags |= ((skb->queue_mapping & 0x7) << 13);
|
||||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
} else {
|
||||
skb->queue_mapping =
|
||||
adapter->ring_feature[RING_F_DCB].indices-1;
|
||||
}
|
||||
tx_flags |= ((skb->queue_mapping & 0x7) << 13);
|
||||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
}
|
||||
|
||||
tx_ring = adapter->tx_ring[skb->queue_mapping];
|
||||
|
|
Загрузка…
Ссылка в новой задаче