Author: arybchik
Date: Tue Dec 27 08:51:26 2016
New Revision: 310627
URL: https://svnweb.freebsd.org/changeset/base/310627

Log:
  sfxge(4): do not limit driver RSS table to RSS channels max
  
  Specification of entire RSS table in the driver allows to spread traffic
  more equally across CPUs/RSS channels if number of RSS channels is not
  power of 2.
  
  Reviewed by:    philip
  Sponsored by:   Solarflare Communications, Inc.
  MFC after:      2 days
  Differential Revision: https://reviews.freebsd.org/D8910

Modified:
  head/sys/dev/sfxge/sfxge.h
  head/sys/dev/sfxge/sfxge_rx.c
  head/sys/dev/sfxge/sfxge_tx.c

Modified: head/sys/dev/sfxge/sfxge.h
==============================================================================
--- head/sys/dev/sfxge/sfxge.h  Tue Dec 27 08:32:54 2016        (r310626)
+++ head/sys/dev/sfxge/sfxge.h  Tue Dec 27 08:51:26 2016        (r310627)
@@ -301,7 +301,7 @@ struct sfxge_softc {
        unsigned int                    max_rss_channels;
        uma_zone_t                      rxq_cache;
        struct sfxge_rxq                *rxq[SFXGE_RX_SCALE_MAX];
-       unsigned int                    rx_indir_table[SFXGE_RX_SCALE_MAX];
+       unsigned int                    rx_indir_table[EFX_RSS_TBL_SIZE];
 
        struct sfxge_txq                *txq[SFXGE_TXQ_NTYPES + 
SFXGE_RX_SCALE_MAX];
 

Modified: head/sys/dev/sfxge/sfxge_rx.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_rx.c       Tue Dec 27 08:32:54 2016        
(r310626)
+++ head/sys/dev/sfxge/sfxge_rx.c       Tue Dec 27 08:51:26 2016        
(r310627)
@@ -1128,7 +1128,7 @@ sfxge_rx_start(struct sfxge_softc *sc)
        /*
         * Set up the scale table.  Enable all hash types and hash insertion.
         */
-       for (index = 0; index < SFXGE_RX_SCALE_MAX; index++)
+       for (index = 0; index < nitems(sc->rx_indir_table); index++)
 #ifdef RSS
                sc->rx_indir_table[index] =
                        rss_get_indirection_to_bucket(index) % sc->rxq_count;
@@ -1136,7 +1136,7 @@ sfxge_rx_start(struct sfxge_softc *sc)
                sc->rx_indir_table[index] = index % sc->rxq_count;
 #endif
        if ((rc = efx_rx_scale_tbl_set(sc->enp, sc->rx_indir_table,
-                                      SFXGE_RX_SCALE_MAX)) != 0)
+                                      nitems(sc->rx_indir_table))) != 0)
                goto fail;
        (void)efx_rx_scale_mode_set(sc->enp, EFX_RX_HASHALG_TOEPLITZ,
            (1 << EFX_RX_HASH_IPV4) | (1 << EFX_RX_HASH_TCPIPV4) |

Modified: head/sys/dev/sfxge/sfxge_tx.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_tx.c       Tue Dec 27 08:32:54 2016        
(r310626)
+++ head/sys/dev/sfxge/sfxge_tx.c       Tue Dec 27 08:51:26 2016        
(r310627)
@@ -838,8 +838,9 @@ sfxge_if_transmit(struct ifnet *ifp, str
                /* check if flowid is set */
                if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
                        uint32_t hash = m->m_pkthdr.flowid;
+                       uint32_t idx = hash % nitems(sc->rx_indir_table);
 
-                       index = sc->rx_indir_table[hash % SFXGE_RX_SCALE_MAX];
+                       index = sc->rx_indir_table[idx];
                }
 #endif
 #if SFXGE_TX_PARSE_EARLY
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to