Skip to content

Commit 5da4597

Browse files
author
Paolo Abeni
committed
Merge tag 'mlx5-fixes-2024-01-24' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5 fixes 2024-01-24 This series provides bug fixes to mlx5 driver. Please pull and let me know if there is any problem. * tag 'mlx5-fixes-2024-01-24' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5e: fix a potential double-free in fs_any_create_groups net/mlx5e: fix a double-free in arfs_create_groups net/mlx5e: Ignore IPsec replay window values on sender side net/mlx5e: Allow software parsing when IPsec crypto is enabled net/mlx5: Use mlx5 device constant for selecting CQ period mode for ASO net/mlx5: DR, Can't go to uplink vport on RX rule net/mlx5: DR, Use the right GVMI number for drop action net/mlx5: Bridge, fix multicast packets sent to uplink net/mlx5: Fix a WARN upon a callback command failure net/mlx5e: Fix peer flow lists handling net/mlx5e: Fix inconsistent hairpin RQT sizes net/mlx5e: Fix operation precedence bug in port timestamping napi_poll context net/mlx5: Fix query of sd_group field net/mlx5e: Use the correct lag ports number when creating TISes ==================== Link: https://lore.kernel.org/r/20240124081855.115410-1-saeed@kernel.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2 parents fdf8e6d + aef855d commit 5da4597

File tree

20 files changed

+99
-41
lines changed

20 files changed

