svn commit: r239109 - in head: share/man/man4 sys/dev/e1000
Jack F Vogel
jfv at FreeBSD.org
Mon Aug 6 22:43:50 UTC 2012
Author: jfv
Date: Mon Aug 6 22:43:49 2012
New Revision: 239109
URL: http://svn.freebsd.org/changeset/base/239109
Log:
Make the polling interface in igb able to handle
multiqueue, and correct the rxdone handling. Update
the polling man page to include igb as well.
Thanks to Mark Johnston for these changes.
Modified:
head/share/man/man4/polling.4
head/sys/dev/e1000/if_igb.c
Modified: head/share/man/man4/polling.4
==============================================================================
--- head/share/man/man4/polling.4 Mon Aug 6 21:33:11 2012 (r239108)
+++ head/share/man/man4/polling.4 Mon Aug 6 22:43:49 2012 (r239109)
@@ -184,6 +184,7 @@ As of this writing, the
.Xr fwe 4 ,
.Xr fwip 4 ,
.Xr fxp 4 ,
+.Xr igb 4 ,
.Xr ixgb 4 ,
.Xr nfe 4 ,
.Xr nge 4 ,
Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c Mon Aug 6 21:33:11 2012 (r239108)
+++ head/sys/dev/e1000/if_igb.c Mon Aug 6 22:43:49 2012 (r239109)
@@ -1502,12 +1502,6 @@ igb_irq_fast(void *arg)
}
#ifdef DEVICE_POLLING
-/*********************************************************************
- *
- * Legacy polling routine : if using this code you MUST be sure that
- * multiqueue is not defined, ie, set igb_num_queues to 1.
- *
- *********************************************************************/
#if __FreeBSD_version >= 800000
#define POLL_RETURN_COUNT(a) (a)
static int
@@ -1518,8 +1512,8 @@ static void
igb_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
{
struct adapter *adapter = ifp->if_softc;
- struct igb_queue *que = adapter->queues;
- struct tx_ring *txr = adapter->tx_rings;
+ struct igb_queue *que;
+ struct tx_ring *txr;
u32 reg_icr, rx_done = 0;
u32 loop = IGB_MAX_LOOP;
bool more;
@@ -1541,20 +1535,26 @@ igb_poll(struct ifnet *ifp, enum poll_cm
}
IGB_CORE_UNLOCK(adapter);
- igb_rxeof(que, count, &rx_done);
+ for (int i = 0; i < adapter->num_queues; i++) {
+ que = &adapter->queues[i];
+ txr = que->txr;
- IGB_TX_LOCK(txr);
- do {
- more = igb_txeof(txr);
- } while (loop-- && more);
+ igb_rxeof(que, count, &rx_done);
+
+ IGB_TX_LOCK(txr);
+ do {
+ more = igb_txeof(txr);
+ } while (loop-- && more);
#if __FreeBSD_version >= 800000
- if (!drbr_empty(ifp, txr->br))
- igb_mq_start_locked(ifp, txr, NULL);
+ if (!drbr_empty(ifp, txr->br))
+ igb_mq_start_locked(ifp, txr, NULL);
#else
- if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
- igb_start_locked(txr, ifp);
+ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ igb_start_locked(txr, ifp);
#endif
- IGB_TX_UNLOCK(txr);
+ IGB_TX_UNLOCK(txr);
+ }
+
return POLL_RETURN_COUNT(rx_done);
}
#endif /* DEVICE_POLLING */
@@ -4901,7 +4901,7 @@ next_desc:
}
if (done != NULL)
- *done = rxdone;
+ *done += rxdone;
IGB_RX_UNLOCK(rxr);
return ((staterr & E1000_RXD_STAT_DD) ? TRUE : FALSE);
More information about the svn-src-head
mailing list