Hi, Currently, m_tag_get() calls malloc()(kern_malloc()), and then kern_malloc() calls pool_cache_get() as long as m_tag size is not too large.
According to my measurements of using DTrace, there is a certain overhead between kern_malloc() and pool_cache_get(). Here is each function's average turnaround times in my measurement. m_tag_get | 124205 [ns] kern_malloc | 108007 [ns] kmem_intr_alloc | 89636 [ns] pool_cache_get_paddr | 65942 [ns] i.e. the overhead between kern_malloc() and pool_cache_get() is 42065[ns], this overhead is considerable compared to pool_cache_get_paddr()'s turnaround time. Of course, m_tag_get() is used by packet processing path, this overhead would have a certain influence on packet throughput and latency. So, I think m_tag should use a dedicated pool cache like mbuf to call pool_cache_get() directly. Here is the patch to introduce mbuf pool cache. http://www.netbsd.org/~knakahara/mtag-pool-cache/mtag-pool-cache.patch Could you comment this patch? Any comments are welcome. Thanks, -- ////////////////////////////////////////////////////////////////////// Internet Initiative Japan Inc. Device Engineering Section, Core Product Development Department, Product Division, Technology Unit Kengo NAKAHARA <k-nakah...@iij.ad.jp>