From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adrien Mazarguil Subject: [PATCH v2 05/29] net/mlx4: expose support for flow rule priorities Date: Thu, 12 Oct 2017 14:19:19 +0200 Message-ID: <6b54329baf3f351b052befa10de08b7b78e4fb82.1507809961.git.adrien.mazarguil@6wind.com> References: Cc: Nelio Laranjeiro , dev@dpdk.org To: Ferruh Yigit Return-path: Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by dpdk.org (Postfix) with ESMTP id 82DA61B290 for ; Thu, 12 Oct 2017 14:20:12 +0200 (CEST) Received: by mail-wm0-f53.google.com with SMTP id i124so12805513wmf.3 for ; Thu, 12 Oct 2017 05:20:12 -0700 (PDT) In-Reply-To: List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This PMD supports up to 4096 flow rule priority levels (0 to 4095). Applications were not allowed to use them until now due to overlaps with the default flows (e.g. MAC address, promiscuous mode). This is not an issue in isolated mode when such flows do not exist. Signed-off-by: Adrien Mazarguil Acked-by: Nelio Laranjeiro --- drivers/net/mlx4/mlx4_flow.c | 20 +++++++++++++++++--- drivers/net/mlx4/mlx4_flow.h | 3 +++ drivers/net/mlx4/mlx4_utils.h | 6 ++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c index 018843b..730249b 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 459030c..8ac09f1 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 b9c02d5..13f731a 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); -- 2.1.4