|
@@ -110,8 +110,20 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
int channel_ix = fallback(dev, skb);
|
|
|
- int up = (netdev_get_num_tc(dev) && skb_vlan_tag_present(skb)) ?
|
|
|
- skb->vlan_tci >> VLAN_PRIO_SHIFT : 0;
|
|
|
+ int up = 0;
|
|
|
+
|
|
|
+ if (!netdev_get_num_tc(dev))
|
|
|
+ return channel_ix;
|
|
|
+
|
|
|
+ if (skb_vlan_tag_present(skb))
|
|
|
+ up = skb->vlan_tci >> VLAN_PRIO_SHIFT;
|
|
|
+
|
|
|
+ /* channel_ix can be larger than num_channels since
|
|
|
+ * dev->num_real_tx_queues = num_channels * num_tc
|
|
|
+ */
|
|
|
+ if (channel_ix >= priv->params.num_channels)
|
|
|
+ channel_ix = reciprocal_scale(channel_ix,
|
|
|
+ priv->params.num_channels);
|
|
|
|
|
|
return priv->channeltc_to_txq_map[channel_ix][up];
|
|
|
}
|