NAME¶
vmem
—
general purpose resource allocator
SYNOPSIS¶
#include
<sys/vmem.h>
vmem_t *
vmem_create
(
const
char *name,
vmem_addr_t
base,
vmem_size_t
size,
vmem_size_t
quantum,
vmem_size_t
qcache_max,
int
flags);
int
vmem_add
(
vmem_t
*vm,
vmem_addr_t
addr,
vmem_size_t
size,
int
flags);
int
vmem_xalloc
(
vmem_t
*vm,
const
vmem_size_t size,
vmem_size_t
align,
const
vmem_size_t phase,
const vmem_size_t
nocross,
const
vmem_addr_t minaddr,
const vmem_addr_t
maxaddr,
int
flags,
vmem_addr_t
*addrp);
void
vmem_xfree
(
vmem_t
*vm,
vmem_addr_t
addr,
vmem_size_t
size);
int
vmem_alloc
(
vmem_t
*vm,
vmem_size_t
size,
int
flags,
vmem_addr_t
*addrp);
void
vmem_free
(
vmem_t
*vm,
vmem_addr_t
addr,
vmem_size_t
size);
void
vmem_destroy
(
vmem_t
*vm);
DESCRIPTION¶
The
vmem
is a general purpose resource
allocator. Despite its name, it can be used for arbitrary resources other than
virtual memory.
vmem_create
() creates a new vmem arena.
- name
- The string to describe the vmem.
- base
- The start address of the initial span. Pass
0
if no initial span is required.
- size
- The size of the initial span. Pass
0
if
no initial span is required.
- quantum
- The smallest unit of allocation.
- qcache_max
- The largest size of allocations which can be served by quantum cache. It
is merely a hint and can be ignored.
- flags
- Combination of malloc(9) wait flag and
vmem
allocation strategy flag:
M_FIRSTFIT
- Prefer allocation performance.
M_BESTFIT
- Prefer space efficiency.
vmem_add
() adds a span of size
size starting at
addr to the arena. Returns 0 on success,
ENOMEM
on failure.
flags is
malloc(9) wait flag.
vmem_xalloc
() allocates a resource from the
arena.
- vm
- The arena which we allocate from.
- size
- Specify the size of the allocation.
- align
- If zero, don't care about the alignment of the allocation. Otherwise,
request a resource segment starting at offset
phase from an
align aligned boundary.
- phase
- See the above description of align. If
align is zero,
phase should be zero. Otherwise,
phase should be smaller than
align.
- nocross
- Request a resource which doesn't cross
nocross aligned boundary.
- minaddr
- Specify the minimum address which can be allocated, or
VMEM_ADDR_MIN
if the caller does not
care.
- maxaddr
- Specify the maximum address which can be allocated, or
VMEM_ADDR_MAX
if the caller does not
care.
- flags
- A bitwise OR of an allocation strategy and a
malloc(9) wait flag. The allocation strategy
is one of
M_FIRSTFIT
and
M_BESTFIT
.
- addrp
- On success, if addrp is not
NULL
,
vmem_xalloc
() overwrites it with the
start address of the allocated span.
vmem_xfree
() frees resource allocated by
vmem_xalloc
() to the arena.
- vm
- The arena which we free to.
- addr
- The resource being freed. It must be the one returned by
vmem_xalloc
(). Notably, it must not be
the one from vmem_alloc
(). Otherwise,
the behaviour is undefined.
- size
- The size of the resource being freed. It must be the same as the
size argument used for
vmem_xalloc
().
vmem_alloc
() allocates a resource from the
arena.
- vm
- The arena which we allocate from.
- size
- Specify the size of the allocation.
- flags
- A bitwise OR of an
vmem
allocation
strategy flag (see above) and a malloc(9)
sleep flag.
- addrp
- On success, if addrp is not
NULL
,
vmem_alloc
() overwrites it with the
start address of the allocated span.
vmem_free
() frees resource allocated by
vmem_alloc
() to the arena.
- vm
- The arena which we free to.
- addr
- The resource being freed. It must be the one returned by
vmem_alloc
(). Notably, it must not be
the one from vmem_xalloc
(). Otherwise,
the behaviour is undefined.
- size
- The size of the resource being freed. It must be the same as the
size argument used for
vmem_alloc
().
vmem_destroy
() destroys a vmem arena.
- vm
- The vmem arena being destroyed. The caller should ensure that no one will
use it anymore.
RETURN VALUES¶
vmem_create
() returns a pointer to the newly
allocated vmem_t. Otherwise, it returns
NULL
.
On success,
vmem_xalloc
() and
vmem_alloc
() return 0. Otherwise,
ENOMEM
is returned.
CODE REFERENCES¶
The
vmem
subsystem is implemented within the
file
sys/kern/subr_vmem.c.
SEE ALSO¶
malloc(9)
Jeff Bonwick and
Jonathan Adams, Magazines and Vmem:
Extending the Slab Allocator to Many CPUs and Arbitrary Resources,
2001 USENIX Annual Technical Conference,
2001.
HISTORY¶
The
vmem
allocator was originally implemented
in
NetBSD. It was introduced in
FreeBSD 10.0.
AUTHORS¶
Original implementation of
vmem
was written
by
YAMAMOTO Takashi. The
FreeBSD port was made by
Jeff Roberson.
BUGS¶
vmem
relies on
malloc(9), so it cannot be used as early during
system bootstrap.