Skip to content

Commit 8c253df

Browse files
shayshyiSaeed Mahameed
authored andcommitted
net/mlx5: E-switch, Devcom, sync devcom events and devcom comp register
devcom events are sent to all registered component. Following the cited patch, it is possible for two components, e.g.: two eswitches, to send devcom events, while both components are registered. This means eswitch layer will do double un/pairing, which is double allocation and free of resources, even though only one un/pairing is needed. flow example: cpu0 cpu1 ---- ---- mlx5_devlink_eswitch_mode_set(dev0) esw_offloads_devcom_init() mlx5_devcom_register_component(esw0) mlx5_devlink_eswitch_mode_set(dev1) esw_offloads_devcom_init() mlx5_devcom_register_component(esw1) mlx5_devcom_send_event() mlx5_devcom_send_event() Hence, check whether the eswitches are already un/paired before free/allocation of resources. Fixes: 09b2784 ("net: devlink: enable parallel ops on netlink interface") Signed-off-by: Shay Drory <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent dfa1e46 commit 8c253df

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ struct mlx5_eswitch {
342342
u32 large_group_num;
343343
} params;
344344
struct blocking_notifier_head n_head;
345+
bool paired[MLX5_MAX_PORTS];
345346
};
346347

347348
void esw_offloads_disable(struct mlx5_eswitch *esw);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,9 @@ static int mlx5_esw_offloads_devcom_event(int event,
27422742
mlx5_eswitch_vport_match_metadata_enabled(peer_esw))
27432743
break;
27442744

2745+
if (esw->paired[mlx5_get_dev_index(peer_esw->dev)])
2746+
break;
2747+
27452748
err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true);
27462749
if (err)
27472750
goto err_out;
@@ -2753,14 +2756,18 @@ static int mlx5_esw_offloads_devcom_event(int event,
27532756
if (err)
27542757
goto err_pair;
27552758

2759+
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true;
2760+
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true;
27562761
mlx5_devcom_set_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
27572762
break;
27582763

27592764
case ESW_OFFLOADS_DEVCOM_UNPAIR:
2760-
if (!mlx5_devcom_is_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
2765+
if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)])
27612766
break;
27622767

27632768
mlx5_devcom_set_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
2769+
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = false;
2770+
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = false;
27642771
mlx5_esw_offloads_unpair(peer_esw);
27652772
mlx5_esw_offloads_unpair(esw);
27662773
mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false);

0 commit comments

Comments
 (0)