From patchwork Wed Mar 17 07:02:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Yuying" X-Patchwork-Id: 89335 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A5BABA00C2; Wed, 17 Mar 2021 08:11:38 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 245AA242B14; Wed, 17 Mar 2021 08:11:38 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id 19C094014D for ; Wed, 17 Mar 2021 08:11:35 +0100 (CET) IronPort-SDR: BhEzp8u8xlFzxZGMloSojIbGoYdc6T1RaxjeMTN+/oETXkPRctOGQ+ZpNmop5PiF3/9Js7TPng 4TNm71KsZcgA== X-IronPort-AV: E=McAfee;i="6000,8403,9925"; a="189453512" X-IronPort-AV: E=Sophos;i="5.81,255,1610438400"; d="scan'208";a="189453512" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Mar 2021 00:11:34 -0700 IronPort-SDR: tofOraynlLGL9rObC66W4EVq2v3iJ3E8sgT9NVZJheiBzgd8eXHqfMT8blL62gJxouqmTAw4Hx OjLEg1L1+sPw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,255,1610438400"; d="scan'208";a="379175861" Received: from dpdk-yyzhang2.sh.intel.com ([10.67.117.129]) by fmsmga007.fm.intel.com with ESMTP; 17 Mar 2021 00:11:33 -0700 From: Yuying To: dev@dpdk.org, qi.z.zhang@intel.com Cc: Yuying Date: Wed, 17 Mar 2021 07:02:43 +0000 Message-Id: <20210317070243.136145-1-yuying.zhang@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1] net/ice: support flow priority for DCF switch filter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Support rte flow priority attribute for DCF switch filter. The rules with same patterns couldn't be created at the same time since they were related to the same recipe. This patch supports flow priority to create different recipes for this situation. Only priority 0 and 1 are supported and higher value denotes higher priority. for example: 1. flow create 0 priority 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / end actions vf id 1 / end 2. flow create 0 priority 1 ingress pattern eth / ipv4 dst is 192.168.0.2 / end actions vf id 2 / end These two rules can be created at the same time in DCF switch filter. And priority of rule 2 is higher. Signed-off-by: Yuying --- doc/guides/rel_notes/release_21_05.rst | 3 +++ drivers/net/ice/ice_acl_filter.c | 1 + drivers/net/ice/ice_fdir_filter.c | 1 + drivers/net/ice/ice_generic_flow.c | 20 ++++++++------------ drivers/net/ice/ice_generic_flow.h | 1 + drivers/net/ice/ice_hash.c | 2 ++ drivers/net/ice/ice_switch_filter.c | 14 +++++++++----- 7 files changed, 25 insertions(+), 17 deletions(-) diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst index 88e7607a08..a865ca94ae 100644 --- a/doc/guides/rel_notes/release_21_05.rst +++ b/doc/guides/rel_notes/release_21_05.rst @@ -91,6 +91,9 @@ New Features * Added a command line option to configure forced speed for Ethernet port. ``dpdk-testpmd -c 0xff -- -i --eth-link-speed N`` +* **Updated Intel ice driver.** + + * Added flow priority support for DCF switch filter. Removed Items ------------- diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c index 9e06e8a3de..33756099c6 100644 --- a/drivers/net/ice/ice_acl_filter.c +++ b/drivers/net/ice/ice_acl_filter.c @@ -904,6 +904,7 @@ ice_acl_parse(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 3af5812660..1b0fa2d5dc 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -1980,6 +1980,7 @@ ice_fdir_parse(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 8704812622..74e8e8803b 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1774,6 +1774,7 @@ enum rte_flow_item_type pattern_eth_ipv6_pfcp[] = { typedef struct ice_flow_engine * (*parse_engine_t)(struct ice_adapter *ad, struct rte_flow *flow, struct ice_parser_list *parser_list, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error); @@ -1965,13 +1966,6 @@ ice_flow_valid_attr(struct ice_adapter *ad, } else { *ice_pipeline_stage = ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY; - /* Not supported */ - if (attr->priority) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, - attr, "Not support priority."); - return -rte_errno; - } } /* Not supported */ @@ -2240,6 +2234,7 @@ static struct ice_flow_engine * ice_parse_engine_create(struct ice_adapter *ad, struct rte_flow *flow, struct ice_parser_list *parser_list, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error) @@ -2255,7 +2250,7 @@ ice_parse_engine_create(struct ice_adapter *ad, if (parser_node->parser->parse_pattern_action(ad, parser_node->parser->array, parser_node->parser->array_len, - pattern, actions, &meta, error) < 0) + pattern, actions, priority, &meta, error) < 0) continue; engine = parser_node->parser->engine; @@ -2273,6 +2268,7 @@ 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, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error) @@ -2285,7 +2281,7 @@ ice_parse_engine_validate(struct ice_adapter *ad, if (parser_node->parser->parse_pattern_action(ad, parser_node->parser->array, parser_node->parser->array_len, - pattern, actions, NULL, error) < 0) + pattern, actions, priority, NULL, error) < 0) continue; engine = parser_node->parser->engine; @@ -2335,7 +2331,7 @@ ice_flow_process_filter(struct rte_eth_dev *dev, return ret; *engine = ice_parse_engine(ad, flow, &pf->rss_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); if (*engine != NULL) return 0; @@ -2343,11 +2339,11 @@ ice_flow_process_filter(struct rte_eth_dev *dev, case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY: case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR: *engine = ice_parse_engine(ad, flow, &pf->dist_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); break; case ICE_FLOW_CLASSIFY_STAGE_PERMISSION: *engine = ice_parse_engine(ad, flow, &pf->perm_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); break; default: return -EINVAL; diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h index 9f422e5925..a4d0b6671d 100644 --- a/drivers/net/ice/ice_generic_flow.h +++ b/drivers/net/ice/ice_generic_flow.h @@ -515,6 +515,7 @@ typedef int (*parse_pattern_action_t)(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error); diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index 58a0c18d09..18549c9abe 100644 --- a/drivers/net/ice/ice_hash.c +++ b/drivers/net/ice/ice_hash.c @@ -102,6 +102,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error); @@ -983,6 +984,7 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index ada3ecf60b..ecb47a66be 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -1335,6 +1335,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], static int ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { @@ -1382,7 +1383,7 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, rule_info->sw_act.src = rule_info->sw_act.vsi_handle; rule_info->sw_act.flag = ICE_FLTR_RX; rule_info->rx = 1; - rule_info->priority = 5; + rule_info->priority = priority + 5; return 0; } @@ -1390,6 +1391,7 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, static int ice_switch_parse_action(struct ice_pf *pf, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { @@ -1460,7 +1462,7 @@ ice_switch_parse_action(struct ice_pf *pf, rule_info->sw_act.vsi_handle = vsi->idx; rule_info->rx = 1; rule_info->sw_act.src = vsi->idx; - rule_info->priority = 5; + rule_info->priority = priority + 5; return 0; @@ -1552,6 +1554,7 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error) { @@ -1642,10 +1645,11 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, goto error; if (ad->hw.dcf_enabled) - ret = ice_switch_parse_dcf_action((void *)ad, actions, error, - &rule_info); + ret = ice_switch_parse_dcf_action((void *)ad, actions, priority, + error, &rule_info); else - ret = ice_switch_parse_action(pf, actions, error, &rule_info); + ret = ice_switch_parse_action(pf, actions, priority, error, + &rule_info); if (ret) goto error;