zone(9)
NAME
- uma_zcreate, uma_zalloc, uma_zfree, uma_zdestroy,
- uma_zone_set_max - zone
allocator
SYNOPSIS
#include <sys/param.h>
#include <sys/queue.h>
#include <vm/uma.h>
uma_zone_t
uma_zcreate(char *name, int size, uma_ctor ctor, uma_dtor
dtor,
uma_init uminit, uma_fini fini, int align, u_int16_t
flags);
void *
uma_zalloc(uma_zone_t zone, int flags);
void
uma_zfree(uma_zone_t zone, void *item);
void
uma_zdestroy(uma_zone_t zone);
void
uma_zone_set_max(uma_zone_t zone, int nitems);
DESCRIPTION
- The zone allocator provides an efficient interface for man
- aging dynamically-sized collections of items of similar size. The zone
- allocator can
work with preallocated zones as well as with runtime-allo
- cated ones, and
is therefore available much earlier in the boot process than
- other memory
management routines.
- A zone is an extensible collection of items of identical
- size. The zone
allocator keeps track of which items are in use and which
- are not, and
provides functions for allocating items from the zone and
- for releasing
them back (which makes them available for later use).
- The zone allocator stores state information inside the items
- proper while
they are not allocated, so structures that will be managed
- by the zone
allocator and wish to use the type stable property of zones
- by leaving
some fields pre-filled between allocations, must reserve two
- pointers at
the very beginning for internal use by the zone allocator,
- as follows:
struct my_item {
struct my_item *z_rsvd1;
struct my_item *z_rsvd2;
/* rest of structure */
- };
- Alternatively they should assume those entries corrupted af
- ter each allocation. After the first allocation of an item, it will have
- been cleared
to zeroes, however subsequent allocations will retain the
- contents as of
the last free, with the exception of the fields mentioned
- above.
- The uma_zcreate() function creates a new zone from which
- items may then
be allocated from. The name argument is a text name of the
- zone for
debugging and stats; this memory should not be freed until
- the zone has
been deallocated.
- The ctor and dtor arguments are callback functions that are
- called by the
uma subsystem at the time of the call to uma_zalloc() and
- uma_zfree()
respectively. Their purpose is to provide hooks for ini
- tializing or
destroying things that need to be done at the time of the
- allocation or
release of a resource. A good usage for the ctor and dtor
- callbacks
might be to adjust a global count of the number of objects
- allocated.
- The uminit and fini arguments are used to optimize the allo
- cation of
objects from the zone. They are called by the uma subsystem
- whenever it
needs to allocate or free several items to satisfy requests
- or memory
pressure. A good use for the uminit and fini callbacks
- might be to initialize and destroy mutexes contained within the object.
- This would
allow one to re-use already initialized mutexes when an ob
- ject is
returned from the uma subsystem's object cache. They are
- not called on
each call to uma_zalloc() and uma_zfree() but rather in a
- batch mode on
several objects.
- To allocate an item from a zone, simply call uma_zalloc()
- with a pointer
to that zone and set the flags argument to selected flags as
- documented
in malloc(9). It will return a pointer to an item if suc
- cessful, or NULL
in the rare case where all items in the zone are in use and
- the allocator
is unable to grow the zone or when M_NOWAIT is specified.
- Items are released back to the zone from which they were al
- located by
calling uma_zfree() with a pointer to the zone and a pointer
- to the item.
- Created zones, which are empty, can be destroyed using
- uma_zdestroy(),
freeing all memory that was allocated for the zone. All
- items allocated
from the zone with uma_zalloc() must have been freed with
- uma_zfree()
before.
- The purpose of uma_zone_set_max() is to limit the maximum
- amount of memory that the system can dedicated toward the zone specified
- by the zone
argument. The nitems argument gives the upper limit of
- items in the
zone. This limits the total number of items in the zone
- which includes:
allocated items, free items and free items in the per-cpu
- caches. On
systems with more than one CPU it may not be possible to al
- locate the
specified number of items even when there is no shortage of
- memory,
because all of the remaining free items may be in the caches
- of the other
CPUs when the limit is hit.
RETURN VALUES
- The uma_zalloc() function returns a pointer to an item, or
- NULL if the
zone ran out of unused items and the allocator was unable to
- enlarge it.
SEE ALSO
malloc(9)
HISTORY
- The zone allocator first appeared in FreeBSD 3.0. It was
- radically
changed in FreeBSD 5.0 to function as a slab allocator.
AUTHORS
- The zone allocator was written by John S. Dyson. The zone
- allocator was
rewritten in large parts by Jeff Roberson <jeff@FreeBSD.org>
- to function
as a slab allocator.
- This manual page was written by Dag-Erling Smorgrav
- <des@FreeBSD.org>.
Changes for UMA by Jeroen Ruigrok van der Werven <as
- modai@FreeBSD.org>.
- BSD July 21, 2003