svn commit: r258328 - head/sys/net

Adrian Chadd adrian at freebsd.org
Wed Nov 20 22:02:28 UTC 2013


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..)



-adrian


On 18 November 2013 14:58, George V. Neville-Neil <gnn at 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;
> +       }
>  }
>
>  /*


More information about the svn-src-all mailing list