On 19.11.2013 02:58, George V. Neville-Neil wrote:
Author: gnn
Date: Mon Nov 18 22:58:14 2013
New Revision: 258328
URL: http://svnweb.freebsd.org/changeset/base/258328
Log:
Allow ethernet drivers to pass in packets connected via the nextpkt pointer.
Handling packets in this way allows drivers to amortize work during packet
reception.
Great! First, but important step in kernel batching :)
Submitted by: Vijay Singh
Sponsored by: NetApp
Modified:
head/sys/net/if_ethersubr.c
Modified: head/sys/net/if_ethersubr.c
==============================================================================
--- head/sys/net/if_ethersubr.c Mon Nov 18 22:55:50 2013 (r258327)
+++ head/sys/net/if_ethersubr.c Mon Nov 18 22:58:14 2013 (r258328)
@@ -708,13 +708,25 @@ static void
ether_input(struct ifnet *ifp, struct mbuf *m)
{
+ struct mbuf *mn;
+
/*
- * We will rely on rcvif being set properly in the deferred context,
- * so assert it is correct here.
+ * The drivers are allowed to pass in a chain of packets linked with
+ * m_nextpkt. We split them up into separate packets here and pass
+ * them up. This allows the drivers to amortize the receive lock.
*/
- KASSERT(m->m_pkthdr.rcvif == ifp, ("%s: ifnet mismatch", __func__));
+ while (m) {
+ mn = m->m_nextpkt;
+ m->m_nextpkt = NULL;
- netisr_dispatch(NETISR_ETHER, m);
+ /*
+ * We will rely on rcvif being set properly in the deferred
context,
+ * so assert it is correct here.
+ */
+ KASSERT(m->m_pkthdr.rcvif == ifp, ("%s: ifnet mismatch",
__func__));
+ netisr_dispatch(NETISR_ETHER, m);
+ m = mn;
+ }
}
/*
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"