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
This commit is contained in:
Sean Bruno 2017-07-27 23:01:07 +00:00
parent 9d35858f48
commit b7e0bde0af
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=321631

View File

@ -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 @@ ixl_rxeof(struct ixl_queue *que, int count)
/* 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 @@ ixl_rxeof(struct ixl_queue *que, int count)
rxr->next_check = i;
IXL_RX_UNLOCK(rxr);
#if defined(INET6) || defined(INET)
/*
* Flush any outstanding LRO work
@ -1762,7 +1764,6 @@ ixl_rxeof(struct ixl_queue *que, int count)
#endif
#endif /* defined(INET6) || defined(INET) */
IXL_RX_UNLOCK(rxr);
return (FALSE);
}