From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EBA36A00C3; Mon, 3 Oct 2022 16:10:42 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CB43140DFB; Mon, 3 Oct 2022 16:10:42 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id B8E2A40695 for ; Mon, 3 Oct 2022 16:10:41 +0200 (CEST) Received: from [192.168.38.17] (aros.oktetlabs.ru [192.168.38.17]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 4359A66; Mon, 3 Oct 2022 17:10:41 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 4359A66 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1664806241; bh=KsL2IfqklI3k9HNvR82RHm6kPs5oTNhnZvELhDPsS5Q=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=E4JHjL22T/zung3JkuwDmjxTnZyQZCMxz1/Rc2nybmGvZoJCOPFTGw541LtyMyAYW wnI8ILvPLFs01avTob48CeJYt7cnoUfyYzDPpRq6mt6/r3moU9+mw2GpfyaH+PDo0x /SC24jgouiNrcQ7kivuVO8q1VFUIPv8K1X6sDYpQ= Message-ID: <0bce0520-d551-0f88-b916-af1f8ff1aff6@oktetlabs.ru> Date: Mon, 3 Oct 2022 17:10:40 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.0 Subject: Re: [PATCH v2 09/14] net/idpf: add support for RSS Content-Language: en-US To: Junfeng Guo , qi.z.zhang@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com Cc: dev@dpdk.org, xiao.w.wang@intel.com References: <20220803113104.1184059-1-junfeng.guo@intel.com> <20220905105828.3190335-1-junfeng.guo@intel.com> <20220905105828.3190335-10-junfeng.guo@intel.com> From: Andrew Rybchenko Organization: OKTET Labs In-Reply-To: <20220905105828.3190335-10-junfeng.guo@intel.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On 9/5/22 13:58, Junfeng Guo wrote: > Add RSS support. > > Signed-off-by: Beilei Xing > Signed-off-by: Junfeng Guo > --- > drivers/net/idpf/idpf_ethdev.c | 118 ++++++++++++++++++++++++++++++++- > drivers/net/idpf/idpf_ethdev.h | 17 +++++ > drivers/net/idpf/idpf_vchnl.c | 96 +++++++++++++++++++++++++++ > 3 files changed, 229 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c > index 6310745684..b1e2ca21ca 100644 > --- a/drivers/net/idpf/idpf_ethdev.c > +++ b/drivers/net/idpf/idpf_ethdev.c > @@ -87,6 +87,7 @@ idpf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) > dev_info->max_mtu = dev_info->max_rx_pktlen - IDPF_ETH_OVERHEAD; > dev_info->min_mtu = RTE_ETHER_MIN_MTU; > > + dev_info->flow_type_rss_offloads = IDPF_RSS_OFFLOAD_ALL; > dev_info->max_mac_addrs = IDPF_NUM_MACADDR_MAX; > dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | > RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; > @@ -319,9 +320,116 @@ idpf_init_vport(struct rte_eth_dev *dev) > } > > static int > -idpf_dev_configure(__rte_unused struct rte_eth_dev *dev) > +idpf_config_rss(struct idpf_vport *vport) > { > - return 0; > + int ret; > + > + ret = idpf_set_rss_key(vport); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to configure RSS key"); > + return ret; > + } > + > + ret = idpf_set_rss_lut(vport); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to configure RSS lut"); > + return ret; > + } > + > + ret = idpf_set_rss_hash(vport); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to configure RSS hash"); > + return ret; > + } > + > + return ret; > +} > + > +static int > +idpf_init_rss(struct idpf_vport *vport) > +{ > + struct rte_eth_rss_conf *rss_conf; > + uint16_t i, nb_q, lut_size; > + int ret = 0; > + > + rss_conf = &vport->dev_data->dev_conf.rx_adv_conf.rss_conf; > + nb_q = vport->dev_data->nb_rx_queues; > + > + vport->rss_key = (uint8_t *)rte_zmalloc("rss_key", > + vport->rss_key_size, 0); > + if (!vport->rss_key) { > + PMD_INIT_LOG(ERR, "Failed to allocate RSS key"); > + ret = -ENOMEM; > + goto err_key; > + } > + > + lut_size = vport->rss_lut_size; > + vport->rss_lut = (uint32_t *)rte_zmalloc("rss_lut", > + sizeof(uint32_t) * lut_size, 0); > + if (!vport->rss_lut) { > + PMD_INIT_LOG(ERR, "Failed to allocate RSS lut"); > + ret = -ENOMEM; > + goto err_lut; > + } > + > + if (!rss_conf->rss_key) { > + for (i = 0; i < vport->rss_key_size; i++) > + vport->rss_key[i] = (uint8_t)rte_rand(); IMHO it is a bad idea. Random key could result in very bad distribution of the traffic. > + } else { > + rte_memcpy(vport->rss_key, rss_conf->rss_key, > + RTE_MIN(rss_conf->rss_key_len, > + vport->rss_key_size)); It looks like rss_key_len from rss_conf is saved nowhere. How do you know which bits of the RSS key are really valid/ initialized. > + } > + > + for (i = 0; i < lut_size; i++) > + vport->rss_lut[i] = i % nb_q; > + > + vport->rss_hf = IECM_DEFAULT_RSS_HASH_EXPANDED; Hm, what about rss_conf->rss_hf? > + > + ret = idpf_config_rss(vport); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to configure RSS"); > + goto err_cfg; > + } > + > + return ret; > + > +err_cfg: > + rte_free(vport->rss_lut); > + vport->rss_lut = NULL; > +err_lut: > + rte_free(vport->rss_key); > + vport->rss_key = NULL; > +err_key: > + return ret; > +} > + > +static int > +idpf_dev_configure(struct rte_eth_dev *dev) > +{ > + struct idpf_vport *vport = dev->data->dev_private; > + struct idpf_adapter *adapter = vport->adapter; > + int ret = 0; > + > + if (dev->data->nb_tx_queues > IDPF_DEFAULT_TXQ_NUM || > + dev->data->nb_rx_queues > IDPF_DEFAULT_RXQ_NUM) { > + PMD_INIT_LOG(ERR, "Invalid queue number."); > + return -EINVAL; > + } Above is checked on ethdev level if you report maximums correctly. > + > + if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) > + dev->data->dev_conf.rxmode.offloads |= > + RTE_ETH_RX_OFFLOAD_RSS_HASH; It looks wrong. Offload configuration is a user choice. > + > + if (adapter->caps->rss_caps) { > + ret = idpf_init_rss(vport); > + if (ret) { > + PMD_INIT_LOG(ERR, "Failed to init rss"); > + return ret; > + } > + } > + > + return ret; > } > > static int [snip]