From: Shay Drory Date: Fri, 12 Jun 2026 11:38:51 +0000 (+0300) Subject: net/mlx5: devcom, expose locked variant of send_event X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=95e26588c84b7fb0e91c0c544ea29168ffd3de70;p=thirdparty%2Fkernel%2Flinux.git 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 Reviewed-by: Mark Bloch Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260612113904.537595-3-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c index d40c53193ea80..96b4f06d61847 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c @@ -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 @@ rollback: 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; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h index 316052a85ca5c..d5c60c03e55c1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h @@ -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);