Skip to content

Commit b3a69c5

Browse files
committed
Merge branch 'mlx5-misc-fixes-2024-12-20'
Tariq Toukan says: ==================== mlx5 misc fixes 2024-12-20 This small patchset provides misc bug fixes from the team to the mlx5 core and Eth drivers. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 75221e9 + 2a4f56f commit b3a69c5

File tree

8 files changed

+46
-11
lines changed

8 files changed

+46
-11
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,13 @@ static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx,
339339
{
340340
struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);
341341
struct mlx5_macsec_fs *macsec_fs = priv->mdev->macsec_fs;
342+
const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;
342343
struct mlx5_macsec_rule_attrs rule_attrs;
343344
union mlx5_macsec_rule *macsec_rule;
344345

346+
if (is_tx && tx_sc->encoding_sa != sa->assoc_num)
347+
return 0;
348+
345349
rule_attrs.macsec_obj_id = sa->macsec_obj_id;
346350
rule_attrs.sci = sa->sci;
347351
rule_attrs.assoc_num = sa->assoc_num;

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6542,8 +6542,23 @@ static void _mlx5e_remove(struct auxiliary_device *adev)
65426542

65436543
mlx5_core_uplink_netdev_set(mdev, NULL);
65446544
mlx5e_dcbnl_delete_app(priv);
6545-
unregister_netdev(priv->netdev);
6546-
_mlx5e_suspend(adev, false);
6545+
/* When unload driver, the netdev is in registered state
6546+
* if it's from legacy mode. If from switchdev mode, it
6547+
* is already unregistered before changing to NIC profile.
6548+
*/
6549+
if (priv->netdev->reg_state == NETREG_REGISTERED) {
6550+
unregister_netdev(priv->netdev);
6551+
_mlx5e_suspend(adev, false);
6552+
} else {
6553+
struct mlx5_core_dev *pos;
6554+
int i;
6555+
6556+
if (test_bit(MLX5E_STATE_DESTROYING, &priv->state))
6557+
mlx5_sd_for_each_dev(i, mdev, pos)
6558+
mlx5e_destroy_mdev_resources(pos);
6559+
else
6560+
_mlx5e_suspend(adev, true);
6561+
}
65476562
/* Avoid cleanup if profile rollback failed. */
65486563
if (priv->profile)
65496564
priv->profile->cleanup(priv);

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,6 +1509,21 @@ mlx5e_vport_uplink_rep_unload(struct mlx5e_rep_priv *rpriv)
15091509

15101510
priv = netdev_priv(netdev);
15111511

1512+
/* This bit is set when using devlink to change eswitch mode from
1513+
* switchdev to legacy. As need to keep uplink netdev ifindex, we
1514+
* detach uplink representor profile and attach NIC profile only.
1515+
* The netdev will be unregistered later when unload NIC auxiliary
1516+
* driver for this case.
1517+
* We explicitly block devlink eswitch mode change if any IPSec rules
1518+
* offloaded, but can't block other cases, such as driver unload
1519+
* and devlink reload. We have to unregister netdev before profile
1520+
* change for those cases. This is to avoid resource leak because
1521+
* the offloaded rules don't have the chance to be unoffloaded before
1522+
* cleanup which is triggered by detach uplink representor profile.
1523+
*/
1524+
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_SWITCH_LEGACY))
1525+
unregister_netdev(netdev);
1526+
15121527
mlx5e_netdev_attach_nic_profile(priv);
15131528
}
15141529

drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,11 @@ void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev)
150150
unsigned long i;
151151
int err;
152152

153-
xa_for_each(&esw->offloads.vport_reps, i, rep) {
154-
rpriv = rep->rep_data[REP_ETH].priv;
155-
if (!rpriv || !rpriv->netdev)
153+
mlx5_esw_for_each_rep(esw, i, rep) {
154+
if (atomic_read(&rep->rep_data[REP_ETH].state) != REP_LOADED)
156155
continue;
157156

157+
rpriv = rep->rep_data[REP_ETH].priv;
158158
rhashtable_walk_enter(&rpriv->tc_ht, &iter);
159159
rhashtable_walk_start(&iter);
160160
while ((flow = rhashtable_walk_next(&iter)) != NULL) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,9 @@ void mlx5e_tc_clean_fdb_peer_flows(struct mlx5_eswitch *esw);
714714
MLX5_CAP_GEN_2((esw->dev), ec_vf_vport_base) +\
715715
(last) - 1)
716716

717+
#define mlx5_esw_for_each_rep(esw, i, rep) \
718+
xa_for_each(&((esw)->offloads.vport_reps), i, rep)
719+
717720
struct mlx5_eswitch *__must_check
718721
mlx5_devlink_eswitch_get(struct devlink *devlink);
719722

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@
5353
#include "lag/lag.h"
5454
#include "en/tc/post_meter.h"
5555

56-
#define mlx5_esw_for_each_rep(esw, i, rep) \
57-
xa_for_each(&((esw)->offloads.vport_reps), i, rep)
58-
5956
/* There are two match-all miss flows, one for unicast dst mac and
6057
* one for multicast.
6158
*/
@@ -3780,6 +3777,8 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
37803777
esw->eswitch_operation_in_progress = true;
37813778
up_write(&esw->mode_lock);
37823779

3780+
if (mode == DEVLINK_ESWITCH_MODE_LEGACY)
3781+
esw->dev->priv.flags |= MLX5_PRIV_FLAGS_SWITCH_LEGACY;
37833782
mlx5_eswitch_disable_locked(esw);
37843783
if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV) {
37853784
if (mlx5_devlink_trap_get_num_active(esw->dev)) {

drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
10671067
int inlen, err, eqn;
10681068
void *cqc, *in;
10691069
__be64 *pas;
1070-
int vector;
10711070
u32 i;
10721071

10731072
cq = kzalloc(sizeof(*cq), GFP_KERNEL);
@@ -1096,8 +1095,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
10961095
if (!in)
10971096
goto err_cqwq;
10981097

1099-
vector = raw_smp_processor_id() % mlx5_comp_vectors_max(mdev);
1100-
err = mlx5_comp_eqn_get(mdev, vector, &eqn);
1098+
err = mlx5_comp_eqn_get(mdev, 0, &eqn);
11011099
if (err) {
11021100
kvfree(in);
11031101
goto err_cqwq;

include/linux/mlx5/driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,7 @@ enum {
524524
* creation/deletion on drivers rescan. Unset during device attach.
525525
*/
526526
MLX5_PRIV_FLAGS_DETACH = 1 << 2,
527+
MLX5_PRIV_FLAGS_SWITCH_LEGACY = 1 << 3,
527528
};
528529

529530
struct mlx5_adev {

0 commit comments

Comments
 (0)