aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack F Vogel <jfv@FreeBSD.org>2013-08-13 00:25:39 +0000
committerJack F Vogel <jfv@FreeBSD.org>2013-08-13 00:25:39 +0000
commit83cef45266a49c82dcbb3a44c2321570d628778b (patch)
treed5292fb5851302d75a27a5122c9f20c1fa608103
parentc68534f1d5bab4ad466384c4fb9bb2956811e8b9 (diff)
downloadsrc-83cef45266a49c82dcbb3a44c2321570d628778b.tar.gz
src-83cef45266a49c82dcbb3a44c2321570d628778b.zip
Alter the mq_start routine to do a TRYLOCK and call to the locked routine
rather than just queueing. The former code was an attempt at getting UDP performance up, but there have been customer reports of problems with it, so the ixgbe approach seems the best solution for now.
Notes
Notes: svn path=/head/; revision=254264
-rw-r--r--sys/dev/e1000/if_igb.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index 65f4205af6cb..6887bcf35533 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -972,7 +972,13 @@ igb_mq_start(struct ifnet *ifp, struct mbuf *m)
que = &adapter->queues[i];
err = drbr_enqueue(ifp, txr->br, m);
- taskqueue_enqueue(que->tq, &txr->txq_task);
+ if (err)
+ return (err);
+ if (IGB_TX_TRYLOCK(txr)) {
+ err = igb_mq_start_locked(ifp, txr);
+ IGB_TX_UNLOCK(txr);
+ } else
+ taskqueue_enqueue(que->tq, &txr->txq_task);
return (err);
}