Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Jan 2012 11:15:12 +0000 (UTC)
From:      Luigi Rizzo <luigi@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r230582 - user/luigi/netmap/sys/dev/netmap
Message-ID:  <201201261115.q0QBFCVa084114@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: luigi
Date: Thu Jan 26 11:15:12 2012
New Revision: 230582
URL: http://svn.freebsd.org/changeset/base/230582

Log:
  sync with HEAD

Modified:
  user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h
  user/luigi/netmap/sys/dev/netmap/netmap.c
  user/luigi/netmap/sys/dev/netmap/netmap_kern.h

Modified: user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h
==============================================================================
--- user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h	Thu Jan 26 11:08:55 2012	(r230581)
+++ user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h	Thu Jan 26 11:15:12 2012	(r230582)
@@ -192,9 +192,9 @@ fail:
  *
  * ring->avail is never used, only checked for bogus values.
  *
- * If do_lock is set, it means the function has been called from the ioctl
- * handler: in this particular case, do_lock has also the special meaning of
- * force the update of NIC registers
+ * do_lock is set iff the function is called from the ioctl handler.
+ * In this case, grab a lock around the body, and also reclaim transmitted
+ * buffers irrespective of interrupt mitigation.
  */
 static int
 ixgbe_netmap_txsync(void *a, u_int ring_nr, int do_lock)
@@ -300,7 +300,7 @@ ring_reset:
 			curr->read.cmd_type_len =
 			    htole32(txr->txd_cmd | len |
 				(IXGBE_ADVTXD_DTYP_DATA |
-				    IXGBE_ADVTXD_DCMD_DEXT | // XXX
+				    IXGBE_ADVTXD_DCMD_DEXT |
 				    IXGBE_ADVTXD_DCMD_IFCS |
 				    IXGBE_TXD_CMD_EOP | flags) );
 			/* If the buffer has changed, unload and reload map
@@ -333,32 +333,36 @@ ring_reset:
 	}
 
 	/*
-	 * If no packets are sent, or there is no room in the tx ring,
-	 * Check whether there are completed transmissions.
-	 * Because this is expensive (we need a register etc.)
-	 * we only do it if absolutely necessary, i.e. there is no room
-	 * in the tx ring, or where were no completed transmissions
-	 * (meaning that probably the caller really wanted to check
-	 * for completed transmissions).
+	 * Reclaim buffers for completed transmissions.
+	 * Because this is expensive (we read a NIC register etc.)
+	 * we only do it in specific cases (see below).
+	 * In all cases kring->nr_kflags indicates which slot will be
+	 * checked upon a tx interrupt (nkr_num_slots means none).
 	 */
 	if (do_lock) {
-		kring->nr_kflags = kring->nkr_num_slots; // filter interrupts
-		j = 1; // force read
-	} else if (kring->nr_hwavail > 0) { // no need to block
-		kring->nr_kflags = kring->nkr_num_slots; // filter interrupts
-		j = 0;
+		j = 1; /* forced reclaim, ignore interrupts */
+		kring->nr_kflags = kring->nkr_num_slots;
+	} else if (kring->nr_hwavail > 0) {
+		j = 0; /* buffers still available: no reclaim, ignore intr. */
+		kring->nr_kflags = kring->nkr_num_slots;
 	} else {
+		/*
+		 * no buffers available, locate a slot for which we request
+		 * ReportStatus (approximately half ring after next_to_clean)
+		 * and record it in kring->nr_kflags.
+		 * If the slot has DD set, do the reclaim looking at TDH,
+		 * otherwise we go to sleep (in netmap_poll()) and will be
+		 * woken up when slot nr_kflags will be ready.
+		 */
 		struct ixgbe_legacy_tx_desc *txd = (struct ixgbe_legacy_tx_desc *)txr->tx_base;
 
-		// wake me up every half ring (more or less)
 		j = txr->next_to_clean + kring->nkr_num_slots/2;
 		if (j >= kring->nkr_num_slots)
 			j -= kring->nkr_num_slots;
 		// round to the closest with dd set
 		j= (j < kring->nkr_num_slots / 4 || j >= kring->nkr_num_slots*3/4) ?
 			0 : report_frequency;
-		kring->nr_kflags = j; // remember where to look at in the interrupt
-		// now check if we have data ready
+		kring->nr_kflags = j; /* the slot to check */
 		j = txd[j].upper.fields.status & IXGBE_TXD_STAT_DD;
 	}
 	if (!j) {
@@ -389,7 +393,6 @@ ring_reset:
 			/* some tx completed, increment avail */
 			if (delta < 0)
 				delta += kring->nkr_num_slots;
-			netmap_delta[ring_nr] = (netmap_delta[ring_nr] * 15 + delta)/16;
 			txr->next_to_clean = l;
 			kring->nr_hwavail += delta;
 			if (kring->nr_hwavail > lim)
@@ -475,7 +478,6 @@ ixgbe_netmap_rxsync(void *a, u_int ring_
 
 		if ((staterr & IXGBE_RXD_STAT_DD) == 0)
 			break;
-		// XXX add -4 if crcstrip
 		ring->slot[j].len = le16toh(curr->wb.upper.length);
 		bus_dmamap_sync(rxr->ptag,
 			rxr->rx_buffers[l].pmap, BUS_DMASYNC_POSTREAD);

Modified: user/luigi/netmap/sys/dev/netmap/netmap.c
==============================================================================
--- user/luigi/netmap/sys/dev/netmap/netmap.c	Thu Jan 26 11:08:55 2012	(r230581)
+++ user/luigi/netmap/sys/dev/netmap/netmap.c	Thu Jan 26 11:15:12 2012	(r230582)
@@ -152,11 +152,6 @@ int netmap_skip_txsync;
 SYSCTL_INT(_dev_netmap, OID_AUTO, skip_txsync, CTLFLAG_RW, &netmap_skip_txsync, 0, "");
 int netmap_skip_rxsync;
 SYSCTL_INT(_dev_netmap, OID_AUTO, skip_rxsync, CTLFLAG_RW, &netmap_skip_rxsync, 0, "");
-int netmap_delta[8];
-SYSCTL_INT(_dev_netmap, OID_AUTO, delta0, CTLFLAG_RW, &netmap_delta[0], 0, "");
-SYSCTL_INT(_dev_netmap, OID_AUTO, delta1, CTLFLAG_RW, &netmap_delta[1], 0, "");
-SYSCTL_INT(_dev_netmap, OID_AUTO, delta2, CTLFLAG_RW, &netmap_delta[2], 0, "");
-SYSCTL_INT(_dev_netmap, OID_AUTO, delta3, CTLFLAG_RW, &netmap_delta[3], 0, "");
 
 /*
  * Allocate n buffers from the ring, and fill the slot.

Modified: user/luigi/netmap/sys/dev/netmap/netmap_kern.h
==============================================================================
--- user/luigi/netmap/sys/dev/netmap/netmap_kern.h	Thu Jan 26 11:08:55 2012	(r230581)
+++ user/luigi/netmap/sys/dev/netmap/netmap_kern.h	Thu Jan 26 11:15:12 2012	(r230582)
@@ -174,7 +174,6 @@ int netmap_ring_reinit(struct netmap_kri
 
 extern int netmap_mitigate;
 extern int netmap_skip_txsync, netmap_skip_rxsync;
-extern int netmap_delta[8];
 extern u_int netmap_total_buffers;
 extern char *netmap_buffer_base;
 extern int netmap_verbose;	// XXX debugging



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201261115.q0QBFCVa084114>