Commit 70c36438 authored by Roi Dayan's avatar Roi Dayan Committed by Saeed Mahameed

net/mlx5e: E-Switch, Use xarray for devcom paired device index

To allow devcom events on E-Switch that is not a vport group manager,
use vhca id as an index instead of device index which might be shared
between several E-Switches. for example SF and its PF.
Signed-off-by: default avatarRoi Dayan <roid@nvidia.com>
Reviewed-by: default avatarShay Drory <shayd@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 1552e9b5
...@@ -353,7 +353,7 @@ struct mlx5_eswitch { ...@@ -353,7 +353,7 @@ struct mlx5_eswitch {
u32 large_group_num; u32 large_group_num;
} params; } params;
struct blocking_notifier_head n_head; struct blocking_notifier_head n_head;
bool paired[MLX5_MAX_PORTS]; struct xarray paired;
}; };
void esw_offloads_disable(struct mlx5_eswitch *esw); void esw_offloads_disable(struct mlx5_eswitch *esw);
......
...@@ -2807,15 +2807,21 @@ static int mlx5_esw_offloads_devcom_event(int event, ...@@ -2807,15 +2807,21 @@ static int mlx5_esw_offloads_devcom_event(int event,
struct mlx5_eswitch *esw = my_data; struct mlx5_eswitch *esw = my_data;
struct mlx5_devcom *devcom = esw->dev->priv.devcom; struct mlx5_devcom *devcom = esw->dev->priv.devcom;
struct mlx5_eswitch *peer_esw = event_data; struct mlx5_eswitch *peer_esw = event_data;
u16 esw_i, peer_esw_i;
bool esw_paired;
int err; int err;
peer_esw_i = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
esw_i = MLX5_CAP_GEN(esw->dev, vhca_id);
esw_paired = !!xa_load(&esw->paired, peer_esw_i);
switch (event) { switch (event) {
case ESW_OFFLOADS_DEVCOM_PAIR: case ESW_OFFLOADS_DEVCOM_PAIR:
if (mlx5_eswitch_vport_match_metadata_enabled(esw) != if (mlx5_eswitch_vport_match_metadata_enabled(esw) !=
mlx5_eswitch_vport_match_metadata_enabled(peer_esw)) mlx5_eswitch_vport_match_metadata_enabled(peer_esw))
break; break;
if (esw->paired[mlx5_get_dev_index(peer_esw->dev)]) if (esw_paired)
break; break;
err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true); err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true);
...@@ -2829,23 +2835,29 @@ static int mlx5_esw_offloads_devcom_event(int event, ...@@ -2829,23 +2835,29 @@ static int mlx5_esw_offloads_devcom_event(int event,
if (err) if (err)
goto err_pair; goto err_pair;
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true; err = xa_insert(&esw->paired, peer_esw_i, peer_esw, GFP_KERNEL);
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true; if (err)
goto err_xa;
err = xa_insert(&peer_esw->paired, esw_i, esw, GFP_KERNEL);
if (err)
goto err_peer_xa;
esw->num_peers++; esw->num_peers++;
peer_esw->num_peers++; peer_esw->num_peers++;
mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true); mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
break; break;
case ESW_OFFLOADS_DEVCOM_UNPAIR: case ESW_OFFLOADS_DEVCOM_UNPAIR:
if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)]) if (!esw_paired)
break; break;
peer_esw->num_peers--; peer_esw->num_peers--;
esw->num_peers--; esw->num_peers--;
if (!esw->num_peers && !peer_esw->num_peers) if (!esw->num_peers && !peer_esw->num_peers)
mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false); mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = false; xa_erase(&peer_esw->paired, esw_i);
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = false; xa_erase(&esw->paired, peer_esw_i);
mlx5_esw_offloads_unpair(peer_esw, esw); mlx5_esw_offloads_unpair(peer_esw, esw);
mlx5_esw_offloads_unpair(esw, peer_esw); mlx5_esw_offloads_unpair(esw, peer_esw);
mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false); mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false);
...@@ -2854,6 +2866,10 @@ static int mlx5_esw_offloads_devcom_event(int event, ...@@ -2854,6 +2866,10 @@ static int mlx5_esw_offloads_devcom_event(int event,
return 0; return 0;
err_peer_xa:
xa_erase(&esw->paired, peer_esw_i);
err_xa:
mlx5_esw_offloads_unpair(peer_esw, esw);
err_pair: err_pair:
mlx5_esw_offloads_unpair(esw, peer_esw); mlx5_esw_offloads_unpair(esw, peer_esw);
err_peer: err_peer:
...@@ -2879,6 +2895,7 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw) ...@@ -2879,6 +2895,7 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
if (!mlx5_lag_is_supported(esw->dev)) if (!mlx5_lag_is_supported(esw->dev))
return; return;
xa_init(&esw->paired);
mlx5_devcom_register_component(devcom, mlx5_devcom_register_component(devcom,
MLX5_DEVCOM_ESW_OFFLOADS, MLX5_DEVCOM_ESW_OFFLOADS,
mlx5_esw_offloads_devcom_event, mlx5_esw_offloads_devcom_event,
...@@ -2906,6 +2923,7 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw) ...@@ -2906,6 +2923,7 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
ESW_OFFLOADS_DEVCOM_UNPAIR, esw); ESW_OFFLOADS_DEVCOM_UNPAIR, esw);
mlx5_devcom_unregister_component(devcom, MLX5_DEVCOM_ESW_OFFLOADS); mlx5_devcom_unregister_component(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
xa_destroy(&esw->paired);
} }
bool mlx5_esw_vport_match_metadata_supported(const struct mlx5_eswitch *esw) bool mlx5_esw_vport_match_metadata_supported(const struct mlx5_eswitch *esw)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment