Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Mar 2014 21:59:40 -0400 (EDT)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        John-Mark Gurney <jmg@funkthat.com>
Cc:        Freebsd hackers list <freebsd-hackers@freebsd.org>, Garrett Wollman <wollman@freebsd.org>
Subject:   Re: kernel memory allocator: UMA or malloc?
Message-ID:  <1291887352.21761108.1394675980413.JavaMail.root@uoguelph.ca>
In-Reply-To: <20140312062517.GX32089@funkthat.com>

next in thread | previous in thread | raw e-mail | index | archive | help
John-Mark Gurney wrote:
> Rick Macklem wrote this message on Tue, Mar 11, 2014 at 21:32 -0400:
> > I've been working on a patch provided by wollman@, where
> > he uses UMA instead of malloc() to allocate an iovec array
> > for use by the NFS server's read.
> > 
> > So, my question is:
> > When is it preferable to use UMA(9) vs malloc(9) if the
> > allocation is going to be a fixed size?
> 
> UMA has benefits if the structure size is uniform and a non-power of
> 2..
> In this case, it can pack the items more densely, say, a 192 byte
> allocation can fit 21 allocations in a 4k page size verse malloc
> which
> would round it up to 256 bytes leaving only 16 per page...  These
> counts per page are probably different as UMA may keep some
> information
> in the page...
> 
Ok, this one might apply. I need to look at the size.

> It also has the benefit of being able to keep allocations "half
> alive"..
> "freed" objects can be partly initalized with references to buffers
> and
> other allocations still held by them... Then if the systems needs to
> fully free your allocation, it can, and will call your function to
> release these remaining resources... look at the ctor/dtor
> uminit/fini
> functions in uma(9) for more info...
> 
> uma also allows you to set a hard limit on the number of allocations
> the zone provides...
> 
Yep. None of the above applies to this case, but thanks for the good points
for a future case. (I've seen where this gets used for the "secondary zone"
for mbufs+cluster.)

> Hope this helps...
> 
Yes, it did. Thanks.

Does anyone know if there is a significant performance difference if the allocation
is a power of 2 and the "half alive" cases don't apply?

Thanks all for your help, rick
ps: Garrett's patch switched to using a fixed size allocation and using UMA(9).
    Since I have found that a uma allocation request with M_WAITOK can get the thread
    stuck sleeping in "btalloc", I am a bit shy of using it when I've never
    had a problem with malloc(). Btw, this was for a pagesize cluster allocation,
    so it might be related to the alignment requirement (and running on a small
    i386, so the kernel address space is relatively small).
    I do see that switching to a fixed size allocation to cover the common
    case is a good idea, but I'm not sure if setting up a uma zone is worth
    the effort over malloc()?

> --
>   John-Mark Gurney				Voice: +1 415 225 5579
> 
>      "All that I will do, has been done, All that I have, has not."
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to
> "freebsd-hackers-unsubscribe@freebsd.org"
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1291887352.21761108.1394675980413.JavaMail.root>