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