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: [email protected]

Signed-off-by: Anurag Mandal <[email protected]>
---
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

Reply via email to