net/mlx5: fix internal root table flow priority
When creating internal transfer flow on root table with lowest
priority, the flow was created with max UINT32_MAX priority. It is wrong
since the flow is created in kernel and max priority supported is 16.
This patch fixes this by adding internal flow check.
Fixes: 5f8ae44dd4
("net/mlx5: enlarge maximal flow priority")
Cc: stable@dpdk.org
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
This commit is contained in:
parent
d9020f2577
commit
ebe9afedc7
@ -1003,13 +1003,15 @@ mlx5_get_lowest_priority(struct rte_eth_dev *dev,
|
||||
* Pointer to device flow rule attributes.
|
||||
* @param[in] subpriority
|
||||
* The priority based on the items.
|
||||
* @param[in] external
|
||||
* Flow is user flow.
|
||||
* @return
|
||||
* The matcher priority of the flow.
|
||||
*/
|
||||
uint16_t
|
||||
mlx5_get_matcher_priority(struct rte_eth_dev *dev,
|
||||
const struct rte_flow_attr *attr,
|
||||
uint32_t subpriority)
|
||||
uint32_t subpriority, bool external)
|
||||
{
|
||||
uint16_t priority = (uint16_t)attr->priority;
|
||||
struct mlx5_priv *priv = dev->data->dev_private;
|
||||
@ -1018,6 +1020,9 @@ mlx5_get_matcher_priority(struct rte_eth_dev *dev,
|
||||
if (attr->priority == MLX5_FLOW_LOWEST_PRIO_INDICATOR)
|
||||
priority = priv->config.flow_prio - 1;
|
||||
return mlx5_os_flow_adjust_priority(dev, priority, subpriority);
|
||||
} else if (!external && attr->transfer && attr->group == 0 &&
|
||||
attr->priority == MLX5_FLOW_LOWEST_PRIO_INDICATOR) {
|
||||
return (priv->config.flow_prio - 1) * 3;
|
||||
}
|
||||
if (attr->priority == MLX5_FLOW_LOWEST_PRIO_INDICATOR)
|
||||
priority = MLX5_NON_ROOT_FLOW_MAX_PRIO;
|
||||
|
@ -1431,8 +1431,8 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
|
||||
uint32_t mlx5_get_lowest_priority(struct rte_eth_dev *dev,
|
||||
const struct rte_flow_attr *attr);
|
||||
uint16_t mlx5_get_matcher_priority(struct rte_eth_dev *dev,
|
||||
const struct rte_flow_attr *attr,
|
||||
uint32_t subpriority);
|
||||
const struct rte_flow_attr *attr,
|
||||
uint32_t subpriority, bool external);
|
||||
int mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
|
||||
enum mlx5_feature_name feature,
|
||||
uint32_t id,
|
||||
|
@ -13556,7 +13556,8 @@ flow_dv_translate(struct rte_eth_dev *dev,
|
||||
matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
|
||||
matcher.mask.size);
|
||||
matcher.priority = mlx5_get_matcher_priority(dev, attr,
|
||||
matcher.priority);
|
||||
matcher.priority,
|
||||
dev_flow->external);
|
||||
/**
|
||||
* When creating meter drop flow in drop table, using original
|
||||
* 5-tuple match, the matcher priority should be lower than
|
||||
|
Loading…
Reference in New Issue
Block a user