Date: Sat, 23 Nov 2013 10:57:31 +0000 (GMT) From: Robert Watson <rwatson@FreeBSD.org> To: Julian Elischer <julian@freebsd.org> Cc: Adrian Chadd <adrian@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>, FreeBSD Net <freebsd-net@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "George V. Neville-Neil" <gnn@freebsd.org>, "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org> Subject: Re: svn commit: r258328 - head/sys/net Message-ID: <alpine.BSF.2.00.1311231056110.6980@fledge.watson.org> In-Reply-To: <528D6173.4080406@freebsd.org> References: <201311182258.rAIMwEFd048783@svn.freebsd.org> <CAJ-VmomjQrq39jafTTGQA_EJLSi5j%2BNB=g1sLwCK-KaEfgwrbw@mail.gmail.com> <528D6173.4080406@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 20 Nov 2013, Julian Elischer wrote: >> 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. To me, the name "multi" is ambiguous: could be multicast. If we call the new datastructure "mbqueue" or "mqueue", then we should name the method ether_input_mbqueue or ether_input_mqueue. Robert > >> >> >> >> -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?alpine.BSF.2.00.1311231056110.6980>