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;
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));
}
}
- 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));
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;
}
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);