net/mlx5: HWS, Add error checking to hws_bwc_rule_complex_hash_node_get()
authorDan Carpenter <dan.carpenter@linaro.org>
Wed, 11 Jun 2025 13:14:32 +0000 (16:14 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 12 Jun 2025 15:10:07 +0000 (08:10 -0700)
Check for if ida_alloc() or rhashtable_lookup_get_insert_fast() fails.

Fixes: 17e0accac577 ("net/mlx5: HWS, support complex matchers")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Link: https://patch.msgid.link/aEmBONjyiF6z5yCV@stanley.mountain
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c

index 70768953a4f6f3ac2948a1cdf89c7bbe15252e6a..ca7501c5746886efceb40c637528b512729702b1 100644 (file)
@@ -1070,7 +1070,7 @@ hws_bwc_rule_complex_hash_node_get(struct mlx5hws_bwc_rule *bwc_rule,
        struct mlx5hws_bwc_matcher *bwc_matcher = bwc_rule->bwc_matcher;
        struct mlx5hws_bwc_complex_rule_hash_node *node, *old_node;
        struct rhashtable *refcount_hash;
-       int i;
+       int ret, i;
 
        bwc_rule->complex_hash_node = NULL;
 
@@ -1078,7 +1078,11 @@ hws_bwc_rule_complex_hash_node_get(struct mlx5hws_bwc_rule *bwc_rule,
        if (unlikely(!node))
                return -ENOMEM;
 
-       node->tag = ida_alloc(&bwc_matcher->complex->metadata_ida, GFP_KERNEL);
+       ret = ida_alloc(&bwc_matcher->complex->metadata_ida, GFP_KERNEL);
+       if (ret < 0)
+               goto err_free_node;
+       node->tag = ret;
+
        refcount_set(&node->refcount, 1);
 
        /* Clear match buffer - turn off all the unrelated fields
@@ -1094,6 +1098,11 @@ hws_bwc_rule_complex_hash_node_get(struct mlx5hws_bwc_rule *bwc_rule,
        old_node = rhashtable_lookup_get_insert_fast(refcount_hash,
                                                     &node->hash_node,
                                                     hws_refcount_hash);
+       if (IS_ERR(old_node)) {
+               ret = PTR_ERR(old_node);
+               goto err_free_ida;
+       }
+
        if (old_node) {
                /* Rule with the same tag already exists - update refcount */
                refcount_inc(&old_node->refcount);
@@ -1112,6 +1121,12 @@ hws_bwc_rule_complex_hash_node_get(struct mlx5hws_bwc_rule *bwc_rule,
 
        bwc_rule->complex_hash_node = node;
        return 0;
+
+err_free_ida:
+       ida_free(&bwc_matcher->complex->metadata_ida, node->tag);
+err_free_node:
+       kfree(node);
+       return ret;
 }
 
 static void