m_tag, malloc vs uma

Karim Fodil-Lemelin kfl at xiplink.com
Fri Apr 10 12:32:04 PDT 2009


Robert Watson wrote:
> On Fri, 10 Apr 2009, Karim Fodil-Lemelin wrote:
>
>> Is there any plans on getting the mbuf tags sub-system integrated 
>> with the universal memory allocator? Getting tags for mbufs is still 
>> calling malloc in uipc_mbuf.c ... What would be the benefits of using 
>> uma instead?
>
> Hi Karim:
>
> Right now there are no specific plans for changes along these lines, 
> although we have talked about moving towards better support for deep 
> objects in m_tags. Right now, MAC requires a "deep" copy, because 
> labels may be complex objects, and this is special-cased in the m_tag 
> code.  One way to move in that direction would be to move from an 
> explicit m_tag free pointer to a pointer to a vector of copy, free, 
> etc, operations.  This would make it easier to support more flexible 
> memory models there, rather than forcing the use of malloc(9).
>
> That said, malloc(9) for "small" memory types is essentially a thin 
> wrapper accounting around a set of fixed-size UMA zones:
>
> ITEM                     SIZE     LIMIT      USED      FREE  REQUESTS  
> FAILURES
> 16:                        16,        0,     3703,      966, 
> 55930783,        0
> 32:                        32,        0,     1455,      692, 
> 30720298,        0
> 64:                        64,        0,     4794,     1224, 
> 38352819,        0
> 128:                      128,        0,     3169,      341,  
> 5705218,        0
> 256:                      256,        0,     1565,      535, 
> 48338889,        0
> 512:                      512,        0,      386,      494,  
> 9962475,        0
> 1024:                    1024,        0,       66,      354,  
> 3418306,        0
> 2048:                    2048,        0,      314,      514,    
> 29945,        0
> 4096:                    4096,        0,      250,      279,  
> 4567645,        0
>
> For larger memory sizes, malloc(9) becomes instead a thin wrapper 
> around VM allocation of kernel address space and pages.  So as long as 
> you're using smaller objects, malloc(9) actually offers most of the 
> benefits of slab allocation.
>
> Because m_tag(9) is an interface used for a variety of base system and 
> third party parts, changes to the KPI would need to be made with a 
> major FreeBSD release -- for example with 8.0.  Such a change is 
> definitely not precluded at this point, but in a couple of months 
> we'll hit feature freeze and it won't be possible to make those 
> changes after that time.
>
> Robert N M Watson
> Computer Laboratory
> University of Cambridge
Hi Robert,

Thank you for the answer, clear and concise. I asked the question 
because I had modified pf_get_mtag() to use uma directly in the hope 
that it would be faster then calling malloc. But since pf_mtag is 
20bytes, malloc will end up using a fixed 32bytes zone and I shouldn't 
expect much speed gain from using something like (except some savings 
from not having to select the 32bytes zone):

extern uma_zone_t pf_mtag_zone;
static __inline struct pf_mtag *
pf_get_mtag(struct mbuf *m)
{
  struct m_tag    *mtag;

  if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) == NULL) {
    mtag = uma_zalloc(pf_mtag_zone, M_NOWAIT);
    if (mtag == NULL)
      return (NULL);
    m_tag_setup(mtag, MTAG_ABI_COMPAT, PACKET_TAG_PF, sizeof(struct 
pf_mtag));
    mtag->m_tag_free = pf_mtag_delete;
    bzero(mtag + 1, sizeof(struct pf_mtag));
    m_tag_prepend(m, mtag);
  }
  return ((struct pf_mtag *)(mtag + 1));
}


Where pf_mtag_delete is a wrapper around uma_zfree().

Regards,

Karim.


More information about the freebsd-net mailing list