svn commit: r310627 - head/sys/dev/sfxge

Andrew Rybchenko arybchik at FreeBSD.org
Tue Dec 27 08:51:28 UTC 2016


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


More information about the svn-src-head mailing list