svn commit: r230582 - user/luigi/netmap/sys/dev/netmap
Luigi Rizzo
luigi at FreeBSD.org
Thu Jan 26 11:15:12 UTC 2012
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
More information about the svn-src-user
mailing list