From patchwork Wed Mar 29 07:53:38 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: 22671 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 BF2B95A8D; Wed, 29 Mar 2017 09:56:29 +0200 (CEST) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by dpdk.org (Postfix) with ESMTP id 2FCFC2C55 for ; Wed, 29 Mar 2017 09:53:55 +0200 (CEST) Received: by mail-wm0-f43.google.com with SMTP id u132so57022444wmg.0 for ; Wed, 29 Mar 2017 00:53:55 -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=v9Qo75AW1KCRXHhpyGzyXBR8S19hCnslrJI2FA+gJB4yhQHoa3W1LKKVLJzb93cS6i RfGpYJ+aN+3VkjghpRLFCwzvIKEixVtPoP4RcMhU/u0GY4w9EqSEA04mtl5HRCLfou1d 1SqvwhSxFIEf/BNpf5jN1MK2cffYix3u9Zb4uRB3sNtyUIMoyhoEmQ6qgumxEcSFskKV wUw2Hkc3DB60KmSXJ9fk0u6wfZPjzP75d5DpYs8auWCOGy9zv+9+ZImn4iGgBgWzVVFR Pzhk3Fx7lpE+i519rYler5q5efwiL0k0LIStb7Dy88nFP6oqVqPL1PxS+8kvHzMN4Qae iyPQ== 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=PPExufXBuGoruVaops01V9Y1erG7MsBKpPs2kzpZNF4MTZkeYiqruirlE2CTai4I6V 1Up1gttFHjZr3h5KZ92FGztBMI0SPzoLonRorITc/zGfbj8XggFhADv8TwNwyiiwEWBL Dd0o+uogsvbJoFMGO4iJTU8L0oSrnl75AquGU0SqW+AXCGqTmc/EbGbHcld6NeUWvztG B8VvwAvCgncVHvmSNgKI/Za8Ly68sxwgJ5mWJG0ZNeWMljfUi0HPDb49phKj6HvkiRBu z+IQIm98PnrxcQTwZpj9Ah7mPkbHsumaDB4VUDFr4r5p0Ibf+DVWKf9MDIDfJkYcOxn5 xedQ== X-Gm-Message-State: AFeK/H3oenJKvOOnCho4CedlJsyeVGR89AAnSCRMdzYLqGzoN9VupFDt9ijKkhDo6kIRogAV X-Received: by 10.28.7.144 with SMTP id 138mr18140589wmh.125.1490774035661; Wed, 29 Mar 2017 00:53:55 -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 b42sm8190981wra.36.2017.03.29.00.53.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 29 Mar 2017 00:53:55 -0700 (PDT) From: Nelio Laranjeiro To: dev@dpdk.org Cc: Adrien Mazarguil , Yongseok Koh Date: Wed, 29 Mar 2017 09:53:38 +0200 Message-Id: <2a99263e0ab95c4af08ffb2dc17084a72b9265ee.1490773631.git.nelio.laranjeiro@6wind.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH 1/2] 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); }