DPDK patches and discussions
 help / color / mirror / Atom feed
From: Yuying Zhang <yuying.zhang@intel.com>
To: dev@dpdk.org, qi.z.zhang@intel.com
Cc: Yuying Zhang <yuying.zhang@intel.com>
Subject: [dpdk-dev] [PATCH v3] net/ice: support flow priority for DCF switch filter
Date: Thu, 15 Apr 2021 10:58:21 +0000	[thread overview]
Message-ID: <20210415105821.826132-1-yuying.zhang@intel.com> (raw)
In-Reply-To: <20210317070243.136145-1-yuying.zhang@intel.com>

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 Zhang <yuying.zhang@intel.com>
---
 doc/guides/rel_notes/release_21_05.rst |  1 +
 drivers/net/ice/ice_acl_filter.c       |  1 +
 drivers/net/ice/ice_fdir_filter.c      |  1 +
 drivers/net/ice/ice_generic_flow.c     | 18 ++++++++++--------
 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(+), 13 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 3bd775772f..462a43fdb6 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -125,6 +125,7 @@ New Features
 * **Updated Intel ice driver.**
 
   * Added Intel ice support on Windows.
+  * Added flow priority support for DCF switch filter.
 
 * **Updated Marvell OCTEON TX2 ethdev driver.**
 
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 92e18d59cc..3b8ea32b1a 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -1997,6 +1997,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..261f0b78e4 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,11 +1966,10 @@ ice_flow_valid_attr(struct ice_adapter *ad,
 	} else {
 		*ice_pipeline_stage =
 			ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY;
-		/* Not supported */
-		if (attr->priority) {
+		if (attr->priority > 1) {
 			rte_flow_error_set(error, EINVAL,
 					RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
-					attr, "Not support priority.");
+					attr, "Only support priority 0 and 1.");
 			return -rte_errno;
 		}
 	}
@@ -2240,6 +2240,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 +2256,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 +2274,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 +2287,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 +2337,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 +2345,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 e56cdf9941..f2b17197be 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);
 
@@ -985,6 +986,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 0bf3660677..a69ff7ce82 100644
--- a/drivers/net/ice/ice_switch_filter.c
+++ b/drivers/net/ice/ice_switch_filter.c
@@ -1343,6 +1343,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)
 {
@@ -1390,7 +1391,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;
 }
@@ -1398,6 +1399,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)
 {
@@ -1468,7 +1470,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;
 
@@ -1540,6 +1542,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)
 {
@@ -1630,10 +1633,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;
-- 
2.25.1


  parent reply	other threads:[~2021-04-15 11:09 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-17  7:02 [dpdk-dev] [PATCH v1] " Yuying
2021-04-12  8:54 ` [dpdk-dev] [PATCH v2] " Yuying Zhang
2021-04-15 10:58 ` Yuying Zhang [this message]
2021-04-15 15:38 ` [dpdk-dev] [PATCH v4] " Yuying Zhang
2021-04-16 10:19   ` Zhang, Qi Z

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210415105821.826132-1-yuying.zhang@intel.com \
    --to=yuying.zhang@intel.com \
    --cc=dev@dpdk.org \
    --cc=qi.z.zhang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).