Hiten Pandya (Tue, Mar 04, 2003 at 07:01:15PM -0500) wrote: > Petri Helenius (Wed, Mar 05, 2003 at 01:42:05AM +0200) wrote: > > > > > > This does look odd... maybe there's a leak somewhere... does "in use" > > > go back down to a much lower number eventually? What kind of test are > > > you running? "in pool" means that that's the number in the cache > > > while "in use" means that that's the number out of the cache > > > currently being used by the system; but if you're telling me that > > > there's no way usage could be that high while you ran the netstat, > > > either there's a serious leak somewhere or I got the stats wrong > > > (anyone else notice irregular stats?) > > > > > I think I figured this, the "em" driver is allocating mbuf for each receive > > descriptor regardless if it?s needed or not. Does this cause a performance > > issue if there is 8000 mbufs in use and we get 100k-150k frees and > > allocates a second (for every packet?) > > > > (I have the em driver configured for 4096 receive descriptors) > > While you are there debugging mbuf issues, you might also want to try > this patch: >
Oops, my first patch had some bugs because of quick editing. Please try the newer patch: http://www.unixdaemons.com/~hiten/work/mbuf/if_em.c.patch Cheers. -- Hiten Pandya ([EMAIL PROTECTED], [EMAIL PROTECTED]) http://www.unixdaemons.com/~hiten/
Index: sys/dev/em/if_em.c =================================================================== RCS file: /home/ncvs/src/sys/dev/em/if_em.c,v retrieving revision 1.19 diff -u -r1.19 if_em.c --- sys/dev/em/if_em.c 19 Feb 2003 05:47:03 -0000 1.19 +++ sys/dev/em/if_em.c 5 Mar 2003 00:17:05 -0000 @@ -1802,17 +1802,11 @@ ifp = &adapter->interface_data.ac_if; if (mp == NULL) { - MGETHDR(mp, M_DONTWAIT, MT_DATA); + mp = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); if (mp == NULL) { adapter->mbuf_alloc_failed++; return(ENOBUFS); } - MCLGET(mp, M_DONTWAIT); - if ((mp->m_flags & M_EXT) == 0) { - m_freem(mp); - adapter->mbuf_cluster_failed++; - return(ENOBUFS); - } mp->m_len = mp->m_pkthdr.len = MCLBYTES; } else { mp->m_len = mp->m_pkthdr.len = MCLBYTES; @@ -2410,8 +2404,6 @@ adapter->no_tx_desc_avail2); printf("em%d: Std Mbuf Failed = %ld\n",unit, adapter->mbuf_alloc_failed); - printf("em%d: Std Cluster Failed = %ld\n",unit, - adapter->mbuf_cluster_failed); printf("em%d: Symbol errors = %lld\n", unit, (long long)adapter->stats.symerrs); Index: sys/dev/em/if_em.h =================================================================== RCS file: /home/ncvs/src/sys/dev/em/if_em.h,v retrieving revision 1.12 diff -u -r1.12 if_em.h --- sys/dev/em/if_em.h 23 Dec 2002 19:11:23 -0000 1.12 +++ sys/dev/em/if_em.h 5 Mar 2003 00:20:57 -0000 @@ -366,7 +366,6 @@ /* Misc stats maintained by the driver */ unsigned long dropped_pkts; unsigned long mbuf_alloc_failed; - unsigned long mbuf_cluster_failed; unsigned long no_tx_desc_avail1; unsigned long no_tx_desc_avail2; #ifdef DBG_STATS