net/sfc: use even spread mode in flow action RSS

If the user provides contiguous ascending queue IDs,
use the even spread mode to avoid wasting resources
which are needed to serve indirection table entries.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
This commit is contained in:
Ivan Malov 2022-02-01 11:50:02 +03:00 committed by Ferruh Yigit
parent bcdcec8cca
commit 68cde2a3bd
2 changed files with 20 additions and 0 deletions

View File

@ -140,6 +140,8 @@ sfc_flow_rss_parse_conf(struct sfc_adapter *sa,
return EINVAL;
}
out->rte_hash_function = in->func;
if (in->queue_num == 0) {
sfc_err(sa, "flow-rss: parse: 'queue_num' is 0; MIN=1");
return EINVAL;
@ -317,6 +319,9 @@ sfc_flow_rss_ctx_program_tbl(struct sfc_adapter *sa,
SFC_ASSERT(sfc_adapter_is_locked(sa));
if (nb_tbl_entries == 0)
return 0;
if (conf->nb_qid_offsets != 0) {
SFC_ASSERT(ctx->qid_offsets != NULL);
@ -336,6 +341,7 @@ sfc_flow_rss_ctx_program(struct sfc_adapter *sa, struct sfc_flow_rss_ctx *ctx)
{
efx_rx_scale_context_type_t ctx_type = EFX_RX_SCALE_EXCLUSIVE;
struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
const struct sfc_flow_rss *flow_rss = &sa->flow_rss;
struct sfc_rss *ethdev_rss = &sas->rss;
struct sfc_flow_rss_conf *conf;
@ -366,6 +372,19 @@ sfc_flow_rss_ctx_program(struct sfc_adapter *sa, struct sfc_flow_rss_ctx *ctx)
nb_tbl_entries = RTE_MAX(flow_rss->nb_tbl_entries_min, nb_qid_offsets);
if (conf->rte_hash_function == RTE_ETH_HASH_FUNCTION_DEFAULT &&
conf->nb_qid_offsets == 0 &&
conf->qid_span <= encp->enc_rx_scale_even_spread_max_nqueues) {
/*
* Conformance to a specific hash algorithm is a don't care to
* the user. The queue array is contiguous and ascending. That
* means that the even spread context may be requested here in
* order to avoid wasting precious indirection table resources.
*/
ctx_type = EFX_RX_SCALE_EVEN_SPREAD;
nb_tbl_entries = 0;
}
if (ctx->nic_handle_refcnt == 0) {
rc = efx_rx_scale_context_alloc_v2(sa->nic, ctx_type,
conf->qid_span,

View File

@ -20,6 +20,7 @@ extern "C" {
struct sfc_flow_rss_conf {
uint8_t key[EFX_RSS_KEY_SIZE];
enum rte_eth_hash_function rte_hash_function;
efx_rx_hash_type_t efx_hash_types;
unsigned int nb_qid_offsets;
unsigned int qid_span;