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 759C3A057C; Thu, 26 Mar 2020 08:15:21 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 40DC31C02E; Thu, 26 Mar 2020 08:15:16 +0100 (CET) Received: from mail.chinasoftinc.com (unknown [114.113.233.8]) by dpdk.org (Postfix) with ESMTP id 608864CA7 for ; Thu, 26 Mar 2020 08:15:10 +0100 (CET) Received: from localhost.localdomain (114.119.4.74) by INCCAS002.ito.icss (10.168.0.60) with Microsoft SMTP Server id 14.3.487.0; Thu, 26 Mar 2020 15:15:01 +0800 From: "Wei Hu (Xavier)" To: Date: Thu, 26 Mar 2020 15:14:30 +0800 Message-ID: <20200326071433.65694-2-huwei013@chinasoftinc.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200326071433.65694-1-huwei013@chinasoftinc.com> References: <20200326071433.65694-1-huwei013@chinasoftinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [114.119.4.74] Subject: [dpdk-dev] [PATCH 1/4] net/hns3: fix RSS indirection table configuration 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" From: Lijun Ou For the current hns3 PMD driver, there are some RSS related bugs at the following scenes: 1. Start the application with the number of Rx queues equals 1(--rxq=1), modify the number of Rx queue to some number greater than 1 during normal operation. As a result, upper application can't receive packets from multiple rx queues. 2. Start testpmd application with the option disable-rss and the number of Rx queue is greater than 1(--disable-rss --rxq=N, N>1). As a result, upper application still can receive packets from multiple rx queues. The root cause as below: There are some error configuration in the RSS indirection table of hns3 network engine. This patch fixes them with the following modification. 1. When rss size is changed, we need to update rss redirection table maintained by driver and configure them to hardware. Besides, during the entire reset process, we need to ensure that the rss table information are not overwritten and configured directly to the hardware in the RESET_STAGE_RESTORE stage of the reset process. 2. When satrting testpmd appication with the options disable-rss, it doesn't need to configure rss redirection table to hardware. Fixes: c37ca66f2b27 ("net/hns3: support RSS") Cc: stable@dpdk.org Signed-off-by: Lijun Ou Signed-off-by: Huisong Li Signed-off-by: Wei Hu (Xavier) --- drivers/net/hns3/hns3_dcb.c | 15 +++++++++++++++ drivers/net/hns3/hns3_ethdev.c | 8 ++++++++ drivers/net/hns3/hns3_ethdev_vf.c | 8 ++++++++ drivers/net/hns3/hns3_flow.c | 13 +++++++++++++ drivers/net/hns3/hns3_rss.c | 28 ++++++++++++++++++---------- drivers/net/hns3/hns3_rss.h | 2 ++ 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c index 369a40e6a..8688de2a7 100644 --- a/drivers/net/hns3/hns3_dcb.c +++ b/drivers/net/hns3/hns3_dcb.c @@ -580,7 +580,9 @@ hns3_dcb_pri_shaper_cfg(struct hns3_hw *hw) void hns3_set_rss_size(struct hns3_hw *hw, uint16_t nb_rx_q) { + struct hns3_rss_conf *rss_cfg = &hw->rss_info; uint16_t rx_qnum_per_tc; + int i; rx_qnum_per_tc = nb_rx_q / hw->num_tc; rx_qnum_per_tc = RTE_MIN(hw->rss_size_max, rx_qnum_per_tc); @@ -590,6 +592,19 @@ hns3_set_rss_size(struct hns3_hw *hw, uint16_t nb_rx_q) hw->alloc_rss_size = rx_qnum_per_tc; } hw->used_rx_queues = hw->num_tc * hw->alloc_rss_size; + + /* + * When rss size is changed, we need to update rss redirection table + * maintained by driver. Besides, during the entire reset process, we + * need to ensure that the rss table information are not overwritten + * and configured directly to the hardware in the RESET_STAGE_RESTORE + * stage of the reset process. + */ + if (rte_atomic16_read(&hw->reset.resetting) == 0) { + for (i = 0; i < HNS3_RSS_IND_TBL_SIZE; i++) + rss_cfg->rss_indirection_tbl[i] = + i % hw->alloc_rss_size; + } } void diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 1d57de7f9..3f0b005e4 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -4258,6 +4258,12 @@ hns3_map_rx_interrupt(struct rte_eth_dev *dev) return ret; } +static void +hns3_restore_filter(struct rte_eth_dev *dev) +{ + hns3_restore_rss_filter(dev); +} + static int hns3_dev_start(struct rte_eth_dev *dev) { @@ -4289,6 +4295,8 @@ hns3_dev_start(struct rte_eth_dev *dev) hns3_mp_req_start_rxtx(dev); rte_eal_alarm_set(HNS3_SERVICE_INTERVAL, hns3_service_handler, dev); + hns3_restore_filter(dev); + hns3_info(hw, "hns3 dev start successful!"); return 0; } diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 2e8acfee3..b93649c62 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1744,6 +1744,12 @@ hns3vf_map_rx_interrupt(struct rte_eth_dev *dev) return ret; } +static void +hns3vf_restore_filter(struct rte_eth_dev *dev) +{ + hns3_restore_rss_filter(dev); +} + static int hns3vf_dev_start(struct rte_eth_dev *dev) { @@ -1773,6 +1779,8 @@ hns3vf_dev_start(struct rte_eth_dev *dev) hns3_mp_req_start_rxtx(dev); rte_eal_alarm_set(HNS3VF_SERVICE_INTERVAL, hns3vf_service_handler, dev); + hns3vf_restore_filter(dev); + return ret; } diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c index 559b9d02b..53708d205 100644 --- a/drivers/net/hns3/hns3_flow.c +++ b/drivers/net/hns3/hns3_flow.c @@ -1546,6 +1546,19 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) return hns3_config_rss_filter(dev, &hw->rss_info, false); } +/* Restore the rss filter */ +int +hns3_restore_rss_filter(struct rte_eth_dev *dev) +{ + struct hns3_adapter *hns = dev->data->dev_private; + struct hns3_hw *hw = &hns->hw; + + if (hw->rss_info.conf.queue_num == 0) + return 0; + + return hns3_config_rss_filter(dev, &hw->rss_info, true); +} + static int hns3_flow_parse_rss(struct rte_eth_dev *dev, const struct hns3_rss_conf *conf, bool add) diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c index dfc42f840..737d5f109 100644 --- a/drivers/net/hns3/hns3_rss.c +++ b/drivers/net/hns3/hns3_rss.c @@ -127,7 +127,7 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size) req->rss_set_bitmap = rte_cpu_to_le_16(HNS3_RSS_SET_BITMAP_MSK); for (j = 0; j < HNS3_RSS_CFG_TBL_SIZE; j++) { num = i * HNS3_RSS_CFG_TBL_SIZE + j; - req->rss_result[j] = indir[num] % hw->alloc_rss_size; + req->rss_result[j] = indir[num]; } ret = hns3_cmd_send(hw, &desc, 1); if (ret) { @@ -423,7 +423,7 @@ hns3_dev_rss_reta_query(struct rte_eth_dev *dev, shift = i % RTE_RETA_GROUP_SIZE; if (reta_conf[idx].mask & (1ULL << shift)) reta_conf[idx].reta[shift] = - rss_cfg->rss_indirection_tbl[i] % hw->alloc_rss_size; + rss_cfg->rss_indirection_tbl[i]; } rte_spinlock_unlock(&hw->lock); return 0; @@ -532,7 +532,7 @@ hns3_config_rss(struct hns3_adapter *hns) enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode; - /* When there is no open RSS, redirect the packet queue 0 */ + /* When RSS is off, redirect the packet queue 0 */ if (((uint32_t)mq_mode & ETH_MQ_RX_RSS_FLAG) == 0) hns3_rss_uninit(hns); @@ -546,10 +546,16 @@ hns3_config_rss(struct hns3_adapter *hns) if (ret) return ret; - ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, - HNS3_RSS_IND_TBL_SIZE); - if (ret) - goto rss_tuple_uninit; + /* + * When RSS is off, it doesn't need to configure rss redirection table + * to hardware. + */ + if (((uint32_t)mq_mode & ETH_MQ_RX_RSS_FLAG)) { + ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, + HNS3_RSS_IND_TBL_SIZE); + if (ret) + goto rss_tuple_uninit; + } ret = hns3_set_rss_tc_mode(hw); if (ret) @@ -558,9 +564,11 @@ hns3_config_rss(struct hns3_adapter *hns) return ret; rss_indir_table_uninit: - ret1 = hns3_rss_reset_indir_table(hw); - if (ret1 != 0) - return ret; + if (((uint32_t)mq_mode & ETH_MQ_RX_RSS_FLAG)) { + ret1 = hns3_rss_reset_indir_table(hw); + if (ret1 != 0) + return ret; + } rss_tuple_uninit: hns3_rss_tuple_uninit(hw); diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h index 725970f89..3c7905132 100644 --- a/drivers/net/hns3/hns3_rss.h +++ b/drivers/net/hns3/hns3_rss.h @@ -111,4 +111,6 @@ int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); int hns3_set_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo, const uint8_t *key); +int hns3_restore_rss_filter(struct rte_eth_dev *dev); + #endif /* _HNS3_RSS_H_ */ -- 2.23.0