Re: [PATCH net-next 1/7] net: hns3: add ethtool_ops.set_channels support for HNS3 VF driver

2019-09-10 Thread tanhuazhong




On 2019/9/11 1:25, David Miller wrote:

From: Huazhong Tan 
Date: Tue, 10 Sep 2019 16:58:22 +0800


+   /* Set to user value, no larger than max_rss_size. */
+   if (kinfo->req_rss_size != kinfo->rss_size && kinfo->req_rss_size &&
+   kinfo->req_rss_size <= max_rss_size) {
+   dev_info(>pdev->dev, "rss changes from %u to %u\n",
+kinfo->rss_size, kinfo->req_rss_size);
+   kinfo->rss_size = kinfo->req_rss_size;


Please do not emit kernel log messages for normal operations.



Will remove this log in V2.
Thanks.


.





Re: [PATCH net-next 1/7] net: hns3: add ethtool_ops.set_channels support for HNS3 VF driver

2019-09-10 Thread David Miller
From: Huazhong Tan 
Date: Tue, 10 Sep 2019 16:58:22 +0800

> + /* Set to user value, no larger than max_rss_size. */
> + if (kinfo->req_rss_size != kinfo->rss_size && kinfo->req_rss_size &&
> + kinfo->req_rss_size <= max_rss_size) {
> + dev_info(>pdev->dev, "rss changes from %u to %u\n",
> +  kinfo->rss_size, kinfo->req_rss_size);
> + kinfo->rss_size = kinfo->req_rss_size;

Please do not emit kernel log messages for normal operations.


[PATCH net-next 1/7] net: hns3: add ethtool_ops.set_channels support for HNS3 VF driver

2019-09-10 Thread Huazhong Tan
From: Guangbin Huang 

This patch adds ethtool_ops.set_channels support for HNS3 VF driver,
and updates related TQP information and RSS information, to support
modification of VF TQP number, and uses current rss_size instead of
max_rss_size to initialize RSS.

Also, fixes a format error in hclgevf_get_rss().

Signed-off-by: Guangbin Huang 
Signed-off-by: Huazhong Tan 
---
 drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c |  1 +
 .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c  | 87 --
 2 files changed, 83 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
index aa692b1..f5a681d 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
@@ -1397,6 +1397,7 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
.set_rxfh = hns3_set_rss,
.get_link_ksettings = hns3_get_link_ksettings,
.get_channels = hns3_get_channels,
+   .set_channels = hns3_set_channels,
.get_coalesce = hns3_get_coalesce,
.set_coalesce = hns3_set_coalesce,
.get_regs_len = hns3_get_regs_len,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index 594cae8..d77dcc2 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
@@ -743,7 +743,7 @@ static int hclgevf_get_rss(struct hnae3_handle *handle, u32 
*indir, u8 *key,
 }
 
 static int hclgevf_set_rss(struct hnae3_handle *handle, const u32 *indir,
-  const  u8 *key, const  u8 hfunc)
+  const u8 *key, const u8 hfunc)
 {
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
struct hclgevf_rss_cfg *rss_cfg = >rss_cfg;
@@ -2060,9 +2060,10 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, 
bool en)
 static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
 {
struct hclgevf_rss_cfg *rss_cfg = >rss_cfg;
-   int i, ret;
+   int ret;
+   u32 i;
 
-   rss_cfg->rss_size = hdev->rss_size_max;
+   rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
 
if (hdev->pdev->revision >= 0x21) {
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
@@ -2099,13 +2100,13 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
 
/* Initialize RSS indirect table */
for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
-   rss_cfg->rss_indirection_tbl[i] = i % hdev->rss_size_max;
+   rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
 
ret = hclgevf_set_rss_indir_table(hdev);
if (ret)
return ret;
 
-   return hclgevf_set_rss_tc_mode(hdev, hdev->rss_size_max);
+   return hclgevf_set_rss_tc_mode(hdev, rss_cfg->rss_size);
 }
 
 static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev)
@@ -2835,6 +2836,81 @@ static void hclgevf_get_tqps_and_rss_info(struct 
hnae3_handle *handle,
*max_rss_size = hdev->rss_size_max;
 }
 
+static void hclgevf_update_rss_size(struct hnae3_handle *handle,
+   u32 new_tqps_num)
+{
+   struct hnae3_knic_private_info *kinfo = >kinfo;
+   struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
+   u16 max_rss_size;
+
+   kinfo->req_rss_size = new_tqps_num;
+
+   max_rss_size = min_t(u16, hdev->rss_size_max,
+hdev->num_tqps / kinfo->num_tc);
+
+   /* Set to user value, no larger than max_rss_size. */
+   if (kinfo->req_rss_size != kinfo->rss_size && kinfo->req_rss_size &&
+   kinfo->req_rss_size <= max_rss_size) {
+   dev_info(>pdev->dev, "rss changes from %u to %u\n",
+kinfo->rss_size, kinfo->req_rss_size);
+   kinfo->rss_size = kinfo->req_rss_size;
+   } else if (kinfo->rss_size > max_rss_size ||
+  (!kinfo->req_rss_size && kinfo->rss_size < max_rss_size)) {
+   /* Set to the maximum specification value (max_rss_size). */
+   dev_info(>pdev->dev, "rss changes from %u to %u\n",
+kinfo->rss_size, max_rss_size);
+   kinfo->rss_size = max_rss_size;
+   }
+
+   kinfo->num_tqps = kinfo->num_tc * kinfo->rss_size;
+}
+
+static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
+   bool rxfh_configured)
+{
+   struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
+   struct hnae3_knic_private_info *kinfo = >kinfo;
+   u16 cur_rss_size = kinfo->rss_size;
+   u16 cur_tqps = kinfo->num_tqps;
+   u32 *rss_indir;
+   unsigned int i;
+   int ret;
+
+   hclgevf_update_rss_size(handle, new_tqps_num);
+
+   ret = hclgevf_set_rss_tc_mode(hdev, kinfo->rss_size);
+   if (ret)
+   return ret;
+