150 lines
5.1 KiB
Diff
150 lines
5.1 KiB
Diff
From d0c9a7b130290b2079dfaeaf301b95982480912c Mon Sep 17 00:00:00 2001
|
|
From: Huisong Li <lihuisong@huawei.com>
|
|
Date: Tue, 31 Jan 2023 21:02:53 +0800
|
|
Subject: net/hns3: refactor set RSS hash algorithm and key interface
|
|
|
|
[ upstream commit 88347111eb53bc54c598dde81715a06ca1dbd132 ]
|
|
|
|
The hns3_rss_set_algo_key() is used to set RSS hash algorithm and key to
|
|
hardware.
|
|
The maximum execution time of the command sent to the firmware is
|
|
proportional to the length of the key.
|
|
However, now this times is fixed, which isn't good for key expansion.
|
|
|
|
In addition, hash algorithm comes from rss_info::hash_algo maintained in
|
|
the driver, which also isn't good for the usage of this function.
|
|
|
|
Interface is updated to get hash algorithm and key length as input
|
|
parameters.
|
|
|
|
Fixes: c37ca66f2b27 ("net/hns3: support RSS")
|
|
Cc: stable@dpdk.org
|
|
|
|
Signed-off-by: Huisong Li <lihuisong@huawei.com>
|
|
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
|
|
---
|
|
drivers/net/hns3/hns3_flow.c | 3 ++-
|
|
drivers/net/hns3/hns3_rss.c | 48 ++++++++++++++++--------------------
|
|
drivers/net/hns3/hns3_rss.h | 4 ++-
|
|
3 files changed, 26 insertions(+), 29 deletions(-)
|
|
|
|
diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c
|
|
index a2c1589c39..95609f8483 100644
|
|
--- a/drivers/net/hns3/hns3_flow.c
|
|
+++ b/drivers/net/hns3/hns3_flow.c
|
|
@@ -1494,7 +1494,8 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ret = hns3_rss_set_algo_key(hw, rss_config->key);
|
|
+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo,
|
|
+ rss_config->key, HNS3_RSS_KEY_SIZE);
|
|
if (ret)
|
|
return ret;
|
|
|
|
diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c
|
|
index ca5a129234..3db7bf0445 100644
|
|
--- a/drivers/net/hns3/hns3_rss.c
|
|
+++ b/drivers/net/hns3/hns3_rss.c
|
|
@@ -277,45 +277,37 @@ static const struct {
|
|
|
|
/*
|
|
* rss_generic_config command function, opcode:0x0D01.
|
|
- * Used to set algorithm, key_offset and hash key of rss.
|
|
+ * Used to set algorithm and hash key of RSS.
|
|
*/
|
|
int
|
|
-hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key)
|
|
+hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo,
|
|
+ const uint8_t *key, uint8_t key_len)
|
|
{
|
|
-#define HNS3_KEY_OFFSET_MAX 3
|
|
-#define HNS3_SET_HASH_KEY_BYTE_FOUR 2
|
|
-
|
|
struct hns3_rss_generic_config_cmd *req;
|
|
struct hns3_cmd_desc desc;
|
|
- uint32_t key_offset, key_size;
|
|
- const uint8_t *key_cur;
|
|
- uint8_t cur_offset;
|
|
+ const uint8_t *cur_key;
|
|
+ uint16_t cur_key_size;
|
|
+ uint16_t max_bd_num;
|
|
+ uint16_t idx;
|
|
int ret;
|
|
|
|
req = (struct hns3_rss_generic_config_cmd *)desc.data;
|
|
|
|
- /*
|
|
- * key_offset=0, hash key byte0~15 is set to hardware.
|
|
- * key_offset=1, hash key byte16~31 is set to hardware.
|
|
- * key_offset=2, hash key byte32~39 is set to hardware.
|
|
- */
|
|
- for (key_offset = 0; key_offset < HNS3_KEY_OFFSET_MAX; key_offset++) {
|
|
+ max_bd_num = DIV_ROUND_UP(key_len, HNS3_RSS_HASH_KEY_NUM);
|
|
+ for (idx = 0; idx < max_bd_num; idx++) {
|
|
hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_GENERIC_CONFIG,
|
|
false);
|
|
|
|
- req->hash_config |=
|
|
- (hw->rss_info.hash_algo & HNS3_RSS_HASH_ALGO_MASK);
|
|
- req->hash_config |= (key_offset << HNS3_RSS_HASH_KEY_OFFSET_B);
|
|
+ req->hash_config |= (hash_algo & HNS3_RSS_HASH_ALGO_MASK);
|
|
+ req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B);
|
|
|
|
- if (key_offset == HNS3_SET_HASH_KEY_BYTE_FOUR)
|
|
- key_size = HNS3_RSS_KEY_SIZE - HNS3_RSS_HASH_KEY_NUM *
|
|
- HNS3_SET_HASH_KEY_BYTE_FOUR;
|
|
+ if (idx == max_bd_num - 1)
|
|
+ cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM;
|
|
else
|
|
- key_size = HNS3_RSS_HASH_KEY_NUM;
|
|
+ cur_key_size = HNS3_RSS_HASH_KEY_NUM;
|
|
|
|
- cur_offset = key_offset * HNS3_RSS_HASH_KEY_NUM;
|
|
- key_cur = key + cur_offset;
|
|
- memcpy(req->hash_key, key_cur, key_size);
|
|
+ cur_key = key + idx * HNS3_RSS_HASH_KEY_NUM;
|
|
+ memcpy(req->hash_key, cur_key, cur_key_size);
|
|
|
|
ret = hns3_cmd_send(hw, &desc, 1);
|
|
if (ret) {
|
|
@@ -518,7 +510,8 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev,
|
|
goto set_tuple_fail;
|
|
|
|
if (key) {
|
|
- ret = hns3_rss_set_algo_key(hw, key);
|
|
+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo,
|
|
+ key, HNS3_RSS_KEY_SIZE);
|
|
if (ret)
|
|
goto set_algo_key_fail;
|
|
}
|
|
@@ -795,8 +788,9 @@ hns3_config_rss(struct hns3_adapter *hns)
|
|
break;
|
|
}
|
|
|
|
- /* Configure RSS hash algorithm and hash key offset */
|
|
- ret = hns3_rss_set_algo_key(hw, hash_key);
|
|
+ /* Configure RSS hash algorithm and hash key */
|
|
+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, hash_key,
|
|
+ HNS3_RSS_KEY_SIZE);
|
|
if (ret)
|
|
return ret;
|
|
|
|
diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h
|
|
index 8e8b056f4e..b7f62ca1ee 100644
|
|
--- a/drivers/net/hns3/hns3_rss.h
|
|
+++ b/drivers/net/hns3/hns3_rss.h
|
|
@@ -109,6 +109,8 @@ int hns3_rss_reset_indir_table(struct hns3_hw *hw);
|
|
int hns3_config_rss(struct hns3_adapter *hns);
|
|
void hns3_rss_uninit(struct hns3_adapter *hns);
|
|
int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf);
|
|
-int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key);
|
|
+int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo,
|
|
+ const uint8_t *key, uint8_t key_len);
|
|
+
|
|
|
|
#endif /* HNS3_RSS_H */
|
|
--
|
|
2.23.0
|
|
|