Hi Qi, Thank you for your comments, replies in line.
> -----Original Message----- > From: Zhang, Qi Z <qi.z.zh...@intel.com> > Sent: Wednesday, December 23, 2020 6:15 PM > To: Ding, Xuan <xuan.d...@intel.com>; Wu, Jingjing > <jingjing...@intel.com>; Xing, Beilei <beilei.x...@intel.com> > Cc: dev@dpdk.org > Subject: RE: [PATCH] net/iavf: improve default RSS > > > > > -----Original Message----- > > From: Ding, Xuan <xuan.d...@intel.com> > > Sent: Thursday, December 3, 2020 11:26 AM > > To: Zhang, Qi Z <qi.z.zh...@intel.com>; Wu, Jingjing > <jingjing...@intel.com>; > > Xing, Beilei <beilei.x...@intel.com> > > Cc: dev@dpdk.org; Ding, Xuan <xuan.d...@intel.com> > > Subject: [PATCH] net/iavf: improve default RSS > > > > This patch adds support to actively configure RSS. Any kernel PF enabled > > default RSS will be disabled during initialization. Currently supported > default > > rss_type: ipv4[6], ipv4[6]_udp, ipv4[6]_tcp, ipv4[6]_sctp. > > > > Signed-off-by: Xuan Ding <xuan.d...@intel.com> > > --- > > drivers/net/iavf/iavf.h | 12 ++++- > > drivers/net/iavf/iavf_ethdev.c | 76 ++++++++++++++++++++++++------- > > drivers/net/iavf/iavf_hash.c | 83 ++++++++++++++++++++++++---------- > > drivers/net/iavf/iavf_vchnl.c | 23 ++++++++++ > > 4 files changed, 153 insertions(+), 41 deletions(-) > > > > diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index > > 6d5912d8c..9754273b2 100644 > > --- a/drivers/net/iavf/iavf.h > > +++ b/drivers/net/iavf/iavf.h > > @@ -46,11 +46,18 @@ > > VIRTCHNL_VF_OFFLOAD_RX_POLLING) > > > > #define IAVF_RSS_OFFLOAD_ALL ( \ > > +ETH_RSS_IPV4 | \ > > ETH_RSS_FRAG_IPV4 | \ > > ETH_RSS_NONFRAG_IPV4_TCP | \ > > ETH_RSS_NONFRAG_IPV4_UDP | \ > > ETH_RSS_NONFRAG_IPV4_SCTP | \ > > -ETH_RSS_NONFRAG_IPV4_OTHER) > > +ETH_RSS_NONFRAG_IPV4_OTHER | \ > > +ETH_RSS_IPV6 | \ > > +ETH_RSS_FRAG_IPV6 | \ > > +ETH_RSS_NONFRAG_IPV6_TCP | \ > > +ETH_RSS_NONFRAG_IPV6_UDP | \ > > +ETH_RSS_NONFRAG_IPV6_SCTP | \ > > +ETH_RSS_NONFRAG_IPV6_OTHER) > > > > #define IAVF_MISC_VEC_ID RTE_INTR_VEC_ZERO_OFFSET > > #define IAVF_RX_VEC_START RTE_INTR_VEC_RXTX_OFFSET > > @@ -153,6 +160,7 @@ struct iavf_info { > > > > uint8_t *rss_lut; > > uint8_t *rss_key; > > +uint64_t rss_hf; > > uint16_t nb_msix; /* number of MSI-X interrupts on Rx */ > > uint16_t msix_base; /* msix vector base from */ > > uint16_t max_rss_qregion; /* max RSS queue region supported by PF */ > > @@ -321,6 +329,8 @@ int iavf_fdir_check(struct iavf_adapter *adapter, > > struct iavf_fdir_conf *filter); > > int iavf_add_del_rss_cfg(struct iavf_adapter *adapter, > > struct virtchnl_rss_cfg *rss_cfg, bool add); > > +int iavf_set_hena(struct iavf_adapter *adapter, uint64_t hena); int > > +iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add); > > int iavf_add_del_mc_addr_list(struct iavf_adapter *adapter, > > struct rte_ether_addr *mc_addrs, > > uint32_t mc_addrs_num, bool add); > > diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c > index > > 7e3c26a94..d2fa16825 100644 > > --- a/drivers/net/iavf/iavf_ethdev.c > > +++ b/drivers/net/iavf/iavf_ethdev.c > > @@ -267,10 +267,6 @@ iavf_init_rss(struct iavf_adapter *adapter) > > return ret; > > } > > > > -/* In IAVF, RSS enablement is set by PF driver. It is not supported > > - * to set based on rss_conf->rss_hf. > > - */ > > - > > /* configure RSS key */ > > if (!rss_conf->rss_key) { > > /* Calculate the default hash key */ > > @@ -295,6 +291,13 @@ iavf_init_rss(struct iavf_adapter *adapter) > > if (ret) > > return ret; > > > > +/* Set RSS hash configuration based on rss_conf->rss_hf. */ > > +ret = iavf_rss_hash_set(adapter, rss_conf->rss_hf, true); > > +if (ret) { > > +PMD_DRV_LOG(ERR, "fail to set default RSS"); > > +return ret; > > +} > > + > > return 0; > > } > > > > @@ -1102,33 +1105,66 @@ iavf_dev_rss_reta_query(struct rte_eth_dev > > *dev, } > > > > static int > > -iavf_dev_rss_hash_update(struct rte_eth_dev *dev, > > -struct rte_eth_rss_conf *rss_conf) > > +iavf_set_rss_key(struct iavf_adapter *adapter, uint8_t *key, uint8_t > > +key_len) > > { > > -struct iavf_adapter *adapter = > > -IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > > struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); > > > > -if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF)) > > -return -ENOTSUP; > > - > > /* HENA setting, it is enabled by default, no change */ > > -if (!rss_conf->rss_key || rss_conf->rss_key_len == 0) { > > +if (!key || key_len == 0) { > > PMD_DRV_LOG(DEBUG, "No key to be configured"); > > return 0; > > -} else if (rss_conf->rss_key_len != vf->vf_res->rss_key_size) { > > +} else if (key_len != vf->vf_res->rss_key_size) { > > PMD_DRV_LOG(ERR, "The size of hash key configured " > > "(%d) doesn't match the size of hardware can " > > -"support (%d)", rss_conf->rss_key_len, > > +"support (%d)", key_len, > > vf->vf_res->rss_key_size); > > return -EINVAL; > > } > > > > -rte_memcpy(vf->rss_key, rss_conf->rss_key, rss_conf->rss_key_len); > > +rte_memcpy(vf->rss_key, key, key_len); > > > > return iavf_configure_rss_key(adapter); } > > > > +static int > > +iavf_dev_rss_hash_update(struct rte_eth_dev *dev, > > +struct rte_eth_rss_conf *rss_conf) > > +{ > > +struct iavf_adapter *adapter = > > +IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > > +struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); > > +int ret; > > + > > +adapter->eth_dev->data->dev_conf.rx_adv_conf.rss_conf = *rss_conf; > > + > > +if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF)) > > +return -ENOTSUP; > > + > > +/* Set hash key. */ > > +ret = iavf_set_rss_key(adapter, rss_conf->rss_key, > > + rss_conf->rss_key_len); > > +if (ret) > > +return ret; > > + > > +if (rss_conf->rss_hf == 0) > > +return 0; > > + > > +/* Overwritten default RSS. */ > > +ret = iavf_set_hena(adapter, 0); > > +if (ret) > > +PMD_DRV_LOG(ERR, "%s Remove rss vsi fail %d", > > + __func__, ret); > > + > > +/* Set new RSS configuration. */ > > +ret = iavf_rss_hash_set(adapter, rss_conf->rss_hf, true); > > +if (ret) { > > +PMD_DRV_LOG(ERR, "fail to set new RSS"); > > +return ret; > > +} > > + > > +return 0; > > +} > > + > > static int > > iavf_dev_rss_hash_conf_get(struct rte_eth_dev *dev, > > struct rte_eth_rss_conf *rss_conf) @@ -1140,8 +1176,7 @@ > > iavf_dev_rss_hash_conf_get(struct rte_eth_dev *dev, > > if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF)) > > return -ENOTSUP; > > > > - /* Just set it to default value now. */ > > -rss_conf->rss_hf = IAVF_RSS_OFFLOAD_ALL; > > +rss_conf->rss_hf = vf->rss_hf; > > > > if (!rss_conf->rss_key) > > return 0; > > @@ -2029,6 +2064,13 @@ iavf_dev_init(struct rte_eth_dev *eth_dev) > > return ret; > > } > > > > +/* Set hena = 0 to ask PF to cleanup all existing RSS. */ > > +ret = iavf_set_hena(adapter, 0); > > +if (ret) { > > +PMD_DRV_LOG(ERR, "fail to disable default PF RSS"); > > +return ret; > > +} > > + > > return 0; > > } > > > > diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c > index > > c4c73e664..1f3238dab 100644 > > --- a/drivers/net/iavf/iavf_hash.c > > +++ b/drivers/net/iavf/iavf_hash.c > > @@ -429,17 +429,6 @@ static struct iavf_pattern_match_item > > iavf_hash_pattern_list[] = { > > {iavf_pattern_eth_ipv6_gtpc,ETH_RSS_IPV6, > > &ipv6_udp_gtpc_tmplt}, > > }; > > > > -struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = { > > -&inner_ipv4_tmplt, > > -&inner_ipv4_udp_tmplt, > > -&inner_ipv4_tcp_tmplt, > > -&inner_ipv4_sctp_tmplt, > > -&inner_ipv6_tmplt, > > -&inner_ipv6_udp_tmplt, > > -&inner_ipv6_tcp_tmplt, > > -&inner_ipv6_sctp_tmplt, > > -}; > > - > > static struct iavf_flow_engine iavf_hash_engine = { > > .init = iavf_hash_init, > > .create = iavf_hash_create, > > @@ -458,24 +447,76 @@ static struct iavf_flow_parser iavf_hash_parser = > { > > .stage = IAVF_FLOW_STAGE_RSS, > > }; > > > > -static int > > -iavf_hash_default_set(struct iavf_adapter *ad, bool add) > > +int > > +iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add) > > { > > +struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad); > > struct virtchnl_rss_cfg *rss_cfg; > > -uint16_t i; > > + > > +#define IAVF_RSS_HF_ALL ( \ > > +ETH_RSS_IPV4 | \ > > +ETH_RSS_IPV6 | \ > > +ETH_RSS_NONFRAG_IPV4_UDP | \ > > +ETH_RSS_NONFRAG_IPV6_UDP | \ > > +ETH_RSS_NONFRAG_IPV4_TCP | \ > > +ETH_RSS_NONFRAG_IPV6_TCP | \ > > +ETH_RSS_NONFRAG_IPV4_SCTP | \ > > +ETH_RSS_NONFRAG_IPV6_SCTP) > > > > rss_cfg = rte_zmalloc("iavf rss rule", > > sizeof(struct virtchnl_rss_cfg), 0); > > I didn’t see the rss_cfg has been freed somewhere, can you check if we > need to fix it in v2, though it is not brought by this patch. > I think no need to malloc , "struct virtchnl_rss_cfg rss_cfg" should be fine. You are right, the rss_cfg is better only as a local variable here, will refine it in v2. > > > if (!rss_cfg) > > return -ENOMEM; > > > > -for (i = 0; i < RTE_DIM(iavf_hash_default_hdrs); i++) { > > -rss_cfg->proto_hdrs = *iavf_hash_default_hdrs[i]; > > +if (rss_hf & ETH_RSS_IPV4) { > > +rss_cfg->proto_hdrs = inner_ipv4_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > Better to assign rss_cfg->rss_algorithm before the if branch, so we can avoid > duplicate code in each if branch. Yes, will refine it in v2, thanks. > > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) { > > +rss_cfg->proto_hdrs = inner_ipv4_udp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) { > > +rss_cfg->proto_hdrs = inner_ipv4_tcp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +if (rss_hf & ETH_RSS_NONFRAG_IPV4_SCTP) { > > +rss_cfg->proto_hdrs = inner_ipv4_sctp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +if (rss_hf & ETH_RSS_IPV6) { > > +rss_cfg->proto_hdrs = inner_ipv6_tmplt; > > rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > > > +if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) { > > +rss_cfg->proto_hdrs = inner_ipv6_udp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > iavf_add_del_rss_cfg(ad, rss_cfg, add); > > } > > > > +if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) { > > +rss_cfg->proto_hdrs = inner_ipv6_tcp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +if (rss_hf & ETH_RSS_NONFRAG_IPV6_SCTP) { > > +rss_cfg->proto_hdrs = inner_ipv6_sctp_tmplt; > > +rss_cfg->rss_algorithm = > > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > > +iavf_add_del_rss_cfg(ad, rss_cfg, add); > > +} > > + > > +vf->rss_hf = rss_hf & IAVF_RSS_HF_ALL; > > return 0; > > } > > > > @@ -510,12 +551,6 @@ iavf_hash_init(struct iavf_adapter *ad) > > return ret; > > } > > > > -ret = iavf_hash_default_set(ad, true); > > -if (ret) { > > -PMD_DRV_LOG(ERR, "fail to set default RSS"); > > -iavf_unregister_parser(parser, ad); > > -} > > - > > return ret; > > } > > > > @@ -1089,6 +1124,7 @@ static void > > iavf_hash_uninit(struct iavf_adapter *ad) { > > struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad); > > +struct rte_eth_rss_conf *rss_conf; > > > > if (vf->vf_reset) > > return; > > @@ -1099,7 +1135,8 @@ iavf_hash_uninit(struct iavf_adapter *ad) > > if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF)) > > return; > > > > -if (iavf_hash_default_set(ad, false)) > > +rss_conf = &ad->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; > > +if (iavf_rss_hash_set(ad, rss_conf->rss_hf, false)) > > PMD_DRV_LOG(ERR, "fail to delete default RSS"); > > > > iavf_unregister_parser(&iavf_hash_parser, ad); diff --git > > a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index > > 33d03af65..c718a75c4 100644 > > --- a/drivers/net/iavf/iavf_vchnl.c > > +++ b/drivers/net/iavf/iavf_vchnl.c > > @@ -1341,6 +1341,29 @@ iavf_add_del_rss_cfg(struct iavf_adapter > *adapter, > > return err; > > } > > > > +int > > +iavf_set_hena(struct iavf_adapter *adapter, uint64_t hena) { > > +struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter); > > +struct virtchnl_rss_hena vrh; > > +struct iavf_cmd_info args; > > +int err; > > + > > +vrh.hena = hena; > > +args.ops = VIRTCHNL_OP_SET_RSS_HENA; > > +args.in_args = (u8 *)&vrh; > > +args.in_args_size = sizeof(vrh); > > +args.out_buffer = vf->aq_resp; > > +args.out_size = IAVF_AQ_BUF_SZ; > > + > > +err = iavf_execute_vf_cmd(adapter, &args); > > +if (err) > > +PMD_DRV_LOG(ERR, > > + "Failed to execute command of OP_SET_RSS_HENA"); > > + > > +return err; > > +} > > + > > int > > iavf_add_del_mc_addr_list(struct iavf_adapter *adapter, > > struct rte_ether_addr *mc_addrs, > > -- > > 2.17.1 >