From: Lijun Ou Date: Thu, 26 Mar 2020 07:14:31 +0000 (+0800) Subject: net/hns3: fix configuring RSS hash when rules are flushed X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=5e782bc2570c;p=dpdk.git net/hns3: fix configuring RSS hash when rules are flushed Currently, when performing test case as follow: 1. Run testpmd application based on hns3 network engine with multiple receive queues(--rxq=N --txq=N, N>1). 2. Create the special RSS rules by "create flow ..." command in the command prompt of the testpmd application. 3. Flush the RSS rules created in step 2 by "flow flush ..." command. 4. Enable RSS by "port config all rss all" command. In step 4, the command exeuctes successfully. This phenomenon is inconsistent with the expectation. The API function named rte_eth_dev_rss_hash_update called in the command should return error and the command should fail. This patch fixes it by adding a flag for disabling RSS in the driver. When RSS rules is flushed, we set the the flag with true, and the '.rss_hash_update' ops implementation function named hns3_dev_rss_hash_update return -EINVAL. Fixes: c37ca66f2b27 ("net/hns3: support RSS") Cc: stable@dpdk.org Signed-off-by: Lijun Ou Signed-off-by: Wei Hu (Xavier) --- diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 1d19de0e67..86676390fe 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -2663,6 +2663,7 @@ hns3_get_board_configuration(struct hns3_hw *hw) hw->mac.media_type = cfg.media_type; hw->rss_size_max = cfg.rss_size_max; + hw->rss_dis_flag = false; hw->rx_buf_len = cfg.rx_buf_len; memcpy(hw->mac.mac_addr, cfg.mac_addr, RTE_ETHER_ADDR_LEN); hw->mac.phy_addr = cfg.phy_addr; diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h index 28484188a6..0423e64ea0 100644 --- a/drivers/net/hns3/hns3_ethdev.h +++ b/drivers/net/hns3/hns3_ethdev.h @@ -368,6 +368,7 @@ struct hns3_hw { /* The configuration info of RSS */ struct hns3_rss_conf rss_info; + bool rss_dis_flag; /* disable rss flag. true: disable, false: enable */ uint8_t num_tc; /* Total number of enabled TCs */ uint8_t hw_tc_map; diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 3c72976f3d..08ae58a794 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1022,6 +1022,7 @@ hns3vf_get_configuration(struct hns3_hw *hw) int ret; hw->mac.media_type = HNS3_MEDIA_TYPE_NONE; + hw->rss_dis_flag = false; /* Get queue configuration from PF */ ret = hns3vf_get_queue_info(hw); diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c index 53708d2054..aef301a8a7 100644 --- a/drivers/net/hns3/hns3_flow.c +++ b/drivers/net/hns3/hns3_flow.c @@ -1333,6 +1333,7 @@ hns3_disable_rss(struct hns3_hw *hw) /* Disable RSS */ hw->rss_info.conf.types = 0; + hw->rss_dis_flag = true; return 0; } diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c index 737d5f1093..95a637ddc2 100644 --- a/drivers/net/hns3/hns3_rss.c +++ b/drivers/net/hns3/hns3_rss.c @@ -261,6 +261,9 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, uint8_t *key = rss_conf->rss_key; int ret; + if (hw->rss_dis_flag) + return -EINVAL; + rte_spinlock_lock(&hw->lock); ret = hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_hf); if (ret)