On 11/20/13, 2:02 PM, Adrian Chadd wrote:
Can we revert this and just quickly put together something else that
won't potentially come back to bite us with weird side effects?
My suggestions (and I'm happy to do this work if needed):
* create a lightweight mbuf queue representation so an mbuf list isn't
just the mbuf header pointer;
* create a new ether input (say, ether_input_multi) that takes an mbuf
list, so existing driver code does the right thing.
After that it'd be nice to write a set of mbuf list macros for
abstract the whole queue, dequeue, concat, iterate, etc (like
sys/queue.h, but for mbufs.)
What do people think?
(I've been doing it for m->next chained things, but not m->m_nextpkt things..)
I was thinking:
new interfaces.. (your -multi names sound good).
macros for handling said lists so that people don't screw them up
Old drivers run with no change.
-adrian
On 18 November 2013 14:58, George V. Neville-Neil <g...@freebsd.org> 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.
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-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"