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