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 ADB3FA052A; Wed, 23 Dec 2020 13:32:28 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 461EDC9E4; Wed, 23 Dec 2020 13:32:26 +0100 (CET) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id BA887C9E2 for ; Wed, 23 Dec 2020 13:32:23 +0100 (CET) IronPort-SDR: XZUsq+oFWHEb1UGsM3KbXyZdE2aP0mjbOpfdmrixDy+v+Fjp3PWwoA7dJZoniUJde+sYCsa4ev P4803V0EiwtA== X-IronPort-AV: E=McAfee;i="6000,8403,9843"; a="163729629" X-IronPort-AV: E=Sophos;i="5.78,441,1599548400"; d="scan'208";a="163729629" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Dec 2020 04:32:22 -0800 IronPort-SDR: lljbUcvyhNkzhk56ej6wBdTV8BrA52qJTbpfmVP+wdWVOuRR6pm5SSrzIEzTAWx3etl5zQLVX4 6IBZlwKvgeMw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,441,1599548400"; d="scan'208";a="417198196" Received: from dpdk-xuanding-dev2.sh.intel.com ([10.67.119.124]) by orsmga001.jf.intel.com with ESMTP; 23 Dec 2020 04:32:20 -0800 From: Xuan Ding To: qi.z.zhang@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com Cc: dev@dpdk.org, Xuan Ding Date: Wed, 23 Dec 2020 12:30:44 +0000 Message-Id: <20201223123044.55942-1-xuan.ding@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201203032618.70919-1-xuan.ding@intel.com> References: <20201203032618.70919-1-xuan.ding@intel.com> Subject: [dpdk-dev] [PATCH v2] 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" This patch adds support to actively configure RSS through port config. Any kernel PF enabled default RSS will be disabled during initialization. Besides, default RSS will be configured based on rte_eth_rss_conf->rss_hf. Currently supported default rss_type: ipv4[6], ipv4[6]_udp, ipv4[6]_tcp, ipv4[6]_sctp. Signed-off-by: Xuan Ding --- v2: * Revised the commit log. * Fixed a bug to cause memory leak. * Optimized the code to avoid duplication. --- drivers/net/iavf/iavf.h | 12 ++++- drivers/net/iavf/iavf_ethdev.c | 76 ++++++++++++++++++++++++------- drivers/net/iavf/iavf_hash.c | 81 ++++++++++++++++++++++------------ drivers/net/iavf/iavf_vchnl.c | 23 ++++++++++ 4 files changed, 146 insertions(+), 46 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..8fda6d0cb 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,64 @@ 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; - rss_cfg = rte_zmalloc("iavf rss rule", - sizeof(struct virtchnl_rss_cfg), 0); - if (!rss_cfg) - return -ENOMEM; +#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->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; + if (rss_hf & ETH_RSS_IPV4) { + rss_cfg->proto_hdrs = inner_ipv4_tmplt; + 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; + 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; + iavf_add_del_rss_cfg(ad, rss_cfg, add); + } - for (i = 0; i < RTE_DIM(iavf_hash_default_hdrs); i++) { - rss_cfg->proto_hdrs = *iavf_hash_default_hdrs[i]; - rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; + if (rss_hf & ETH_RSS_NONFRAG_IPV4_SCTP) { + rss_cfg->proto_hdrs = inner_ipv4_sctp_tmplt; + iavf_add_del_rss_cfg(ad, rss_cfg, add); + } + + if (rss_hf & ETH_RSS_IPV6) { + rss_cfg->proto_hdrs = inner_ipv6_tmplt; + 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; + 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; + 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; iavf_add_del_rss_cfg(ad, rss_cfg, add); } + vf->rss_hf = rss_hf & IAVF_RSS_HF_ALL; return 0; } @@ -510,12 +539,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 +1112,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 +1123,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