+99
-41
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,14 +1923,15 @@ static void cmd_status_log(struct mlx5_core_dev *dev, u16 opcode, u8 status,
19231923
{
19241924
const char *namep = mlx5_command_str(opcode);
19251925
struct mlx5_cmd_stats *stats;
1926+
unsigned long flags;
19261927

19271928
if (!err || !(strcmp(namep, "unknown command opcode")))
19281929
return;
19291930

19301931
stats = xa_load(&dev->cmd.stats, opcode);
19311932
if (!stats)
19321933
return;
1933-
spin_lock_irq(&stats->lock);
1934+
spin_lock_irqsave(&stats->lock, flags);
19341935
stats->failed++;
19351936
if (err < 0)
19361937
stats->last_failed_errno = -err;
@@ -1939,7 +1940,7 @@ static void cmd_status_log(struct mlx5_core_dev *dev, u16 opcode, u8 status,
19391940
stats->last_failed_mbox_status = status;
19401941
stats->last_failed_syndrome = syndrome;
19411942
}
1942-
spin_unlock_irq(&stats->lock);
1943+
spin_unlock_irqrestore(&stats->lock, flags);
19431944
}
19441945

19451946
/* preserve -EREMOTEIO for outbox.status != OK, otherwise return err as is */

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,7 @@ static inline bool mlx5_tx_swp_supported(struct mlx5_core_dev *mdev)
11241124
extern const struct ethtool_ops mlx5e_ethtool_ops;
11251125

11261126
int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey);
1127-
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev);
1127+
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises);
11281128
void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev);
11291129
int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
11301130
bool enable_mc_lb);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ static int fs_any_create_groups(struct mlx5e_flow_table *ft)
436436
in = kvzalloc(inlen, GFP_KERNEL);
437437
if (!in || !ft->g) {
438438
kfree(ft->g);
439+
ft->g = NULL;
439440
kvfree(in);
440441
return -ENOMEM;
441442
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,8 +1064,8 @@ void mlx5e_build_sq_param(struct mlx5_core_dev *mdev,
10641064
void *wq = MLX5_ADDR_OF(sqc, sqc, wq);
10651065
bool allow_swp;
10661066

1067-
allow_swp =
1068-
mlx5_geneve_tx_allowed(mdev) || !!mlx5_ipsec_device_caps(mdev);
1067+
allow_swp = mlx5_geneve_tx_allowed(mdev) ||
1068+
(mlx5_ipsec_device_caps(mdev) & MLX5_IPSEC_CAP_CRYPTO);
10691069
mlx5e_build_sq_param_common(mdev, param);
10701070
MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size);
10711071
MLX5_SET(sqc, sqc, allow_swp, allow_swp);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static void mlx5e_ptp_handle_ts_cqe(struct mlx5e_ptpsq *ptpsq,
213213
mlx5e_ptpsq_mark_ts_cqes_undelivered(ptpsq, hwtstamp);
214214
out:
215215
napi_consume_skb(skb, budget);
216-
md_buff[*md_buff_sz++] = metadata_id;
216+
md_buff[(*md_buff_sz)++] = metadata_id;
217217
if (unlikely(mlx5e_ptp_metadata_map_unhealthy(&ptpsq->metadata_map)) &&
218218
!test_and_set_bit(MLX5E_SQ_STATE_RECOVERING, &sq->state))
219219
queue_work(ptpsq->txqsq.priv->wq, &ptpsq->report_unhealthy_work);

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,12 +336,17 @@ void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
336336
/* iv len */
337337
aes_gcm->icv_len = x->aead->alg_icv_len;
338338

339+
attrs->dir = x->xso.dir;
340+
339341
/* esn */
340342
if (x->props.flags & XFRM_STATE_ESN) {
341343
attrs->replay_esn.trigger = true;
342344
attrs->replay_esn.esn = sa_entry->esn_state.esn;
343345
attrs->replay_esn.esn_msb = sa_entry->esn_state.esn_msb;
344346
attrs->replay_esn.overlap = sa_entry->esn_state.overlap;
347+
if (attrs->dir == XFRM_DEV_OFFLOAD_OUT)
348+
goto skip_replay_window;
349+
345350
switch (x->replay_esn->replay_window) {
346351
case 32:
347352
attrs->replay_esn.replay_window =
@@ -365,7 +370,7 @@ void mlx5e_ipsec_build_accel_xfrm_attrs(struct mlx5e_ipsec_sa_entry *sa_entry,
365370
}
366371
}
367372

368-
attrs->dir = x->xso.dir;
373+
skip_replay_window:
369374
/* spi */
370375
attrs->spi = be32_to_cpu(x->id.spi);
371376

@@ -501,7 +506,8 @@ static int mlx5e_xfrm_validate_state(struct mlx5_core_dev *mdev,
501506
return -EINVAL;
502507
}
503508

504-
if (x->replay_esn && x->replay_esn->replay_window != 32 &&
509+
if (x->replay_esn && x->xso.dir == XFRM_DEV_OFFLOAD_IN &&
510+
x->replay_esn->replay_window != 32 &&
505511
x->replay_esn->replay_window != 64 &&
506512
x->replay_esn->replay_window != 128 &&
507513
x->replay_esn->replay_window != 256) {

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -254,11 +254,13 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft,
254254

255255
ft->g = kcalloc(MLX5E_ARFS_NUM_GROUPS,
256256
sizeof(*ft->g), GFP_KERNEL);
257-
in = kvzalloc(inlen, GFP_KERNEL);
258-
if (!in || !ft->g) {
259-
kfree(ft->g);
260-
kvfree(in);
257+
if (!ft->g)
261258
return -ENOMEM;
259+
260+
in = kvzalloc(inlen, GFP_KERNEL);
261+
if (!in) {
262+
err = -ENOMEM;
263+
goto err_free_g;
262264
}
263265

264266
mc = MLX5_ADDR_OF(create_flow_group_in, in, match_criteria);
@@ -278,7 +280,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft,
278280
break;
279281
default:
280282
err = -EINVAL;
281-
goto out;
283+
goto err_free_in;
282284
}
283285

284286
switch (type) {
@@ -300,7 +302,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft,
300302
break;
301303
default:
302304
err = -EINVAL;
303-
goto out;
305+
goto err_free_in;
304306
}
305307

306308
MLX5_SET_CFG(in, match_criteria_enable, MLX5_MATCH_OUTER_HEADERS);
@@ -309,7 +311,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft,
309311
MLX5_SET_CFG(in, end_flow_index, ix - 1);
310312
ft->g[ft->num_groups] = mlx5_create_flow_group(ft->t, in);
311313
if (IS_ERR(ft->g[ft->num_groups]))
312-
goto err;
314+
goto err_clean_group;
313315
ft->num_groups++;
314316

315317
memset(in, 0, inlen);
@@ -318,18 +320,20 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft,
318320
MLX5_SET_CFG(in, end_flow_index, ix - 1);
319321
ft->g[ft->num_groups] = mlx5_create_flow_group(ft->t, in);
320322
if (IS_ERR(ft->g[ft->num_groups]))
321-
goto err;
323+
goto err_clean_group;
322324
ft->num_groups++;
323325

324326
kvfree(in);
325327
return 0;
326328

327-
err:
329+
err_clean_group:
328330
err = PTR_ERR(ft->g[ft->num_groups]);
329331
ft->g[ft->num_groups] = NULL;
330-
out:
332+
err_free_in:
331333
kvfree(in);
332-
334+
err_free_g:
335+
kfree(ft->g);
336+
ft->g = NULL;
333337
return err;
334338
}
335339

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static void mlx5e_destroy_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PO
9595
{
9696
int tc, i;
9797

98-
for (i = 0; i < MLX5_MAX_PORTS; i++)
98+
for (i = 0; i < mlx5e_get_num_lag_ports(mdev); i++)
9999
for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++)
100100
mlx5e_destroy_tis(mdev, tisn[i][tc]);
101101
}
@@ -110,7 +110,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT
110110
int tc, i;
111111
int err;
112112

113-
for (i = 0; i < MLX5_MAX_PORTS; i++) {
113+
for (i = 0; i < mlx5e_get_num_lag_ports(mdev); i++) {
114114
for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++) {
115115
u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
116116
void *tisc;
@@ -140,7 +140,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT
140140
return err;
141141
}
142142

143-
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
143+
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises)
144144
{
145145
struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
146146
int err;
@@ -169,11 +169,15 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
169169
goto err_destroy_mkey;
170170
}
171171

172-
err = mlx5e_create_tises(mdev, res->tisn);
173-
if (err) {
174-
mlx5_core_err(mdev, "alloc tises failed, %d\n", err);
175-
goto err_destroy_bfreg;
172+
if (create_tises) {
173+
err = mlx5e_create_tises(mdev, res->tisn);
174+
if (err) {
175+
mlx5_core_err(mdev, "alloc tises failed, %d\n", err);
176+
goto err_destroy_bfreg;
177+
}
178+
res->tisn_valid = true;
176179
}
180+
177181
INIT_LIST_HEAD(&res->td.tirs_list);
178182
mutex_init(&res->td.list_lock);
179183

@@ -203,7 +207,8 @@ void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
203207

204208
mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv);
205209
mdev->mlx5e_res.dek_priv = NULL;
206-
mlx5e_destroy_tises(mdev, res->tisn);
210+
if (res->tisn_valid)
211+
mlx5e_destroy_tises(mdev, res->tisn);
207212
mlx5_free_bfreg(mdev, &res->bfreg);
208213
mlx5_core_destroy_mkey(mdev, res->mkey);
209214
mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5992,7 +5992,7 @@ static int mlx5e_resume(struct auxiliary_device *adev)
59925992
if (netif_device_present(netdev))
59935993
return 0;
59945994

5995-
err = mlx5e_create_mdev_resources(mdev);
5995+
err = mlx5e_create_mdev_resources(mdev, true);
59965996
if (err)
59975997
return err;
59985998

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ static int mlx5e_hairpin_create_indirect_rqt(struct mlx5e_hairpin *hp)
761761

762762
err = mlx5e_rss_params_indir_init(&indir, mdev,
763763
mlx5e_rqt_size(mdev, hp->num_channels),
764-
mlx5e_rqt_size(mdev, priv->max_nch));
764+
mlx5e_rqt_size(mdev, hp->num_channels));
765765
if (err)
766766
return err;
767767

@@ -2014,9 +2014,10 @@ static void mlx5e_tc_del_fdb_peer_flow(struct mlx5e_tc_flow *flow,
20142014
list_for_each_entry_safe(peer_flow, tmp, &flow->peer_flows, peer_flows) {
20152015
if (peer_index != mlx5_get_dev_index(peer_flow->priv->mdev))
20162016
continue;
2017+
2018+
list_del(&peer_flow->peer_flows);
20172019
if (refcount_dec_and_test(&peer_flow->refcnt)) {
20182020
mlx5e_tc_del_fdb_flow(peer_flow->priv, peer_flow);
2019-
list_del(&peer_flow->peer_flows);
20202021
kfree(peer_flow);
20212022
}
20222023
}

0 commit comments

Comments
 (0)