Sync some patchs from upstreaming and modifies are as follow: - net/hns3: fix mailbox sync - net/hns3: report maximum buffer size - ethdev: add maximum Rx buffer size - app/procinfo: show RSS hash algorithm - ethdev: get RSS algorithm names - app/procinfo: adjust format of RSS info - app/procinfo: fix RSS info - net/hns3: support setting and querying RSS hash function - net/hns3: report RSS hash algorithms capability - ethdev: set and query RSS hash algorithm - ethdev: clarify RSS related fields usage - net/hns3: fix uninitialized hash algo value - net/hns3: keep set/get algo key functions local - net/hns3: fix some error logs - net/hns3: fix some return values - net/hns3: fix LRO offload to report - net/hns3: fix setting DCB capability - app/testpmd: ease configuring all offloads - net/hns3: refactor interrupt state query - net/hns3: fix IMP or global reset - net/hns3: fix multiple reset detected log - net/hns3: remove reset log in secondary - net/hns3: fix double stats for IMP and global reset - net/hns3: fix crash for NEON and SVE - net/hns3: fix unchecked Rx free threshold - net/hns3: fix typo in function name - net/hns3: fix build warning - telemetry: fix repeat display when callback don't init dict Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
208 lines
7.1 KiB
Diff
208 lines
7.1 KiB
Diff
From 597270b32229f1c39f29cd6b0d07203850bd975b Mon Sep 17 00:00:00 2001
|
|
From: Jie Hai <haijie1@huawei.com>
|
|
Date: Thu, 2 Nov 2023 16:20:13 +0800
|
|
Subject: [PATCH 385/394] ethdev: set and query RSS hash algorithm
|
|
|
|
[ upstream commit 34ff088cc24159c9fa6e61242efb76d0289b4e37 ]
|
|
|
|
Currently, rte_eth_rss_conf supports configuring and querying
|
|
RSS hash functions, rss key and it's length, but not RSS hash
|
|
algorithm.
|
|
|
|
The structure ``rte_eth_dev_info`` is extended by adding a new
|
|
field "rss_algo_capa". Drivers are responsible for reporting this
|
|
capa and configurations of RSS hash algorithm can be verified based
|
|
on the capability. The default value of "rss_algo_capa" is
|
|
RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT) if drivers do not report it.
|
|
|
|
The structure ``rte_eth_rss_conf`` is extended by adding a new
|
|
field "algorithm". This represents the RSS algorithms to apply.
|
|
If the value of "algorithm" used for configuration is a gibberish
|
|
value, drivers should report the error.
|
|
|
|
To check whether the drivers report valid "algorithm", it is set
|
|
to default value before querying in rte_eth_dev_rss_hash_conf_get().
|
|
|
|
Signed-off-by: Jie Hai <haijie1@huawei.com>
|
|
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
|
|
Acked-by: Huisong Li <lihuisong@huawei.com>
|
|
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
|
|
Reviewed-by: Ferruh Yigit <ferruh.yigit@amd.com>
|
|
---
|
|
lib/ethdev/rte_ethdev.c | 25 +++++++++++++++++++++++++
|
|
lib/ethdev/rte_ethdev.h | 29 +++++++++++++++++++++++++++++
|
|
lib/ethdev/rte_flow.c | 1 -
|
|
lib/ethdev/rte_flow.h | 19 ++-----------------
|
|
4 files changed, 56 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
|
|
index f8f111ba6d..ec06bd3a9c 100644
|
|
--- a/lib/ethdev/rte_ethdev.c
|
|
+++ b/lib/ethdev/rte_ethdev.c
|
|
@@ -1422,6 +1422,7 @@ int
|
|
rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
|
|
const struct rte_eth_conf *dev_conf)
|
|
{
|
|
+ enum rte_eth_hash_function algorithm;
|
|
struct rte_eth_dev *dev;
|
|
struct rte_eth_dev_info dev_info;
|
|
struct rte_eth_conf orig_conf;
|
|
@@ -1630,6 +1631,17 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
|
|
goto rollback;
|
|
}
|
|
|
|
+ algorithm = dev_conf->rx_adv_conf.rss_conf.algorithm;
|
|
+ if ((size_t)algorithm >= CHAR_BIT * sizeof(dev_info.rss_algo_capa) ||
|
|
+ (dev_info.rss_algo_capa & RTE_ETH_HASH_ALGO_TO_CAPA(algorithm)) == 0) {
|
|
+ RTE_ETHDEV_LOG(ERR,
|
|
+ "Ethdev port_id=%u configured RSS hash algorithm (%u)"
|
|
+ "is not in the algorithm capability (0x%" PRIx32 ")\n",
|
|
+ port_id, algorithm, dev_info.rss_algo_capa);
|
|
+ ret = -EINVAL;
|
|
+ goto rollback;
|
|
+ }
|
|
+
|
|
/*
|
|
* Setup new number of Rx/Tx queues and reconfigure device.
|
|
*/
|
|
@@ -3507,6 +3519,7 @@ rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
|
|
dev_info->min_mtu = RTE_ETHER_MIN_LEN - RTE_ETHER_HDR_LEN -
|
|
RTE_ETHER_CRC_LEN;
|
|
dev_info->max_mtu = UINT16_MAX;
|
|
+ dev_info->rss_algo_capa = RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT);
|
|
|
|
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
|
|
diag = (*dev->dev_ops->dev_infos_get)(dev, dev_info);
|
|
@@ -4223,6 +4236,16 @@ rte_eth_dev_rss_hash_update(uint16_t port_id,
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ if ((size_t)rss_conf->algorithm >= CHAR_BIT * sizeof(dev_info.rss_algo_capa) ||
|
|
+ (dev_info.rss_algo_capa &
|
|
+ RTE_ETH_HASH_ALGO_TO_CAPA(rss_conf->algorithm)) == 0) {
|
|
+ RTE_ETHDEV_LOG(ERR,
|
|
+ "Ethdev port_id=%u configured RSS hash algorithm (%u)"
|
|
+ "is not in the algorithm capability (0x%" PRIx32 ")\n",
|
|
+ port_id, rss_conf->algorithm, dev_info.rss_algo_capa);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);
|
|
return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
|
|
rss_conf));
|
|
@@ -4258,6 +4281,8 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ rss_conf->algorithm = RTE_ETH_HASH_FUNCTION_DEFAULT;
|
|
+
|
|
RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_conf_get, -ENOTSUP);
|
|
return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
|
|
rss_conf));
|
|
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
|
|
index 03799bafa9..911b9e03ab 100644
|
|
--- a/lib/ethdev/rte_ethdev.h
|
|
+++ b/lib/ethdev/rte_ethdev.h
|
|
@@ -503,6 +503,33 @@ struct rte_vlan_filter_conf {
|
|
uint64_t ids[64];
|
|
};
|
|
|
|
+/**
|
|
+ * Hash function types.
|
|
+ */
|
|
+enum rte_eth_hash_function {
|
|
+ /** DEFAULT means driver decides which hash algorithm to pick. */
|
|
+ RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
|
|
+ RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */
|
|
+ RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */
|
|
+ /**
|
|
+ * Symmetric Toeplitz: src, dst will be replaced by
|
|
+ * xor(src, dst). For the case with src/dst only,
|
|
+ * src or dst address will xor with zero pair.
|
|
+ */
|
|
+ RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ,
|
|
+ /**
|
|
+ * Symmetric Toeplitz: L3 and L4 fields are sorted prior to
|
|
+ * the hash function.
|
|
+ * If src_ip > dst_ip, swap src_ip and dst_ip.
|
|
+ * If src_port > dst_port, swap src_port and dst_port.
|
|
+ */
|
|
+ RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ_SORT,
|
|
+ RTE_ETH_HASH_FUNCTION_MAX,
|
|
+};
|
|
+
|
|
+#define RTE_ETH_HASH_ALGO_TO_CAPA(x) RTE_BIT32(x)
|
|
+#define RTE_ETH_HASH_ALGO_CAPA_MASK(x) RTE_BIT32(RTE_ETH_HASH_FUNCTION_ ## x)
|
|
+
|
|
/**
|
|
* A structure used to configure the Receive Side Scaling (RSS) feature
|
|
* of an Ethernet port.
|
|
@@ -527,6 +554,7 @@ struct rte_eth_rss_conf {
|
|
* which RSS hashing is to be applied.
|
|
*/
|
|
uint64_t rss_hf;
|
|
+ enum rte_eth_hash_function algorithm; /**< Hash algorithm. */
|
|
};
|
|
|
|
/*
|
|
@@ -1820,6 +1848,7 @@ struct rte_eth_dev_info {
|
|
/** Device redirection table size, the total number of entries. */
|
|
uint16_t reta_size;
|
|
uint8_t hash_key_size; /**< Hash key size in bytes */
|
|
+ uint32_t rss_algo_capa; /** RSS hash algorithms capabilities */
|
|
/** Bit mask of RSS offloads, the bit offset also means flow type */
|
|
uint64_t flow_type_rss_offloads;
|
|
struct rte_eth_rxconf default_rxconf; /**< Default Rx configuration */
|
|
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
|
|
index a93f68abbc..e11c08baae 100644
|
|
--- a/lib/ethdev/rte_flow.c
|
|
+++ b/lib/ethdev/rte_flow.c
|
|
@@ -14,7 +14,6 @@
|
|
#include <rte_string_fns.h>
|
|
#include <rte_mbuf.h>
|
|
#include <rte_mbuf_dyn.h>
|
|
-#include "rte_ethdev.h"
|
|
#include "rte_flow_driver.h"
|
|
#include "rte_flow.h"
|
|
|
|
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
|
|
index 039d09e0a9..d560cc7dcd 100644
|
|
--- a/lib/ethdev/rte_flow.h
|
|
+++ b/lib/ethdev/rte_flow.h
|
|
@@ -38,6 +38,8 @@
|
|
#include <rte_l2tpv2.h>
|
|
#include <rte_ppp.h>
|
|
|
|
+#include "rte_ethdev.h"
|
|
+
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
@@ -2970,23 +2972,6 @@ struct rte_flow_query_count {
|
|
uint64_t bytes; /**< Number of bytes through this rule [out]. */
|
|
};
|
|
|
|
-/**
|
|
- * Hash function types.
|
|
- */
|
|
-enum rte_eth_hash_function {
|
|
- /** DEFAULT means driver decides which hash algorithm to pick. */
|
|
- RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
|
|
- RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */
|
|
- RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */
|
|
- /**
|
|
- * Symmetric Toeplitz: src, dst will be replaced by
|
|
- * xor(src, dst). For the case with src/dst only,
|
|
- * src or dst address will xor with zero pair.
|
|
- */
|
|
- RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ,
|
|
- RTE_ETH_HASH_FUNCTION_MAX,
|
|
-};
|
|
-
|
|
/**
|
|
* RTE_FLOW_ACTION_TYPE_RSS
|
|
*
|
|
--
|
|
2.23.0
|
|
|