Date: Mon, 01 Jul 2002 13:34:19 +0200 From: Andre Oppermann <oppermann@pipeline.ch> To: Luigi Rizzo <rizzo@icir.org> Cc: net@freebsd.org Subject: Re: Should we keep a cache of mbuf+cluster ready for use ? Message-ID: <3D203E3B.F8F91B9B@pipeline.ch> References: <20020629145303.A75543@iguana.icir.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Luigi Rizzo wrote:
>
> Hi,
> during some experiments i was doing recently, i noticed that there
> is a significant improvement in the forwarding speed (especially
> at very high speeds) if we keep a small pool of mbuf+cluster
> ready for use. This is because most network drivers do something
> like this
>
> MGETHDR(m_new, M_DONTWAIT, MT_DATA);
> if (m_new == NULL)
> return(ENOBUFS);
>
> MCLGET(m_new, M_DONTWAIT);
> if (!(m_new->m_flags & M_EXT)) {
> m_freem(m_new);
> return(ENOBUFS);
> }
>
> when replenishing the receive buffers, and both macros are quite
> long even if there are available blocks in the free lists. We can
> store buffers of this form when/if they are released with some code
> like this:
>
> if (my_pool_count < my_pool_max && m->m_next == NULL &&
> (m->m_flags & M_EXT) && M_EXT_WRITABLE(m) ) {
> m->m_nextpkt = my_pool;
> m->m_data = ->m_ext.ext_buf;
> m->m_len = m->m_pkthdr.len = MCLBYTES;
> my_pool = m;
> my_pool_now++;
> } else {
> ... rest of m_freem() ...
> }
>
> and save a lot of overhead (we just need to reset m_data and
> m_len and m_pkthdr.len) when someone wants to allocate them.
>
> Is there interest in committing some code like this to
> mbuf.h and maybe uipc_mbuf*.c ?
Sounds good to me.
--
Andre
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D203E3B.F8F91B9B>
