From e0ef5a73069bf8d8ab053e8e780e99b470d227a6 Mon Sep 17 00:00:00 2001 From: Sean Bruno Date: Tue, 25 Jul 2017 14:38:30 +0000 Subject: [PATCH] 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 MFC after: 2 days Differential Revision: https://reviews.freebsd.org/D11712 --- sys/dev/ixgbe/ix_txrx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/dev/ixgbe/ix_txrx.c b/sys/dev/ixgbe/ix_txrx.c index 0597493a7ca..c634afb62e3 100644 --- a/sys/dev/ixgbe/ix_txrx.c +++ b/sys/dev/ixgbe/ix_txrx.c @@ -1593,9 +1593,7 @@ ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, 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,13 +1897,13 @@ 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? */