diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c index 018843bda9..730249b9fa 100644 --- a/drivers/net/mlx4/mlx4_flow.c +++ b/drivers/net/mlx4/mlx4_flow.c @@ -597,8 +597,8 @@ mlx4_flow_prepare(struct priv *priv, .queue = 0, .drop = 0, }; + uint32_t priority_override = 0; - (void)priv; if (attr->group) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ATTR_GROUP, @@ -606,11 +606,22 @@ mlx4_flow_prepare(struct priv *priv, "groups are not supported"); return -rte_errno; } - if (attr->priority) { + if (priv->isolated) { + priority_override = attr->priority; + } else if (attr->priority) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, NULL, - "priorities are not supported"); + "priorities are not supported outside" + " isolated mode"); + return -rte_errno; + } + if (attr->priority > MLX4_FLOW_PRIORITY_LAST) { + rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, + NULL, + "maximum priority level is " + MLX4_STR_EXPAND(MLX4_FLOW_PRIORITY_LAST)); return -rte_errno; } if (attr->egress) { @@ -680,6 +691,9 @@ mlx4_flow_prepare(struct priv *priv, } flow->offset += cur_item->dst_sz; } + /* Use specified priority level when in isolated mode. */ + if (priv->isolated && flow->ibv_attr) + flow->ibv_attr->priority = priority_override; /* Go over actions list */ for (; actions->type != RTE_FLOW_ACTION_TYPE_END; ++actions) { if (actions->type == RTE_FLOW_ACTION_TYPE_VOID) { diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h index 459030c60c..8ac09f1350 100644 --- a/drivers/net/mlx4/mlx4_flow.h +++ b/drivers/net/mlx4/mlx4_flow.h @@ -52,6 +52,9 @@ #include #include +/** Last and lowest priority level for a flow rule. */ +#define MLX4_FLOW_PRIORITY_LAST UINT32_C(0xfff) + /** PMD-specific (mlx4) definition of a flow rule handle. */ struct rte_flow { LIST_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */ diff --git a/drivers/net/mlx4/mlx4_utils.h b/drivers/net/mlx4/mlx4_utils.h index b9c02d59b1..13f731a0db 100644 --- a/drivers/net/mlx4/mlx4_utils.h +++ b/drivers/net/mlx4/mlx4_utils.h @@ -104,6 +104,12 @@ pmd_drv_log_basename(const char *s) \ snprintf(name, sizeof(name), __VA_ARGS__) +/** Generate a string out of the provided arguments. */ +#define MLX4_STR(...) # __VA_ARGS__ + +/** Similar to MLX4_STR() with enclosed macros expanded first. */ +#define MLX4_STR_EXPAND(...) MLX4_STR(__VA_ARGS__) + /* mlx4_utils.c */ int mlx4_fd_set_non_blocking(int fd);