svn commit: r280965 - projects/em_mq/sys/dev/e1000
Sean Bruno
sbruno at FreeBSD.org
Wed Apr 1 19:36:56 UTC 2015
Author: sbruno
Date: Wed Apr 1 19:36:54 2015
New Revision: 280965
URL: https://svnweb.freebsd.org/changeset/base/280965
Log:
Always enqueue work first. If unable to acquire a TXLOCK for this work,
schedule a task to come back and do it later.
Stolen from igb(4)
Modified:
projects/em_mq/sys/dev/e1000/if_em.c
Modified: projects/em_mq/sys/dev/e1000/if_em.c
==============================================================================
--- projects/em_mq/sys/dev/e1000/if_em.c Wed Apr 1 18:57:51 2015 (r280964)
+++ projects/em_mq/sys/dev/e1000/if_em.c Wed Apr 1 19:36:54 2015 (r280965)
@@ -1002,11 +1002,15 @@ em_mq_start(if_t ifp, struct mbuf *m)
txr = &adapter->tx_rings[i];
+ error = drbr_enqueue(ifp, txr->br, m);
+ if (error)
+ return (error);
+
if (EM_TX_TRYLOCK(txr)) {
error = em_mq_start_locked(ifp, txr, m);
EM_TX_UNLOCK(txr);
} else
- error = drbr_enqueue(ifp, txr->br, m);
+ taskqueue_enqueue(txr->tq, &txr->tx_task);
return (error);
}
@@ -1027,13 +1031,6 @@ em_mq_start_locked(if_t ifp, struct tx_r
return (err);
}
- enq = 0;
- if (m != NULL) {
- err = drbr_enqueue(ifp, txr->br, m);
- if (err)
- return (err);
- }
-
/* Process the queue */
while ((next = drbr_peek(ifp, txr->br)) != NULL) {
if ((err = em_xmit(txr, &next)) != 0) {
More information about the svn-src-projects
mailing list