From owner-freebsd-net Sat Jun 29 14:53: 8 2002 Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 31A0537B400; Sat, 29 Jun 2002 14:53:04 -0700 (PDT) Received: from iguana.icir.org (iguana.icir.org [192.150.187.36]) by mx1.FreeBSD.org (Postfix) with ESMTP id DA9B143E06; Sat, 29 Jun 2002 14:53:03 -0700 (PDT) (envelope-from rizzo@iguana.icir.org) Received: (from rizzo@localhost) by iguana.icir.org (8.11.6/8.11.3) id g5TLr3U75658; Sat, 29 Jun 2002 14:53:03 -0700 (PDT) (envelope-from rizzo) Date: Sat, 29 Jun 2002 14:53:03 -0700 From: Luigi Rizzo To: net@freebsd.org Subject: Should we keep a cache of mbuf+cluster ready for use ? Message-ID: <20020629145303.A75543@iguana.icir.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org 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 ? cheers luigi To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message