mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
net/mlx5: devcom, expose locked variant of send_event
Factor mlx5_devcom_send_event() into two functions: - mlx5_devcom_locked_send_event(): performs the dispatch (and rollback) with comp->sem already held by the caller. - mlx5_devcom_send_event(): unchanged wrapper that takes comp->sem, calls the locked variant, and releases it. This lets callers bracket multiple event broadcasts under a single held write lock, eliminating the gap between consecutive dispatches where peer state could change. Will be used by a downstream patch. Signed-off-by: Shay Drory <shayd@nvidia.com> Reviewed-by: Mark Bloch <mbloch@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/20260612113904.537595-3-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
597baeb467
commit
95e26588c8
|
|
@ -287,9 +287,9 @@ int mlx5_devcom_comp_get_size(struct mlx5_devcom_comp_dev *devcom)
|
|||
return kref_read(&comp->ref);
|
||||
}
|
||||
|
||||
int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
||||
int event, int rollback_event,
|
||||
void *event_data)
|
||||
int mlx5_devcom_locked_send_event(struct mlx5_devcom_comp_dev *devcom,
|
||||
int event, int rollback_event,
|
||||
void *event_data)
|
||||
{
|
||||
struct mlx5_devcom_comp_dev *pos;
|
||||
struct mlx5_devcom_comp *comp;
|
||||
|
|
@ -299,8 +299,8 @@ int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
|||
if (!devcom)
|
||||
return -ENODEV;
|
||||
|
||||
lockdep_assert_held_write(&devcom->comp->sem);
|
||||
comp = devcom->comp;
|
||||
down_write(&comp->sem);
|
||||
list_for_each_entry(pos, &comp->comp_dev_list_head, list) {
|
||||
data = rcu_dereference_protected(pos->data, lockdep_is_held(&comp->sem));
|
||||
|
||||
|
|
@ -311,12 +311,11 @@ int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
|||
}
|
||||
}
|
||||
|
||||
up_write(&comp->sem);
|
||||
return 0;
|
||||
|
||||
rollback:
|
||||
if (list_entry_is_head(pos, &comp->comp_dev_list_head, list))
|
||||
goto out;
|
||||
return err;
|
||||
pos = list_prev_entry(pos, list);
|
||||
list_for_each_entry_from_reverse(pos, &comp->comp_dev_list_head, list) {
|
||||
data = rcu_dereference_protected(pos->data, lockdep_is_held(&comp->sem));
|
||||
|
|
@ -324,7 +323,23 @@ int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
|||
if (pos != devcom && data)
|
||||
comp->handler(rollback_event, data, event_data);
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
||||
int event, int rollback_event,
|
||||
void *event_data)
|
||||
{
|
||||
struct mlx5_devcom_comp *comp;
|
||||
int err;
|
||||
|
||||
if (!devcom)
|
||||
return -ENODEV;
|
||||
|
||||
comp = devcom->comp;
|
||||
down_write(&comp->sem);
|
||||
err = mlx5_devcom_locked_send_event(devcom, event, rollback_event,
|
||||
event_data);
|
||||
up_write(&comp->sem);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,9 @@ mlx5_devcom_register_component(struct mlx5_devcom_dev *devc,
|
|||
void *data);
|
||||
void mlx5_devcom_unregister_component(struct mlx5_devcom_comp_dev *devcom);
|
||||
|
||||
int mlx5_devcom_locked_send_event(struct mlx5_devcom_comp_dev *devcom,
|
||||
int event, int rollback_event,
|
||||
void *event_data);
|
||||
int mlx5_devcom_send_event(struct mlx5_devcom_comp_dev *devcom,
|
||||
int event, int rollback_event,
|
||||
void *event_data);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user