Skip to content

Commit 509d179

Browse files
shayshyiBrian Maly
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]> Orabug: 35383105 (cherry picked from commit 8c253df) cherry-pick-repo=kernel/git/torvalds/linux.git unmodified-from-upstream: 8c253df Signed-off-by: Mikhael Goikhman <[email protected]> Signed-off-by: Qing Huang <[email protected]> Reviewed-by: Devesh Sharma <[email protected]> Signed-off-by: Brian Maly <[email protected]>
1 parent 01021f2 commit 509d179

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
@@ -2744,6 +2744,9 @@ static int mlx5_esw_offloads_devcom_event(int event,
27442744
mlx5_eswitch_vport_match_metadata_enabled(peer_esw))
27452745
break;
27462746

2747+
if (esw->paired[mlx5_get_dev_index(peer_esw->dev)])
2748+
break;
2749+
27472750
err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true);
27482751
if (err)
27492752
goto err_out;
@@ -2755,14 +2758,18 @@ static int mlx5_esw_offloads_devcom_event(int event,
27552758
if (err)
27562759
goto err_pair;
27572760

2761+
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true;
2762+
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true;
27582763
mlx5_devcom_set_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
27592764
break;
27602765

27612766
case ESW_OFFLOADS_DEVCOM_UNPAIR:
2762-
if (!mlx5_devcom_is_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
2767+
if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)])
27632768
break;
27642769

27652770
mlx5_devcom_set_paired(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
2771+
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = false;
2772+
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = false;
27662773
mlx5_esw_offloads_unpair(peer_esw);
27672774
mlx5_esw_offloads_unpair(esw);
27682775
mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false);

0 commit comments

Comments
 (0)