From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0F36AA00C5; Tue, 1 Feb 2022 09:50:39 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5888D426DD; Tue, 1 Feb 2022 09:50:13 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 05DB640691 for ; Tue, 1 Feb 2022 09:50:07 +0100 (CET) Received: from bree.oktetlabs.ru (bree.oktetlabs.ru [192.168.34.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPS id C6D134C; Tue, 1 Feb 2022 11:50:06 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru C6D134C Authentication-Results: shelob.oktetlabs.ru/C6D134C; dkim=none; dkim-atps=neutral From: Ivan Malov To: dev@dpdk.org Cc: Andrew Rybchenko , Andy Moreton Subject: [PATCH 7/8] common/sfc_efx/base: support the even spread RSS mode Date: Tue, 1 Feb 2022 11:50:01 +0300 Message-Id: <20220201085002.320102-8-ivan.malov@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220201085002.320102-1-ivan.malov@oktetlabs.ru> References: <20220201085002.320102-1-ivan.malov@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Riverhead boards support spreading traffic across the specified number of queues without using indirections. This mode is provided by a dedicated RSS context type. Signed-off-by: Ivan Malov Reviewed-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/ef10_nic.c | 22 +++++++++++++ drivers/common/sfc_efx/base/ef10_rx.c | 42 ++++++++++++++++++------- drivers/common/sfc_efx/base/efx.h | 8 ++++- drivers/common/sfc_efx/base/efx_rx.c | 6 +++- drivers/common/sfc_efx/base/siena_nic.c | 3 ++ 5 files changed, 67 insertions(+), 14 deletions(-) diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index cca31bc725..aa667309ab 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1482,10 +1482,32 @@ ef10_get_datapath_caps( encp->enc_rx_scale_tbl_max_nentries = MCDI_OUT_DWORD(req, GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE); + + if (CAP_FLAGS3(req, RSS_EVEN_SPREADING)) { +#define RSS_MAX_EVEN_SPREADING_QUEUES \ + GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES + /* + * The even spreading mode distributes traffic across + * the specified number of queues without the need to + * allocate precious indirection entry pool resources. + */ + encp->enc_rx_scale_even_spread_max_nqueues = + MCDI_OUT_DWORD(req, RSS_MAX_EVEN_SPREADING_QUEUES); +#undef RSS_MAX_EVEN_SPREADING_QUEUES + } else { + /* There is no support for the even spread contexts. */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; + } } else { encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS; encp->enc_rx_scale_tbl_min_nentries = EFX_RSS_TBL_SIZE; encp->enc_rx_scale_tbl_max_nentries = EFX_RSS_TBL_SIZE; + + /* + * Assume that there is no support + * for the even spread contexts. + */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; } #endif /* EFSYS_OPT_RX_SCALE */ diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c index 78af7300a0..afc9cf025f 100644 --- a/drivers/common/sfc_efx/base/ef10_rx.c +++ b/drivers/common/sfc_efx/base/ef10_rx.c @@ -23,30 +23,45 @@ efx_mcdi_rss_context_alloc( efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_LEN, MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN); + uint32_t table_nentries_min; + uint32_t table_nentries_max; + uint32_t num_queues_max; uint32_t rss_context; uint32_t context_type; efx_rc_t rc; - if (num_queues > encp->enc_rx_scale_indirection_max_nqueues) { - rc = EINVAL; - goto fail1; - } - - if (table_nentries < encp->enc_rx_scale_tbl_min_nentries || - table_nentries > encp->enc_rx_scale_tbl_max_nentries || - !ISP2(table_nentries)) { - rc = EINVAL; - goto fail2; - } - switch (type) { case EFX_RX_SCALE_EXCLUSIVE: context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EXCLUSIVE; + num_queues_max = encp->enc_rx_scale_indirection_max_nqueues; + table_nentries_min = encp->enc_rx_scale_tbl_min_nentries; + table_nentries_max = encp->enc_rx_scale_tbl_max_nentries; break; case EFX_RX_SCALE_SHARED: context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_SHARED; + num_queues_max = encp->enc_rx_scale_indirection_max_nqueues; + table_nentries_min = encp->enc_rx_scale_tbl_min_nentries; + table_nentries_max = encp->enc_rx_scale_tbl_max_nentries; + break; + case EFX_RX_SCALE_EVEN_SPREAD: + context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EVEN_SPREADING; + num_queues_max = encp->enc_rx_scale_even_spread_max_nqueues; + table_nentries_min = 0; + table_nentries_max = 0; break; default: + rc = EINVAL; + goto fail1; + } + + if (num_queues == 0 || num_queues > num_queues_max) { + rc = EINVAL; + goto fail2; + } + + if (table_nentries < table_nentries_min || + table_nentries > table_nentries_max || + (table_nentries != 0 && !ISP2(table_nentries))) { rc = EINVAL; goto fail3; } @@ -69,6 +84,9 @@ efx_mcdi_rss_context_alloc( * indirection table offsets. * For shared contexts, the provided context will spread traffic over * NUM_QUEUES many queues. + * For the even spread contexts, the provided context will spread + * traffic over NUM_QUEUES many queues, but that will not involve + * the use of precious indirection table resources in the adapter. */ MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_NUM_QUEUES, num_queues); diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 4523829eb2..854527e0fd 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1495,6 +1495,11 @@ typedef struct efx_nic_cfg_s { uint32_t enc_rx_buf_align_start; uint32_t enc_rx_buf_align_end; #if EFSYS_OPT_RX_SCALE + /* + * The limit on how many queues an RSS context in the even spread + * mode can span. When this mode is not supported, the value is 0. + */ + uint32_t enc_rx_scale_even_spread_max_nqueues; /* * The limit on how many queues an RSS indirection table can address. * @@ -2784,7 +2789,8 @@ typedef enum efx_rx_hash_support_e { typedef enum efx_rx_scale_context_type_e { EFX_RX_SCALE_UNAVAILABLE = 0, /* No RX scale context */ EFX_RX_SCALE_EXCLUSIVE, /* Writable key/indirection table */ - EFX_RX_SCALE_SHARED /* Read-only key/indirection table */ + EFX_RX_SCALE_SHARED, /* Read-only key/indirection table */ + EFX_RX_SCALE_EVEN_SPREAD, /* No indirection table, writable key */ } efx_rx_scale_context_type_t; /* diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c index d10b990259..45dc5d6c6d 100644 --- a/drivers/common/sfc_efx/base/efx_rx.c +++ b/drivers/common/sfc_efx/base/efx_rx.c @@ -504,6 +504,7 @@ efx_rx_scale_context_alloc( __in uint32_t num_queues, __out uint32_t *rss_contextp) { + uint32_t table_nentries = EFX_RSS_TBL_SIZE; const efx_rx_ops_t *erxop = enp->en_erxop; efx_rc_t rc; @@ -515,8 +516,11 @@ efx_rx_scale_context_alloc( goto fail1; } + if (type == EFX_RX_SCALE_EVEN_SPREAD) + table_nentries = 0; + if ((rc = erxop->erxo_scale_context_alloc(enp, type, num_queues, - EFX_RSS_TBL_SIZE, rss_contextp)) != 0) { + table_nentries, rss_contextp)) != 0) { goto fail2; } diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c index 5f6d298d3f..939551dbf5 100644 --- a/drivers/common/sfc_efx/base/siena_nic.c +++ b/drivers/common/sfc_efx/base/siena_nic.c @@ -121,6 +121,9 @@ siena_board_cfg( #if EFSYS_OPT_RX_SCALE encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS; + /* There is no support for the even spread contexts. */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; + /* There is one RSS context per function */ encp->enc_rx_scale_max_exclusive_contexts = 1; -- 2.30.2