diff options
author | Maxim Mikityanskiy <maximmi@nvidia.com> | 2022-01-25 13:52:57 +0300 |
---|---|---|
committer | Saeed Mahameed <saeedm@nvidia.com> | 2022-02-15 09:30:51 +0300 |
commit | 3c87aedd48997f9ab3afdeb2084f6b6163a21db8 (patch) | |
tree | 8aad713fe496497d53263df7fee1a91e2c887519 /drivers | |
parent | ed5f9cf06b20f74c1098d6d62313e3e9af217fcb (diff) | |
download | linux-3c87aedd48997f9ab3afdeb2084f6b6163a21db8.tar.xz |
net/mlx5e: Optimize mlx5e_select_queue
This commit optimizes mlx5e_select_queue for HTB and PTP cases by
short-cutting some checks, without sacrificing performance of the common
non-HTB non-PTP flow.
1. The HTB flow uses the fact that num_tcs == 1 to drop these checks
(it's not possible to attach both mqprio and htb as the root qdisc).
It's also enough to calculate `txq_ix % num_channels` only once, instead
of twice.
2. The PTP flow drops the check for HTB and the second calculation of
`txq_ix % num_channels`.
Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en/selq.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/selq.c b/drivers/net/ethernet/mellanox/mlx5/core/en/selq.c index b8f1a955944d..b3ed5262d2a1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/selq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/selq.c @@ -164,36 +164,62 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb, if (unlikely(!selq)) return 0; - if (unlikely(selq->is_ptp || selq->is_htb)) { - if (unlikely(selq->is_htb)) { - txq_ix = mlx5e_select_htb_queue(priv, skb); - if (txq_ix > 0) - return txq_ix; - } + if (likely(!selq->is_ptp && !selq->is_htb)) { + /* No special queues, netdev_pick_tx returns one of the regular ones. */ + + txq_ix = netdev_pick_tx(dev, skb, NULL); + + if (selq->num_tcs <= 1) + return txq_ix; + + up = mlx5e_get_up(priv, skb); + + /* Normalize any picked txq_ix to [0, num_channels), + * So we can return a txq_ix that matches the channel and + * packet UP. + */ + return txq_ix % selq->num_channels + up * selq->num_channels; + } + + if (unlikely(selq->is_htb)) { + /* num_tcs == 1, shortcut for PTP */ + + txq_ix = mlx5e_select_htb_queue(priv, skb); + if (txq_ix > 0) + return txq_ix; if (unlikely(selq->is_ptp && mlx5e_use_ptpsq(skb))) - return mlx5e_select_ptpsq(dev, skb, selq); + return selq->num_channels; txq_ix = netdev_pick_tx(dev, skb, NULL); + /* Fix netdev_pick_tx() not to choose ptp_channel and HTB txqs. * If they are selected, switch to regular queues. * Driver to select these queues only at mlx5e_select_ptpsq() * and mlx5e_select_htb_queue(). */ - if (unlikely(txq_ix >= selq->num_regular_queues)) - txq_ix %= selq->num_regular_queues; - } else { - txq_ix = netdev_pick_tx(dev, skb, NULL); + return txq_ix % selq->num_channels; } + /* PTP is enabled */ + + if (mlx5e_use_ptpsq(skb)) + return mlx5e_select_ptpsq(dev, skb, selq); + + txq_ix = netdev_pick_tx(dev, skb, NULL); + + /* Normalize any picked txq_ix to [0, num_channels). Queues in range + * [0, num_regular_queues) will be mapped to the corresponding channel + * index, so that we can apply the packet's UP (if num_tcs > 1). + * If netdev_pick_tx() picks ptp_channel, switch to a regular queue, + * because driver should select the PTP only at mlx5e_select_ptpsq(). + */ + txq_ix %= selq->num_channels; + if (selq->num_tcs <= 1) return txq_ix; up = mlx5e_get_up(priv, skb); - /* Normalize any picked txq_ix to [0, num_channels), - * So we can return a txq_ix that matches the channel and - * packet UP. - */ - return txq_ix % selq->num_channels + up * selq->num_channels; + return txq_ix + up * selq->num_channels; } |