Commit e2a82bf8 authored by Shay Drory's avatar Shay Drory Committed by Saeed Mahameed
Browse files

net/mlx5: Devcom, extend mlx5_devcom_send_event to work with more than two devices



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: default avatarShay Drory <shayd@nvidia.com>
Reviewed-by: default avatarMark Bloch <mbloch@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 90ca127c
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -2892,7 +2892,8 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
	esw->num_peers = 0;
	esw->num_peers = 0;
	mlx5_devcom_send_event(devcom,
	mlx5_devcom_send_event(devcom,
			       MLX5_DEVCOM_ESW_OFFLOADS,
			       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)
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;
		return;


	mlx5_devcom_send_event(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
	mlx5_devcom_send_event(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
			       ESW_OFFLOADS_DEVCOM_UNPAIR,
			       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);
+15 −2
Original line number Original line Diff line number Diff line
@@ -193,7 +193,7 @@ void mlx5_devcom_unregister_component(struct mlx5_devcom *devcom,


int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
			   enum mlx5_devcom_components id,
			   enum mlx5_devcom_components id,
			   int event,
			   int event, int rollback_event,
			   void *event_data)
			   void *event_data)
{
{
	struct mlx5_devcom_component *comp;
	struct mlx5_devcom_component *comp;
@@ -210,8 +210,21 @@ int mlx5_devcom_send_event(struct mlx5_devcom *devcom,


		if (i != devcom->idx && data) {
		if (i != devcom->idx && data) {
			err = comp->handler(event, data, event_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);
	up_write(&comp->sem);
+1 −1
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@ void mlx5_devcom_unregister_component(struct mlx5_devcom *devcom,


int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
int mlx5_devcom_send_event(struct mlx5_devcom *devcom,
			   enum mlx5_devcom_components id,
			   enum mlx5_devcom_components id,
			   int event,
			   int event, int rollback_event,
			   void *event_data);
			   void *event_data);


void mlx5_devcom_comp_set_ready(struct mlx5_devcom *devcom,
void mlx5_devcom_comp_set_ready(struct mlx5_devcom *devcom,