aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ixl/ixl_txrx.c
diff options
context:
space:
mode:
authorSean Bruno <sbruno@FreeBSD.org>2017-07-27 23:01:07 +0000
committerSean Bruno <sbruno@FreeBSD.org>2017-07-27 23:01:07 +0000
commitb7e0bde0af3b19e9fa0d3f0da4703467e8b2785a (patch)
tree90b74f8933f5f4cc7b5db539c24c28341e8c7cf5 /sys/dev/ixl/ixl_txrx.c
parent9d35858f4860040a969b10342c9d85e1e6c24d02 (diff)
downloadsrc-b7e0bde0af3b19e9fa0d3f0da4703467e8b2785a.tar.gz
src-b7e0bde0af3b19e9fa0d3f0da4703467e8b2785a.zip
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 <kevin.bowling@kev009.com> Reviewed by: erj Sponsored by: Limelight Networks Differential Revision: https://reviews.freebsd.org/D11724
Notes
Notes: svn path=/head/; revision=321631
Diffstat (limited to 'sys/dev/ixl/ixl_txrx.c')
-rw-r--r--sys/dev/ixl/ixl_txrx.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/dev/ixl/ixl_txrx.c b/sys/dev/ixl/ixl_txrx.c
index fb97cd463fe0..7872d0a4b925 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);
}