Skip to content

Commit 186abfc

Browse files
committed
Merge branch 'mlx5-misc-fixes'
Tariq Toukan says: ==================== mlx5 misc fixes This patchset provides bug fixes to mlx5 driver. This is V2 of the series previously submitted as PR by Saeed: https://lore.kernel.org/netdev/20240326144646.2078893-1-saeed@kernel.org/T/ Series generated against: commit 237f3cf ("xsk: validate user input for XDP_{UMEM|COMPLETION}_FILL_RING") ==================== Link: https://lore.kernel.org/r/20240409190820.227554-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 65acf6e + 7772dc7 commit 186abfc

14 files changed

Lines changed: 131 additions & 53 deletions

File tree

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,15 @@ static inline void mlx5e_ptp_metadata_fifo_push(struct mlx5e_ptp_metadata_fifo *
9595
}
9696

9797
static inline u8
98+
mlx5e_ptp_metadata_fifo_peek(struct mlx5e_ptp_metadata_fifo *fifo)
99+
{
100+
return fifo->data[fifo->mask & fifo->cc];
101+
}
102+
103+
static inline void
98104
mlx5e_ptp_metadata_fifo_pop(struct mlx5e_ptp_metadata_fifo *fifo)
99105
{
100-
return fifo->data[fifo->mask & fifo->cc++];
106+
fifo->cc++;
101107
}
102108

103109
static inline void

