net/mlx5: fix support for meter flow action in HWS
PATCH 1/1 net/mlx5: fix support for meter flow action in HWS
METER flow action is not supported in MLX5 HWS mode. Application must use METER_MARK flow action.
The patch removes METER action from HWS code.
--- drivers/net/mlx5/mlx5_flow_hw.c | 85 ----- drivers/net/mlx5/mlx5_flow_meter.c | 552 ----------------------------- 2 files changed, 637 deletions(-)
drivers/net/mlx5/mlx5_flow_hw.c +0 -85
@@ -1784,35 +1784,6 @@ flow_hw_represented_port_compile(struct rte_eth_dev *dev,return 0 ; } -static __rte_always_inline int -flow_hw_meter_compile (struct rte_eth_dev *dev, -const struct mlx5_flow_template_table_cfg *cfg, -uint16_t aso_mtr_pos, -uint16_t jump_pos, -const struct rte_flow_action *action, -struct mlx5_hw_actions *acts, -struct rte_flow_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_aso_mtr *aso_mtr; -const struct rte_flow_action_meter *meter = action->conf; -uint32_t group = cfg->attr.flow_attr.group; - - aso_mtr =mlx5_aso_meter_by_idx (priv, meter->mtr_id); - acts->rule_acts[aso_mtr_pos].action = priv->mtr_bulk.action; - acts->rule_acts[aso_mtr_pos].aso_meter.offset = aso_mtr->offset; - acts->jump =flow_hw_jump_action_register - (dev, cfg, aso_mtr->fm.group, error); -if (!acts->jump) -return -ENOMEM ; - acts->rule_acts[jump_pos].action = (!!group) ? - acts->jump->hws_action : - acts->jump->root_action; -if (mlx5_aso_mtr_wait (priv, aso_mtr, true)) -return -ENOMEM ; -return 0 ; -} - static __rte_always_inline intflow_hw_cnt_compile (struct rte_eth_dev *dev,uint32_t start_pos,struct mlx5_hw_actions *acts)
@@ -2534,7 +2505,6 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,bool reformat_used = false;bool recom_used = false;unsigned int of_vlan_offset; -uint16_t jump_pos;uint32_t ct_idx;int ret, err;uint32_t target_grp =0 ;
@@ -2802,27 +2772,6 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev, masks, acts, src_pos, dr_pos, &sub_error)) goto err;break ; -case RTE_FLOW_ACTION_TYPE_METER : -/* -* METER action is compiled to 2 DR actions - ASO_METER and FT. -* Calculated DR offset is stored only for ASO_METER and FT -* is assumed to be the next action. -*/ - jump_pos = dr_pos +1 ; -if (actions->conf && masks->conf && - ((const struct rte_flow_action_meter *) - masks->conf)->mtr_id) { - err =flow_hw_meter_compile (dev, cfg, - dr_pos, jump_pos, actions, acts, - &sub_error); -if (err) - goto err; - }else if (__flow_hw_act_data_general_append (priv, acts, - actions->type, - src_pos, - dr_pos)) - goto err; -break ;case RTE_FLOW_ACTION_TYPE_AGE : ret =flow_hw_translate_group (dev, cfg, attr->group, &target_grp, &sub_error);
@@ -3510,7 +3459,6 @@ flow_hw_actions_construct(struct rte_eth_dev *dev,const struct rte_flow_action_ipv6_ext_push *ipv6_push;const struct rte_flow_item *enc_item =NULL ;const struct rte_flow_action_ethdev *port_action =NULL ; -const struct rte_flow_action_meter *meter =NULL ;const struct rte_flow_action_age *age =NULL ;const struct rte_flow_action_nat64 *nat64_c =NULL ;struct rte_flow_attr attr = {
@@ -3683,28 +3631,6 @@ flow_hw_actions_construct(struct rte_eth_dev *dev, rule_acts + act_data->action_dst, act_data->shared_meter.id);break ; -case RTE_FLOW_ACTION_TYPE_METER : - meter = action->conf; - mtr_id = meter->mtr_id; - aso_mtr =mlx5_aso_meter_by_idx (priv, mtr_id); - rule_acts[act_data->action_dst].action = - priv->mtr_bulk.action; - rule_acts[act_data->action_dst].aso_meter.offset = - aso_mtr->offset; - jump =flow_hw_jump_action_register - (dev, &table->cfg, aso_mtr->fm.group,NULL ); -if (!jump) - goto error; -MLX5_ASSERT - (!rule_acts[act_data->action_dst +1 ].action); - rule_acts[act_data->action_dst +1 ].action = - (!!attr.group) ? jump->hws_action : - jump->root_action; - flow->jump = jump; - flow->flags |=MLX5_FLOW_HW_FLOW_FLAG_FATE_JUMP ; -if (mlx5_aso_mtr_wait (priv, aso_mtr, true)) - goto error; -break ;case RTE_FLOW_ACTION_TYPE_AGE : aux =mlx5_flow_hw_aux (dev->data->port_id, flow); age = action->conf;
@@ -7334,10 +7260,6 @@ mlx5_flow_hw_actions_validate(struct rte_eth_dev *dev, } action_flags |=MLX5_FLOW_ACTION_IPV6_ROUTING_REMOVE ;break ; -case RTE_FLOW_ACTION_TYPE_METER : -/* TODO: Validation logic */ - action_flags |=MLX5_FLOW_ACTION_METER ; -break ;case RTE_FLOW_ACTION_TYPE_METER_MARK : ret =flow_hw_validate_action_meter_mark (dev, action, false, error);if (ret <0 )
@@ -7665,13 +7587,6 @@ flow_hw_parse_flow_actions_to_dr_actions(struct rte_eth_dev *dev, action_types[mhdr_off] = type; }break ; -case RTE_FLOW_ACTION_TYPE_METER : - at->dr_off[i] = curr_off; - action_types[curr_off++] =MLX5DR_ACTION_TYP_ASO_METER ; -if (curr_off >=MLX5_HW_MAX_ACTS ) - goto err_actions_num; - action_types[curr_off++] =MLX5DR_ACTION_TYP_TBL ; -break ;case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN : type = mlx5_hw_dr_action_types[at->actions[i].type]; at->dr_off[i] = curr_off;
drivers/net/mlx5/mlx5_flow_meter.c +0 -552
594 lines not on this page · raw message
Signature · 1 line
2.48.1
Please disregard the Community Lab DTS failure just reported on this patchseries. I need to reconfigure the testbed and rerun the test.
Quoted 836 lines · Gregory Etelson
METER flow action is not supported in MLX5 HWS mode. Application must use
METER_MARKflow action.The patch removes METER action from HWS code.
Fixes 48fbb0e93d06 ("net/mlx5: support flow meter mark indirect actionwith HWS")
Signed-off-by Gregory Etelson <[email protected]>--- drivers/net/mlx5/mlx5_flow_hw.c | 85 ----- drivers/net/mlx5/mlx5_flow_meter.c | 552 ----------------------------- 2 files changed, 637 deletions(-)drivers/net/mlx5/mlx5_flow_hw.c +0
-29@@ -1784,35 +1784,6 @@ flow_hw_represented_port_compile(struct rte_eth_dev *dev, return 0; } -static __rte_always_inline int -flow_hw_meter_compile (struct rte_eth_dev *dev, -const struct mlx5_flow_template_table_cfg *cfg, -uint16_t aso_mtr_pos, -uint16_t jump_pos, -const struct rte_flow_action *action, -struct mlx5_hw_actions *acts, -struct rte_flow_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_aso_mtr *aso_mtr; -const struct rte_flow_action_meter *meter = action->conf; -uint32_t group = cfg->attr.flow_attr.group; - - aso_mtr =mlx5_aso_meter_by_idx (priv, meter->mtr_id); - acts->rule_acts[aso_mtr_pos].action = priv->mtr_bulk.action; - acts->rule_acts[aso_mtr_pos].aso_meter.offset = aso_mtr->offset; - acts->jump =flow_hw_jump_action_register - (dev, cfg, aso_mtr->fm.group, error); -if (!acts->jump) -return -ENOMEM ; - acts->rule_acts[jump_pos].action = (!!group) ? - acts->jump->hws_action : - acts->jump->root_action; -if (mlx5_aso_mtr_wait (priv, aso_mtr, true)) -return -ENOMEM ; -return 0 ; -} - static __rte_always_inline int flow_hw_cnt_compile(struct rte_eth_dev *dev, uint32_t start_pos,struct
mlx5_hw_actions*acts)drivers/net/mlx5/mlx5_flow_hw.c +0
-1@@ -2534,7 +2505,6 @@ __flow_hw_translate_actions_template(structrte_eth_dev *dev, bool reformat_used = false;bool recom_used = false;unsigned int of_vlan_offset; -uint16_t jump_pos;uint32_t ct_idx;int ret, err;uint32_t target_grp = 0;drivers/net/mlx5/mlx5_flow_hw.c +0
-3@@ -2802,27 +2772,6 @@ __flow_hw_translate_actions_template(structrte_eth_dev *dev, masks, acts, src_pos, dr_pos, &sub_error)) goto err;break ; -case RTE_FLOW_ACTION_TYPE_METER : -/* -* METER action is compiled to 2 DR actions -
ASO_METERand FT.
- * Calculated DR offset is stored only forASO_METERand FTdrivers/net/mlx5/mlx5_flow_hw.c +0
-8-* is assumed to be the next action. -*/ - jump_pos = dr_pos +1 ; -if (actions->conf && masks->conf && - ((const struct rte_flow_action_meter *) - masks->conf)->mtr_id) { - err = flow_hw_meter_compile(dev, cfg, - dr_pos,
jump_pos, actions, acts,drivers/net/mlx5/mlx5_flow_hw.c +0
-4- &sub_error); -if (err) - goto err; - } else if (__flow_hw_act_data_general_append(priv,acts,
-actions->type,
-src_pos,
-dr_pos))drivers/net/mlx5/mlx5_flow_hw.c +0
-2- goto err; -break ;case RTE_FLOW_ACTION_TYPE_AGE : ret = flow_hw_translate_group(dev, cfg,
attr->group,&target_grp, &sub_error);drivers/net/mlx5/mlx5_flow_hw.c +0
-11@@ -3510,7 +3459,6 @@ flow_hw_actions_construct(struct rte_eth_dev *dev,const struct rte_flow_action_ipv6_ext_push *ipv6_push;const struct rte_flow_item *enc_item =NULL ;const struct rte_flow_action_ethdev *port_action =NULL ; -const struct rte_flow_action_meter *meter =NULL ;const struct rte_flow_action_age *age =NULL ;const struct rte_flow_action_nat64 *nat64_c =NULL ;struct rte_flow_attr attr = {@@ -3683,28 +3631,6 @@ flow_hw_actions_construct(struct rte_eth_dev *dev, rule_acts + act_data->action_dst, act_data->shared_meter.id );break ; -case RTE_FLOW_ACTION_TYPE_METER : - meter = action->conf; - mtr_id = meter->mtr_id; - aso_mtr =mlx5_aso_meter_by_idx (priv, mtr_id); - rule_acts[act_data->action_dst].action = - priv->mtr_bulk.action; - rule_acts[act_data->action_dst].aso_meter.offset = - aso_mtr->offset; - jump = flow_hw_jump_action_register - (dev, &table->cfg, aso_mtr->fm.group,NULL);
drivers/net/mlx5/mlx5_flow_hw.c +0
-4-if (!jump) - goto error; -MLX5_ASSERT - (!rule_acts[act_data->action_dst +1].action);
drivers/net/mlx5/mlx5_flow_hw.c +0
-12- rule_acts[act_data->action_dst +1 ].action = - (!!attr.group) ? jump->hws_action : - jump->root_action; - flow->jump = jump; - flow->flags |=MLX5_FLOW_HW_FLOW_FLAG_FATE_JUMP ; -if (mlx5_aso_mtr_wait (priv, aso_mtr, true)) - goto error; -break ;case RTE_FLOW_ACTION_TYPE_AGE : aux =mlx5_flow_hw_aux (dev->data->port_id, flow); age = action->conf;@@ -7334,10 +7260,6 @@ mlx5_flow_hw_actions_validate(struct rte_eth_dev *dev, } action_flags |=MLX5_FLOW_ACTION_IPV6_ROUTING_REMOVE ;break ; -case RTE_FLOW_ACTION_TYPE_METER : -/* TODO: Validation logic */ - action_flags |=MLX5_FLOW_ACTION_METER ; -break ;case RTE_FLOW_ACTION_TYPE_METER_MARK :ret = flow_hw_validate_action_meter_mark(dev,
action, false, error); if (ret < 0)drivers/net/mlx5/mlx5_flow_hw.c +0
-7@@ -7665,13 +7587,6 @@ flow_hw_parse_flow_actions_to_dr_actions(structrte_eth_dev *dev, action_types[mhdr_off] = type; }break ; -case RTE_FLOW_ACTION_TYPE_METER : - at->dr_off[i] = curr_off; - action_types[curr_off++] =MLX5DR_ACTION_TYP_ASO_METER ; -if (curr_off >=MLX5_HW_MAX_ACTS ) - goto err_actions_num; - action_types[curr_off++] =MLX5DR_ACTION_TYP_TBL ; -break ;case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN :type =
mlx5_hw_dr_action_types[at->actions[i].type]; at->dr_off[i] = curr_off;drivers/net/mlx5/mlx5_flow_meter.c +0
-35@@ -1166,49 +1166,6 @@ mlx5_flow_meter_policy_validate(struct rte_eth_dev *dev, return 0; } -#if defined(HAVE_MLX5_HWS_SUPPORT ) -/** -* Callback to check MTR policy action validate for HWS -* -* @param[in] dev -* Pointer to Ethernet device. -* @param[in] actions -* Pointer to meter policy action detail. -* @param[out] error -* Pointer to the error structure. -* -* @return -* 0 on success, a negative errno value otherwise and rte_errno is set. -*/ -static int -mlx5_flow_meter_policy_hws_validate (struct rte_eth_dev *dev, -struct rte_mtr_meter_policy_params *policy, -struct rte_mtr_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -const struct rte_flow_actions_template_attr attr = { - .transfer = priv->sh->config.dv_esw_en ?1 :0 }; -int ret; -int i; - -if (mlx5_hws_active (dev) && !mlx5_hw_ctx_validate (dev,NULL )) -return -rte_mtr_error_set (error,EINVAL , -RTE_MTR_ERROR_TYPE_UNSPECIFIED ,NULL , - "non-template flow engine was not configured"); - if (!priv->mtr_en || !priv->sh->meter_aso_en) - return -rte_mtr_error_set(error, ENOTSUP, -RTE_MTR_ERROR_TYPE_METER_POLICY , - NULL, "meter policy unsupported."); -for (i =0 ; i <RTE_COLORS ; i++) { - ret = mlx5_flow_actions_validate(dev, &attr,policy->actions[i],
drivers/net/mlx5/mlx5_flow_meter.c +0
-128- policy->actions[i], NULL); -if (ret) - return ret; - } -return 0 ; -} -#endif - static int __mlx5_flow_meter_policy_delete(struct rte_eth_dev *dev, uint32_t policy_id,@@ -1540,334 +1497,6 @@ mlx5_flow_meter_policy_get(struct rte_eth_dev *dev, &policy_idx); } -#if defined(HAVE_MLX5_HWS_SUPPORT ) -/** -* Callback to delete MTR policy for HWS. -* -* @param[in] dev -* Pointer to Ethernet device. -* @param[in] policy_id -* Meter policy id. -* @param[out] error -* Pointer to the error structure. -* -* @return -* 0 on success, a negative errno value otherwise and rte_errno is set. -*/ -static int -mlx5_flow_meter_policy_hws_delete (struct rte_eth_dev *dev, -uint32_t policy_id, -struct rte_mtr_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_flow_meter_policy *mtr_policy; -uint32_t i, j; -uint32_t nb_flows =0 ; -int ret; -struct rte_flow_op_attr op_attr = { .postpone =1 }; -struct rte_flow_op_result result[RTE_COLORS *MLX5_MTR_DOMAIN_MAX ]; - -if (!priv->mtr_policy_arr) -return mlx5_flow_meter_policy_delete (dev, policy_id, error); -/* Meter policy must exist. */ - mtr_policy =mlx5_flow_meter_policy_find (dev, policy_id,NULL ); -if (!mtr_policy->initialized) -return -rte_mtr_error_set (error,ENOENT , -RTE_MTR_ERROR_TYPE_METER_POLICY_ID ,NULL , -"Meter policy does not exists." ); -/* Check policy is unused. */ -if (mtr_policy->ref_cnt) -return -rte_mtr_error_set (error,EBUSY , -RTE_MTR_ERROR_TYPE_METER_POLICY_ID , -NULL ,"Meter policy is in use." ); -rte_spinlock_lock (&priv->hw_ctrl_lock); -for (i =0 ; i <MLX5_MTR_DOMAIN_MAX ; i++) { -for (j =0 ; j <RTE_COLORS ; j++) { -if (mtr_policy->hws_flow_rule[i][j]) { - ret = rte_flow_async_destroy(dev->data->port_id, -CTRL_QUEUE_ID (priv), &op_attr, - mtr_policy->hws_flow_rule[i][j], -NULL ,NULL ); -if (ret <0 ) -continue ; - nb_flows++; - } - } - } - ret =rte_flow_push (dev->data->port_id,CTRL_QUEUE_ID (priv),NULL ); -while (nb_flows && (ret >=0 )) { - ret =rte_flow_pull (dev->data->port_id, -CTRL_QUEUE_ID (priv), result, - nb_flows,NULL ); - nb_flows -= ret; - } -for (i =0 ; i <MLX5_MTR_DOMAIN_MAX ; i++) { -if (mtr_policy->hws_flow_table[i]) -rte_flow_template_table_destroy (dev->data->port_id, - mtr_policy->hws_flow_table[i],NULL ); - } -for (i =0 ; i <RTE_COLORS ; i++) { -if (mtr_policy->hws_act_templ[i]) - rte_flow_actions_template_destroy(dev->data->port_id, - mtr_policy->hws_act_templ[i],NULL ); - } -if (mtr_policy->hws_item_templ) -rte_flow_pattern_template_destroy (dev->data->port_id, - mtr_policy->hws_item_templ,NULL ); -rte_spinlock_unlock (&priv->hw_ctrl_lock); -memset (mtr_policy,0 ,sizeof (struct mlx5_flow_meter_policy )); -return 0 ; -} - -/** -* Callback to add MTR policy for HWS. -* -* @param[in] dev -* Pointer to Ethernet device. -* @param[out] policy_id -* Pointer to policy id -* @param[in] actions -* Pointer to meter policy action detail. -* @param[out] error -* Pointer to the error structure. -* -* @return -* 0 on success, a negative errno value otherwise and rte_errno is set. -*/ -static int -mlx5_flow_meter_policy_hws_add (struct rte_eth_dev *dev, -uint32_t policy_id, -struct rte_mtr_meter_policy_params *policy, -struct rte_mtr_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_flow_meter_policy *mtr_policy =NULL ; -const struct rte_flow_action *act; -const struct rte_flow_action_meter *mtr; -struct mlx5_flow_meter_info *fm; -struct mlx5_flow_meter_policy *plc; -uint8_t domain_color =MLX5_MTR_ALL_DOMAIN_BIT ; -bool is_rss = false; -bool is_hierarchy = false; -int i, j; -uint32_t nb_colors =0 ; -uint32_t nb_flows =0 ; -int color; -int ret; -struct rte_flow_pattern_template_attr pta = {0 }; -struct rte_flow_actions_template_attr ata = {0 }; -struct rte_flow_template_table_attr ta = { {0 },0 }; -struct rte_flow_op_attr op_attr = { .postpone =1 }; -struct rte_flow_op_result result[RTE_COLORS *MLX5_MTR_DOMAIN_MAX ]; - const uint32_t color_mask = (UINT32_C(1) << MLX5_MTR_COLOR_BITS) -1;
drivers/net/mlx5/mlx5_flow_meter.c +0
-22-int color_reg_c_idx =mlx5_flow_get_reg_id (dev,MLX5_MTR_COLOR , -0 ,NULL ); -struct rte_flow_item_tag tag_spec = { - .data =0 , - .index = color_reg_c_idx - }; -struct rte_flow_item_tag tag_mask = { - .data = color_mask, - .index =0xff }; -struct rte_flow_item pattern[] = { - [0 ] = { - .type = (enum rte_flow_item_type ) -MLX5_RTE_FLOW_ITEM_TYPE_TAG , - .spec = &tag_spec, - .mask = &tag_mask, - }, - [1 ] = { .type =RTE_FLOW_ITEM_TYPE_END } - }; - -if (mlx5_hws_active (dev) && !mlx5_hw_ctx_validate (dev,NULL )) - return -rte_mtr_error_set(error, EINVAL, - RTE_MTR_ERROR_TYPE_UNSPECIFIED,NULL,
- "non-template flow engine was
not configured");drivers/net/mlx5/mlx5_flow_meter.c +0
-2-if (!priv->mtr_policy_arr) - return mlx5_flow_meter_policy_add(dev, policy_id, policy,error);
drivers/net/mlx5/mlx5_flow_meter.c +0
-12- mtr_policy =mlx5_flow_meter_policy_find (dev, policy_id,NULL ); -if (mtr_policy->initialized) -return -rte_mtr_error_set (error,EEXIST , -RTE_MTR_ERROR_TYPE_METER_POLICY_ID , -NULL ,"Meter policy already exists." ); -if (!policy || - (!policy->actions[RTE_COLOR_RED ] && - !policy->actions[RTE_COLOR_YELLOW ] && - !policy->actions[RTE_COLOR_GREEN ])) - return -rte_mtr_error_set(error, EINVAL, - RTE_MTR_ERROR_TYPE_METER_POLICY, - NULL, "Meter policy actions arenot valid.");
drivers/net/mlx5/mlx5_flow_meter.c +0
-10-if (policy->actions[RTE_COLOR_RED ] ==RTE_FLOW_ACTION_TYPE_END ) - mtr_policy->skip_r =1 ; -if (policy->actions[RTE_COLOR_YELLOW ] ==RTE_FLOW_ACTION_TYPE_END ) - mtr_policy->skip_y =1 ; -if (policy->actions[RTE_COLOR_GREEN ] ==RTE_FLOW_ACTION_TYPE_END ) - mtr_policy->skip_g =1 ; -if (mtr_policy->skip_r && mtr_policy->skip_y && mtr_policy->skip_g) - return -rte_mtr_error_set(error, ENOTSUP, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, "Meter policy actions areempty.");
drivers/net/mlx5/mlx5_flow_meter.c +0
-8-for (i =0 ; i <RTE_COLORS ; i++) { - act = policy->actions[i]; -while (act && act->type !=RTE_FLOW_ACTION_TYPE_END ) { -switch (act->type) { -case RTE_FLOW_ACTION_TYPE_PORT_ID : -/* fall-through. */ -case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT : - domain_color &=~(MLX5_MTR_DOMAIN_INGRESS_BIT |
drivers/net/mlx5/mlx5_flow_meter.c +0
-7- MLX5_MTR_DOMAIN_EGRESS_BIT); -break ; -case RTE_FLOW_ACTION_TYPE_RSS : - is_rss = true; -/* fall-through. */ -case RTE_FLOW_ACTION_TYPE_QUEUE : - domain_color &=~(MLX5_MTR_DOMAIN_EGRESS_BIT |
drivers/net/mlx5/mlx5_flow_meter.c +0
-7- MLX5_MTR_DOMAIN_TRANSFER_BIT); -break ; -case RTE_FLOW_ACTION_TYPE_METER : - is_hierarchy = true; - mtr = act->conf; - fm = mlx5_flow_meter_find(priv, - mtr->mtr_id,NULL);
drivers/net/mlx5/mlx5_flow_meter.c +0
-2-if (!fm) - return -rte_mtr_error_set(error,EINVAL,
-RTE_MTR_ERROR_TYPE_MTR_ID,
NULL,
- "Meter not found in meter
hierarchy.");drivers/net/mlx5/mlx5_flow_meter.c +0
-29- plc =mlx5_flow_meter_policy_find (dev, - fm->policy_id, -NULL ); -MLX5_ASSERT (plc); - domain_color &=MLX5_MTR_ALL_DOMAIN_BIT & - (plc->ingress << -MLX5_MTR_DOMAIN_INGRESS ); - domain_color &=MLX5_MTR_ALL_DOMAIN_BIT & - (plc->egress << -MLX5_MTR_DOMAIN_EGRESS ); - domain_color &=MLX5_MTR_ALL_DOMAIN_BIT & - (plc->transfer << -MLX5_MTR_DOMAIN_TRANSFER ); -break ; -default : -break ; - } - act++; - } - } -if (priv->sh->config.dv_esw_en) - domain_color &= ~(MLX5_MTR_DOMAIN_EGRESS_BIT | -MLX5_MTR_DOMAIN_TRANSFER_BIT ); -else - domain_color &= ~MLX5_MTR_DOMAIN_TRANSFER_BIT ; -if (!domain_color) - return -rte_mtr_error_set(error, ENOTSUP, - RTE_MTR_ERROR_TYPE_METER_POLICY_ID, - NULL, "Meter policy domains areconflicting.");
drivers/net/mlx5/mlx5_flow_meter.c +0
-2- mtr_policy->is_rss = is_rss; - mtr_policy->ingress = !!(domain_color &
MLX5_MTR_DOMAIN_INGRESS_BIT);drivers/net/mlx5/mlx5_flow_meter.c +0
-4- pta.ingress = mtr_policy->ingress; - mtr_policy->egress = !!(domain_color &MLX5_MTR_DOMAIN_EGRESS_BIT ); - pta.egress = mtr_policy->egress; - mtr_policy->transfer = !!(domain_color &
MLX5_MTR_DOMAIN_TRANSFER_BIT);drivers/net/mlx5/mlx5_flow_meter.c +0
-45- pta.transfer = mtr_policy->transfer; - mtr_policy->group =MLX5_FLOW_TABLE_HWS_POLICY - policy_id; - mtr_policy->is_hierarchy = is_hierarchy; - mtr_policy->initialized =1 ; -rte_spinlock_lock (&priv->hw_ctrl_lock); - mtr_policy->hws_item_templ = -rte_flow_pattern_template_create (dev->data->port_id, - &pta, pattern,NULL ); -if (!mtr_policy->hws_item_templ) - goto policy_add_err; -for (i =0 ; i <RTE_COLORS ; i++) { -if (mtr_policy->skip_g && i ==RTE_COLOR_GREEN ) -continue ; -if (mtr_policy->skip_y && i ==RTE_COLOR_YELLOW ) -continue ; -if (mtr_policy->skip_r && i ==RTE_COLOR_RED ) -continue ; - mtr_policy->hws_act_templ[nb_colors] = - rte_flow_actions_template_create(dev->data->port_id, - &ata, policy->actions[i], - policy->actions[i],NULL ); -if (!mtr_policy->hws_act_templ[nb_colors]) - goto policy_add_err; - nb_colors++; - } -for (i =0 ; i <MLX5_MTR_DOMAIN_MAX ; i++) { -memset (&ta,0 ,sizeof (ta)); - ta.nb_flows =RTE_COLORS ; - ta.flow_attr.group = mtr_policy->group; -if (i ==MLX5_MTR_DOMAIN_INGRESS ) { -if (!mtr_policy->ingress) -continue ; - ta.flow_attr.ingress =1 ; - }else if (i ==MLX5_MTR_DOMAIN_EGRESS ) { -if (!mtr_policy->egress) -continue ; - ta.flow_attr.egress =1 ; - }else if (i ==MLX5_MTR_DOMAIN_TRANSFER ) { -if (!mtr_policy->transfer) -continue ; - ta.flow_attr.transfer =1 ; - } - mtr_policy->hws_flow_table[i] = - rte_flow_template_table_create(dev->data->port_id, - &ta, &mtr_policy->hws_item_templ,1,
-mtr_policy->hws_act_templ,nb_colors,drivers/net/mlx5/mlx5_flow_meter.c +0
-97- NULL); -if (!mtr_policy->hws_flow_table[i]) - goto policy_add_err; - nb_colors =0 ; -for (j =0 ; j <RTE_COLORS ; j++) { -if (mtr_policy->skip_g && j ==RTE_COLOR_GREEN ) -continue ; -if (mtr_policy->skip_y && j ==RTE_COLOR_YELLOW ) -continue ; -if (mtr_policy->skip_r && j ==RTE_COLOR_RED ) -continue ; - color =rte_col_2_mlx5_col ((enum rte_color )j); - tag_spec.data = color; - mtr_policy->hws_flow_rule[i][j] = -rte_flow_async_create (dev->data->port_id, -CTRL_QUEUE_ID (priv), &op_attr, - mtr_policy->hws_flow_table[i], - pattern,0 , policy->actions[j], - nb_colors,NULL ,NULL ); -if (!mtr_policy->hws_flow_rule[i][j]) - goto policy_add_err; - nb_colors++; - nb_flows++; - } - ret =rte_flow_push (dev->data->port_id, -CTRL_QUEUE_ID (priv),NULL ); -if (ret <0 ) - goto policy_add_err; -while (nb_flows) { - ret =rte_flow_pull (dev->data->port_id, -CTRL_QUEUE_ID (priv), result, - nb_flows,NULL ); -if (ret <0 ) - goto policy_add_err; -for (j =0 ; j < ret; j++) { -if (result[j].status ==RTE_FLOW_OP_ERROR ) - goto policy_add_err; - } - nb_flows -= ret; - } - } -rte_spinlock_unlock (&priv->hw_ctrl_lock); -return 0 ; -policy_add_err: -rte_spinlock_unlock (&priv->hw_ctrl_lock); - ret =mlx5_flow_meter_policy_hws_delete (dev, policy_id, error); -memset (mtr_policy,0 ,sizeof (struct mlx5_flow_meter_policy )); -if (ret) -return ret; -return -rte_mtr_error_set (error,ENOTSUP , -RTE_MTR_ERROR_TYPE_UNSPECIFIED , -NULL ,"Failed to create meter policy." ); -} -#endif /** * Check meter validation. * @@ -2239,105 +1868,6 @@ mlx5_flow_meter_create(struct rte_eth_dev *dev, uint32_t meter_id, NULL, "Failed to create devx meter."); } -#if defined(HAVE_MLX5_HWS_SUPPORT ) -/** -* Create meter rules. -* -* @param[in] dev -* Pointer to Ethernet device. -* @param[in] meter_id -* Meter id. -* @param[in] params -* Pointer to rte meter parameters. -* @param[in] shared -* Meter shared with other flow or not. -* @param[out] error -* Pointer to rte meter error structure. -* -* @return -* 0 on success, a negative errno value otherwise and rte_errno is set. -*/ -static int -mlx5_flow_meter_hws_create (struct rte_eth_dev *dev,uint32_t meter_id, -struct rte_mtr_params *params,int shared, -struct rte_mtr_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_flow_meter_profile *profile; -struct mlx5_flow_meter_info *fm; -struct mlx5_flow_meter_policy *policy =NULL ; -struct mlx5_aso_mtr *aso_mtr; -struct mlx5_hw_q_job *job; -int ret; - -if (mlx5_hws_active (dev) && !mlx5_hw_ctx_validate (dev,NULL )) -return -rte_mtr_error_set (error,EINVAL , -RTE_MTR_ERROR_TYPE_UNSPECIFIED ,NULL , - "non-template flow engine was not configured"); - if (!priv->mtr_profile_arr || - !priv->mtr_policy_arr || - !priv->mtr_bulk.aso) - return -rte_mtr_error_set(error, ENOTSUP, -RTE_MTR_ERROR_TYPE_UNSPECIFIED ,NULL , - "Meter bulk array is not allocated."); -/* Meter profile must exist. */ - profile = mlx5_flow_meter_profile_find(priv,
params->meter_profile_id);drivers/net/mlx5/mlx5_flow_meter.c +0
-23-if (!profile->initialized) -return -rte_mtr_error_set (error,ENOENT , -RTE_MTR_ERROR_TYPE_METER_PROFILE_ID , -NULL ,"Meter profile id not valid." ); -/* Meter policy must exist. */ - policy =mlx5_flow_meter_policy_find (dev, - params->meter_policy_id,NULL ); -if (!policy->initialized) -return -rte_mtr_error_set (error,ENOENT , -RTE_MTR_ERROR_TYPE_METER_POLICY_ID , -NULL ,"Meter policy id not valid." ); -/* Meter ID must be valid. */ -if (meter_id >= priv->mtr_config.nb_meters) -return -rte_mtr_error_set (error,EINVAL , -RTE_MTR_ERROR_TYPE_MTR_ID , -NULL ,"Meter id not valid." ); -/* Find ASO object. */ - aso_mtr =mlx5_aso_meter_by_idx (priv, meter_id); - fm = &aso_mtr->fm; -if (fm->initialized) - return -rte_mtr_error_set(error, ENOENT, - RTE_MTR_ERROR_TYPE_MTR_ID, - NULL, "Meter object alreadyexists.");
drivers/net/mlx5/mlx5_flow_meter.c +0
-13-/* Fill the flow meter parameters. */ - fm->meter_id = meter_id; - fm->policy_id = params->meter_policy_id; - fm->profile = profile; - fm->meter_offset = meter_id; - fm->group = policy->group; -/* Add to the flow meter list. */ - fm->active_state =1 ;/* Config meter starts as active. */ - fm->is_enable = params->meter_enable; - fm->shared = !!shared; - fm->initialized =1 ; -/* Update ASO flow meter by wqe. */ - job = mlx5_flow_action_job_init(priv, MLX5_HW_INV_QUEUE, NULL,NULL,
- NULL,MLX5_HW_Q_JOB_TYPE_CREATE,
NULL);drivers/net/mlx5/mlx5_flow_meter.c +0
-5-if (!job) -return -rte_mtr_error_set (error,ENOMEM , -RTE_MTR_ERROR_TYPE_MTR_ID , -NULL ,"No job context." ); - ret = mlx5_aso_meter_update_by_wqe(priv, MLX5_HW_INV_QUEUE,
aso_mtr,drivers/net/mlx5/mlx5_flow_meter.c +0
-6- &priv->mtr_bulk, job, true); -if (ret) { -flow_hw_job_put (priv, job,CTRL_QUEUE_ID (priv)); - return -rte_mtr_error_set(error, ENOTSUP, - RTE_MTR_ERROR_TYPE_UNSPECIFIED, - NULL, "Failed to create devxmeter.");
drivers/net/mlx5/mlx5_flow_meter.c +0
-3- } - fm->active_state = params->meter_enable; - rte_atomic_fetch_add_explicit(&fm->profile->ref_cnt, 1,
rte_memory_order_relaxed);
- rte_atomic_fetch_add_explicit(&policy->ref_cnt, 1,rte_memory_order_relaxed);drivers/net/mlx5/mlx5_flow_meter.c +0
-47-return 0 ; -} -#endif - static int mlx5_flow_meter_params_flush(struct rte_eth_dev *dev, struct mlx5_flow_meter_info *fm,@@ -2444,58 +1974,6 @@ mlx5_flow_meter_destroy(struct rte_eth_dev *dev,uint32_t meter_id, return 0; } -/** -* Destroy meter rules. -* -* @param[in] dev -* Pointer to Ethernet device. -* @param[in] meter_id -* Meter id. -* @param[out] error -* Pointer to rte meter error structure. -* -* @return -* 0 on success, a negative errno value otherwise and rte_errno is set. -*/ -static int -mlx5_flow_meter_hws_destroy (struct rte_eth_dev *dev,uint32_t meter_id, -struct rte_mtr_error *error) -{ -struct mlx5_priv *priv = dev->data->dev_private; -struct mlx5_aso_mtr *aso_mtr; -struct mlx5_flow_meter_info *fm; -struct mlx5_flow_meter_policy *policy; - -if (!priv->mtr_profile_arr || - !priv->mtr_policy_arr || - !priv->mtr_bulk.aso) -return -rte_mtr_error_set (error,ENOTSUP , -RTE_MTR_ERROR_TYPE_METER_POLICY ,NULL , -"Meter bulk array is not allocated." ); -/* Find ASO object. */ - aso_mtr =mlx5_aso_meter_by_idx (priv, meter_id); - fm = &aso_mtr->fm; -if (!fm->initialized) -return -rte_mtr_error_set (error,ENOENT , -RTE_MTR_ERROR_TYPE_MTR_ID , - NULL, "Meter object id not valid."); -/* Meter object must not have any owner. */ -if (fm->ref_cnt >0 ) -return -rte_mtr_error_set (error,EBUSY , -RTE_MTR_ERROR_TYPE_UNSPECIFIED , - NULL, "Meter object is being used."); -/* Destroy the meter profile. */ - rte_atomic_fetch_sub_explicit(&fm->profile->ref_cnt, - 1,
rte_memory_order_relaxed);drivers/net/mlx5/mlx5_flow_meter.c +0
-5-/* Destroy the meter policy. */ - policy =mlx5_flow_meter_policy_find (dev, - fm->policy_id,NULL ); - rte_atomic_fetch_sub_explicit(&policy->ref_cnt, - 1,
rte_memory_order_relaxed);drivers/net/mlx5/mlx5_flow_meter.c +0
-12-memset (fm,0 ,sizeof (struct mlx5_flow_meter_info )); -return 0 ; -} -/** * Modify meter state. * @@ -2835,14 +2313,6 @@ static const struct rte_mtr_ops mlx5_flow_mtr_hws_ops = { .meter_profile_add = mlx5_flow_meter_profile_hws_add, .meter_profile_delete = mlx5_flow_meter_profile_hws_delete, .meter_profile_get = mlx5_flow_meter_profile_get, - .meter_policy_validate = mlx5_flow_meter_policy_hws_validate, - .meter_policy_add = mlx5_flow_meter_policy_hws_add, - .meter_policy_delete = mlx5_flow_meter_policy_hws_delete, - .meter_policy_get = mlx5_flow_meter_policy_get, - .create = mlx5_flow_meter_hws_create, - .destroy = mlx5_flow_meter_hws_destroy, - .meter_enable = mlx5_flow_meter_enable, - .meter_disable = mlx5_flow_meter_disable, .meter_profile_update = mlx5_flow_meter_profile_update, .meter_dscp_table_update = NULL,.stats_update = NULL,
drivers/net/mlx5/mlx5_flow_meter.c +0
-8@@ -3286,14 +2756,6 @@ mlx5_flow_meter_flush(struct rte_eth_dev *dev, struct rte_mtr_error *error) NULL, "MTR object meter profile invalid."); } } -if (priv->mtr_bulk.aso) { -for (i =0 ; i < priv->mtr_config.nb_meters; i++) { - aso_mtr =mlx5_aso_meter_by_idx (priv, i); - fm = &aso_mtr->fm; -if (fm->initialized) -mlx5_flow_meter_hws_destroy (dev, i, error); - } - }if (priv->policy_idx_tbl) { MLX5_L3T_FOREACH(priv->policy_idx_tbl, i, entry) {policy_idx = *(uint32_t *)entry;drivers/net/mlx5/mlx5_flow_meter.c +0
-14@@ -3319,20 +2781,6 @@ mlx5_flow_meter_flush(struct rte_eth_dev *dev, struct rte_mtr_error *error) mlx5_l3t_destroy(priv->policy_idx_tbl); priv->policy_idx_tbl =NULL ; } -#if defined(HAVE_MLX5_HWS_SUPPORT ) -if (priv->mtr_policy_arr) { -struct mlx5_flow_meter_policy *policy; - -for (i =0 ; i < priv->mtr_config.nb_meter_policies; i++) { - policy =mlx5_flow_meter_policy_find (dev, i, - &policy_idx); -if (policy->initialized) { -mlx5_flow_meter_policy_hws_delete (dev, i, - error); - } - } - } -#endif if (priv->mtr_profile_tbl) { MLX5_L3T_FOREACH(priv->mtr_profile_tbl, i, entry) {fmp = entry;--
2.48.1
Hi,
Quoted 9 lines · Gregory Etelson
METER flow action is not supported in MLX5 HWS mode. Application must use
METER_MARKflow action.The patch removes METER action from HWS code.
Fixes 48fbb0e93d06 ("net/mlx5: support flow meter mark indirect action with HWS")Signed-off-by Gregory Etelson <[email protected]>---
Patch applied to next-net-mlx,
Signature · 2 lines
Kindest regards Raslan Darawsheh