Date: Wed, 20 Nov 2013 17:27:15 -0800 From: Julian Elischer <julian@freebsd.org> To: Adrian Chadd <adrian@freebsd.org>, "George V. Neville-Neil" <gnn@freebsd.org>, "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>, FreeBSD Net <freebsd-net@freebsd.org> Cc: "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org> Subject: Re: svn commit: r258328 - head/sys/net Message-ID: <528D6173.4080406@freebsd.org> In-Reply-To: <CAJ-VmomjQrq39jafTTGQA_EJLSi5j%2BNB=g1sLwCK-KaEfgwrbw@mail.gmail.com> References: <201311182258.rAIMwEFd048783@svn.freebsd.org> <CAJ-VmomjQrq39jafTTGQA_EJLSi5j%2BNB=g1sLwCK-KaEfgwrbw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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 <gnn@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; >> + } >> } >> >> /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?528D6173.4080406>