]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: devcom, expose locked variant of send_event
authorShay Drory <shayd@nvidia.com>
Fri, 12 Jun 2026 11:38:51 +0000 (14:38 +0300)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jun 2026 18:40:49 +0000 (11:40 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h

index d40c53193ea806eb3e66a6b948a0dce2a1dd45db..96b4f06d6184750741599511a7ad0bedff2474f7 100644 (file)
@@ -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;
 }
index 316052a85ca5c20c459163f3f2259a73a8ca7233..d5c60c03e55c1488164b68ca99a0211963368f80 100644 (file)
@@ -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);