drivers/net/ethernet/mellanox/mlx5/core/en/qos.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,25 @@ int mlx5e_open_qos_sq(struct mlx5e_priv *priv, struct mlx5e_channels *chs,
8383

8484
txq_ix = mlx5e_qid_from_qos(chs, node_qid);
8585

86-
WARN_ON(node_qid > priv->htb_max_qos_sqs);
87-
if (node_qid == priv->htb_max_qos_sqs) {
88-
struct mlx5e_sq_stats *stats, **stats_list = NULL;
89-
90-
if (priv->htb_max_qos_sqs == 0) {
91-
stats_list = kvcalloc(mlx5e_qos_max_leaf_nodes(priv->mdev),
92-
sizeof(*stats_list),
93-
GFP_KERNEL);
94-
if (!stats_list)
95-
return -ENOMEM;
96-
}
86+
WARN_ON(node_qid >= mlx5e_htb_cur_leaf_nodes(priv->htb));
87+
if (!priv->htb_qos_sq_stats) {
88+
struct mlx5e_sq_stats **stats_list;
89+
90+
stats_list = kvcalloc(mlx5e_qos_max_leaf_nodes(priv->mdev),
91+
sizeof(*stats_list), GFP_KERNEL);
92+
if (!stats_list)
93+
return -ENOMEM;
94+
95+
WRITE_ONCE(priv->htb_qos_sq_stats, stats_list);
96+
}
97+
98+
if (!priv->htb_qos_sq_stats[node_qid]) {
99+
struct mlx5e_sq_stats *stats;
100+
97101
stats = kzalloc(sizeof(*stats), GFP_KERNEL);
98-
if (!stats) {
99-
kvfree(stats_list);
102+
if (!stats)
100103
return -ENOMEM;
101-
}
102-
if (stats_list)
103-
WRITE_ONCE(priv->htb_qos_sq_stats, stats_list);
104+
104105
WRITE_ONCE(priv->htb_qos_sq_stats[node_qid], stats);
105106
/* Order htb_max_qos_sqs increment after writing the array pointer.
106107
* Pairs with smp_load_acquire in en_stats.c.

drivers/net/ethernet/mellanox/mlx5/core/en/rqt.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ u32 mlx5e_rqt_size(struct mlx5_core_dev *mdev, unsigned int num_channels)
179179
return min_t(u32, rqt_size, max_cap_rqt_size);
180180
}
181181

182+
#define MLX5E_MAX_RQT_SIZE_ALLOWED_WITH_XOR8_HASH 256
183+
184+
unsigned int mlx5e_rqt_max_num_channels_allowed_for_xor8(void)
185+
{
186+
return MLX5E_MAX_RQT_SIZE_ALLOWED_WITH_XOR8_HASH / MLX5E_UNIFORM_SPREAD_RQT_FACTOR;
187+
}
188+
182189
void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt)
183190
{
184191
mlx5_core_destroy_rqt(rqt->mdev, rqt->rqtn);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static inline u32 mlx5e_rqt_get_rqtn(struct mlx5e_rqt *rqt)
3838
}
3939

4040
u32 mlx5e_rqt_size(struct mlx5_core_dev *mdev, unsigned int num_channels);
41+
unsigned int mlx5e_rqt_max_num_channels_allowed_for_xor8(void);
4142
int mlx5e_rqt_redirect_direct(struct mlx5e_rqt *rqt, u32 rqn, u32 *vhca_id);
4243
int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids,
4344
unsigned int num_rqns,

drivers/net/ethernet/mellanox/mlx5/core/en/selq.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ int mlx5e_selq_init(struct mlx5e_selq *selq, struct mutex *state_lock)
5757

5858
void mlx5e_selq_cleanup(struct mlx5e_selq *selq)
5959
{
60+
mutex_lock(selq->state_lock);
6061
WARN_ON_ONCE(selq->is_prepared);
6162

6263
kvfree(selq->standby);
@@ -67,6 +68,7 @@ void mlx5e_selq_cleanup(struct mlx5e_selq *selq)
6768

6869
kvfree(selq->standby);
6970
selq->standby = NULL;
71+
mutex_unlock(selq->state_lock);
7072
}
7173

7274
void mlx5e_selq_prepare_params(struct mlx5e_selq *selq, struct mlx5e_params *params)

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

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,34 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
451451

452452
mutex_lock(&priv->state_lock);
453453

454+
if (mlx5e_rx_res_get_current_hash(priv->rx_res).hfunc == ETH_RSS_HASH_XOR) {
455+
unsigned int xor8_max_channels = mlx5e_rqt_max_num_channels_allowed_for_xor8();
456+
457+
if (count > xor8_max_channels) {
458+
err = -EINVAL;
459+
netdev_err(priv->netdev, "%s: Requested number of channels (%d) exceeds the maximum allowed by the XOR8 RSS hfunc (%d)\n",
460+
__func__, count, xor8_max_channels);
461+
goto out;
462+
}
463+
}
464+
465+
/* If RXFH is configured, changing the channels number is allowed only if
466+
* it does not require resizing the RSS table. This is because the previous
467+
* configuration may no longer be compatible with the new RSS table.
468+
*/
469+
if (netif_is_rxfh_configured(priv->netdev)) {
470+
int cur_rqt_size = mlx5e_rqt_size(priv->mdev, cur_params->num_channels);
471+
int new_rqt_size = mlx5e_rqt_size(priv->mdev, count);
472+
473+
if (new_rqt_size != cur_rqt_size) {
474+
err = -EINVAL;
475+
netdev_err(priv->netdev,
476+
"%s: RXFH is configured, block changing channels number that affects RSS table size (new: %d, current: %d)\n",
477+
__func__, new_rqt_size, cur_rqt_size);
478+
goto out;
479+
}
480+
}
481+
454482
/* Don't allow changing the number of channels if HTB offload is active,
455483
* because the numeration of the QoS SQs will change, while per-queue
456484
* qdiscs are attached.
@@ -1281,17 +1309,30 @@ int mlx5e_set_rxfh(struct net_device *dev, struct ethtool_rxfh_param *rxfh,
12811309
struct mlx5e_priv *priv = netdev_priv(dev);
12821310
u32 *rss_context = &rxfh->rss_context;
12831311
u8 hfunc = rxfh->hfunc;
1312+
unsigned int count;
12841313
int err;
12851314

12861315
mutex_lock(&priv->state_lock);
1316+
1317+
count = priv->channels.params.num_channels;
1318+
1319+
if (hfunc == ETH_RSS_HASH_XOR) {
1320+
unsigned int xor8_max_channels = mlx5e_rqt_max_num_channels_allowed_for_xor8();
1321+
1322+
if (count > xor8_max_channels) {
1323+
err = -EINVAL;
1324+
netdev_err(priv->netdev, "%s: Cannot set RSS hash function to XOR, current number of channels (%d) exceeds the maximum allowed for XOR8 RSS hfunc (%d)\n",
1325+
__func__, count, xor8_max_channels);
1326+
goto unlock;
1327+
}
1328+
}
1329+
12871330
if (*rss_context && rxfh->rss_delete) {
12881331
err = mlx5e_rx_res_rss_destroy(priv->rx_res, *rss_context);
12891332
goto unlock;
12901333
}
12911334

12921335
if (*rss_context == ETH_RXFH_CONTEXT_ALLOC) {
1293-
unsigned int count = priv->channels.params.num_channels;
1294-
12951336
err = mlx5e_rx_res_rss_init(priv->rx_res, rss_context, count);
12961337
if (err)
12971338
goto unlock;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5726,9 +5726,7 @@ void mlx5e_priv_cleanup(struct mlx5e_priv *priv)
57265726
kfree(priv->tx_rates);
57275727
kfree(priv->txq2sq);
57285728
destroy_workqueue(priv->wq);
5729-
mutex_lock(&priv->state_lock);
57305729
mlx5e_selq_cleanup(&priv->selq);
5731-
mutex_unlock(&priv->state_lock);
57325730
free_cpumask_var(priv->scratchpad.cpumask);
57335731

57345732
for (i = 0; i < priv->htb_max_qos_sqs; i++)

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
398398
(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))) {
399399
u8 metadata_index = be32_to_cpu(eseg->flow_table_metadata);
400400

401+
mlx5e_ptp_metadata_fifo_pop(&sq->ptpsq->metadata_freelist);
402+
401403
mlx5e_skb_cb_hwtstamp_init(skb);
402404
mlx5e_ptp_metadata_map_put(&sq->ptpsq->metadata_map, skb,
403405
metadata_index);
@@ -496,9 +498,6 @@ mlx5e_sq_xmit_wqe(struct mlx5e_txqsq *sq, struct sk_buff *skb,
496498

497499
err_drop:
498500
stats->dropped++;
499-
if (unlikely(sq->ptpsq && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)))
500-
mlx5e_ptp_metadata_fifo_push(&sq->ptpsq->metadata_freelist,
501-
be32_to_cpu(eseg->flow_table_metadata));
502501
dev_kfree_skb_any(skb);
503502
mlx5e_tx_flush(sq);
504503
}
@@ -657,7 +656,7 @@ static void mlx5e_cqe_ts_id_eseg(struct mlx5e_ptpsq *ptpsq, struct sk_buff *skb,
657656
{
658657
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
659658
eseg->flow_table_metadata =
660-
cpu_to_be32(mlx5e_ptp_metadata_fifo_pop(&ptpsq->metadata_freelist));
659+
cpu_to_be32(mlx5e_ptp_metadata_fifo_peek(&ptpsq->metadata_freelist));
661660
}
662661

663662
static void mlx5e_txwqe_build_eseg(struct mlx5e_priv *priv, struct mlx5e_txqsq *sq,

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,6 +1868,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18681868
if (err)
18691869
goto abort;
18701870

1871+
dev->priv.eswitch = esw;
18711872
err = esw_offloads_init(esw);
18721873
if (err)
18731874
goto reps_err;
@@ -1892,11 +1893,6 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18921893
esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC;
18931894
else
18941895
esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;
1895-
if (MLX5_ESWITCH_MANAGER(dev) &&
1896-
mlx5_esw_vport_match_metadata_supported(esw))
1897-
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
1898-
1899-
dev->priv.eswitch = esw;
19001896
BLOCKING_INIT_NOTIFIER_HEAD(&esw->n_head);
19011897

19021898
esw_info(dev,
@@ -1908,6 +1904,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
19081904

19091905
reps_err:
19101906
mlx5_esw_vports_cleanup(esw);
1907+
dev->priv.eswitch = NULL;
19111908
abort:
19121909
if (esw->work_queue)
19131910
destroy_workqueue(esw->work_queue);
@@ -1926,7 +1923,6 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
19261923

19271924
esw_info(esw->dev, "cleanup\n");
19281925

1929-
esw->dev->priv.eswitch = NULL;
19301926
destroy_workqueue(esw->work_queue);
19311927
WARN_ON(refcount_read(&esw->qos.refcnt));
19321928
mutex_destroy(&esw->state_lock);
@@ -1937,6 +1933,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
19371933
mutex_destroy(&esw->offloads.encap_tbl_lock);
19381934
mutex_destroy(&esw->offloads.decap_tbl_lock);
19391935
esw_offloads_cleanup(esw);
1936+
esw->dev->priv.eswitch = NULL;
19401937
mlx5_esw_vports_cleanup(esw);
19411938
debugfs_remove_recursive(esw->debugfs_root);
19421939
devl_params_unregister(priv_to_devlink(esw->dev), mlx5_eswitch_params,

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "rdma.h"
4444
#include "en.h"
4545
#include "fs_core.h"
46+
#include "lib/mlx5.h"
4647
#include "lib/devcom.h"
4748
#include "lib/eq.h"
4849
#include "lib/fs_chains.h"
@@ -2476,6 +2477,10 @@ int esw_offloads_init(struct mlx5_eswitch *esw)
24762477
if (err)
24772478
return err;
24782479

2480+
if (MLX5_ESWITCH_MANAGER(esw->dev) &&
2481+
mlx5_esw_vport_match_metadata_supported(esw))
2482+
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
2483+
24792484
err = devl_params_register(priv_to_devlink(esw->dev),
24802485
esw_devlink_params,
24812486
ARRAY_SIZE(esw_devlink_params));
@@ -3707,6 +3712,12 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
37073712
if (esw_mode_from_devlink(mode, &mlx5_mode))
37083713
return -EINVAL;
37093714

3715+
if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV && mlx5_get_sd(esw->dev)) {
3716+
NL_SET_ERR_MSG_MOD(extack,
3717+
"Can't change E-Switch mode to switchdev when multi-PF netdev (Socket Direct) is configured.");
3718+
return -EPERM;
3719+
}
3720+
37103721
mlx5_lag_disable_change(esw->dev);
37113722
err = mlx5_esw_try_lock(esw);
37123723
if (err < 0) {

0 commit comments

Comments
 (0)