VMEM(9) | Kernel Developer's Manual | VMEM(9) |
vmem
—
#include <sys/vmem.h>
vmem_t *
vmem_create
(const
char *name, vmem_addr_t
base, vmem_size_t
size, vmem_size_t
quantum, int
(*allocfn)(void *, vmem_size_t, vm_flag_t, vmem_addr_t *),
void (*freefn)(void *,
vmem_addr_t, vmem_size_t),
void *arg,
vmem_size_t qcache_max,
vm_flag_t flags,
int ipl);
vmem_t *
vmem_xcreate
(const
char *name, vmem_addr_t
base, vmem_size_t
size, vmem_size_t
quantum, int
(*allocfn)(void *, vmem_size_t, vmem_size_t *, vm_flag_t, vmem_addr_t
*), void (*freefn)(void
*, vmem_addr_t, vmem_size_t),
void *arg,
vmem_size_t qcache_max,
vm_flag_t flags,
int ipl);
int
vmem_add
(vmem_t
*vm, vmem_addr_t
addr, vmem_size_t
size, vm_flag_t
flags, vmem_addr_t
*addrp);
int
vmem_xalloc
(vmem_t
*vm, vmem_size_t
size, vmem_size_t
align, vmem_size_t
phase, vmem_size_t
nocross, vmem_addr_t
minaddr, vmem_addr_t
maxaddr, vm_flag_t
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, vm_flag_t
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);
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.
0
if
no initial span is required.0
if no initial
span is required.NULL
to disable automatic imports.
vmem
calls
(*allocfn)
(arg,
size, flags,
&addrp); to import a span of size at least
size. allocfn must accept the
same flags as vmem_alloc
().
allocfn must return ENOMEM
to indicate failure, or 0 on success. If allocfn
succeeds, it must write the starting address of the imported span to
addrp.NULL
even if
allocfn is not NULL
.
vmem
calls
(*freefn)
(arg,
addr, size) to return to
arg a span of size size,
starting at addr, that was previously allocated by
allocfn.NULL
. vmem
passes
arg as the first argument of
allocfn and freefn.VM_SLEEP
VM_NOSLEEP
NULL
if there
are not enough resources available.vmem_xcreate
() creates a new vmem
arena.
0
if
no initial span is required.0
if no initial
span is required.NULL
to disable automatic imports.
vmem
calls
(*allocfn)
(arg,
size, &actualsize,
flags, &addrp); to import
a span of size at least size.
allocfn must accept the same
flags as vmem_alloc
().
allocfn must return ENOMEM
to indicate failure, or 0 on success. If allocfn
succeeds, it must write the actual size of the allocation to
actualsize and the starting address of the imported
span to addrp. The actual size will always be
greater than or equal to the requested size.NULL
even if
allocfn is not NULL
.
vmem
calls
(*freefn)
(arg,
addr, size) to return to
arg a span of size size,
starting at addr, that was previously allocated by
allocfn.NULL
. vmem
passes
arg as the first argument of
allocfn and freefn.VM_SLEEP
VM_NOSLEEP
NULL
if there
are not enough resources available.vmem_add
() adds a span of size
size starting at addr to the
arena. Returns 0 on success, ENOMEM
on failure.
VM_SLEEP
VM_NOSLEEP
ENOMEM
if
there are not enough resources available.vmem_xalloc
() allocates a resource from
the arena.
VMEM_ADDR_MIN
if the caller does not care.VMEM_ADDR_MAX
if the caller does not care.The allocation strategy must be one of:
VM_BESTFIT
VM_INSTANTFIT
The sleep flag must be one of:
VM_SLEEP
VM_NOSLEEP
ENOMEM
if
there are not enough resources available.NULL
, vmem_xalloc
()
overwrites it with the start address of the allocated span.vmem_xfree
() frees resource allocated by
vmem_xalloc
() to the arena.
vmem_xalloc
(). Notably, it must not have been
allocated via vmem_alloc
(). Otherwise, the
behaviour is undefined.vmem_xalloc
().vmem_alloc
() allocates a resource from the
arena.
The allocation strategy must be one of:
VM_BESTFIT
VM_INSTANTFIT
The sleep flag must be one of:
VM_SLEEP
VM_NOSLEEP
ENOMEM
if
there are not enough resources available.NULL
, vmem_alloc
()
overwrites it with the start address of the allocated span.vmem_free
() frees resource allocated by
vmem_alloc
() to the arena.
vmem_alloc
(). Notably, it must not have been
allocated via vmem_xalloc
(). Otherwise, the
behaviour is undefined.vmem_alloc
().vmem_destroy
() destroys a vmem arena.
vmem_create
() return 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.
vmem
subsystem is implemented within the file
sys/kern/subr_vmem.c.
Jeff Bonwick and Jonathan Adams, Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources, 2001 USENIX Annual Technical Conference, 2001.
vmem
was written by
YAMAMOTO Takashi.
vmem
relies on
malloc(9),
pool(9), and
RUN_ONCE(9), so it cannot be
used as early during system bootstrap as
extent(9).
February 28, 2016 | NetBSD 9.0 |