]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: E-switch, mark devcom as not ready when all eswitches are unpaired
authorShay Drory <shayd@nvidia.com>
Thu, 2 Feb 2023 08:27:45 +0000 (10:27 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 2 Jun 2023 19:10:48 +0000 (12:10 -0700)
Whenever an eswitch is unpaired with another, the driver mark devcom
as not ready. While this is correct in case we are pairing only two
eswitches, in order to support pairing of more than two eswitches,
driver need to mark devcom as not ready only when all eswitches are
unpaired.

Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Roi Dayan <roid@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 9833d1a587cc88b2bb8fafe5db56802ad33bda2c..d6e4ca436f399f33db8535db6c07c7af49292563 100644 (file)
@@ -343,6 +343,7 @@ struct mlx5_eswitch {
        int                     mode;
        u16                     manager_vport;
        u16                     first_host_vport;
+       u8                      num_peers;
        struct mlx5_esw_functions esw_funcs;
        struct {
                u32             large_group_num;
index aeb15b10048e5505658c845a90d9ad26e383d313..09367a3207418046ddca7fbfc892e81f86d2cb3c 100644 (file)
@@ -2836,6 +2836,8 @@ static int mlx5_esw_offloads_devcom_event(int event,
 
                esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true;
                peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true;
+               esw->num_peers++;
+               peer_esw->num_peers++;
                mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
                break;
 
@@ -2843,7 +2845,10 @@ static int mlx5_esw_offloads_devcom_event(int event,
                if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)])
                        break;
 
-               mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
+               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;
                mlx5_esw_offloads_unpair(peer_esw, esw);
@@ -2884,6 +2889,7 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
                                       mlx5_esw_offloads_devcom_event,
                                       esw);
 
+       esw->num_peers = 0;
        mlx5_devcom_send_event(devcom,
                               MLX5_DEVCOM_ESW_OFFLOADS,
                               ESW_OFFLOADS_DEVCOM_PAIR, esw);