From patchwork Mon Oct 28 17:43:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ying Wang X-Patchwork-Id: 62126 X-Patchwork-Delegate: xiaolong.ye@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 83970A00BE; Tue, 29 Oct 2019 03:07:18 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 048C41BEDB; Tue, 29 Oct 2019 03:07:18 +0100 (CET) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id 1FA981BEC5 for ; Tue, 29 Oct 2019 03:07:15 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Oct 2019 19:07:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,242,1569308400"; d="scan'208";a="350843814" Received: from npg-dpdk-cvl-yingwang-117d84.sh.intel.com ([10.67.117.96]) by orsmga004.jf.intel.com with ESMTP; 28 Oct 2019 19:07:13 -0700 From: Ying Wang To: xiaolong.ye@intel.com, qi.z.zhang@intel.com Cc: dev@dpdk.org, qiming.yang@intel.com, ying.a.wang@intel.com Date: Tue, 29 Oct 2019 01:43:36 +0800 Message-Id: <20191028174336.96618-1-ying.a.wang@intel.com> X-Mailer: git-send-email 2.15.1 Subject: [dpdk-dev] [PATCH] net/ice: fix rte flow framework 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" In non-pipeline mode, switch should be used as fdir's backup. The patch fiexed rule can't be created when fdir's flow table is full. Fixes: 7615a6895009 ("net/ice: rework for generic flow enabling") Signed-off-by: Ying Wang Acked-by: Qi Zhang Reviewed-by: Xiaolong Ye --- drivers/net/ice/ice_generic_flow.c | 84 ++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 26 deletions(-) diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 7133dd7ff..5594f8555 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1347,6 +1347,14 @@ enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = { RTE_FLOW_ITEM_TYPE_END, }; +typedef struct ice_flow_engine * (*parse_engine_t)(struct ice_adapter *ad, + struct rte_flow *flow, + struct ice_parser_list *parser_list, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + void **meta, + struct rte_flow_error *error); + void ice_register_flow_engine(struct ice_flow_engine *engine) { @@ -1677,7 +1685,42 @@ ice_search_pattern_match_item(const struct rte_flow_item pattern[], } static struct ice_flow_engine * -ice_parse_engine(struct ice_adapter *ad, +ice_parse_engine_create(struct ice_adapter *ad, + struct rte_flow *flow, + struct ice_parser_list *parser_list, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + void **meta, + struct rte_flow_error *error) +{ + struct ice_flow_engine *engine = NULL; + struct ice_flow_parser_node *parser_node; + void *temp; + + TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) { + if (parser_node->parser->parse_pattern_action(ad, + parser_node->parser->array, + parser_node->parser->array_len, + pattern, actions, meta, error) < 0) + continue; + + engine = parser_node->parser->engine; + if (engine->create == NULL) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_HANDLE, + NULL, "Invalid engine"); + continue; + } + + if (!(engine->create(ad, flow, *meta, error))) + return engine; + } + return NULL; +} + +static struct ice_flow_engine * +ice_parse_engine_validate(struct ice_adapter *ad, + struct rte_flow *flow __rte_unused, struct ice_parser_list *parser_list, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], @@ -1702,12 +1745,14 @@ ice_parse_engine(struct ice_adapter *ad, } static int -ice_flow_validate_filter(struct rte_eth_dev *dev, +ice_flow_process_filter(struct rte_eth_dev *dev, + struct rte_flow *flow, const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct ice_flow_engine **engine, void **meta, + parse_engine_t ice_parse_engine, struct rte_flow_error *error) { int ret = ICE_ERR_NOT_SUPPORTED; @@ -1740,20 +1785,20 @@ ice_flow_validate_filter(struct rte_eth_dev *dev, if (ret) return ret; - *engine = ice_parse_engine(ad, &pf->rss_parser_list, pattern, actions, - meta, error); + *engine = ice_parse_engine(ad, flow, &pf->rss_parser_list, + pattern, actions, meta, error); if (*engine != NULL) return 0; switch (ice_pipeline_stage) { case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY: case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR: - *engine = ice_parse_engine(ad, &pf->dist_parser_list, pattern, - actions, meta, error); + *engine = ice_parse_engine(ad, flow, &pf->dist_parser_list, + pattern, actions, meta, error); break; case ICE_FLOW_CLASSIFY_STAGE_PERMISSION: - *engine = ice_parse_engine(ad, &pf->perm_parser_list, pattern, - actions, meta, error); + *engine = ice_parse_engine(ad, flow, &pf->perm_parser_list, + pattern, actions, meta, error); break; default: return -EINVAL; @@ -1775,8 +1820,8 @@ ice_flow_validate(struct rte_eth_dev *dev, void *meta; struct ice_flow_engine *engine; - return ice_flow_validate_filter(dev, attr, pattern, actions, - &engine, &meta, error); + return ice_flow_process_filter(dev, NULL, attr, pattern, actions, + &engine, &meta, ice_parse_engine_validate, error); } static struct rte_flow * @@ -1789,8 +1834,6 @@ ice_flow_create(struct rte_eth_dev *dev, struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); struct rte_flow *flow = NULL; int ret; - struct ice_adapter *ad = - ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct ice_flow_engine *engine = NULL; void *meta; @@ -1802,24 +1845,13 @@ ice_flow_create(struct rte_eth_dev *dev, return flow; } - ret = ice_flow_validate_filter(dev, attr, pattern, actions, - &engine, &meta, error); + ret = ice_flow_process_filter(dev, flow, attr, pattern, actions, + &engine, &meta, ice_parse_engine_create, error); if (ret < 0) goto free_flow; - - if (engine->create == NULL) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_HANDLE, - NULL, "Invalid engine"); - goto free_flow; - } - - ret = engine->create(ad, flow, meta, error); - if (ret) - goto free_flow; - flow->engine = engine; TAILQ_INSERT_TAIL(&pf->flow_list, flow, node); + PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type); return flow; free_flow: