Skip to content

Commit 7624e58

Browse files
shayshyiSaeed Mahameed
authored andcommitted
net/mlx5: E-switch, register event handler before arming the event
Currently, mlx5 is registering event handler for vport context change event some time after arming the event. this can lead to missing an event, which will result in wrong rules in the FDB. Hence, register the event handler before arming the event. This solution is valid since FW is sending vport context change event only on vports which SW armed, and SW arming the vport when enabling it, which is done after the FDB has been created. Fixes: 6933a93 ("net/mlx5: E-Switch, Use async events chain") Signed-off-by: Shay Drory <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 8698cb9 commit 7624e58

File tree

1 file changed

+8
-9
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+8
-9
lines changed

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,25 +1038,20 @@ const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev)
10381038
return ERR_PTR(err);
10391039
}
10401040

1041-
static void mlx5_eswitch_event_handlers_register(struct mlx5_eswitch *esw)
1041+
static void mlx5_eswitch_event_handler_register(struct mlx5_eswitch *esw)
10421042
{
1043-
MLX5_NB_INIT(&esw->nb, eswitch_vport_event, NIC_VPORT_CHANGE);
1044-
mlx5_eq_notifier_register(esw->dev, &esw->nb);
1045-
10461043
if (esw->mode == MLX5_ESWITCH_OFFLOADS && mlx5_eswitch_is_funcs_handler(esw->dev)) {
10471044
MLX5_NB_INIT(&esw->esw_funcs.nb, mlx5_esw_funcs_changed_handler,
10481045
ESW_FUNCTIONS_CHANGED);
10491046
mlx5_eq_notifier_register(esw->dev, &esw->esw_funcs.nb);
10501047
}
10511048
}
10521049

1053-
static void mlx5_eswitch_event_handlers_unregister(struct mlx5_eswitch *esw)
1050+
static void mlx5_eswitch_event_handler_unregister(struct mlx5_eswitch *esw)
10541051
{
10551052
if (esw->mode == MLX5_ESWITCH_OFFLOADS && mlx5_eswitch_is_funcs_handler(esw->dev))
10561053
mlx5_eq_notifier_unregister(esw->dev, &esw->esw_funcs.nb);
10571054

1058-
mlx5_eq_notifier_unregister(esw->dev, &esw->nb);
1059-
10601055
flush_workqueue(esw->work_queue);
10611056
}
10621057

@@ -1483,6 +1478,9 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs)
14831478

14841479
mlx5_eswitch_update_num_of_vfs(esw, num_vfs);
14851480

1481+
MLX5_NB_INIT(&esw->nb, eswitch_vport_event, NIC_VPORT_CHANGE);
1482+
mlx5_eq_notifier_register(esw->dev, &esw->nb);
1483+
14861484
if (esw->mode == MLX5_ESWITCH_LEGACY) {
14871485
err = esw_legacy_enable(esw);
14881486
} else {
@@ -1495,7 +1493,7 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs)
14951493

14961494
esw->fdb_table.flags |= MLX5_ESW_FDB_CREATED;
14971495

1498-
mlx5_eswitch_event_handlers_register(esw);
1496+
mlx5_eswitch_event_handler_register(esw);
14991497

15001498
esw_info(esw->dev, "Enable: mode(%s), nvfs(%d), necvfs(%d), active vports(%d)\n",
15011499
esw->mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS",
@@ -1622,7 +1620,8 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch *esw)
16221620
*/
16231621
mlx5_esw_mode_change_notify(esw, MLX5_ESWITCH_LEGACY);
16241622

1625-
mlx5_eswitch_event_handlers_unregister(esw);
1623+
mlx5_eq_notifier_unregister(esw->dev, &esw->nb);
1624+
mlx5_eswitch_event_handler_unregister(esw);
16261625

16271626
esw_info(esw->dev, "Disable: mode(%s), nvfs(%d), necvfs(%d), active vports(%d)\n",
16281627
esw->mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS",

0 commit comments

Comments
 (0)