]> git.droids-corp.org - dpdk.git/commitdiff
common/sfc_efx/base: support even spread RSS mode
authorIvan Malov <ivan.malov@oktetlabs.ru>
Tue, 1 Feb 2022 08:50:01 +0000 (11:50 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 2 Feb 2022 17:37:31 +0000 (18:37 +0100)
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 <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/base/ef10_nic.c
drivers/common/sfc_efx/base/ef10_rx.c
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_rx.c
drivers/common/sfc_efx/base/siena_nic.c

index cca31bc725c3eb91046a4e3be9967292cd29e071..aa667309ab730da5b2e461e3416e770832238cbd 100644 (file)
@@ -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 */
 
index 78af7300a0db08d64a7dde44cf3db1de4a3c118f..afc9cf025f9dbc5643b9801633c9c59dc2f9de2b 100644 (file)
@@ -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);
 
index 4523829eb264704346fbb4150a8f5e70357058fa..854527e0fd1c04cfdec50f6c4f57851bd263ce28 100644 (file)
@@ -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;
 
 /*
index d10b99025911a70785a91188f02d6f6697fc1a1f..45dc5d6c6dd54516c66410d91de73971376be614 100644 (file)
@@ -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;
        }
 
index 5f6d298d3f820b74d1040281ec8b00fbf3a033fe..939551dbf55bd407d834899d48bb55d673a34d28 100644 (file)
@@ -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;