From b7e0bde0af3b19e9fa0d3f0da4703467e8b2785a Mon Sep 17 00:00:00 2001 From: Sean Bruno Date: Thu, 27 Jul 2017 23:01:07 +0000 Subject: [PATCH] Drop IXL RX lock during TCP_LRO, fixes LOR mahem while holding the RX queue lock when the uppoer stack is called inside TCP_LRO Submitted by: Kevin Bowling Reviewed by: erj Sponsored by: Limelight Networks Differential Revision: https://reviews.freebsd.org/D11724 --- sys/dev/ixl/ixl_txrx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/dev/ixl/ixl_txrx.c b/sys/dev/ixl/ixl_txrx.c index fb97cd463fe..7872d0a4b92 100644 --- a/sys/dev/ixl/ixl_txrx.c +++ b/sys/dev/ixl/ixl_txrx.c @@ -1400,9 +1400,7 @@ ixl_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u8 ptype) return; } #endif - IXL_RX_UNLOCK(rxr); (*ifp->if_input)(ifp, m); - IXL_RX_LOCK(rxr); } @@ -1730,7 +1728,9 @@ next_desc: /* Now send to the stack or do LRO */ if (sendmp != NULL) { rxr->next_check = i; + IXL_RX_UNLOCK(rxr); ixl_rx_input(rxr, ifp, sendmp, ptype); + IXL_RX_LOCK(rxr); i = rxr->next_check; } @@ -1747,6 +1747,8 @@ next_desc: rxr->next_check = i; + IXL_RX_UNLOCK(rxr); + #if defined(INET6) || defined(INET) /* * Flush any outstanding LRO work @@ -1762,7 +1764,6 @@ next_desc: #endif #endif /* defined(INET6) || defined(INET) */ - IXL_RX_UNLOCK(rxr); return (FALSE); }