svn commit: r321476 - head/sys/dev/ixgbe

Sean Bruno sbruno at FreeBSD.org
Tue Jul 25 14:38:31 UTC 2017


Author: sbruno
Date: Tue Jul 25 14:38:30 2017
New Revision: 321476
URL: https://svnweb.freebsd.org/changeset/base/321476

Log:
  Drop ixgbe RX lock during TCP_LRO processing.  This eliminates a "storm"
  of LOR detection and a bit of lock release/acquire collision when using LRO.
  
  Submitted by:   Kevin Bowling <kevin.bowling at kev009.com>
  MFC after:      2 days
  Differential Revision:  https://reviews.freebsd.org/D11712

Modified:
  head/sys/dev/ixgbe/ix_txrx.c

Modified: head/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- head/sys/dev/ixgbe/ix_txrx.c	Tue Jul 25 14:35:44 2017	(r321475)
+++ head/sys/dev/ixgbe/ix_txrx.c	Tue Jul 25 14:38:30 2017	(r321476)
@@ -1593,9 +1593,7 @@ ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp,
 			if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
 				return;
 	}
-	IXGBE_RX_UNLOCK(rxr);
 	(*ifp->if_input)(ifp, m);
-	IXGBE_RX_LOCK(rxr);
 } /* ixgbe_rx_input */
 
 /************************************************************************
@@ -1880,7 +1878,9 @@ next_desc:
 		/* Now send to the stack or do LRO */
 		if (sendmp != NULL) {
 			rxr->next_to_check = i;
+			IXGBE_RX_UNLOCK(rxr);
 			ixgbe_rx_input(rxr, ifp, sendmp, ptype);
+			IXGBE_RX_LOCK(rxr);
 			i = rxr->next_to_check;
 		}
 
@@ -1897,12 +1897,12 @@ next_desc:
 
 	rxr->next_to_check = i;
 
+	IXGBE_RX_UNLOCK(rxr);
+
 	/*
 	 * Flush any outstanding LRO work
 	 */
 	tcp_lro_flush_all(lro);
-
-	IXGBE_RX_UNLOCK(rxr);
 
 	/*
 	 * Still have cleaning to do?


More information about the svn-src-all mailing list