[PATCH v2] net/ice: fix RSS hash function implementation

Anurag Mandal anurag.mandal at intel.com
Tue Mar 17 11:32:03 CET 2026


Hash function type is not meaningful for non-empty patterns as they
are per VSI i.e. they are set globally only &  not per pattern.
So, for non-empty patterns, user should not specify hash function.
ICE PMD does not adhere to these rules.

This patch fixes that by implementing the following:
- interpret "default" hash function as "currently set up"
- store the "current" hash function globally per VSI
- for empty patterns, overwrite the setting
- for non-empty patterns, disallow hash function that is not "default"
or does not match currently selected global hash function type

Tested the following:
1. non-empty pattern with default hash function
2. empty pattern with simple_xor/symmetric_toeplitz hash function
3. non-empty pattern with simple_xor/symmetric_toeplitz hash function
4. empty pattern with no/default hash function

Bugzilla ID: 1518
Fixes: 0b952714e9c1 ("net/ice: refactor PF hash flow")
Cc: stable at dpdk.org

Signed-off-by: Anurag Mandal <anurag.mandal at intel.com>
---
V2: Addressed Vladimir Medvedkin's feedback
 - interpret "default" hash function as "whatever is currently set up"
 - store the "current" hash function globally somewhere (in VSI context)
 - for empty patterns, overwrite the setting
 - for non-empty patterns, disallow hash function that is not "default" 
   or does not match currently selected global hash function type

 drivers/net/intel/ice/ice_ethdev.c |  3 +++
 drivers/net/intel/ice/ice_ethdev.h |  1 +
 drivers/net/intel/ice/ice_hash.c   | 20 ++++++++++++++++----
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index 0d6b030536..0948a8cb23 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -3741,6 +3741,7 @@ static int ice_init_rss(struct ice_pf *pf)
 	vsi->rss_key_size = ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE +
 			    ICE_AQC_GET_SET_RSS_KEY_DATA_HASH_KEY_SIZE;
 	vsi->rss_lut_size = pf->hash_lut_size;
+	vsi->hash_function = rss_conf->algorithm;
 
 	if (nb_q == 0) {
 		PMD_DRV_LOG(WARNING,
@@ -5700,6 +5701,8 @@ ice_rss_hash_update(struct rte_eth_dev *dev,
 	if (rss_conf->rss_hf == 0)
 		pf->rss_hf = 0;
 
+	vsi->hash_function = rss_conf->algorithm;
+
 	/* RSS hash configuration */
 	ice_rss_hash_set(pf, rss_conf->rss_hf);
 
diff --git a/drivers/net/intel/ice/ice_ethdev.h b/drivers/net/intel/ice/ice_ethdev.h
index 4b3718f715..d8a01fe7fa 100644
--- a/drivers/net/intel/ice/ice_ethdev.h
+++ b/drivers/net/intel/ice/ice_ethdev.h
@@ -351,6 +351,7 @@ struct ice_vsi {
 	bool offset_loaded;
 	/* holds previous values so limitations can be enlarged to 64 bits */
 	struct ice_vsi_get_stats_fields old_get_stats_fields;
+	enum rte_eth_hash_function hash_function;
 };
 
 enum proto_xtr_type {
diff --git a/drivers/net/intel/ice/ice_hash.c b/drivers/net/intel/ice/ice_hash.c
index 77829e607b..8e97a6fd42 100644
--- a/drivers/net/intel/ice/ice_hash.c
+++ b/drivers/net/intel/ice/ice_hash.c
@@ -1084,6 +1084,10 @@ ice_any_invalid_rss_type(enum rte_eth_hash_function rss_func,
 	/* check not allowed RSS type */
 	rss_type &= ~VALID_RSS_ATTR;
 
+	/* For Empty patterns */
+	if (!allow_rss_type)
+		return false;
+
 	return ((rss_type & allow_rss_type) != rss_type);
 }
 
@@ -1091,7 +1095,8 @@ static int
 ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
 		const struct rte_flow_action actions[],
 		uint64_t pattern_hint, struct ice_rss_meta *rss_meta,
-		struct rte_flow_error *error)
+		struct rte_flow_error *error,
+		enum rte_eth_hash_function *vsi_hash_function)
 {
 	struct ice_rss_hash_cfg *cfg = pattern_match_item->meta;
 	enum rte_flow_action_type action_type;
@@ -1110,8 +1115,8 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
 
 			/* Check hash function and save it to rss_meta. */
 			if (pattern_match_item->pattern_list !=
-			    pattern_empty && rss->func ==
-			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
+			    pattern_empty && rss->func &&
+			    rss->func != *vsi_hash_function) {
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
 					"Not supported flow");
@@ -1119,6 +1124,7 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
 				   RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
 				rss_meta->hash_function =
 				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
+				*vsi_hash_function = rss_meta->hash_function;
 				return 0;
 			} else if (rss->func ==
 				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
@@ -1161,7 +1167,12 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
 					RTE_FLOW_ERROR_TYPE_ACTION,
 					action, "RSS type not supported");
 
+			/* For Empty patterns*/
+			if (cfg->hash_flds == ICE_HASH_INVALID)
+				cfg->hash_flds = 1;
 			rss_meta->cfg = *cfg;
+			if (rss->func)
+				*vsi_hash_function = rss_meta->hash_function;
 			ice_refine_hash_cfg(&rss_meta->cfg,
 					    rss_type, pattern_hint);
 			break;
@@ -1193,6 +1204,7 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
 	struct ice_pattern_match_item *pattern_match_item;
 	struct ice_rss_meta *rss_meta_ptr;
 	uint64_t phint = ICE_PHINT_NONE;
+	struct ice_vsi *vsi = ad->pf.main_vsi;
 
 	if (priority >= 1)
 		return -rte_errno;
@@ -1230,7 +1242,7 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
 
 	/* Check rss action. */
 	ret = ice_hash_parse_action(pattern_match_item, actions, phint,
-				    rss_meta_ptr, error);
+				    rss_meta_ptr, error, &vsi->hash_function);
 
 error:
 	if (!ret && meta)
-- 
2.34.1



More information about the dev mailing list