net: hns3: fix for rss result nonuniform
authorJian Shen <shenjian15@huawei.com>
Wed, 30 Jan 2019 20:55:48 +0000 (04:55 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Jan 2019 22:50:03 +0000 (14:50 -0800)
The rss result is more uniform when use recommended hash key from
microsoft, instead of the one generated by netdev_rss_key_fill().
Also using hash algorithm "xor" is better than "toeplitz".

This patch modifies the default hash key and hash algorithm.

Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index 795ebed..42f0f88 100644 (file)
@@ -295,6 +295,14 @@ static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = {
        },
 };
 
+static const u8 hclge_hash_key[] = {
+       0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
+       0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
+       0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
+       0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
+       0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA
+};
+
 static int hclge_mac_update_stats_defective(struct hclge_dev *hdev)
 {
 #define HCLGE_MAC_CMD_NUM 21
@@ -3652,8 +3660,11 @@ void hclge_rss_indir_init_cfg(struct hclge_dev *hdev)
 
 static void hclge_rss_init_cfg(struct hclge_dev *hdev)
 {
+       int i, rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
        struct hclge_vport *vport = hdev->vport;
-       int i;
+
+       if (hdev->pdev->revision >= 0x21)
+               rss_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
 
        for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
                vport[i].rss_tuple_sets.ipv4_tcp_en =
@@ -3673,9 +3684,10 @@ static void hclge_rss_init_cfg(struct hclge_dev *hdev)
                vport[i].rss_tuple_sets.ipv6_fragment_en =
                        HCLGE_RSS_INPUT_TUPLE_OTHER;
 
-               vport[i].rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
+               vport[i].rss_algo = rss_algo;
 
-               netdev_rss_key_fill(vport[i].rss_hash_key, HCLGE_RSS_KEY_SIZE);
+               memcpy(vport[i].rss_hash_key, hclge_hash_key,
+                      HCLGE_RSS_KEY_SIZE);
        }
 
        hclge_rss_indir_init_cfg(hdev);
index fc99a0c..93f306f 100644 (file)
@@ -21,6 +21,14 @@ static const struct pci_device_id ae_algovf_pci_tbl[] = {
        {0, }
 };
 
+static const u8 hclgevf_hash_key[] = {
+       0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
+       0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
+       0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
+       0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
+       0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA
+};
+
 MODULE_DEVICE_TABLE(pci, ae_algovf_pci_tbl);
 
 static const u32 cmdq_reg_addr_list[] = {HCLGEVF_CMDQ_TX_ADDR_L_REG,
@@ -1789,9 +1797,9 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
        rss_cfg->rss_size = hdev->rss_size_max;
 
        if (hdev->pdev->revision >= 0x21) {
-               rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
-               netdev_rss_key_fill(rss_cfg->rss_hash_key,
-                                   HCLGEVF_RSS_KEY_SIZE);
+               rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
+               memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
+                      HCLGEVF_RSS_KEY_SIZE);
 
                ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
                                               rss_cfg->rss_hash_key);