From: Alex Vesker <va...@nvidia.com> The check to detect if a rule is in resize was done incorrectly, this can lead to an incorrect function call upon completion for rules which are not in resize (move). Since the resize_info is in a union we cannot rely only on the pointer value but also need to make sure the matcher is in resize process, this assures us the resize info is valid.
Fixes: 762feceb8294 ("net/mlx5/hws: support resizable matchers") Signed-off-by: Alex Vesker <va...@nvidia.com> Acked-by: Matan Azrad <ma...@nvidia.com> --- drivers/net/mlx5/hws/mlx5dr_rule.c | 7 +++++++ drivers/net/mlx5/hws/mlx5dr_rule.h | 6 +----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_rule.c b/drivers/net/mlx5/hws/mlx5dr_rule.c index 7bcf2de55f..3e8e90ba76 100644 --- a/drivers/net/mlx5/hws/mlx5dr_rule.c +++ b/drivers/net/mlx5/hws/mlx5dr_rule.c @@ -350,6 +350,13 @@ static void mlx5dr_rule_move_init(struct mlx5dr_rule *rule, rule->resize_info->state = MLX5DR_RULE_RESIZE_STATE_WRITING; } +bool mlx5dr_rule_move_in_progress(struct mlx5dr_rule *rule) +{ + return unlikely(mlx5dr_matcher_is_in_resize(rule->matcher)) && + rule->resize_info && + rule->resize_info->state != MLX5DR_RULE_RESIZE_STATE_IDLE; +} + static int mlx5dr_rule_create_hws_fw_wqe(struct mlx5dr_rule *rule, struct mlx5dr_rule_attr *attr, uint8_t mt_idx, diff --git a/drivers/net/mlx5/hws/mlx5dr_rule.h b/drivers/net/mlx5/hws/mlx5dr_rule.h index 07adf9c5ad..dffaec1c0f 100644 --- a/drivers/net/mlx5/hws/mlx5dr_rule.h +++ b/drivers/net/mlx5/hws/mlx5dr_rule.h @@ -72,10 +72,6 @@ int mlx5dr_rule_move_hws_remove(struct mlx5dr_rule *rule, int mlx5dr_rule_move_hws_add(struct mlx5dr_rule *rule, struct mlx5dr_rule_attr *attr); -static inline bool mlx5dr_rule_move_in_progress(struct mlx5dr_rule *rule) -{ - return rule->resize_info && - rule->resize_info->state != MLX5DR_RULE_RESIZE_STATE_IDLE; -} +bool mlx5dr_rule_move_in_progress(struct mlx5dr_rule *rule); #endif /* MLX5DR_RULE_H_ */ -- 2.39.3