xref: /freebsd/share/man/man9/vmem.9 (revision 5793008745115f9523f9de32cec3136cea2dd8d5)
1*57930087SAlexander Ziaee.\"-
2*57930087SAlexander Ziaee.\" SPDX-License-Identifier: BSD-2-Clause
3*57930087SAlexander Ziaee.\"
41b746e62SGleb Smirnoff.\"	$NetBSD: vmem.9,v 1.15 2013/01/29 22:02:17 wiz Exp $
51b746e62SGleb Smirnoff.\"
61b746e62SGleb Smirnoff.\" Copyright (c)2006 YAMAMOTO Takashi,
71b746e62SGleb Smirnoff.\" All rights reserved.
81b746e62SGleb Smirnoff.\"
91b746e62SGleb Smirnoff.\" Redistribution and use in source and binary forms, with or without
101b746e62SGleb Smirnoff.\" modification, are permitted provided that the following conditions
111b746e62SGleb Smirnoff.\" are met:
121b746e62SGleb Smirnoff.\" 1. Redistributions of source code must retain the above copyright
131b746e62SGleb Smirnoff.\"    notice, this list of conditions and the following disclaimer.
141b746e62SGleb Smirnoff.\" 2. Redistributions in binary form must reproduce the above copyright
151b746e62SGleb Smirnoff.\"    notice, this list of conditions and the following disclaimer in the
161b746e62SGleb Smirnoff.\"    documentation and/or other materials provided with the distribution.
171b746e62SGleb Smirnoff.\"
181b746e62SGleb Smirnoff.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
191b746e62SGleb Smirnoff.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201b746e62SGleb Smirnoff.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
211b746e62SGleb Smirnoff.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
221b746e62SGleb Smirnoff.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
231b746e62SGleb Smirnoff.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
241b746e62SGleb Smirnoff.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
251b746e62SGleb Smirnoff.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
261b746e62SGleb Smirnoff.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
271b746e62SGleb Smirnoff.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
281b746e62SGleb Smirnoff.\" SUCH DAMAGE.
291b746e62SGleb Smirnoff.\"
301b746e62SGleb Smirnoff.\" ------------------------------------------------------------
31f1c592fbSMark Johnston.Dd May 17, 2019
321b746e62SGleb Smirnoff.Dt VMEM 9
331b746e62SGleb Smirnoff.Os
341b746e62SGleb Smirnoff.\" ------------------------------------------------------------
351b746e62SGleb Smirnoff.Sh NAME
361b746e62SGleb Smirnoff.Nm vmem
371b746e62SGleb Smirnoff.Nd general purpose resource allocator
381b746e62SGleb Smirnoff.\" ------------------------------------------------------------
391b746e62SGleb Smirnoff.Sh SYNOPSIS
401b746e62SGleb Smirnoff.In sys/vmem.h
411b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
421b746e62SGleb Smirnoff.Ft vmem_t *
431b746e62SGleb Smirnoff.Fn vmem_create \
441b746e62SGleb Smirnoff"const char *name" "vmem_addr_t base" "vmem_size_t size" "vmem_size_t quantum" \
451b746e62SGleb Smirnoff"vmem_size_t qcache_max" "int flags"
461b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
471b746e62SGleb Smirnoff.Ft int
481b746e62SGleb Smirnoff.Fn vmem_add \
491b746e62SGleb Smirnoff"vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size" "int flags"
501b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
511b746e62SGleb Smirnoff.Ft int
521b746e62SGleb Smirnoff.Fn vmem_xalloc \
531b746e62SGleb Smirnoff"vmem_t *vm" "const vmem_size_t size" "vmem_size_t align" \
541b746e62SGleb Smirnoff"const vmem_size_t phase" "const vmem_size_t nocross" \
551b746e62SGleb Smirnoff"const vmem_addr_t minaddr" "const vmem_addr_t maxaddr" "int flags" \
561b746e62SGleb Smirnoff"vmem_addr_t *addrp"
571b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
581b746e62SGleb Smirnoff.Ft void
591b746e62SGleb Smirnoff.Fn vmem_xfree "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size"
601b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
611b746e62SGleb Smirnoff.Ft int
621b746e62SGleb Smirnoff.Fn vmem_alloc "vmem_t *vm" "vmem_size_t size" "int flags" "vmem_addr_t *addrp"
631b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
641b746e62SGleb Smirnoff.Ft void
651b746e62SGleb Smirnoff.Fn vmem_free "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size"
661b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
671b746e62SGleb Smirnoff.Ft void
681b746e62SGleb Smirnoff.Fn vmem_destroy "vmem_t *vm"
691b746e62SGleb Smirnoff.\" ------------------------------------------------------------
701b746e62SGleb Smirnoff.Sh DESCRIPTION
711b746e62SGleb SmirnoffThe
721b746e62SGleb Smirnoff.Nm
731b746e62SGleb Smirnoffis a general purpose resource allocator.
741b746e62SGleb SmirnoffDespite its name, it can be used for arbitrary resources
751b746e62SGleb Smirnoffother than virtual memory.
761b746e62SGleb Smirnoff.Pp
771b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
781b746e62SGleb Smirnoff.Fn vmem_create
791b746e62SGleb Smirnoffcreates a new vmem arena.
80*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
811b746e62SGleb Smirnoff.It Fa name
821b746e62SGleb SmirnoffThe string to describe the vmem.
831b746e62SGleb Smirnoff.It Fa base
841b746e62SGleb SmirnoffThe start address of the initial span.
851b746e62SGleb SmirnoffPass
861b746e62SGleb Smirnoff.Dv 0
871b746e62SGleb Smirnoffif no initial span is required.
881b746e62SGleb Smirnoff.It Fa size
891b746e62SGleb SmirnoffThe size of the initial span.
901b746e62SGleb SmirnoffPass
911b746e62SGleb Smirnoff.Dv 0
921b746e62SGleb Smirnoffif no initial span is required.
931b746e62SGleb Smirnoff.It Fa quantum
941b746e62SGleb SmirnoffThe smallest unit of allocation.
951b746e62SGleb Smirnoff.It Fa qcache_max
961b746e62SGleb SmirnoffThe largest size of allocations which can be served by quantum cache.
971b746e62SGleb SmirnoffIt is merely a hint and can be ignored.
981b746e62SGleb Smirnoff.It Fa flags
991b746e62SGleb Smirnoff.Xr malloc 9
100f1c592fbSMark Johnstonwait flag.
1011b746e62SGleb Smirnoff.El
1021b746e62SGleb Smirnoff.Pp
1031b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1041b746e62SGleb Smirnoff.Fn vmem_add
1051b746e62SGleb Smirnoffadds a span of size
1061b746e62SGleb Smirnoff.Fa size
1071b746e62SGleb Smirnoffstarting at
1081b746e62SGleb Smirnoff.Fa addr
1091b746e62SGleb Smirnoffto the arena.
1101b746e62SGleb SmirnoffReturns
1111b746e62SGleb Smirnoff0
1121b746e62SGleb Smirnoffon success,
1131b746e62SGleb Smirnoff.Dv ENOMEM
1141b746e62SGleb Smirnoffon failure.
1151b746e62SGleb Smirnoff.Fa flags
1161b746e62SGleb Smirnoffis
1171b746e62SGleb Smirnoff.Xr malloc 9
1181b746e62SGleb Smirnoffwait flag.
1191b746e62SGleb Smirnoff.Pp
1201b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1211b746e62SGleb Smirnoff.Fn vmem_xalloc
1221b746e62SGleb Smirnoffallocates a resource from the arena.
123*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
1241b746e62SGleb Smirnoff.It Fa vm
1251b746e62SGleb SmirnoffThe arena which we allocate from.
1261b746e62SGleb Smirnoff.It Fa size
1271b746e62SGleb SmirnoffSpecify the size of the allocation.
1281b746e62SGleb Smirnoff.It Fa align
1291b746e62SGleb SmirnoffIf zero, don't care about the alignment of the allocation.
1301b746e62SGleb SmirnoffOtherwise, request a resource segment starting at
1311b746e62SGleb Smirnoffoffset
1321b746e62SGleb Smirnoff.Fa phase
1331b746e62SGleb Smirnofffrom an
1341b746e62SGleb Smirnoff.Fa align
1351b746e62SGleb Smirnoffaligned boundary.
1361b746e62SGleb Smirnoff.It Fa phase
1371b746e62SGleb SmirnoffSee the above description of
1381b746e62SGleb Smirnoff.Fa align .
1391b746e62SGleb SmirnoffIf
1401b746e62SGleb Smirnoff.Fa align
1411b746e62SGleb Smirnoffis zero,
1421b746e62SGleb Smirnoff.Fa phase
1431b746e62SGleb Smirnoffshould be zero.
1441b746e62SGleb SmirnoffOtherwise,
1451b746e62SGleb Smirnoff.Fa phase
1461b746e62SGleb Smirnoffshould be smaller than
1471b746e62SGleb Smirnoff.Fa align .
1481b746e62SGleb Smirnoff.It Fa nocross
1491b746e62SGleb SmirnoffRequest a resource which doesn't cross
1501b746e62SGleb Smirnoff.Fa nocross
1511b746e62SGleb Smirnoffaligned boundary.
1521b746e62SGleb Smirnoff.It Fa minaddr
1531b746e62SGleb SmirnoffSpecify the minimum address which can be allocated, or
1541b746e62SGleb Smirnoff.Dv VMEM_ADDR_MIN
1551b746e62SGleb Smirnoffif the caller does not care.
1561b746e62SGleb Smirnoff.It Fa maxaddr
1571b746e62SGleb SmirnoffSpecify the maximum address which can be allocated, or
1581b746e62SGleb Smirnoff.Dv VMEM_ADDR_MAX
1591b746e62SGleb Smirnoffif the caller does not care.
1601b746e62SGleb Smirnoff.It Fa flags
1611b746e62SGleb SmirnoffA bitwise OR of an allocation strategy and a
162eeeb863fSSergey Kandaurov.Xr malloc 9
1631b746e62SGleb Smirnoffwait flag.
164f1c592fbSMark JohnstonThe allocation strategy is one of:
165*57930087SAlexander Ziaee.Bl -tag -width "M_FIRSTFIT"
166f1c592fbSMark Johnston.It Dv M_FIRSTFIT
167f1c592fbSMark JohnstonPrefer allocation performance.
168f1c592fbSMark Johnston.It Dv M_BESTFIT
169f1c592fbSMark JohnstonPrefer space efficiency.
170f1c592fbSMark Johnston.It Dv M_NEXTFIT
171f1c592fbSMark JohnstonPerform an address-ordered search for free addresses, beginning where
172f1c592fbSMark Johnstonthe previous search ended.
173f1c592fbSMark Johnston.El
1741b746e62SGleb Smirnoff.It Fa addrp
1751b746e62SGleb SmirnoffOn success, if
1761b746e62SGleb Smirnoff.Fa addrp
1771b746e62SGleb Smirnoffis not
1781b746e62SGleb Smirnoff.Dv NULL ,
1791b746e62SGleb Smirnoff.Fn vmem_xalloc
1801b746e62SGleb Smirnoffoverwrites it with the start address of the allocated span.
1811b746e62SGleb Smirnoff.El
1821b746e62SGleb Smirnoff.Pp
1831b746e62SGleb Smirnoff.\" ------------------------------------------------------------
1841b746e62SGleb Smirnoff.Fn vmem_xfree
1851b746e62SGleb Smirnofffrees resource allocated by
1861b746e62SGleb Smirnoff.Fn vmem_xalloc
1871b746e62SGleb Smirnoffto the arena.
188*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
1891b746e62SGleb Smirnoff.It Fa vm
1901b746e62SGleb SmirnoffThe arena which we free to.
1911b746e62SGleb Smirnoff.It Fa addr
1921b746e62SGleb SmirnoffThe resource being freed.
1931b746e62SGleb SmirnoffIt must be the one returned by
1941b746e62SGleb Smirnoff.Fn vmem_xalloc .
1951b746e62SGleb SmirnoffNotably, it must not be the one from
1961b746e62SGleb Smirnoff.Fn vmem_alloc .
1971b746e62SGleb SmirnoffOtherwise, the behaviour is undefined.
1981b746e62SGleb Smirnoff.It Fa size
1991b746e62SGleb SmirnoffThe size of the resource being freed.
2001b746e62SGleb SmirnoffIt must be the same as the
2011b746e62SGleb Smirnoff.Fa size
2021b746e62SGleb Smirnoffargument used for
2031b746e62SGleb Smirnoff.Fn vmem_xalloc .
2041b746e62SGleb Smirnoff.El
2051b746e62SGleb Smirnoff.Pp
2061b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2071b746e62SGleb Smirnoff.Fn vmem_alloc
2081b746e62SGleb Smirnoffallocates a resource from the arena.
209*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
2101b746e62SGleb Smirnoff.It Fa vm
2111b746e62SGleb SmirnoffThe arena which we allocate from.
2121b746e62SGleb Smirnoff.It Fa size
2131b746e62SGleb SmirnoffSpecify the size of the allocation.
2141b746e62SGleb Smirnoff.It Fa flags
2151b746e62SGleb SmirnoffA bitwise OR of an
2161b746e62SGleb Smirnoff.Nm
2171b746e62SGleb Smirnoffallocation strategy flag (see above) and a
2181b746e62SGleb Smirnoff.Xr malloc 9
2191b746e62SGleb Smirnoffsleep flag.
2201b746e62SGleb Smirnoff.It Fa addrp
2211b746e62SGleb SmirnoffOn success, if
2221b746e62SGleb Smirnoff.Fa addrp
2231b746e62SGleb Smirnoffis not
2241b746e62SGleb Smirnoff.Dv NULL ,
2251b746e62SGleb Smirnoff.Fn vmem_alloc
2261b746e62SGleb Smirnoffoverwrites it with the start address of the allocated span.
2271b746e62SGleb Smirnoff.El
2281b746e62SGleb Smirnoff.Pp
2291b746e62SGleb Smirnoff.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2301b746e62SGleb Smirnoff.Fn vmem_free
2311b746e62SGleb Smirnofffrees resource allocated by
2321b746e62SGleb Smirnoff.Fn vmem_alloc
2331b746e62SGleb Smirnoffto the arena.
234*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
2351b746e62SGleb Smirnoff.It Fa vm
2361b746e62SGleb SmirnoffThe arena which we free to.
2371b746e62SGleb Smirnoff.It Fa addr
2381b746e62SGleb SmirnoffThe resource being freed.
2391b746e62SGleb SmirnoffIt must be the one returned by
2401b746e62SGleb Smirnoff.Fn vmem_alloc .
2411b746e62SGleb SmirnoffNotably, it must not be the one from
2421b746e62SGleb Smirnoff.Fn vmem_xalloc .
2431b746e62SGleb SmirnoffOtherwise, the behaviour is undefined.
2441b746e62SGleb Smirnoff.It Fa size
2451b746e62SGleb SmirnoffThe size of the resource being freed.
2461b746e62SGleb SmirnoffIt must be the same as the
2471b746e62SGleb Smirnoff.Fa size
2481b746e62SGleb Smirnoffargument used for
2491b746e62SGleb Smirnoff.Fn vmem_alloc .
2501b746e62SGleb Smirnoff.El
2511b746e62SGleb Smirnoff.Pp
2521b746e62SGleb Smirnoff.\" ------------------------------------------------------------
2531b746e62SGleb Smirnoff.Fn vmem_destroy
2541b746e62SGleb Smirnoffdestroys a vmem arena.
255*57930087SAlexander Ziaee.Bl -tag -offset indent -width "qcache_max"
2561b746e62SGleb Smirnoff.It Fa vm
2571b746e62SGleb SmirnoffThe vmem arena being destroyed.
2581b746e62SGleb SmirnoffThe caller should ensure that no one will use it anymore.
2591b746e62SGleb Smirnoff.El
2601b746e62SGleb Smirnoff.\" ------------------------------------------------------------
2611b746e62SGleb Smirnoff.Sh RETURN VALUES
2621b746e62SGleb Smirnoff.Fn vmem_create
2631b746e62SGleb Smirnoffreturns a pointer to the newly allocated vmem_t.
2641b746e62SGleb SmirnoffOtherwise, it returns
2651b746e62SGleb Smirnoff.Dv NULL .
2661b746e62SGleb Smirnoff.Pp
2671b746e62SGleb SmirnoffOn success,
2681b746e62SGleb Smirnoff.Fn vmem_xalloc
2691b746e62SGleb Smirnoffand
2701b746e62SGleb Smirnoff.Fn vmem_alloc
2711b746e62SGleb Smirnoffreturn 0.
2721b746e62SGleb SmirnoffOtherwise,
2731b746e62SGleb Smirnoff.Dv ENOMEM
2741b746e62SGleb Smirnoffis returned.
2751b746e62SGleb Smirnoff.\" ------------------------------------------------------------
2761b746e62SGleb Smirnoff.Sh CODE REFERENCES
2771b746e62SGleb SmirnoffThe
2781b746e62SGleb Smirnoff.Nm
2791b746e62SGleb Smirnoffsubsystem is implemented within the file
2801b746e62SGleb Smirnoff.Pa sys/kern/subr_vmem.c .
2811b746e62SGleb Smirnoff.\" ------------------------------------------------------------
2821b746e62SGleb Smirnoff.Sh SEE ALSO
2831b746e62SGleb Smirnoff.Xr malloc 9
2841b746e62SGleb Smirnoff.Rs
2851b746e62SGleb Smirnoff.%A Jeff Bonwick
2861b746e62SGleb Smirnoff.%A Jonathan Adams
2871b746e62SGleb Smirnoff.%T "Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources"
2881b746e62SGleb Smirnoff.%J "2001 USENIX Annual Technical Conference"
2891b746e62SGleb Smirnoff.%D 2001
2901b746e62SGleb Smirnoff.Re
2911b746e62SGleb Smirnoff.\" ------------------------------------------------------------
2921b746e62SGleb Smirnoff.Sh HISTORY
2931b746e62SGleb SmirnoffThe
2941b746e62SGleb Smirnoff.Nm
2951b746e62SGleb Smirnoffallocator was originally implemented in
2961b746e62SGleb Smirnoff.Nx .
2971b746e62SGleb SmirnoffIt was introduced in
2981b746e62SGleb Smirnoff.Fx 10.0 .
2991b746e62SGleb Smirnoff.Sh AUTHORS
3001b746e62SGleb Smirnoff.An -nosplit
3011b746e62SGleb SmirnoffOriginal implementation of
3021b746e62SGleb Smirnoff.Nm
3031b746e62SGleb Smirnoffwas written by
3041b746e62SGleb Smirnoff.An "YAMAMOTO Takashi" .
3051b746e62SGleb SmirnoffThe
3061b746e62SGleb Smirnoff.Fx
3071b746e62SGleb Smirnoffport was made by
3081b746e62SGleb Smirnoff.An "Jeff Roberson" .
3091b746e62SGleb Smirnoff.Sh BUGS
3101b746e62SGleb Smirnoff.Nm
3111b746e62SGleb Smirnoffrelies on
3121b746e62SGleb Smirnoff.Xr malloc 9 ,
313e7ce237fSGleb Smirnoffso it cannot be used as early during system bootstrap.
314