Hi Bruce/Vladimir/Anatoly,

Friendly ping for review/upstream.

Thank you.

Regards,
Anurag M

> -----Original Message-----
> From: Mandal, Anurag <[email protected]>
> Sent: 17 March 2026 16:02
> To: [email protected]
> Cc: Richardson, Bruce <[email protected]>; Burakov, Anatoly
> <[email protected]>; Medvedkin, Vladimir
> <[email protected]>; Yang, Qiming <[email protected]>;
> [email protected]; Mandal, Anurag <[email protected]>;
> [email protected]
> Subject: [PATCH v2] net/ice: fix RSS hash function implementation
> 
> 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