uma.h revision 226313
1139825Simp/*- 2148078Srwatson * Copyright (c) 2002, 2003, 2004, 2005 Jeffrey Roberson <jeff@FreeBSD.org> 3148078Srwatson * Copyright (c) 2004, 2005 Bosko Milekic <bmilekic@FreeBSD.org> 4148078Srwatson * All rights reserved. 592654Sjeff * 692654Sjeff * Redistribution and use in source and binary forms, with or without 792654Sjeff * modification, are permitted provided that the following conditions 892654Sjeff * are met: 992654Sjeff * 1. Redistributions of source code must retain the above copyright 1092654Sjeff * notice unmodified, this list of conditions, and the following 1192654Sjeff * disclaimer. 1292654Sjeff * 2. Redistributions in binary form must reproduce the above copyright 1392654Sjeff * notice, this list of conditions and the following disclaimer in the 1492654Sjeff * documentation and/or other materials provided with the distribution. 1592654Sjeff * 1692654Sjeff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1792654Sjeff * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1892654Sjeff * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1992654Sjeff * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2092654Sjeff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2192654Sjeff * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2292654Sjeff * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2392654Sjeff * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2492654Sjeff * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2592654Sjeff * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2692654Sjeff * 2792654Sjeff * $FreeBSD: head/sys/vm/uma.h 226313 2011-10-12 18:08:28Z glebius $ 2892654Sjeff * 2992654Sjeff */ 3092654Sjeff 3192654Sjeff/* 3292654Sjeff * uma.h - External definitions for the Universal Memory Allocator 3392654Sjeff * 3492654Sjeff*/ 3592654Sjeff 3692654Sjeff#ifndef VM_UMA_H 3792654Sjeff#define VM_UMA_H 3892654Sjeff 3992654Sjeff#include <sys/param.h> /* For NULL */ 4092654Sjeff#include <sys/malloc.h> /* For M_* */ 4192654Sjeff 42184546Skeramida/* User visible parameters */ 4392654Sjeff#define UMA_SMALLEST_UNIT (PAGE_SIZE / 256) /* Smallest item allocated */ 4492654Sjeff 4592654Sjeff/* Types and type defs */ 4692654Sjeff 47129906Sbmilekicstruct uma_zone; 4892654Sjeff/* Opaque type used as a handle to the zone */ 4992654Sjefftypedef struct uma_zone * uma_zone_t; 5092654Sjeff 51166213Smohansvoid zone_drain(uma_zone_t); 52166213Smohans 5392654Sjeff/* 5492654Sjeff * Item constructor 5592654Sjeff * 5692654Sjeff * Arguments: 5792654Sjeff * item A pointer to the memory which has been allocated. 5892654Sjeff * arg The arg field passed to uma_zalloc_arg 5992654Sjeff * size The size of the allocated item 60132987Sgreen * flags See zalloc flags 6192654Sjeff * 6292654Sjeff * Returns: 63132987Sgreen * 0 on success 64132987Sgreen * errno on failure 6592654Sjeff * 6692654Sjeff * Discussion: 6792654Sjeff * The constructor is called just before the memory is returned 68105689Ssheldonh * to the user. It may block if necessary. 6992654Sjeff */ 70132987Sgreentypedef int (*uma_ctor)(void *mem, int size, void *arg, int flags); 7192654Sjeff 7292654Sjeff/* 7392654Sjeff * Item destructor 7492654Sjeff * 7592654Sjeff * Arguments: 7692654Sjeff * item A pointer to the memory which has been allocated. 7792654Sjeff * size The size of the item being destructed. 7892654Sjeff * arg Argument passed through uma_zfree_arg 7992654Sjeff * 8092654Sjeff * Returns: 8192654Sjeff * Nothing 8292654Sjeff * 8392654Sjeff * Discussion: 8492654Sjeff * The destructor may perform operations that differ from those performed 8592654Sjeff * by the initializer, but it must leave the object in the same state. 8692654Sjeff * This IS type stable storage. This is called after EVERY zfree call. 8792654Sjeff */ 8892654Sjefftypedef void (*uma_dtor)(void *mem, int size, void *arg); 8992654Sjeff 9092654Sjeff/* 9192654Sjeff * Item initializer 9292654Sjeff * 9392654Sjeff * Arguments: 9492654Sjeff * item A pointer to the memory which has been allocated. 9592654Sjeff * size The size of the item being initialized. 96132987Sgreen * flags See zalloc flags 9792654Sjeff * 9892654Sjeff * Returns: 99132987Sgreen * 0 on success 100132987Sgreen * errno on failure 10192654Sjeff * 10292654Sjeff * Discussion: 10392654Sjeff * The initializer is called when the memory is cached in the uma zone. 104184546Skeramida * The initializer and the destructor should leave the object in the same 105184546Skeramida * state. 10692654Sjeff */ 107132987Sgreentypedef int (*uma_init)(void *mem, int size, int flags); 10892654Sjeff 10992654Sjeff/* 11092654Sjeff * Item discard function 11192654Sjeff * 11292654Sjeff * Arguments: 11392654Sjeff * item A pointer to memory which has been 'freed' but has not left the 11492654Sjeff * zone's cache. 11592654Sjeff * size The size of the item being discarded. 11692654Sjeff * 11792654Sjeff * Returns: 11892654Sjeff * Nothing 11992654Sjeff * 12092654Sjeff * Discussion: 12192654Sjeff * This routine is called when memory leaves a zone and is returned to the 122184546Skeramida * system for other uses. It is the counter-part to the init function. 12392654Sjeff */ 12492654Sjefftypedef void (*uma_fini)(void *mem, int size); 12592654Sjeff 12692654Sjeff/* 12792654Sjeff * What's the difference between initializing and constructing? 12892654Sjeff * 12992654Sjeff * The item is initialized when it is cached, and this is the state that the 13092654Sjeff * object should be in when returned to the allocator. The purpose of this is 13192654Sjeff * to remove some code which would otherwise be called on each allocation by 13292654Sjeff * utilizing a known, stable state. This differs from the constructor which 13392654Sjeff * will be called on EVERY allocation. 13492654Sjeff * 135184546Skeramida * For example, in the initializer you may want to initialize embedded locks, 13692654Sjeff * NULL list pointers, set up initial states, magic numbers, etc. This way if 137105689Ssheldonh * the object is held in the allocator and re-used it won't be necessary to 13892654Sjeff * re-initialize it. 13992654Sjeff * 14092654Sjeff * The constructor may be used to lock a data structure, link it on to lists, 14192654Sjeff * bump reference counts or total counts of outstanding structures, etc. 14292654Sjeff * 14392654Sjeff */ 14492654Sjeff 14592654Sjeff 14692654Sjeff/* Function proto types */ 14792654Sjeff 14892654Sjeff/* 14992654Sjeff * Create a new uma zone 15092654Sjeff * 15192654Sjeff * Arguments: 152184546Skeramida * name The text name of the zone for debugging and stats. This memory 15392654Sjeff * should not be freed until the zone has been deallocated. 15492654Sjeff * size The size of the object that is being created. 155184546Skeramida * ctor The constructor that is called when the object is allocated. 15692654Sjeff * dtor The destructor that is called when the object is freed. 15792654Sjeff * init An initializer that sets up the initial state of the memory. 15892654Sjeff * fini A discard function that undoes initialization done by init. 15992654Sjeff * ctor/dtor/init/fini may all be null, see notes above. 160184546Skeramida * align A bitmask that corresponds to the requested alignment 16192654Sjeff * eg 4 would be 0x3 162184546Skeramida * flags A set of parameters that control the behavior of the zone. 16392654Sjeff * 16492654Sjeff * Returns: 16592654Sjeff * A pointer to a structure which is intended to be opaque to users of 16692654Sjeff * the interface. The value may be null if the wait flag is not set. 16792654Sjeff */ 16895925Sarruma_zone_t uma_zcreate(char *name, size_t size, uma_ctor ctor, uma_dtor dtor, 16992654Sjeff uma_init uminit, uma_fini fini, int align, 170148072Ssilby u_int32_t flags); 17192654Sjeff 172120223Sjeff/* 173129906Sbmilekic * Create a secondary uma zone 174129906Sbmilekic * 175129906Sbmilekic * Arguments: 176184546Skeramida * name The text name of the zone for debugging and stats. This memory 177129906Sbmilekic * should not be freed until the zone has been deallocated. 178184546Skeramida * ctor The constructor that is called when the object is allocated. 179129906Sbmilekic * dtor The destructor that is called when the object is freed. 180129906Sbmilekic * zinit An initializer that sets up the initial state of the memory 181129906Sbmilekic * as the object passes from the Keg's slab to the Zone's cache. 182129906Sbmilekic * zfini A discard function that undoes initialization done by init 183129906Sbmilekic * as the object passes from the Zone's cache to the Keg's slab. 184129906Sbmilekic * 185129906Sbmilekic * ctor/dtor/zinit/zfini may all be null, see notes above. 186129906Sbmilekic * Note that the zinit and zfini specified here are NOT 187129906Sbmilekic * exactly the same as the init/fini specified to uma_zcreate() 188129906Sbmilekic * when creating a master zone. These zinit/zfini are called 189129906Sbmilekic * on the TRANSITION from keg to zone (and vice-versa). Once 190129906Sbmilekic * these are set, the primary zone may alter its init/fini 191129906Sbmilekic * (which are called when the object passes from VM to keg) 192129906Sbmilekic * using uma_zone_set_init/fini()) as well as its own 193129906Sbmilekic * zinit/zfini (unset by default for master zone) with 194129906Sbmilekic * uma_zone_set_zinit/zfini() (note subtle 'z' prefix). 195129906Sbmilekic * 196129913Sbmilekic * master A reference to this zone's Master Zone (Primary Zone), 197129913Sbmilekic * which contains the backing Keg for the Secondary Zone 198129913Sbmilekic * being added. 199129906Sbmilekic * 200129906Sbmilekic * Returns: 201129906Sbmilekic * A pointer to a structure which is intended to be opaque to users of 202129906Sbmilekic * the interface. The value may be null if the wait flag is not set. 203129906Sbmilekic */ 204129906Sbmilekicuma_zone_t uma_zsecond_create(char *name, uma_ctor ctor, uma_dtor dtor, 205129906Sbmilekic uma_init zinit, uma_fini zfini, uma_zone_t master); 206129906Sbmilekic 207129906Sbmilekic/* 208187681Sjeff * Add a second master to a secondary zone. This provides multiple data 209187681Sjeff * backends for objects with the same size. Both masters must have 210187681Sjeff * compatible allocation flags. Presently, UMA_ZONE_MALLOC type zones are 211187681Sjeff * the only supported. 212187681Sjeff * 213187681Sjeff * Returns: 214187681Sjeff * Error on failure, 0 on success. 215187681Sjeff */ 216187681Sjeffint uma_zsecond_add(uma_zone_t zone, uma_zone_t master); 217187681Sjeff 218187681Sjeff/* 219120223Sjeff * Definitions for uma_zcreate flags 220120223Sjeff * 221120223Sjeff * These flags share space with UMA_ZFLAGs in uma_int.h. Be careful not to 222148072Ssilby * overlap when adding new features. 0xf0000000 is in use by uma_int.h. 223120223Sjeff */ 22492654Sjeff#define UMA_ZONE_PAGEABLE 0x0001 /* Return items not fully backed by 22592654Sjeff physical memory XXX Not yet */ 22692654Sjeff#define UMA_ZONE_ZINIT 0x0002 /* Initialize with zeros */ 227184546Skeramida#define UMA_ZONE_STATIC 0x0004 /* Statically sized zone */ 22892654Sjeff#define UMA_ZONE_OFFPAGE 0x0008 /* Force the slab structure allocation 22992654Sjeff off of the real memory */ 23092654Sjeff#define UMA_ZONE_MALLOC 0x0010 /* For use by malloc(9) only! */ 23192654Sjeff#define UMA_ZONE_NOFREE 0x0020 /* Do not free slabs of this type! */ 23295758Sjeff#define UMA_ZONE_MTXCLASS 0x0040 /* Create a new lock class */ 233103531Sjeff#define UMA_ZONE_VM 0x0080 /* 234103531Sjeff * Used for internal vm datastructures 235103531Sjeff * only. 236103531Sjeff */ 237103531Sjeff#define UMA_ZONE_HASH 0x0100 /* 238103531Sjeff * Use a hash table instead of caching 239103531Sjeff * information in the vm_page. 240103531Sjeff */ 241129906Sbmilekic#define UMA_ZONE_SECONDARY 0x0200 /* Zone is a Secondary Zone */ 242129906Sbmilekic#define UMA_ZONE_REFCNT 0x0400 /* Allocate refcnts in slabs */ 243129906Sbmilekic#define UMA_ZONE_MAXBUCKET 0x0800 /* Use largest buckets */ 244187681Sjeff#define UMA_ZONE_CACHESPREAD 0x1000 /* 245187681Sjeff * Spread memory start locations across 246187681Sjeff * all possible cache lines. May 247187681Sjeff * require many virtually contiguous 248187681Sjeff * backend pages and can fail early. 249187681Sjeff */ 250187681Sjeff#define UMA_ZONE_VTOSLAB 0x2000 /* Zone uses vtoslab for lookup. */ 25192654Sjeff 252187681Sjeff/* 253187681Sjeff * These flags are shared between the keg and zone. In zones wishing to add 254187681Sjeff * new kegs these flags must be compatible. Some are determined based on 255187681Sjeff * physical parameters of the request and may not be provided by the consumer. 256187681Sjeff */ 257187681Sjeff#define UMA_ZONE_INHERIT \ 258226313Sglebius (UMA_ZONE_OFFPAGE | UMA_ZONE_MALLOC | UMA_ZONE_NOFREE | \ 259226313Sglebius UMA_ZONE_HASH | UMA_ZONE_REFCNT | UMA_ZONE_VTOSLAB) 260187681Sjeff 26192654Sjeff/* Definitions for align */ 26292654Sjeff#define UMA_ALIGN_PTR (sizeof(void *) - 1) /* Alignment fit for ptr */ 26392654Sjeff#define UMA_ALIGN_LONG (sizeof(long) - 1) /* "" long */ 26492654Sjeff#define UMA_ALIGN_INT (sizeof(int) - 1) /* "" int */ 26592654Sjeff#define UMA_ALIGN_SHORT (sizeof(short) - 1) /* "" short */ 26692654Sjeff#define UMA_ALIGN_CHAR (sizeof(char) - 1) /* "" char */ 267166654Srwatson#define UMA_ALIGN_CACHE (0 - 1) /* Cache line size align */ 26892654Sjeff 26992654Sjeff/* 27094161Sjeff * Destroys an empty uma zone. If the zone is not empty uma complains loudly. 27192654Sjeff * 27292654Sjeff * Arguments: 27392654Sjeff * zone The zone we want to destroy. 27492654Sjeff * 27592654Sjeff */ 27694161Sjeffvoid uma_zdestroy(uma_zone_t zone); 27792654Sjeff 27892654Sjeff/* 27992654Sjeff * Allocates an item out of a zone 28092654Sjeff * 28192654Sjeff * Arguments: 28292654Sjeff * zone The zone we are allocating from 28392654Sjeff * arg This data is passed to the ctor function 28495766Sjeff * flags See sys/malloc.h for available flags. 28592654Sjeff * 28692654Sjeff * Returns: 287184546Skeramida * A non-null pointer to an initialized element from the zone is 288184546Skeramida * guaranteed if the wait flag is M_WAITOK. Otherwise a null pointer 289184546Skeramida * may be returned if the zone is empty or the ctor failed. 29092654Sjeff */ 29192654Sjeff 29295766Sjeffvoid *uma_zalloc_arg(uma_zone_t zone, void *arg, int flags); 29392654Sjeff 29492654Sjeff/* 29592654Sjeff * Allocates an item out of a zone without supplying an argument 29692654Sjeff * 29792654Sjeff * This is just a wrapper for uma_zalloc_arg for convenience. 29892654Sjeff * 29992654Sjeff */ 30095766Sjeffstatic __inline void *uma_zalloc(uma_zone_t zone, int flags); 30192654Sjeff 30292654Sjeffstatic __inline void * 30395766Sjeffuma_zalloc(uma_zone_t zone, int flags) 30492654Sjeff{ 30595766Sjeff return uma_zalloc_arg(zone, NULL, flags); 30692654Sjeff} 30792654Sjeff 30892654Sjeff/* 30992654Sjeff * Frees an item back into the specified zone. 31092654Sjeff * 31192654Sjeff * Arguments: 31292654Sjeff * zone The zone the item was originally allocated out of. 31392654Sjeff * item The memory to be freed. 31492654Sjeff * arg Argument passed to the destructor 31592654Sjeff * 31692654Sjeff * Returns: 31792654Sjeff * Nothing. 31892654Sjeff */ 31992654Sjeff 32092654Sjeffvoid uma_zfree_arg(uma_zone_t zone, void *item, void *arg); 32192654Sjeff 32292654Sjeff/* 32392654Sjeff * Frees an item back to a zone without supplying an argument 32492654Sjeff * 32592654Sjeff * This is just a wrapper for uma_zfree_arg for convenience. 32692654Sjeff * 32792654Sjeff */ 32892654Sjeffstatic __inline void uma_zfree(uma_zone_t zone, void *item); 32992654Sjeff 33092654Sjeffstatic __inline void 33192654Sjeffuma_zfree(uma_zone_t zone, void *item) 33292654Sjeff{ 333100326Smarkm uma_zfree_arg(zone, item, NULL); 33492654Sjeff} 33592654Sjeff 33692654Sjeff/* 33792654Sjeff * XXX The rest of the prototypes in this header are h0h0 magic for the VM. 33892654Sjeff * If you think you need to use it for a normal zone you're probably incorrect. 33992654Sjeff */ 34092654Sjeff 34192654Sjeff/* 34292654Sjeff * Backend page supplier routines 34392654Sjeff * 34492654Sjeff * Arguments: 345184546Skeramida * zone The zone that is requesting pages. 346184546Skeramida * size The number of bytes being requested. 34792654Sjeff * pflag Flags for these memory pages, see below. 34892654Sjeff * wait Indicates our willingness to block. 34992654Sjeff * 35092654Sjeff * Returns: 351184546Skeramida * A pointer to the allocated memory or NULL on failure. 35292654Sjeff */ 35392654Sjeff 35492654Sjefftypedef void *(*uma_alloc)(uma_zone_t zone, int size, u_int8_t *pflag, int wait); 35592654Sjeff 35692654Sjeff/* 35792654Sjeff * Backend page free routines 35892654Sjeff * 35992654Sjeff * Arguments: 360184546Skeramida * item A pointer to the previously allocated pages. 361184546Skeramida * size The original size of the allocation. 362184546Skeramida * pflag The flags for the slab. See UMA_SLAB_* below. 36392654Sjeff * 36492654Sjeff * Returns: 36592654Sjeff * None 36692654Sjeff */ 36792654Sjefftypedef void (*uma_free)(void *item, int size, u_int8_t pflag); 36892654Sjeff 36992654Sjeff 37092654Sjeff 37192654Sjeff/* 37292654Sjeff * Sets up the uma allocator. (Called by vm_mem_init) 37392654Sjeff * 37492654Sjeff * Arguments: 37592654Sjeff * bootmem A pointer to memory used to bootstrap the system. 37692654Sjeff * 37792654Sjeff * Returns: 37892654Sjeff * Nothing 37992654Sjeff * 38092654Sjeff * Discussion: 38192654Sjeff * This memory is used for zones which allocate things before the 38292654Sjeff * backend page supplier can give us pages. It should be 383151104Sdes * UMA_SLAB_SIZE * boot_pages bytes. (see uma_int.h) 38492654Sjeff * 38592654Sjeff */ 38692654Sjeff 387151104Sdesvoid uma_startup(void *bootmem, int boot_pages); 38892654Sjeff 38992654Sjeff/* 39092654Sjeff * Finishes starting up the allocator. This should 39192654Sjeff * be called when kva is ready for normal allocs. 39292654Sjeff * 39392654Sjeff * Arguments: 394103531Sjeff * None 39592654Sjeff * 39692654Sjeff * Returns: 39792654Sjeff * Nothing 39892654Sjeff * 39992654Sjeff * Discussion: 400103531Sjeff * uma_startup2 is called by kmeminit() to enable us of uma for malloc. 40192654Sjeff */ 40292654Sjeff 403103531Sjeffvoid uma_startup2(void); 40492654Sjeff 40592654Sjeff/* 40692654Sjeff * Reclaims unused memory for all zones 40792654Sjeff * 40892654Sjeff * Arguments: 40992654Sjeff * None 41092654Sjeff * Returns: 41192654Sjeff * None 41292654Sjeff * 41392654Sjeff * This should only be called by the page out daemon. 41492654Sjeff */ 41592654Sjeff 41692654Sjeffvoid uma_reclaim(void); 41792654Sjeff 41892654Sjeff/* 419166654Srwatson * Sets the alignment mask to be used for all zones requesting cache 420166654Srwatson * alignment. Should be called by MD boot code prior to starting VM/UMA. 421166654Srwatson * 422166654Srwatson * Arguments: 423166654Srwatson * align The alignment mask 424166654Srwatson * 425166654Srwatson * Returns: 426166654Srwatson * Nothing 427166654Srwatson */ 428166654Srwatsonvoid uma_set_align(int align); 429166654Srwatson 430166654Srwatson/* 43192654Sjeff * Switches the backing object of a zone 43292654Sjeff * 43392654Sjeff * Arguments: 434184546Skeramida * zone The zone to update. 435184546Skeramida * obj The VM object to use for future allocations. 436184546Skeramida * size The size of the object to allocate. 43792654Sjeff * 43892654Sjeff * Returns: 43992654Sjeff * 0 if kva space can not be allocated 44092654Sjeff * 1 if successful 44192654Sjeff * 44292654Sjeff * Discussion: 44392654Sjeff * A NULL object can be used and uma will allocate one for you. Setting 44492654Sjeff * the size will limit the amount of memory allocated to this zone. 44592654Sjeff * 44692654Sjeff */ 44792654Sjeffstruct vm_object; 44892654Sjeffint uma_zone_set_obj(uma_zone_t zone, struct vm_object *obj, int size); 44992654Sjeff 45092758Sjeff/* 45192758Sjeff * Sets a high limit on the number of items allowed in a zone 45292758Sjeff * 45392758Sjeff * Arguments: 45492758Sjeff * zone The zone to limit 455213911Slstewart * nitems The requested upper limit on the number of items allowed 45692758Sjeff * 45792758Sjeff * Returns: 458213911Slstewart * int The effective value of nitems after rounding up based on page size 45992758Sjeff */ 460213911Slstewartint uma_zone_set_max(uma_zone_t zone, int nitems); 46192654Sjeff 46292654Sjeff/* 463211396Sandre * Obtains the effective limit on the number of items in a zone 464211396Sandre * 465211396Sandre * Arguments: 466211396Sandre * zone The zone to obtain the effective limit from 467211396Sandre * 468211396Sandre * Return: 469211396Sandre * 0 No limit 470211396Sandre * int The effective limit of the zone 471211396Sandre */ 472211396Sandreint uma_zone_get_max(uma_zone_t zone); 473211396Sandre 474211396Sandre/* 475213910Slstewart * Obtains the approximate current number of items allocated from a zone 476213910Slstewart * 477213910Slstewart * Arguments: 478213910Slstewart * zone The zone to obtain the current allocation count from 479213910Slstewart * 480213910Slstewart * Return: 481213910Slstewart * int The approximate current number of items allocated from the zone 482213910Slstewart */ 483213910Slstewartint uma_zone_get_cur(uma_zone_t zone); 484213910Slstewart 485213910Slstewart/* 486129906Sbmilekic * The following two routines (uma_zone_set_init/fini) 487129906Sbmilekic * are used to set the backend init/fini pair which acts on an 488129906Sbmilekic * object as it becomes allocated and is placed in a slab within 489129906Sbmilekic * the specified zone's backing keg. These should probably not 490184546Skeramida * be changed once allocations have already begun, but only be set 491129906Sbmilekic * immediately upon zone creation. 492129906Sbmilekic */ 493129906Sbmilekicvoid uma_zone_set_init(uma_zone_t zone, uma_init uminit); 494129906Sbmilekicvoid uma_zone_set_fini(uma_zone_t zone, uma_fini fini); 495129906Sbmilekic 496129906Sbmilekic/* 497129906Sbmilekic * The following two routines (uma_zone_set_zinit/zfini) are 498129906Sbmilekic * used to set the zinit/zfini pair which acts on an object as 499129906Sbmilekic * it passes from the backing Keg's slab cache to the 500129906Sbmilekic * specified Zone's bucket cache. These should probably not 501184546Skeramida * be changed once allocations have already begun, but only be set 502184546Skeramida * immediately upon zone creation. 503129906Sbmilekic */ 504129906Sbmilekicvoid uma_zone_set_zinit(uma_zone_t zone, uma_init zinit); 505129906Sbmilekicvoid uma_zone_set_zfini(uma_zone_t zone, uma_fini zfini); 506129906Sbmilekic 507129906Sbmilekic/* 50892654Sjeff * Replaces the standard page_alloc or obj_alloc functions for this zone 50992654Sjeff * 51092654Sjeff * Arguments: 511184546Skeramida * zone The zone whose backend allocator is being changed. 51292654Sjeff * allocf A pointer to the allocation function 51392654Sjeff * 51492654Sjeff * Returns: 51592654Sjeff * Nothing 51692654Sjeff * 51792654Sjeff * Discussion: 51892654Sjeff * This could be used to implement pageable allocation, or perhaps 51992654Sjeff * even DMA allocators if used in conjunction with the OFFPAGE 52092654Sjeff * zone flag. 52192654Sjeff */ 52292654Sjeff 52392654Sjeffvoid uma_zone_set_allocf(uma_zone_t zone, uma_alloc allocf); 52492654Sjeff 52592654Sjeff/* 52692654Sjeff * Used for freeing memory provided by the allocf above 52792654Sjeff * 52892654Sjeff * Arguments: 52992654Sjeff * zone The zone that intends to use this free routine. 53092654Sjeff * freef The page freeing routine. 53192654Sjeff * 53292654Sjeff * Returns: 53392654Sjeff * Nothing 53492654Sjeff */ 53592654Sjeff 53692654Sjeffvoid uma_zone_set_freef(uma_zone_t zone, uma_free freef); 53792654Sjeff 53892654Sjeff/* 539184546Skeramida * These flags are setable in the allocf and visible in the freef. 54092654Sjeff */ 54192654Sjeff#define UMA_SLAB_BOOT 0x01 /* Slab alloced from boot pages */ 54292654Sjeff#define UMA_SLAB_KMEM 0x02 /* Slab alloced from kmem_map */ 543177921Salc#define UMA_SLAB_KERNEL 0x04 /* Slab alloced from kernel_map */ 54492654Sjeff#define UMA_SLAB_PRIV 0x08 /* Slab alloced from priv allocator */ 54594157Sjeff#define UMA_SLAB_OFFP 0x10 /* Slab is managed separately */ 54692654Sjeff#define UMA_SLAB_MALLOC 0x20 /* Slab is a large malloc slab */ 54792654Sjeff/* 0x40 and 0x80 are available */ 54892654Sjeff 54992654Sjeff/* 55092654Sjeff * Used to pre-fill a zone with some number of items 55192654Sjeff * 55292654Sjeff * Arguments: 55392654Sjeff * zone The zone to fill 55492654Sjeff * itemcnt The number of items to reserve 55592654Sjeff * 55692654Sjeff * Returns: 55792654Sjeff * Nothing 55892654Sjeff * 55992654Sjeff * NOTE: This is blocking and should only be done at startup 56092654Sjeff */ 56192654Sjeffvoid uma_prealloc(uma_zone_t zone, int itemcnt); 56292654Sjeff 563129906Sbmilekic/* 564129906Sbmilekic * Used to lookup the reference counter allocated for an item 565129906Sbmilekic * from a UMA_ZONE_REFCNT zone. For UMA_ZONE_REFCNT zones, 566129906Sbmilekic * reference counters are allocated for items and stored in 567129906Sbmilekic * the underlying slab header. 568129906Sbmilekic * 569129906Sbmilekic * Arguments: 570129906Sbmilekic * zone The UMA_ZONE_REFCNT zone to which the item belongs. 571129906Sbmilekic * item The address of the item for which we want a refcnt. 572129906Sbmilekic * 573129906Sbmilekic * Returns: 574129906Sbmilekic * A pointer to a u_int32_t reference counter. 575129906Sbmilekic */ 576129906Sbmilekicu_int32_t *uma_find_refcnt(uma_zone_t zone, void *item); 57792654Sjeff 578147996Srwatson/* 579165809Sjhb * Used to determine if a fixed-size zone is exhausted. 580165809Sjhb * 581165809Sjhb * Arguments: 582165809Sjhb * zone The zone to check 583165809Sjhb * 584165809Sjhb * Returns: 585165809Sjhb * Non-zero if zone is exhausted. 586165809Sjhb */ 587165809Sjhbint uma_zone_exhausted(uma_zone_t zone); 588166213Smohansint uma_zone_exhausted_nolock(uma_zone_t zone); 589165809Sjhb 590165809Sjhb/* 591147996Srwatson * Exported statistics structures to be used by user space monitoring tools. 592184546Skeramida * Statistics stream consists of a uma_stream_header, followed by a series of 593184546Skeramida * alternative uma_type_header and uma_type_stat structures. 594147996Srwatson */ 595147996Srwatson#define UMA_STREAM_VERSION 0x00000001 596147996Srwatsonstruct uma_stream_header { 597147996Srwatson u_int32_t ush_version; /* Stream format version. */ 598147996Srwatson u_int32_t ush_maxcpus; /* Value of MAXCPU for stream. */ 599147996Srwatson u_int32_t ush_count; /* Number of records. */ 600147996Srwatson u_int32_t _ush_pad; /* Pad/reserved field. */ 601147996Srwatson}; 602147996Srwatson 603148371Srwatson#define UTH_MAX_NAME 32 604148371Srwatson#define UTH_ZONE_SECONDARY 0x00000001 605147996Srwatsonstruct uma_type_header { 606147996Srwatson /* 607147996Srwatson * Static per-zone data, some extracted from the supporting keg. 608147996Srwatson */ 609148371Srwatson char uth_name[UTH_MAX_NAME]; 610147996Srwatson u_int32_t uth_align; /* Keg: alignment. */ 611147996Srwatson u_int32_t uth_size; /* Keg: requested size of item. */ 612147996Srwatson u_int32_t uth_rsize; /* Keg: real size of item. */ 613147996Srwatson u_int32_t uth_maxpages; /* Keg: maximum number of pages. */ 614147996Srwatson u_int32_t uth_limit; /* Keg: max items to allocate. */ 615147996Srwatson 616147996Srwatson /* 617147996Srwatson * Current dynamic zone/keg-derived statistics. 618147996Srwatson */ 619147996Srwatson u_int32_t uth_pages; /* Keg: pages allocated. */ 620147996Srwatson u_int32_t uth_keg_free; /* Keg: items free. */ 621147996Srwatson u_int32_t uth_zone_free; /* Zone: items free. */ 622147996Srwatson u_int32_t uth_bucketsize; /* Zone: desired bucket size. */ 623148371Srwatson u_int32_t uth_zone_flags; /* Zone: flags. */ 624147996Srwatson u_int64_t uth_allocs; /* Zone: number of allocations. */ 625147996Srwatson u_int64_t uth_frees; /* Zone: number of frees. */ 626148070Srwatson u_int64_t uth_fails; /* Zone: number of alloc failures. */ 627209215Ssbruno u_int64_t uth_sleeps; /* Zone: number of alloc sleeps. */ 628209215Ssbruno u_int64_t _uth_reserved1[2]; /* Reserved. */ 629147996Srwatson}; 630147996Srwatson 631147996Srwatsonstruct uma_percpu_stat { 632184546Skeramida u_int64_t ups_allocs; /* Cache: number of allocations. */ 633147996Srwatson u_int64_t ups_frees; /* Cache: number of frees. */ 634147996Srwatson u_int64_t ups_cache_free; /* Cache: free items in cache. */ 635147996Srwatson u_int64_t _ups_reserved[5]; /* Reserved. */ 636147996Srwatson}; 637147996Srwatson 63892654Sjeff#endif 639