Hi, Michal

On 2019/9/12 14:23, Michal Kubecek wrote:
On Wed, Sep 11, 2019 at 10:40:33AM +0800, Huazhong Tan wrote:
From: Guangbin Huang <huangguangb...@huawei.com>

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 <huangguangb...@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazh...@huawei.com>
---
  drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c |  1 +
  .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c  | 83 ++++++++++++++++++++--
  2 files changed, 79 insertions(+), 5 deletions(-)

...
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index 594cae8..e3090b3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
...
+static void hclgevf_update_rss_size(struct hnae3_handle *handle,
+                                   u32 new_tqps_num)
+{
+       struct hnae3_knic_private_info *kinfo = &handle->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);
+
+       /* Use the user's configuration when it is not larger than
+        * max_rss_size, otherwise, use the maximum specification value.
+        */
+       if (kinfo->req_rss_size != kinfo->rss_size && kinfo->req_rss_size &&
+           kinfo->req_rss_size <= max_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))
+               kinfo->rss_size = max_rss_size;

I don't think requested channel count can be larger than max_rss_size
here. In ethtool_set_channels(), we check that requested channel counts
do not exceed maximum channel counts as reported by ->get_channels().
And hclgevf_get_max_channels() cannot return more than max_rss_size.


When we can modify the TC number (which PF has already supported, VF may implement in the future) using lldptool or tc cmd, hclgevf_update_rss_size will be called to update the rss information, which may also change max_rss_size, so we will use max_rss_size instead if the kinfo->rss_size configured using ethtool is bigger than 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 = &handle->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;
+
+       /* RSS indirection table has been configuared by user */
+       if (rxfh_configured)
+               goto out;
+
+       /* Reinitializes the rss indirect table according to the new RSS size */
+       rss_indir = kcalloc(HCLGEVF_RSS_IND_TBL_SIZE, sizeof(u32), GFP_KERNEL);
+       if (!rss_indir)
+               return -ENOMEM;
+
+       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+               rss_indir[i] = i % kinfo->rss_size;
+
+       ret = hclgevf_set_rss(handle, rss_indir, NULL, 0);
+       if (ret)
+               dev_err(&hdev->pdev->dev, "set rss indir table fail, ret=%d\n",
+                       ret);
+
+       kfree(rss_indir);
+
+out:
+       if (!ret)
+               dev_info(&hdev->pdev->dev,
+                        "Channels changed, rss_size from %u to %u, tqps from %u to 
%u",
+                        cur_rss_size, kinfo->rss_size,
+                        cur_tqps, kinfo->rss_size * kinfo->num_tc);
+
+       return ret;
+}

IIRC David asked you not to issue this log message in v1 review.

Michal Kubecek


Sorry for missing this log.

Thanks.

.


Reply via email to