Skip to content

Commit c55d8b1

Browse files
Eran Ben ElishaSaeed Mahameed
authored andcommitted
net/mlx5e: Fix TXQ indices to be sequential
Cited patch changed (channel index, tc) => (TXQ index) mapping to be a static one, in order to keep indices consistent when changing number of channels or TCs. For 32 channels (OOB) and 8 TCs, real num of TXQs is 256. When reducing the amount of channels to 8, the real num of TXQs will be changed to 64. This indices method is buggy: - Channel #0, TC 3, the TXQ index is 96. - Index 8 is not valid, as there is no such TXQ from driver perspective (As it represents channel #8, TC 0, which is not valid with the above configuration). As part of driver's select queue, it calls netdev_pick_tx which returns an index in the range of real number of TXQs. Depends on the return value, with the examples above, driver could have returned index larger than the real number of tx queues, or crash the kernel as it tries to read invalid address of SQ which was not allocated. Fix that by allocating sequential TXQ indices, and hold a new mapping between (channel index, tc) => (real TXQ index). This mapping will be updated as part of priv channels activation, and is used in mlx5e_select_queue to find the selected queue index. The existing indices mapping (channel_tc2txq) is no longer needed, as it is used only for statistics structures and can be calculated on run time. Delete its definintion and updates. Fixes: 8bfaf07 ("net/mlx5e: Present SW stats when state is not opened") Signed-off-by: Eran Ben Elisha <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent a350d2e commit c55d8b1

File tree

4 files changed

+15
-22
lines changed

4 files changed

+15
-22
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ struct mlx5e_xsk {
816816
struct mlx5e_priv {
817817
/* priv data path fields - start */
818818
struct mlx5e_txqsq *txq2sq[MLX5E_MAX_NUM_CHANNELS * MLX5E_MAX_NUM_TC];
819-
int channel_tc2txq[MLX5E_MAX_NUM_CHANNELS][MLX5E_MAX_NUM_TC];
819+
int channel_tc2realtxq[MLX5E_MAX_NUM_CHANNELS][MLX5E_MAX_NUM_TC];
820820
#ifdef CONFIG_MLX5_CORE_EN_DCB
821821
struct mlx5e_dcbx_dp dcbx_dp;
822822
#endif

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,11 +1691,10 @@ static int mlx5e_open_sqs(struct mlx5e_channel *c,
16911691
struct mlx5e_params *params,
16921692
struct mlx5e_channel_param *cparam)
16931693
{
1694-
struct mlx5e_priv *priv = c->priv;
16951694
int err, tc;
16961695

16971696
for (tc = 0; tc < params->num_tc; tc++) {
1698-
int txq_ix = c->ix + tc * priv->max_nch;
1697+
int txq_ix = c->ix + tc * params->num_channels;
16991698

17001699
err = mlx5e_open_txqsq(c, c->priv->tisn[c->lag_port][tc], txq_ix,
17011700
params, &cparam->sq, &c->sq[tc], tc);
@@ -2876,26 +2875,21 @@ static void mlx5e_netdev_set_tcs(struct net_device *netdev)
28762875
netdev_set_tc_queue(netdev, tc, nch, 0);
28772876
}
28782877

2879-
static void mlx5e_build_tc2txq_maps(struct mlx5e_priv *priv)
2878+
static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
28802879
{
2881-
int i, tc;
2880+
int i, ch;
28822881

2883-
for (i = 0; i < priv->max_nch; i++)
2884-
for (tc = 0; tc < priv->profile->max_tc; tc++)
2885-
priv->channel_tc2txq[i][tc] = i + tc * priv->max_nch;
2886-
}
2882+
ch = priv->channels.num;
28872883

2888-
static void mlx5e_build_tx2sq_maps(struct mlx5e_priv *priv)
2889-
{
2890-
struct mlx5e_channel *c;
2891-
struct mlx5e_txqsq *sq;
2892-
int i, tc;
2884+
for (i = 0; i < ch; i++) {
2885+
int tc;
2886+
2887+
for (tc = 0; tc < priv->channels.params.num_tc; tc++) {
2888+
struct mlx5e_channel *c = priv->channels.c[i];
2889+
struct mlx5e_txqsq *sq = &c->sq[tc];
28932890

2894-
for (i = 0; i < priv->channels.num; i++) {
2895-
c = priv->channels.c[i];
2896-
for (tc = 0; tc < c->num_tc; tc++) {
2897-
sq = &c->sq[tc];
28982891
priv->txq2sq[sq->txq_ix] = sq;
2892+
priv->channel_tc2realtxq[i][tc] = i + tc * ch;
28992893
}
29002894
}
29012895
}
@@ -2910,7 +2904,7 @@ void mlx5e_activate_priv_channels(struct mlx5e_priv *priv)
29102904
netif_set_real_num_tx_queues(netdev, num_txqs);
29112905
netif_set_real_num_rx_queues(netdev, num_rxqs);
29122906

2913-
mlx5e_build_tx2sq_maps(priv);
2907+
mlx5e_build_txq_maps(priv);
29142908
mlx5e_activate_channels(&priv->channels);
29152909
mlx5e_xdp_tx_enable(priv);
29162910
netif_tx_start_all_queues(priv->netdev);
@@ -5021,7 +5015,6 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
50215015
if (err)
50225016
mlx5_core_err(mdev, "TLS initialization failed, %d\n", err);
50235017
mlx5e_build_nic_netdev(netdev);
5024-
mlx5e_build_tc2txq_maps(priv);
50255018
mlx5e_health_create_reporters(priv);
50265019

50275020
return 0;

drivers/net/ethernet/mellanox/mlx5/core/en_stats.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,7 @@ static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
16011601
for (j = 0; j < NUM_SQ_STATS; j++)
16021602
sprintf(data + (idx++) * ETH_GSTRING_LEN,
16031603
sq_stats_desc[j].format,
1604-
priv->channel_tc2txq[i][tc]);
1604+
i + tc * max_nch);
16051605

16061606
for (i = 0; i < max_nch; i++) {
16071607
for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)

drivers/net/ethernet/mellanox/mlx5/core/en_tx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
9393
if (txq_ix >= num_channels)
9494
txq_ix = priv->txq2sq[txq_ix]->ch_ix;
9595

96-
return priv->channel_tc2txq[txq_ix][up];
96+
return priv->channel_tc2realtxq[txq_ix][up];
9797
}
9898

9999
static inline int mlx5e_skb_l2_header_offset(struct sk_buff *skb)

0 commit comments

Comments
 (0)