]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix meter policy creation assert
authorShun Hao <shunh@nvidia.com>
Wed, 2 Mar 2022 10:33:01 +0000 (12:33 +0200)
committerRaslan Darawsheh <rasland@nvidia.com>
Mon, 7 Mar 2022 10:43:11 +0000 (11:43 +0100)
The meter policy creation doesn't belong to flow rule creation
process, so thread workspace was not initialized and there will be
assert error when using it.

This patch removes the incorrect using of thread workspace in meter
policy creation, and adds a flag in policy instead. When creating
flow rule, can use the flag to set the mark flag in thread workspace.

Fixes: 082becbf1f35 ("net/mlx5: fix mark enabling for Rx")
Cc: stable@dpdk.org
Signed-off-by: Shun Hao <shunh@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_flow.c
drivers/net/mlx5/mlx5_flow_dv.c

index dd5cd9209fdea937ab637ea02d751bf714babcd0..23a28f6e52308528ef77aa67a1e662baccaa01b2 100644 (file)
@@ -779,6 +779,8 @@ struct mlx5_flow_meter_policy {
        /* If yellow color policy is skipped. */
        uint32_t skip_g:1;
        /* If green color policy is skipped. */
+       uint32_t mark:1;
+       /* If policy contains mark action. */
        rte_spinlock_t sl;
        uint32_t ref_cnt;
        /* Use count. */
index efb988a9bb06123c33421e6b7de32e283e66bdc9..15a4a8cd984e513d346d37749ae349d0ac6cc813 100644 (file)
@@ -6296,6 +6296,8 @@ flow_create_split_meter(struct rte_eth_dev *dev,
                                                                  fm->policy_id,
                                                                  NULL);
                        MLX5_ASSERT(wks->policy);
+                       if (wks->policy->mark)
+                               wks->mark = 1;
                        if (wks->policy->is_hierarchy) {
                                wks->final_policy =
                                mlx5_flow_meter_hierarchy_get_final_policy(dev,
index 34d2c7a99f31df36d24b077cc032de7a06cfe5e4..29751e7eda79ae98373b5ab10a320d2ce9c6577a 100644 (file)
@@ -15566,9 +15566,7 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                            (MLX5_MAX_MODIFY_NUM + 1)];
        } mhdr_dummy;
        struct mlx5_flow_dv_modify_hdr_resource *mhdr_res = &mhdr_dummy.res;
-       struct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();
 
-       MLX5_ASSERT(wks);
        egress = (domain == MLX5_MTR_DOMAIN_EGRESS) ? 1 : 0;
        transfer = (domain == MLX5_MTR_DOMAIN_TRANSFER) ? 1 : 0;
        memset(&dh, 0, sizeof(struct mlx5_flow_handle));
@@ -15606,7 +15604,6 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                                          NULL,
                                          "cannot create policy "
                                          "mark action for this color");
-                               wks->mark = 1;
                                if (flow_dv_tag_resource_register(dev, tag_be,
                                                  &dev_flow, &flow_err))
                                        return -rte_mtr_error_set(error,
@@ -15618,6 +15615,7 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                                act_cnt->rix_mark =
                                        dev_flow.handle->dvh.rix_tag;
                                action_flags |= MLX5_FLOW_ACTION_MARK;
+                               mtr_policy->mark = 1;
                                break;
                        }
                        case RTE_FLOW_ACTION_TYPE_SET_TAG:
@@ -15901,6 +15899,8 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev,
                                act_cnt->next_sub_policy = NULL;
                                mtr_policy->is_hierarchy = 1;
                                mtr_policy->dev = next_policy->dev;
+                               if (next_policy->mark)
+                                       mtr_policy->mark = 1;
                                action_flags |=
                                MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY;
                                break;