@@ -2874,8 +2874,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
flow_list_create(struct rte_eth_dev *dev, struct mlx5_flows *list,
const struct rte_flow_attr *attr,
const struct rte_flow_item items[],
- const struct rte_flow_action actions[],
- bool external, struct rte_flow_error *error);
+ const struct rte_flow_action actions[], bool external,
+ enum mlx5_flow_drv_type type, struct rte_flow_error *error);
static void
flow_list_destroy(struct rte_eth_dev *dev, struct mlx5_flows *list,
@@ -3015,7 +3015,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
* by list traversing.
*/
mcp_res->flow = flow_list_create(dev, NULL, &attr, items,
- actions, false, error);
+ actions, false,
+ flow_get_drv_type(dev, &attr), error);
if (!mcp_res->flow)
goto error;
mcp_res->refcnt++;
@@ -4119,6 +4120,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
* Associated actions (list terminated by the END action).
* @param[in] external
* This flow rule is created by request external to PMD.
+ * @param[in] type
+ * Flow rule type, DV or VERBS.
* @param[out] error
* Perform verbose error reporting if not NULL.
*
@@ -4129,8 +4132,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
flow_list_create(struct rte_eth_dev *dev, struct mlx5_flows *list,
const struct rte_flow_attr *attr,
const struct rte_flow_item items[],
- const struct rte_flow_action actions[],
- bool external, struct rte_flow_error *error)
+ const struct rte_flow_action actions[], bool external,
+ enum mlx5_flow_drv_type type, struct rte_flow_error *error)
{
struct mlx5_priv *priv = dev->data->dev_private;
struct rte_flow *flow = NULL;
@@ -4188,7 +4191,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
rte_errno = ENOMEM;
goto error_before_flow;
}
- flow->drv_type = flow_get_drv_type(dev, attr);
+ flow->drv_type = type;
if (hairpin_id != 0)
flow->hairpin_flow_id = hairpin_id;
MLX5_ASSERT(flow->drv_type > MLX5_FLOW_TYPE_MIN &&
@@ -4339,7 +4342,8 @@ struct rte_flow *
struct rte_flow_error error;
return flow_list_create(dev, &priv->ctrl_flows, &attr, &pattern,
- actions, false, &error);
+ actions, false,
+ flow_get_drv_type(dev, &attr), &error);
}
/**
@@ -4356,9 +4360,13 @@ struct rte_flow *
struct rte_flow_error *error)
{
struct mlx5_priv *priv = dev->data->dev_private;
+ struct mlx5_flows *flow_list;
+ enum mlx5_flow_drv_type type = flow_get_drv_type(dev, attr);
- return flow_list_create(dev, &priv->noncached_flows,
- attr, items, actions, true, error);
+ flow_list = (type == MLX5_FLOW_TYPE_DV) ? &priv->noncached_flows :
+ &priv->cached_flows;
+ return flow_list_create(dev, flow_list, attr,
+ items, actions, true, type, error);
}
/**
@@ -4548,8 +4556,8 @@ struct rte_flow *
actions[0].type = RTE_FLOW_ACTION_TYPE_JUMP;
actions[0].conf = &jump;
actions[1].type = RTE_FLOW_ACTION_TYPE_END;
- flow = flow_list_create(dev, &priv->ctrl_flows,
- &attr, items, actions, false, &error);
+ flow = flow_list_create(dev, &priv->ctrl_flows, &attr, items, actions,
+ false, flow_get_drv_type(dev, &attr), &error);
if (!flow) {
DRV_LOG(DEBUG,
"Failed to create ctrl flow: rte_errno(%d),"
@@ -4636,8 +4644,8 @@ struct rte_flow *
}
for (i = 0; i != priv->reta_idx_n; ++i)
queue[i] = (*priv->reta_idx)[i];
- flow = flow_list_create(dev, &priv->ctrl_flows,
- &attr, items, actions, false, &error);
+ flow = flow_list_create(dev, &priv->ctrl_flows, &attr, items, actions,
+ false, flow_get_drv_type(dev, &attr), &error);
if (!flow)
return -rte_errno;
return 0;
@@ -5078,7 +5086,7 @@ struct rte_flow *
}
flow = flow_list_create(dev, &priv->noncached_flows, &fdir_flow->attr,
fdir_flow->items, fdir_flow->actions, true,
- NULL);
+ flow_get_drv_type(dev, &fdir_flow->attr), NULL);
if (!flow)
goto error;
MLX5_ASSERT(!flow->fdir);
@@ -5695,8 +5703,8 @@ struct mlx5_flow_counter *
if (!config->dv_flow_en)
break;
/* Create internal flow, validation skips copy action. */
- flow = flow_list_create(dev, NULL, &attr, items,
- actions, false, &error);
+ flow = flow_list_create(dev, NULL, &attr, items, actions, false,
+ flow_get_drv_type(dev, &attr), &error);
if (!flow)
continue;
if (dev->data->dev_started || !flow_drv_apply(dev, flow, NULL))