From patchwork Mon Apr 3 11:20:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?N=C3=A9lio_Laranjeiro?= X-Patchwork-Id: 23150 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 528D82C18; Mon, 3 Apr 2017 13:20:30 +0200 (CEST) Received: from mail-wr0-f177.google.com (mail-wr0-f177.google.com [209.85.128.177]) by dpdk.org (Postfix) with ESMTP id 92A8A2BBE for ; Mon, 3 Apr 2017 13:20:29 +0200 (CEST) Received: by mail-wr0-f177.google.com with SMTP id k6so159521829wre.2 for ; Mon, 03 Apr 2017 04:20:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=1To8XGKPA5sSGGpFSastoydUNDttcw9AHb3AatJJlFM=; b=fvEFIJhikEPBYq/YM96cMIOo7IPdSUcnfeH0dUBfc96USAHwg5JAj94KPBFxE0RdMj wYHAt5NJ69gJ5oPsN1gNgLA7LPyEfLeZFlHBogtsmk6XJYdW5nbtrsaULtd+3Ky3jyKX 4gsUCxPpoQOl2K985y+GvoX4YMac6VSp9LIp13CofGLxV1K1dTmpg/xnJ2jZLa04B7Zh wd0VBDE6ZlvuSm/c8R8Jhx/qodBXOX+Zx4jm7QDacp3l+yURO7ZvmsUSb6PB6r0azO5l oA3HviS2BtnOJTlg0WhBNnM00IKtpuJry87Srq21nW2iHm+7rEZlvzzml2bbHqfRnX7b bB+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=1To8XGKPA5sSGGpFSastoydUNDttcw9AHb3AatJJlFM=; b=iFDhlLI+kHrcilnxkXWqgvHHEWUNMToetgcatcNyV+moWpqTPAPlZesHItbu8xDSQl Ts+bwLb1z8a74VdQdOsgan5KC3WzTunBMH53tnwV10jfYTCRzjY3ICSqvvJR6DbIfBvf ezD0fTem794COnH/3wk2RN83fDZIINmEnDMM1gU6ePwWEBFnDa/JWHgwRJ5JOd4GkCbD 8kKIAmhs5YbWlIWkQJH/CNjlb9Wfe/jnTnsUSjl4hjjAJN6iGgqrf620gKq2y60/ZYc5 N0J0bUuibtyFU3d/Da92TDHXi8c/NzZm40P+2Qm2nC3YkxmbWq8GuZGKyZmtENbU2sQQ Bquw== X-Gm-Message-State: AFeK/H2VY55MnhWqE2QBqiCM3N4jYBLGunPL0Id07Y4Q5Ayjddn02gsm YLKylY8TnVyCbVqN X-Received: by 10.28.94.15 with SMTP id s15mr9193356wmb.89.1491218428845; Mon, 03 Apr 2017 04:20:28 -0700 (PDT) Received: from ping.vm.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id 201sm13943426wmr.5.2017.04.03.04.20.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Apr 2017 04:20:28 -0700 (PDT) From: Nelio Laranjeiro To: dev@dpdk.org, Ferruh Yigit Cc: Adrien Mazarguil , Yongseok Koh Date: Mon, 3 Apr 2017 13:20:10 +0200 Message-Id: <0c12a237b5ee15689f3c83b4f43b5afa7a26fdaf.1491218354.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH] net/mlx5: remove duplicated process X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Flow validation already processes the final actions to verify if a rule can be applied or not and the same is done during creation. As the creation function relies on validation to generate and apply a rule, this job can be fully handled by the validation function. Signed-off-by: Nelio Laranjeiro Acked-by: Adrien Mazarguil Acked-by: Yongseok Koh --- drivers/net/mlx5/mlx5_flow.c | 115 ++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 72 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 5468642..b34be55 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -377,6 +377,8 @@ mlx5_flow_item_validate(const struct rte_flow_item *item, * Perform verbose error reporting if not NULL. * @param[in, out] flow * Flow structure to update. + * @param[in, out] action + * Action structure to update. * * @return * 0 on success, a negative errno value otherwise and rte_errno is set. @@ -387,14 +389,10 @@ priv_flow_validate(struct priv *priv, const struct rte_flow_item items[], const struct rte_flow_action actions[], struct rte_flow_error *error, - struct mlx5_flow *flow) + struct mlx5_flow *flow, + struct mlx5_flow_action *action) { const struct mlx5_flow_items *cur_item = mlx5_flow_items; - struct mlx5_flow_action action = { - .queue = 0, - .drop = 0, - .mark = 0, - }; (void)priv; if (attr->group) { @@ -474,7 +472,7 @@ priv_flow_validate(struct priv *priv, if (actions->type == RTE_FLOW_ACTION_TYPE_VOID) { continue; } else if (actions->type == RTE_FLOW_ACTION_TYPE_DROP) { - action.drop = 1; + action->drop = 1; } else if (actions->type == RTE_FLOW_ACTION_TYPE_QUEUE) { const struct rte_flow_action_queue *queue = (const struct rte_flow_action_queue *) @@ -484,34 +482,35 @@ priv_flow_validate(struct priv *priv, if (!queue || (queue->index > (priv->rxqs_n - 1))) goto exit_action_not_supported; - for (n = 0; n < action.queues_n; ++n) { - if (action.queues[n] == queue->index) { + for (n = 0; n < action->queues_n; ++n) { + if (action->queues[n] == queue->index) { found = 1; break; } } - if (action.queues_n && !found) { + if (action->queues_n && !found) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, actions, "queue action not in RSS queues"); return -rte_errno; } - action.queue = 1; - action.queues_n = 1; - action.queues[0] = queue->index; + action->queue = 1; + action->queues_n = 1; + action->queues[0] = queue->index; } else if (actions->type == RTE_FLOW_ACTION_TYPE_RSS) { const struct rte_flow_action_rss *rss = (const struct rte_flow_action_rss *) actions->conf; uint16_t n; - if (action.queues_n == 1) { + if (action->queues_n == 1) { uint16_t found = 0; - assert(action.queues_n); + assert(action->queues_n); for (n = 0; n < rss->num; ++n) { - if (action.queues[0] == rss->queue[n]) { + if (action->queues[0] == + rss->queue[n]) { found = 1; break; } @@ -525,10 +524,10 @@ priv_flow_validate(struct priv *priv, return -rte_errno; } } - action.queue = 1; + action->queue = 1; for (n = 0; n < rss->num; ++n) - action.queues[n] = rss->queue[n]; - action.queues_n = rss->num; + action->queues[n] = rss->queue[n]; + action->queues_n = rss->num; } else if (actions->type == RTE_FLOW_ACTION_TYPE_MARK) { const struct rte_flow_action_mark *mark = (const struct rte_flow_action_mark *) @@ -548,16 +547,17 @@ priv_flow_validate(struct priv *priv, " and 16777199"); return -rte_errno; } - action.mark = 1; + action->mark = 1; + action->mark_id = mark->id; } else if (actions->type == RTE_FLOW_ACTION_TYPE_FLAG) { - action.mark = 1; + action->mark = 1; } else { goto exit_action_not_supported; } } - if (action.mark && !flow->ibv_attr && !action.drop) + if (action->mark && !flow->ibv_attr && !action->drop) flow->offset += sizeof(struct ibv_exp_flow_spec_action_tag); - if (!action.queue && !action.drop) { + if (!action->queue && !action->drop) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, "no valid action"); return -rte_errno; @@ -589,9 +589,17 @@ mlx5_flow_validate(struct rte_eth_dev *dev, struct priv *priv = dev->data->dev_private; int ret; struct mlx5_flow flow = { .offset = sizeof(struct ibv_exp_flow_attr) }; + struct mlx5_flow_action action = { + .queue = 0, + .drop = 0, + .mark = 0, + .mark_id = MLX5_FLOW_MARK_DEFAULT, + .queues_n = 0, + }; priv_lock(priv); - ret = priv_flow_validate(priv, attr, items, actions, error, &flow); + ret = priv_flow_validate(priv, attr, items, actions, error, &flow, + &action); priv_unlock(priv); return ret; } @@ -1130,11 +1138,18 @@ priv_flow_create(struct priv *priv, struct rte_flow_error *error) { struct rte_flow *rte_flow; - struct mlx5_flow_action action; struct mlx5_flow flow = { .offset = sizeof(struct ibv_exp_flow_attr), }; + struct mlx5_flow_action action = { + .queue = 0, + .drop = 0, + .mark = 0, + .mark_id = MLX5_FLOW_MARK_DEFAULT, + .queues_n = 0, + }; int err; - err = priv_flow_validate(priv, attr, items, actions, error, &flow); + err = priv_flow_validate(priv, attr, items, actions, error, &flow, + &action); if (err) goto exit; flow.ibv_attr = rte_malloc(__func__, flow.offset, 0); @@ -1156,52 +1171,8 @@ priv_flow_create(struct priv *priv, flow.inner = 0; flow.hash_fields = 0; claim_zero(priv_flow_validate(priv, attr, items, actions, - error, &flow)); - action = (struct mlx5_flow_action){ - .queue = 0, - .drop = 0, - .mark = 0, - .mark_id = MLX5_FLOW_MARK_DEFAULT, - }; - for (; actions->type != RTE_FLOW_ACTION_TYPE_END; ++actions) { - if (actions->type == RTE_FLOW_ACTION_TYPE_VOID) { - continue; - } else if (actions->type == RTE_FLOW_ACTION_TYPE_QUEUE) { - action.queue = 1; - action.queues[action.queues_n++] = - ((const struct rte_flow_action_queue *) - actions->conf)->index; - } else if (actions->type == RTE_FLOW_ACTION_TYPE_RSS) { - const struct rte_flow_action_rss *rss = - (const struct rte_flow_action_rss *) - actions->conf; - uint16_t n; - - action.queue = 1; - action.queues_n = rss->num; - for (n = 0; n < rss->num; ++n) - action.queues[n] = rss->queue[n]; - } else if (actions->type == RTE_FLOW_ACTION_TYPE_DROP) { - action.drop = 1; - action.mark = 0; - } else if (actions->type == RTE_FLOW_ACTION_TYPE_MARK) { - const struct rte_flow_action_mark *mark = - (const struct rte_flow_action_mark *) - actions->conf; - - if (mark) - action.mark_id = mark->id; - action.mark = !action.drop; - } else if (actions->type == RTE_FLOW_ACTION_TYPE_FLAG) { - action.mark = 1; - } else { - rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, - actions, "unsupported action"); - goto exit; - } - } - if (action.mark) { + error, &flow, &action)); + if (action.mark && !action.drop) { mlx5_flow_create_flag_mark(&flow, action.mark_id); flow.offset += sizeof(struct ibv_exp_flow_spec_action_tag); }