From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3270DA052A; Wed, 23 Dec 2020 11:14:57 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 850CBC9E4; Wed, 23 Dec 2020 11:14:55 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 73F89C9DE for ; Wed, 23 Dec 2020 11:14:53 +0100 (CET) IronPort-SDR: CX9ihV7sDFBsSfeBHJ2sYIehe3D1H+PfM5vHLZx/WhP7/O2s0+7BQwEnnJxZArpY1L06+JpwJg ePl4N2rRw9tw== X-IronPort-AV: E=McAfee;i="6000,8403,9843"; a="237554981" X-IronPort-AV: E=Sophos;i="5.78,441,1599548400"; d="scan'208";a="237554981" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Dec 2020 02:14:50 -0800 IronPort-SDR: 88io7NLoIGxBk2g4b4iU2DYinigy+ufPr9XB/HROLZte1aXUrQMDPbfGU4aIHVNJXUN44yzRim 4qUzrZjLrIWA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,441,1599548400"; d="scan'208";a="562980050" Received: from fmsmsx605.amr.corp.intel.com ([10.18.126.85]) by fmsmga006.fm.intel.com with ESMTP; 23 Dec 2020 02:14:50 -0800 Received: from shsmsx601.ccr.corp.intel.com (10.109.6.141) by fmsmsx605.amr.corp.intel.com (10.18.126.85) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Wed, 23 Dec 2020 02:14:50 -0800 Received: from shsmsx601.ccr.corp.intel.com (10.109.6.141) by SHSMSX601.ccr.corp.intel.com (10.109.6.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Wed, 23 Dec 2020 18:14:48 +0800 Received: from shsmsx601.ccr.corp.intel.com ([10.109.6.141]) by SHSMSX601.ccr.corp.intel.com ([10.109.6.141]) with mapi id 15.01.1713.004; Wed, 23 Dec 2020 18:14:48 +0800 From: "Zhang, Qi Z" To: "Ding, Xuan" , "Wu, Jingjing" , "Xing, Beilei" CC: "dev@dpdk.org" Thread-Topic: [PATCH] net/iavf: improve default RSS Thread-Index: AQHWySQciQO0vE2Okkm9HDOUdhMnDaoElDrA Date: Wed, 23 Dec 2020 10:14:48 +0000 Message-ID: <632fdffa2a5844a1b04c5282f1d7ee35@intel.com> References: <20201203032618.70919-1-xuan.ding@intel.com> In-Reply-To: <20201203032618.70919-1-xuan.ding@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-reaction: no-action dlp-version: 11.5.1.3 dlp-product: dlpe-windows x-originating-ip: [10.239.127.36] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH] net/iavf: improve default RSS X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" > -----Original Message----- > From: Ding, Xuan > Sent: Thursday, December 3, 2020 11:26 AM > To: Zhang, Qi Z ; Wu, Jingjing ; > Xing, Beilei > Cc: dev@dpdk.org; Ding, Xuan > Subject: [PATCH] net/iavf: improve default RSS >=20 > This patch adds support to actively configure RSS. Any kernel PF enabled > default RSS will be disabled during initialization. Currently supported d= efault > rss_type: ipv4[6], ipv4[6]_udp, ipv4[6]_tcp, ipv4[6]_sctp. >=20 > Signed-off-by: Xuan Ding > --- > 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(-) >=20 > 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) >=20 > #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) >=20 > #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 { >=20 > 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_ethde= v.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; > } >=20 > - /* 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; >=20 > + /* Set RSS hash configuration based on rss_conf->rss_hf. */ > + ret =3D 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; > } >=20 > @@ -1102,33 +1105,66 @@ iavf_dev_rss_reta_query(struct rte_eth_dev > *dev, } >=20 > 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 =3D > - IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > struct iavf_info *vf =3D IAVF_DEV_PRIVATE_TO_VF(adapter); >=20 > - 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 =3D=3D 0) { > + if (!key || key_len =3D=3D 0) { > PMD_DRV_LOG(DEBUG, "No key to be configured"); > return 0; > - } else if (rss_conf->rss_key_len !=3D vf->vf_res->rss_key_size) { > + } else if (key_len !=3D 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; > } >=20 > - rte_memcpy(vf->rss_key, rss_conf->rss_key, rss_conf->rss_key_len); > + rte_memcpy(vf->rss_key, key, key_len); >=20 > return iavf_configure_rss_key(adapter); } >=20 > +static int > +iavf_dev_rss_hash_update(struct rte_eth_dev *dev, > + struct rte_eth_rss_conf *rss_conf) > +{ > + struct iavf_adapter *adapter =3D > + IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); > + struct iavf_info *vf =3D IAVF_DEV_PRIVATE_TO_VF(adapter); > + int ret; > + > + adapter->eth_dev->data->dev_conf.rx_adv_conf.rss_conf =3D *rss_conf; > + > + if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF)) > + return -ENOTSUP; > + > + /* Set hash key. */ > + ret =3D iavf_set_rss_key(adapter, rss_conf->rss_key, > + rss_conf->rss_key_len); > + if (ret) > + return ret; > + > + if (rss_conf->rss_hf =3D=3D 0) > + return 0; > + > + /* Overwritten default RSS. */ > + ret =3D iavf_set_hena(adapter, 0); > + if (ret) > + PMD_DRV_LOG(ERR, "%s Remove rss vsi fail %d", > + __func__, ret); > + > + /* Set new RSS configuration. */ > + ret =3D 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; >=20 > - /* Just set it to default value now. */ > - rss_conf->rss_hf =3D IAVF_RSS_OFFLOAD_ALL; > + rss_conf->rss_hf =3D vf->rss_hf; >=20 > if (!rss_conf->rss_key) > return 0; > @@ -2029,6 +2064,13 @@ iavf_dev_init(struct rte_eth_dev *eth_dev) > return ret; > } >=20 > + /* Set hena =3D 0 to ask PF to cleanup all existing RSS. */ > + ret =3D iavf_set_hena(adapter, 0); > + if (ret) { > + PMD_DRV_LOG(ERR, "fail to disable default PF RSS"); > + return ret; > + } > + > return 0; > } >=20 > 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[] =3D { > {iavf_pattern_eth_ipv6_gtpc, ETH_RSS_IPV6, > &ipv6_udp_gtpc_tmplt}, > }; >=20 > -struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] =3D { > - &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 =3D { > .init =3D iavf_hash_init, > .create =3D iavf_hash_create, > @@ -458,24 +447,76 @@ static struct iavf_flow_parser iavf_hash_parser =3D= { > .stage =3D IAVF_FLOW_STAGE_RSS, > }; >=20 > -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 =3D 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) >=20 > rss_cfg =3D 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 fin= e. > if (!rss_cfg) > return -ENOMEM; >=20 > - for (i =3D 0; i < RTE_DIM(iavf_hash_default_hdrs); i++) { > - rss_cfg->proto_hdrs =3D *iavf_hash_default_hdrs[i]; > + if (rss_hf & ETH_RSS_IPV4) { > + rss_cfg->proto_hdrs =3D inner_ipv4_tmplt; > + rss_cfg->rss_algorithm =3D > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; Better to assign rss_cfg->rss_algorithm before the if branch, so we can avo= id duplicate code in each if branch. > + iavf_add_del_rss_cfg(ad, rss_cfg, add); > + } > + > + if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) { > + rss_cfg->proto_hdrs =3D inner_ipv4_udp_tmplt; > + rss_cfg->rss_algorithm =3D > 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 =3D inner_ipv4_tcp_tmplt; > + rss_cfg->rss_algorithm =3D > 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 =3D inner_ipv4_sctp_tmplt; > + rss_cfg->rss_algorithm =3D > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > + iavf_add_del_rss_cfg(ad, rss_cfg, add); > + } > + > + if (rss_hf & ETH_RSS_IPV6) { > + rss_cfg->proto_hdrs =3D inner_ipv6_tmplt; > rss_cfg->rss_algorithm =3D > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > + iavf_add_del_rss_cfg(ad, rss_cfg, add); > + } >=20 > + if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) { > + rss_cfg->proto_hdrs =3D inner_ipv6_udp_tmplt; > + rss_cfg->rss_algorithm =3D > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > iavf_add_del_rss_cfg(ad, rss_cfg, add); > } >=20 > + if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) { > + rss_cfg->proto_hdrs =3D inner_ipv6_tcp_tmplt; > + rss_cfg->rss_algorithm =3D > 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 =3D inner_ipv6_sctp_tmplt; > + rss_cfg->rss_algorithm =3D > VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; > + iavf_add_del_rss_cfg(ad, rss_cfg, add); > + } > + > + vf->rss_hf =3D rss_hf & IAVF_RSS_HF_ALL; > return 0; > } >=20 > @@ -510,12 +551,6 @@ iavf_hash_init(struct iavf_adapter *ad) > return ret; > } >=20 > - ret =3D iavf_hash_default_set(ad, true); > - if (ret) { > - PMD_DRV_LOG(ERR, "fail to set default RSS"); > - iavf_unregister_parser(parser, ad); > - } > - > return ret; > } >=20 > @@ -1089,6 +1124,7 @@ static void > iavf_hash_uninit(struct iavf_adapter *ad) { > struct iavf_info *vf =3D IAVF_DEV_PRIVATE_TO_VF(ad); > + struct rte_eth_rss_conf *rss_conf; >=20 > 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; >=20 > - if (iavf_hash_default_set(ad, false)) > + rss_conf =3D &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"); >=20 > 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; > } >=20 > +int > +iavf_set_hena(struct iavf_adapter *adapter, uint64_t hena) { > + struct iavf_info *vf =3D IAVF_DEV_PRIVATE_TO_VF(adapter); > + struct virtchnl_rss_hena vrh; > + struct iavf_cmd_info args; > + int err; > + > + vrh.hena =3D hena; > + args.ops =3D VIRTCHNL_OP_SET_RSS_HENA; > + args.in_args =3D (u8 *)&vrh; > + args.in_args_size =3D sizeof(vrh); > + args.out_buffer =3D vf->aq_resp; > + args.out_size =3D IAVF_AQ_BUF_SZ; > + > + err =3D 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