Module Name:    src
Committed By:   msaitoh
Date:           Mon Dec  4 09:29:42 UTC 2017

Modified Files:
        src/sys/dev/pci/ixgbe: ix_txrx.c

Log Message:
- Fixes two problem:
  1) RX may accesses freed area.
  2) if_init() takes long time on many core machine.
  Call ixgbe_jcl_reinit() not in ixgbe_setup_receive_ring() but in the
  biginning of ixgbe_setup_receive_structures(). It was OK for pre multiqueue,
  but it's not OK now because we support multiqueue.
- Fix comment of ixgbe_free_receive_ring().


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/pci/ixgbe/ix_txrx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/ixgbe/ix_txrx.c
diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.29 src/sys/dev/pci/ixgbe/ix_txrx.c:1.30
--- src/sys/dev/pci/ixgbe/ix_txrx.c:1.29	Tue Sep 26 07:42:06 2017
+++ src/sys/dev/pci/ixgbe/ix_txrx.c	Mon Dec  4 09:29:42 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: ix_txrx.c,v 1.29 2017/09/26 07:42:06 knakahara Exp $ */
+/* $NetBSD: ix_txrx.c,v 1.30 2017/12/04 09:29:42 msaitoh Exp $ */
 
 /******************************************************************************
 
@@ -1355,9 +1355,7 @@ fail:
 } /* ixgbe_allocate_receive_buffers */
 
 /************************************************************************
- * ixgbe_setup_receive_ring
- *
- *   Initialize a receive ring and its buffers.
+ * ixgbe_free_receive_ring
  ************************************************************************/
 static void
 ixgbe_free_receive_ring(struct rx_ring *rxr)
@@ -1409,17 +1407,6 @@ ixgbe_setup_receive_ring(struct rx_ring 
 	/* Free current RX buffer structs and their mbufs */
 	ixgbe_free_receive_ring(rxr);
 
-	IXGBE_RX_UNLOCK(rxr);
-
-	/* Now reinitialize our supply of jumbo mbufs.  The number
-	 * or size of jumbo mbufs may have changed.
-	 */
-	ixgbe_jcl_reinit(&adapter->jcl_head, rxr->ptag->dt_dmat,
-	    (2 * adapter->num_rx_desc) * adapter->num_queues,
-	    adapter->rx_mbuf_sz);
-
-	IXGBE_RX_LOCK(rxr);
-
 	/* Now replenish the mbufs */
 	for (int j = 0; j != rxr->num_desc; ++j) {
 		struct mbuf *mp;
@@ -1526,6 +1513,15 @@ ixgbe_setup_receive_structures(struct ad
 	struct rx_ring *rxr = adapter->rx_rings;
 	int            j;
 
+	/*
+	 * Now reinitialize our supply of jumbo mbufs.  The number
+	 * or size of jumbo mbufs may have changed.
+	 * Assume all of rxr->ptag are the same.
+	 */
+	ixgbe_jcl_reinit(&adapter->jcl_head, rxr->ptag->dt_dmat,
+	    (2 * adapter->num_rx_desc) * adapter->num_queues,
+	    adapter->rx_mbuf_sz);
+
 	for (j = 0; j < adapter->num_queues; j++, rxr++)
 		if (ixgbe_setup_receive_ring(rxr))
 			goto fail;

Reply via email to