Author: sbruno
Date: Thu Jul 27 23:01:07 2017
New Revision: 321631
URL: https://svnweb.freebsd.org/changeset/base/321631

Log:
  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.bowl...@kev009.com>
  Reviewed by:  erj
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D11724

Modified:
  head/sys/dev/ixl/ixl_txrx.c

Modified: head/sys/dev/ixl/ixl_txrx.c
==============================================================================
--- head/sys/dev/ixl/ixl_txrx.c Thu Jul 27 22:53:47 2017        (r321630)
+++ head/sys/dev/ixl/ixl_txrx.c Thu Jul 27 23:01:07 2017        (r321631)
@@ -1400,9 +1400,7 @@ ixl_rx_input(struct rx_ring *rxr, struct ifnet *ifp, s
                                 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);
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to