10aa028ffSDag-Erling Smørgrav.\"- 20aa028ffSDag-Erling Smørgrav.\" Copyright (c) 2001 Dag-Erling Co�dan Sm�rgrav 30aa028ffSDag-Erling Smørgrav.\" All rights reserved. 40aa028ffSDag-Erling Smørgrav.\" 50aa028ffSDag-Erling Smørgrav.\" Redistribution and use in source and binary forms, with or without 60aa028ffSDag-Erling Smørgrav.\" modification, are permitted provided that the following conditions 70aa028ffSDag-Erling Smørgrav.\" are met: 80aa028ffSDag-Erling Smørgrav.\" 1. Redistributions of source code must retain the above copyright 90aa028ffSDag-Erling Smørgrav.\" notice, this list of conditions and the following disclaimer. 100aa028ffSDag-Erling Smørgrav.\" 2. Redistributions in binary form must reproduce the above copyright 110aa028ffSDag-Erling Smørgrav.\" notice, this list of conditions and the following disclaimer in the 120aa028ffSDag-Erling Smørgrav.\" documentation and/or other materials provided with the distribution. 130aa028ffSDag-Erling Smørgrav.\" 140aa028ffSDag-Erling Smørgrav.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 150aa028ffSDag-Erling Smørgrav.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 160aa028ffSDag-Erling Smørgrav.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 170aa028ffSDag-Erling Smørgrav.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 180aa028ffSDag-Erling Smørgrav.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 190aa028ffSDag-Erling Smørgrav.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 200aa028ffSDag-Erling Smørgrav.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 210aa028ffSDag-Erling Smørgrav.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 220aa028ffSDag-Erling Smørgrav.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 230aa028ffSDag-Erling Smørgrav.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 240aa028ffSDag-Erling Smørgrav.\" SUCH DAMAGE. 250aa028ffSDag-Erling Smørgrav.\" 260aa028ffSDag-Erling Smørgrav.\" $FreeBSD$ 270aa028ffSDag-Erling Smørgrav.\" 280aa028ffSDag-Erling Smørgrav.Dd January 27, 2001 290aa028ffSDag-Erling Smørgrav.Dt ZONE 9 300aa028ffSDag-Erling Smørgrav.Os 310aa028ffSDag-Erling Smørgrav.Sh NAME 320aa028ffSDag-Erling Smørgrav.Nm zbootinit , 330aa028ffSDag-Erling Smørgrav.Nm zinitna , 340aa028ffSDag-Erling Smørgrav.Nm zinit , 350aa028ffSDag-Erling Smørgrav.Nm zalloc , 360aa028ffSDag-Erling Smørgrav.Nm zfree 370aa028ffSDag-Erling Smørgrav.Nd Zone allocator 380aa028ffSDag-Erling Smørgrav.Sh SYNOPSIS 390aa028ffSDag-Erling Smørgrav.Fd #include <sys/types.h> 400aa028ffSDag-Erling Smørgrav.Fd #include <vm/vm_zone.h> 410aa028ffSDag-Erling Smørgrav.Ft void 420aa028ffSDag-Erling Smørgrav.Fn zbootinit "vm_zone_t z" "char *name" "int size" "void *item" "int nitems" 430aa028ffSDag-Erling Smørgrav.Ft int 440aa028ffSDag-Erling Smørgrav.Fn zinitna "vm_zone_t z" "struct vm_object *obj" "char *name" "int size" "int nentries" "int flags" "int zalloc" 450aa028ffSDag-Erling Smørgrav.Ft vm_zone_t 460aa028ffSDag-Erling Smørgrav.Fn zinit "char *name" "int size" "int nentries" "int flags" "int zalloc" 470aa028ffSDag-Erling Smørgrav.Ft void * 480aa028ffSDag-Erling Smørgrav.Fn zalloc "vm_zone_t z" 490aa028ffSDag-Erling Smørgrav.Ft void 500aa028ffSDag-Erling Smørgrav.Fn zfree "vm_zone_t z" "void *item" 510aa028ffSDag-Erling Smørgrav.Sh DESCRIPTION 520aa028ffSDag-Erling SmørgravThe zone allocator provides an efficient interface for managing 530aa028ffSDag-Erling Smørgravdynamically-sized collections of items of similar size. 540aa028ffSDag-Erling SmørgravThe zone allocator can work with preallocated zones as well as with 550aa028ffSDag-Erling Smørgravruntime-allocated ones, and is therefore available much earlier in the 560aa028ffSDag-Erling Smørgravboot process than other memory management routines. 570aa028ffSDag-Erling Smørgrav.Pp 580aa028ffSDag-Erling SmørgravA zone is an extensible collection of items of identical size. 590aa028ffSDag-Erling SmørgravThe zone allocator keeps track of which items are in use and which 600aa028ffSDag-Erling Smørgravaren't, and provides functions for allocating items from the zone and 610aa028ffSDag-Erling Smørgravfor releasing them back (which makes them available for later use). 620aa028ffSDag-Erling Smørgrav.Pp 630aa028ffSDag-Erling SmørgravThe zone allocator stores state information inside the items proper, 640aa028ffSDag-Erling Smørgravso structures that will be managed by the zone allocator must reserve 650aa028ffSDag-Erling Smørgravtwo pointers at the very beginning for internal use by the zone 660aa028ffSDag-Erling Smørgravallocator, as follows: 670aa028ffSDag-Erling Smørgrav.Bd -literal 680aa028ffSDag-Erling Smørgravstruct my_item { 690aa028ffSDag-Erling Smørgrav struct my_item *z_rsvd1; 700aa028ffSDag-Erling Smørgrav struct my_item *z_rsvd2; 710aa028ffSDag-Erling Smørgrav /* rest of structure */ 720aa028ffSDag-Erling Smørgrav}; 730aa028ffSDag-Erling Smørgrav.Ed 740aa028ffSDag-Erling Smørgrav.Pp 750aa028ffSDag-Erling SmørgravZones are created in one of two fashions, depending how far along the 760aa028ffSDag-Erling Smørgravboot process is. 770aa028ffSDag-Erling Smørgrav.Pp 780aa028ffSDag-Erling SmørgravIf the VM system is fully initialized, a dynamically allocated zone can 790aa028ffSDag-Erling Smørgravbe created using 800aa028ffSDag-Erling Smørgrav.Fn zinit . 810aa028ffSDag-Erling SmørgravThe 820aa028ffSDag-Erling Smørgrav.Fa name 830aa028ffSDag-Erling Smørgravargument should be a pointer to a short, descriptive name for the 840aa028ffSDag-Erling Smørgravzone; it is used for statistics and debugging purposes. 850aa028ffSDag-Erling SmørgravThe 860aa028ffSDag-Erling Smørgrav.Fa size 870aa028ffSDag-Erling Smørgravand 880aa028ffSDag-Erling Smørgrav.Fa nentries 890aa028ffSDag-Erling Smørgravare the size of the items held by the zone and the initial size (in 900aa028ffSDag-Erling Smørgravitems) of the zone, respectively. 910aa028ffSDag-Erling SmørgravThe 920aa028ffSDag-Erling Smørgrav.Fa flags 930aa028ffSDag-Erling Smørgravargument should be set to 940aa028ffSDag-Erling Smørgrav.Dv ZONE_INTERRUPT 950aa028ffSDag-Erling Smørgravif there is a chance that items may be allocated from the zone in 960aa028ffSDag-Erling Smørgravinterrupt context; note that in this case, the zone will never grow 970aa028ffSDag-Erling Smørgravlarger than 980aa028ffSDag-Erling Smørgrav.Fa nentries 990aa028ffSDag-Erling Smørgravitems. 1000aa028ffSDag-Erling SmørgravIn all other cases, 1010aa028ffSDag-Erling Smørgrav.Fa flags 1020aa028ffSDag-Erling Smørgravshould be set to 0. 1030aa028ffSDag-Erling SmørgravThe final argument, 1040aa028ffSDag-Erling Smørgrav.Fa zalloc , 1050aa028ffSDag-Erling Smørgravindicates the number of VM pages by which the zone should grow every 1060aa028ffSDag-Erling Smørgravtime it fills up. 1070aa028ffSDag-Erling Smørgrav.Pp 1080aa028ffSDag-Erling SmørgravIf the VM system is not yet fully initialized, the zone allocator 1090aa028ffSDag-Erling Smørgravcannot dynamically allocate VM pages from which to dole out items, so 1100aa028ffSDag-Erling Smørgravthe caller needs to provide a static pool of items. 1110aa028ffSDag-Erling SmørgravIn this case, the initialization is done in two stages: first, 1120aa028ffSDag-Erling Smørgrav.Fn zbootinit 1130aa028ffSDag-Erling Smørgravis called before first use of the zone; later, when the VM system is 1140aa028ffSDag-Erling Smørgravup, the initialization of the zone is completed by calling 1150aa028ffSDag-Erling Smørgrav.Fn zinitna . 1160aa028ffSDag-Erling Smørgrav.Pp 1170aa028ffSDag-Erling SmørgravThe first argument to 1180aa028ffSDag-Erling Smørgrav.Fn zbootinit 1190aa028ffSDag-Erling Smørgravis a pointer to a static 1200aa028ffSDag-Erling Smørgrav.Fa struct vm_zone 1210aa028ffSDag-Erling Smørgravto initialize. 1220aa028ffSDag-Erling SmørgravThe second and third are the name of the zone and the size of the 1230aa028ffSDag-Erling Smørgravitems it will hold. 1240aa028ffSDag-Erling SmørgravThe fourth argument is a pointer to a static array of items from which 1250aa028ffSDag-Erling Smørgravthe zone allocator will draw until the zone is fully initialized. 1260aa028ffSDag-Erling SmørgravThe 1270aa028ffSDag-Erling Smørgrav.Fa nitems 1280aa028ffSDag-Erling Smørgravargument is the number of items in the array. 1290aa028ffSDag-Erling Smørgrav.Pp 1300aa028ffSDag-Erling SmørgravThe arguments to 1310aa028ffSDag-Erling Smørgrav.Fa zinitna 1320aa028ffSDag-Erling Smørgravare the same as for 1330aa028ffSDag-Erling Smørgrav.Fa zinit , 1340aa028ffSDag-Erling Smørgravwith the addition of a pointer to the zone to initialize, and a 1350aa028ffSDag-Erling Smørgravpointer to a 1360aa028ffSDag-Erling Smørgrav.Fa struct vm_object 1370aa028ffSDag-Erling Smørgravfrom which to allocate pages in the 1380aa028ffSDag-Erling Smørgrav.Dv ZONE_INTERRUPT 1390aa028ffSDag-Erling Smørgravcase. 1400aa028ffSDag-Erling Smørgrav.Pp 1410aa028ffSDag-Erling SmørgravTo allocate an item from a zone, simply call 1420aa028ffSDag-Erling Smørgrav.Fn zalloc 1430aa028ffSDag-Erling Smørgravwith a pointer to that zone; it will return a pointer to an item, or 1440aa028ffSDag-Erling Smørgrav.Dv NULL 1450aa028ffSDag-Erling Smørgravin the rare case where all items in the zone are in use and the 1460aa028ffSDag-Erling Smørgravallocator is unable to grow the zone. 1470aa028ffSDag-Erling Smørgrav.Pp 1480aa028ffSDag-Erling SmørgravItems are released back to the zone from which they were allocated by 1490aa028ffSDag-Erling Smørgravcalling 1500aa028ffSDag-Erling Smørgrav.Fn zfree 1510aa028ffSDag-Erling Smørgravwith a pointer to the zone and a pointer to the item. 1520aa028ffSDag-Erling Smørgrav.Sh RETURN VALUES 1530aa028ffSDag-Erling SmørgravThe 1540aa028ffSDag-Erling Smørgrav.Fn zinitna 1550aa028ffSDag-Erling Smørgravfunction returns 1 on success and 0 on failure; the only failure case 1560aa028ffSDag-Erling Smørgravis inability to preallocate address space for an interrupt-safe zone. 1570aa028ffSDag-Erling Smørgrav.Pp 1580aa028ffSDag-Erling SmørgravThe 1590aa028ffSDag-Erling Smørgrav.Fn zinit 1600aa028ffSDag-Erling Smørgravfunction returns a pointer to a fully initialized 1610aa028ffSDag-Erling Smørgrav.Fa struct vm_zone , 1620aa028ffSDag-Erling Smørgravor 1630aa028ffSDag-Erling Smørgrav.Dv NULL 1640aa028ffSDag-Erling Smørgravif it was unable to 1650aa028ffSDag-Erling Smørgrav.Fn malloc 1660aa028ffSDag-Erling Smørgrava 1670aa028ffSDag-Erling Smørgrav.Fa struct vm_zone 1680aa028ffSDag-Erling Smørgravor the 1690aa028ffSDag-Erling Smørgrav.Dv ZONE_INTERRUPT 1700aa028ffSDag-Erling Smørgravflag was specified and 1710aa028ffSDag-Erling Smørgrav.Fn zinitna 1720aa028ffSDag-Erling Smørgravfailed to preallocate address space. 1730aa028ffSDag-Erling Smørgrav.Pp 1740aa028ffSDag-Erling SmørgravThe 1750aa028ffSDag-Erling Smørgrav.Fn zalloc 1760aa028ffSDag-Erling Smørgravfunction returns a pointer to an item, or 1770aa028ffSDag-Erling Smørgrav.Dv NULL 1780aa028ffSDag-Erling Smørgravif the zone ran out of unused items and the allocator was unable to 1790aa028ffSDag-Erling Smørgravenlarge it. 1800aa028ffSDag-Erling Smørgrav.Sh SEE ALSO 1810aa028ffSDag-Erling Smørgrav.Xr malloc 9 1820aa028ffSDag-Erling Smørgrav.Sh HISTORY 1830aa028ffSDag-Erling SmørgravThe zone allocator first appeared in 1840aa028ffSDag-Erling Smørgrav.Fx 3.0 . 1850aa028ffSDag-Erling Smørgrav.Sh AUTHORS 1860aa028ffSDag-Erling Smørgrav.An -nosplit 1870aa028ffSDag-Erling SmørgravThe zone allocator was written by 1880aa028ffSDag-Erling Smørgrav.An John S. Dyson . 1890aa028ffSDag-Erling Smørgrav.Pp 1900aa028ffSDag-Erling SmørgravThis manual page was written by 1910aa028ffSDag-Erling Smørgrav.An Dag-Erling Co\(:idan Sm\(/orgrav Aq des@FreeBSD.org . 192