]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/mlx5e: E-Switch, Use xarray for devcom paired device index
authorRoi Dayan <roid@nvidia.com>
Sun, 28 May 2023 09:11:47 +0000 (12:11 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 23 Jun 2023 19:27:33 +0000 (12:27 -0700)
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: Roi Dayan <roid@nvidia.com>
Reviewed-by: Shay Drory <shayd@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 7064609f4998f8f19ae2521d0d24d2c14974e83a..ae0dc8a3060d735569abf917e3f5993b78d37329 100644 (file)
@@ -353,7 +353,7 @@ struct mlx5_eswitch {
                u32             large_group_num;
        }  params;
        struct blocking_notifier_head n_head;
-       bool paired[MLX5_MAX_PORTS];
+       struct xarray paired;
 };
 
 void esw_offloads_disable(struct mlx5_eswitch *esw);
index ed986d1c9e908ee0845a1e63aa42f5c9b5ce91f3..6f3b7d5eb6a451deea2fa42a1705e6792d092784 100644 (file)
@@ -2807,15 +2807,21 @@ static int mlx5_esw_offloads_devcom_event(int event,
        struct mlx5_eswitch *esw = my_data;
        struct mlx5_devcom *devcom = esw->dev->priv.devcom;
        struct mlx5_eswitch *peer_esw = event_data;
+       u16 esw_i, peer_esw_i;
+       bool esw_paired;
        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) {
        case ESW_OFFLOADS_DEVCOM_PAIR:
                if (mlx5_eswitch_vport_match_metadata_enabled(esw) !=
                    mlx5_eswitch_vport_match_metadata_enabled(peer_esw))
                        break;
 
-               if (esw->paired[mlx5_get_dev_index(peer_esw->dev)])
+               if (esw_paired)
                        break;
 
                err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true);
@@ -2829,23 +2835,29 @@ static int mlx5_esw_offloads_devcom_event(int event,
                if (err)
                        goto err_pair;
 
-               esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true;
-               peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true;
+               err = xa_insert(&esw->paired, peer_esw_i, peer_esw, GFP_KERNEL);
+               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++;
                peer_esw->num_peers++;
                mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
                break;
 
        case ESW_OFFLOADS_DEVCOM_UNPAIR:
-               if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)])
+               if (!esw_paired)
                        break;
 
                peer_esw->num_peers--;
                esw->num_peers--;
                if (!esw->num_peers && !peer_esw->num_peers)
                        mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
-               esw->paired[mlx5_get_dev_index(peer_esw->dev)] = false;
-               peer_esw->paired[mlx5_get_dev_index(esw->dev)] = false;
+               xa_erase(&peer_esw->paired, esw_i);
+               xa_erase(&esw->paired, peer_esw_i);
                mlx5_esw_offloads_unpair(peer_esw, esw);
                mlx5_esw_offloads_unpair(esw, peer_esw);
                mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false);
@@ -2854,6 +2866,10 @@ static int mlx5_esw_offloads_devcom_event(int event,
 
        return 0;
 
+err_peer_xa:
+       xa_erase(&esw->paired, peer_esw_i);
+err_xa:
+       mlx5_esw_offloads_unpair(peer_esw, esw);
 err_pair:
        mlx5_esw_offloads_unpair(esw, peer_esw);
 err_peer:
@@ -2879,6 +2895,7 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
        if (!mlx5_lag_is_supported(esw->dev))
                return;
 
+       xa_init(&esw->paired);
        mlx5_devcom_register_component(devcom,
                                       MLX5_DEVCOM_ESW_OFFLOADS,
                                       mlx5_esw_offloads_devcom_event,
@@ -2906,6 +2923,7 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
                               ESW_OFFLOADS_DEVCOM_UNPAIR, esw);
 
        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)