p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_create
creates a new vmem arena.
l -tag -offset indent -width qcache_max t Fa name The string to describe the vmem.
t Fa base The start address of the initial span.
Pass
.Dv 0
if no initial span is required.
t Fa size The size of the initial span.
Pass
.Dv 0
if no initial span is required.
t Fa quantum The smallest unit of allocation.
t Fa allocfn The callback function used to import spans from the backend arena.
Set both
.Fa allocfn
and
.Fa freefn
to
.Dv NULL
to disable automatic imports.
.Nm
calls
.Fo "(*allocfn)"
.Fa arg
.Fa size
.Fa flags
.Fa "&addrp"
.Fc
to import a span of size at least
.Fa size .
.Fa allocfn
must accept the same
.Fa flags
as
.Fn vmem_alloc .
.Fa allocfn
must return
.Dv ENOMEM
to indicate failure, or 0 on success.
If
.Fa allocfn
succeeds, it must write the starting address of the imported span to
.Fa addrp .
t Fa freefn The callback function used to free spans to the backend arena.
.Fa freefn
may be
.Dv NULL
even if
.Fa allocfn
is not
.Dv NULL .
.Nm
calls
.Fn "(*freefn)" arg addr size
to return to
.Fa arg
a span of size
.Fa size ,
starting at
.Fa addr ,
that was previously allocated by
.Fa allocfn .
t Fa arg The backend arena.
.Fa arg
may be
.Dv NULL .
.Nm
passes
.Fa arg
as the first argument of
.Fa allocfn
and
.Fa freefn .
t Fa qcache_max The largest size of allocations which can be served by quantum cache.
It is merely a hint and can be ignored.
t Fa flags Either of:
l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until enough
resources are available.
t Dv VM_NOSLEEP Don't sleep.
Immediately return
.Dv NULL
if there are not enough resources available.
.El
t Fa ipl Interrupt level to be blocked for allocating from vmem.
.El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_xcreate
creates a new vmem arena.
l -tag -offset indent -width qcache_max t Fa name The string to describe the vmem.
t Fa base The start address of the initial span.
Pass
.Dv 0
if no initial span is required.
t Fa size The size of the initial span.
Pass
.Dv 0
if no initial span is required.
t Fa quantum The smallest unit of allocation.
t Fa allocfn The callback function used to import spans from the backend arena.
Set both
.Fa allocfn
and
.Fa freefn
to
.Dv NULL
to disable automatic imports.
.Nm
calls
.Fo "(*allocfn)"
.Fa arg
.Fa size
.Fa "&actualsize"
.Fa flags
.Fa "&addrp"
.Fc
to import a span of size at least
.Fa size .
.Fa allocfn
must accept the same
.Fa flags
as
.Fn vmem_alloc .
.Fa allocfn
must return
.Dv ENOMEM
to indicate failure, or 0 on success.
If
.Fa allocfn
succeeds, it must write the actual size of the allocation to
.Fa actualsize
and the starting address of the imported span to
.Fa addrp .
The actual size will always be greater than or equal to the requested size.
t Fa freefn The callback function used to free spans to the backend arena.
.Fa freefn
may be
.Dv NULL
even if
.Fa allocfn
is not
.Dv NULL .
.Nm
calls
.Fn "(*freefn)" arg addr size
to return to
.Fa arg
a span of size
.Fa size ,
starting at
.Fa addr ,
that was previously allocated by
.Fa allocfn .
t Fa arg The backend arena.
.Fa arg
may be
.Dv NULL .
.Nm
passes
.Fa arg
as the first argument of
.Fa allocfn
and
.Fa freefn .
t Fa qcache_max The largest size of allocations which can be served by quantum cache.
It is merely a hint and can be ignored.
t Fa flags Either of:
l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until enough
resources are available.
t Dv VM_NOSLEEP Don't sleep.
Immediately return
.Dv NULL
if there are not enough resources available.
.El
t Fa ipl Interrupt level to be blocked for allocating from vmem.
.El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_add
adds a span of size
.Fa size
starting at
.Fa addr
to the arena.
Returns
0
on success,
.Dv ENOMEM
on failure.
l -tag -offset indent -width flags t Fa flags Either of:
l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until enough
resources are available.
t Dv VM_NOSLEEP Don't sleep.
Immediately return
.Dv ENOMEM
if there are not enough resources available.
.El
.El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_xalloc
allocates a resource from the arena.
l -tag -offset indent -width nocross t Fa vm The arena which we allocate from.
t Fa size Specify the size of the allocation.
t Fa align If zero, don't care about the alignment of the allocation.
Otherwise, request a resource segment starting at
offset
.Fa phase
from an
.Fa align
aligned boundary.
t Fa phase See the above description of
.Fa align .
If
.Fa align
is zero,
.Fa phase
must be zero.
Otherwise,
.Fa phase
must be smaller than
.Fa align .
t Fa nocross Request a resource which doesn't cross
.Fa nocross
aligned boundary.
t Fa minaddr Specify the minimum address which can be allocated, or
.Dv VMEM_ADDR_MIN
if the caller does not care.
t Fa maxaddr Specify the maximum address which can be allocated, or
.Dv VMEM_ADDR_MAX
if the caller does not care.
t Fa flags A bitwise OR of an allocation strategy and a sleep flag.
p The allocation strategy must be one of: l -tag -width VM_INSTANTFIT t Dv VM_BESTFIT Prefer space efficiency. t Dv VM_INSTANTFIT Prefer performance. .El
p The sleep flag must be one of: l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until enough resources are available. t Dv VM_NOSLEEP Don't sleep. Immediately return .Dv ENOMEM if there are not enough resources available. .El t Fa addrp On success, if .Fa addrp is not .Dv NULL , .Fn vmem_xalloc overwrites it with the start address of the allocated span. .El
p
------------------------------------------------------------
.Fn vmem_xalloc_addr
allocates a specific address from the arena.
The requested address must be aligned with the arena's quantum.
l -tag -offset indent -width flags t Fa vm The arena which we allocate from.
t Fa addr The address to allocate.
t Fa size Specify the size of the allocation.
t Fa flags A sleep flag.
Because a specific address is being allocated, any specified allocation
strategy is ignored.
p The sleep flag must be one of: l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until the requested range can be allocated. t Dv VM_NOSLEEP Don't sleep. Immediately return .Dv ENOMEM if the requested range is not available. .El .El
p
------------------------------------------------------------
.Fn vmem_xfree
frees resource allocated by
.Fn vmem_xalloc
or
.Fn vmem_xalloc_addr
to the arena.
l -tag -offset indent -width addr t Fa vm The arena which we free to.
t Fa addr The resource being freed.
It must have been allocated via
.Fn vmem_xalloc
or
.Fn vmem_xalloc_addr .
Notably, it must not have been allocated via
.Fn vmem_alloc ,
otherwise, the behaviour is undefined.
t Fa size The size of the resource being freed.
It must be the same as the
.Fa size
argument used for
.Fn vmem_xalloc
or
.Fn vmem_xalloc_addr .
.El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_xfreeall
frees all resources that have been allocated by
.Fn vmem_xalloc
to the arena.
l -tag -offset indent -width addr t Fa vm The arena which we free to.
Note that this function is may not be used on arenas
where resources have been allocated using
.Fn vmem_alloc
or arenas that have a quantum cache
o i.e. were created with a non-zero .Fa qcache_max
c . .El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_alloc
allocates a resource from the arena.
l -tag -offset indent -width flags t Fa vm The arena which we allocate from.
t Fa size Specify the size of the allocation.
t Fa flags A bitwise OR of an allocation strategy and a sleep flag.
p The allocation strategy must be one of: l -tag -width VM_INSTANTFIT t Dv VM_BESTFIT Prefer space efficiency. t Dv VM_INSTANTFIT Prefer performance. .El
p The sleep flag must be one of: l -tag -width VM_NOSLEEP t Dv VM_SLEEP If the allocation cannot be satisfied immediately, sleep until enough resources are available. t Dv VM_NOSLEEP Don't sleep. Immediately return .Dv ENOMEM if there are not enough resources available. .El t Fa addrp On success, if .Fa addrp is not .Dv NULL , .Fn vmem_alloc overwrites it with the start address of the allocated span. .El
p
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Fn vmem_free
frees resource allocated by
.Fn vmem_alloc
to the arena.
l -tag -offset indent -width addr t Fa vm The arena which we free to.
t Fa addr The resource being freed.
It must have been allocated via
.Fn vmem_alloc .
Notably, it must not have been allocated via
.Fn vmem_xalloc
or
.Fn vmem_xalloc addr ,
otherwise, the behaviour is undefined.
t Fa size The size of the resource being freed.
It must be the same as the
.Fa size
argument used for
.Fn vmem_alloc .
.El
p
------------------------------------------------------------
.Fn vmem_destroy
destroys a vmem arena.
l -tag -offset indent -width vm t Fa vm The vmem arena being destroyed.
The caller must ensure that no one will use it anymore.
.El
------------------------------------------------------------
.Sh RETURN VALUES
.Fn vmem_create
and
.Fn vmem_xcreate
return a pointer to the newly allocated vmem_t on success, or
.Dv NULL
if
.Dv VM_NOSLEEP
was specified and memory could not be allocated immediately.
p .Fn vmem_add returns 0 on success, or .Er ENOMEM if .Dv VM_NOSLEEP was specified and memory could not be allocated immediately to record the region.
p
.Fn vmem_alloc
and
.Fn vmem_xalloc
return 0 on success, or
.Er ENOMEM
if either:
l -dash t .Dv VM_NOSLEEP
was specified and a matching region could not be allocated immediately;
or
t non-default
.Fa align ,
.Fa phase ,
or
.Fa nocross
parameters were specified, and a matching region could not be allocated
without calling the backing
.Fa allocfn
passed to
.Fn vmem_create .
.El
------------------------------------------------------------
.Sh CODE REFERENCES
The
.Nm
subsystem is implemented within the file
a sys/kern/subr_vmem.c .
------------------------------------------------------------
.Sh SEE ALSO
.Xr intro 9 ,
.Xr kmem 9 ,
.Xr memoryallocators 9 ,
.Xr uvm 9
.Rs
.%A Jeff Bonwick
.%A Jonathan Adams
.%T "Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources"
.%J "2001 USENIX Annual Technical Conference"
.%D 2001
.Re
------------------------------------------------------------
.Sh AUTHORS
This implementation of
.Nm
was written by
.An YAMAMOTO Takashi .
.Sh BUGS
.Nm
relies on
.Xr malloc 9 ,
.Xr pool 9 ,
and
.Xr RUN_ONCE 9 ,
so it cannot be used as early during system bootstrap as
.Xr extent 9 .
p .Nm has no way to pass .Fa align , .Fa phase , .Fa nocross , .Fa minaddr , or .Fa maxaddr constraints into the backing allocator .Fa allocfn , so even if .Dv VM_SLEEP is specified, .Fn vmem_alloc and .Fn vmem_xalloc may spuriously fail immediately with .Fa align , .Fa phase , or .Fa nocross , or sleep forever with .Fa minaddr or .Fa maxaddr .