]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: Devcom, extend mlx5_devcom_send_event to work with more than two devices
authorShay Drory <shayd@nvidia.com>
Mon, 6 Feb 2023 11:50:13 +0000 (13:50 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 2 Jun 2023 19:10:49 +0000 (12:10 -0700)
mlx5_devcom_send_event is used to send event from one eswitch to the
other. In other words, only one event is sent, which means, no error
mechanism is needed.
However, In case devcom have more than two eswitches, a proper error
mechanism is needed. Hence, in case of error, devcom will perform the
error unwind, since devcom knows how many events were successful.

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_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h

index 09367a3207418046ddca7fbfc892e81f86d2cb3c..29de4e759f4fdd336383b1e336e0d218026da436 100644 (file)
@@ -2892,7 +2892,8 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
        esw->num_peers = 0;
        mlx5_devcom_send_event(devcom,
                               MLX5_DEVCOM_ESW_OFFLOADS,
-                              ESW_OFFLOADS_DEVCOM_PAIR, esw);
+                              ESW_OFFLOADS_DEVCOM_PAIR,
+                              ESW_OFFLOADS_DEVCOM_UNPAIR, esw);
 }
 
 void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
@@ -2906,6 +2907,7 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
                return;
 
        mlx5_devcom_send_event(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
+                              ESW_OFFLOADS_DEVCOM_UNPAIR,
                               ESW_OFFLOADS_DEVCOM_UNPAIR, esw);
 
        mlx5_devcom_unregister_component(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
index 96a3b7b9a5cda6d61af5fc9e8a3c79ce1e98fa20..8472bbb3cd588c97c01fc54de5c45b986ba65fb0 100644 (file)
@@ -193,7 +193,7 @@ void mlx5_devcom_unregister_component(struct mlx5_devcom *devcom,
 
 int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
                           enum mlx5_devcom_components id,
-                          int event,
+                          int event, int rollback_event,
                           void *event_data)
 {
        struct mlx5_devcom_component *comp;
@@ -210,10 +210,23 @@ int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
 
                if (i != devcom->idx && data) {
                        err = comp->handler(event, data, event_data);
-                       break;
+                       if (err)
+                               goto rollback;
                }
        }
 
+       up_write(&comp->sem);
+       return 0;
+
+rollback:
+       while (i--) {
+               void *data = rcu_dereference_protected(comp->device[i].data,
+                                                      lockdep_is_held(&comp->sem));
+
+               if (i != devcom->idx && data)
+                       comp->handler(rollback_event, data, event_data);
+       }
+
        up_write(&comp->sem);
        return err;
 }
index b7f72f1a536784f4648dd10a3448f50c6bd07484..bb1970ba8730b78b50f397b1fd24998ea554576d 100644 (file)
@@ -30,7 +30,7 @@ void mlx5_devcom_unregister_component(struct mlx5_devcom *devcom,
 
 int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
                           enum mlx5_devcom_components id,
-                          int event,
+                          int event, int rollback_event,
                           void *event_data);
 
 void mlx5_devcom_comp_set_ready(struct mlx5_devcom *devcom,