1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2002, 2003, 2004, 2005 Jeffrey Roberson <jeff@FreeBSD.org>
5 * Copyright (c) 2004, 2005 Bosko Milekic <bmilekic@FreeBSD.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice unmodified, this list of conditions, and the following
13 *    disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 */
30
31/*
32 * uma.h - External definitions for the Universal Memory Allocator
33 *
34*/
35
36#ifndef _VM_UMA_H_
37#define _VM_UMA_H_
38
39#include <sys/param.h>		/* For NULL */
40#include <sys/malloc.h>		/* For M_* */
41#include <sys/_smr.h>
42
43/* User visible parameters */
44#define	UMA_SMALLEST_UNIT	8 /* Smallest item allocated */
45
46/* Types and type defs */
47
48struct uma_zone;
49/* Opaque type used as a handle to the zone */
50typedef struct uma_zone * uma_zone_t;
51
52/*
53 * Item constructor
54 *
55 * Arguments:
56 *	item  A pointer to the memory which has been allocated.
57 *	arg   The arg field passed to uma_zalloc_arg
58 *	size  The size of the allocated item
59 *	flags See zalloc flags
60 *
61 * Returns:
62 *	0      on success
63 *      errno  on failure
64 *
65 * Discussion:
66 *	The constructor is called just before the memory is returned
67 *	to the user. It may block if necessary.
68 */
69typedef int (*uma_ctor)(void *mem, int size, void *arg, int flags);
70
71/*
72 * Item destructor
73 *
74 * Arguments:
75 *	item  A pointer to the memory which has been allocated.
76 *	size  The size of the item being destructed.
77 *	arg   Argument passed through uma_zfree_arg
78 *
79 * Returns:
80 *	Nothing
81 *
82 * Discussion:
83 *	The destructor may perform operations that differ from those performed
84 *	by the initializer, but it must leave the object in the same state.
85 *	This IS type stable storage.  This is called after EVERY zfree call.
86 */
87typedef void (*uma_dtor)(void *mem, int size, void *arg);
88
89/*
90 * Item initializer
91 *
92 * Arguments:
93 *	item  A pointer to the memory which has been allocated.
94 *	size  The size of the item being initialized.
95 *	flags See zalloc flags
96 *
97 * Returns:
98 *	0      on success
99 *      errno  on failure
100 *
101 * Discussion:
102 *	The initializer is called when the memory is cached in the uma zone.
103 *	The initializer and the destructor should leave the object in the same
104 *	state.
105 */
106typedef int (*uma_init)(void *mem, int size, int flags);
107
108/*
109 * Item discard function
110 *
111 * Arguments:
112 *	item  A pointer to memory which has been 'freed' but has not left the
113 *	      zone's cache.
114 *	size  The size of the item being discarded.
115 *
116 * Returns:
117 *	Nothing
118 *
119 * Discussion:
120 *	This routine is called when memory leaves a zone and is returned to the
121 *	system for other uses.  It is the counter-part to the init function.
122 */
123typedef void (*uma_fini)(void *mem, int size);
124
125/*
126 * Import new memory into a cache zone.
127 */
128typedef int (*uma_import)(void *arg, void **store, int count, int domain,
129    int flags);
130
131/*
132 * Free memory from a cache zone.
133 */
134typedef void (*uma_release)(void *arg, void **store, int count);
135
136/*
137 * What's the difference between initializing and constructing?
138 *
139 * The item is initialized when it is cached, and this is the state that the
140 * object should be in when returned to the allocator. The purpose of this is
141 * to remove some code which would otherwise be called on each allocation by
142 * utilizing a known, stable state.  This differs from the constructor which
143 * will be called on EVERY allocation.
144 *
145 * For example, in the initializer you may want to initialize embedded locks,
146 * NULL list pointers, set up initial states, magic numbers, etc.  This way if
147 * the object is held in the allocator and re-used it won't be necessary to
148 * re-initialize it.
149 *
150 * The constructor may be used to lock a data structure, link it on to lists,
151 * bump reference counts or total counts of outstanding structures, etc.
152 *
153 */
154
155/* Function proto types */
156
157/*
158 * Create a new uma zone
159 *
160 * Arguments:
161 *	name  The text name of the zone for debugging and stats. This memory
162 *		should not be freed until the zone has been deallocated.
163 *	size  The size of the object that is being created.
164 *	ctor  The constructor that is called when the object is allocated.
165 *	dtor  The destructor that is called when the object is freed.
166 *	init  An initializer that sets up the initial state of the memory.
167 *	fini  A discard function that undoes initialization done by init.
168 *		ctor/dtor/init/fini may all be null, see notes above.
169 *	align A bitmask that corresponds to the requested alignment
170 *		eg 4 would be 0x3
171 *	flags A set of parameters that control the behavior of the zone.
172 *
173 * Returns:
174 *	A pointer to a structure which is intended to be opaque to users of
175 *	the interface.  The value may be null if the wait flag is not set.
176 */
177uma_zone_t uma_zcreate(const char *name, size_t size, uma_ctor ctor,
178		    uma_dtor dtor, uma_init uminit, uma_fini fini,
179		    int align, uint32_t flags);
180
181/*
182 * Create a secondary uma zone
183 *
184 * Arguments:
185 *	name  The text name of the zone for debugging and stats. This memory
186 *		should not be freed until the zone has been deallocated.
187 *	ctor  The constructor that is called when the object is allocated.
188 *	dtor  The destructor that is called when the object is freed.
189 *	zinit  An initializer that sets up the initial state of the memory
190 *		as the object passes from the Keg's slab to the Zone's cache.
191 *	zfini  A discard function that undoes initialization done by init
192 *		as the object passes from the Zone's cache to the Keg's slab.
193 *
194 *		ctor/dtor/zinit/zfini may all be null, see notes above.
195 *		Note that the zinit and zfini specified here are NOT
196 *		exactly the same as the init/fini specified to uma_zcreate()
197 *		when creating a primary zone.  These zinit/zfini are called
198 *		on the TRANSITION from keg to zone (and vice-versa). Once
199 *		these are set, the primary zone may alter its init/fini
200 *		(which are called when the object passes from VM to keg)
201 *		using uma_zone_set_init/fini()) as well as its own
202 *		zinit/zfini (unset by default for primary zone) with
203 *		uma_zone_set_zinit/zfini() (note subtle 'z' prefix).
204 *
205 *	primary A reference to this zone's Primary Zone which contains the
206 *		backing Keg for the Secondary Zone being added.
207 *
208 * Returns:
209 *	A pointer to a structure which is intended to be opaque to users of
210 *	the interface.  The value may be null if the wait flag is not set.
211 */
212uma_zone_t uma_zsecond_create(const char *name, uma_ctor ctor, uma_dtor dtor,
213    uma_init zinit, uma_fini zfini, uma_zone_t primary);
214
215/*
216 * Create cache-only zones.
217 *
218 * This allows uma's per-cpu cache facilities to handle arbitrary
219 * pointers.  Consumers must specify the import and release functions to
220 * fill and destroy caches.  UMA does not allocate any memory for these
221 * zones.  The 'arg' parameter is passed to import/release and is caller
222 * specific.
223 */
224uma_zone_t uma_zcache_create(const char *name, int size, uma_ctor ctor,
225    uma_dtor dtor, uma_init zinit, uma_fini zfini, uma_import zimport,
226    uma_release zrelease, void *arg, int flags);
227
228/*
229 * Definitions for uma_zcreate flags
230 *
231 * These flags share space with UMA_ZFLAGs in uma_int.h.  Be careful not to
232 * overlap when adding new features.
233 */
234#define	UMA_ZONE_UNMANAGED	0x0001	/*
235					 * Don't regulate the cache size, even
236					 * under memory pressure.
237					 */
238#define UMA_ZONE_ZINIT		0x0002	/* Initialize with zeros */
239#define UMA_ZONE_CONTIG		0x0004	/*
240					 * Physical memory underlying an object
241					 * must be contiguous.
242					 */
243#define UMA_ZONE_NOTOUCH	0x0008	/* UMA may not access the memory */
244#define UMA_ZONE_MALLOC		0x0010	/* For use by malloc(9) only! */
245#define UMA_ZONE_NOFREE		0x0020	/* Do not free slabs of this type! */
246#define UMA_ZONE_MTXCLASS	0x0040	/* Create a new lock class */
247#define	UMA_ZONE_VM		0x0080	/*
248					 * Used for internal vm datastructures
249					 * only.
250					 */
251#define	UMA_ZONE_NOTPAGE	0x0100	/* allocf memory not vm pages */
252#define	UMA_ZONE_SECONDARY	0x0200	/* Zone is a Secondary Zone */
253#define	UMA_ZONE_NOBUCKET	0x0400	/* Do not use buckets. */
254#define	UMA_ZONE_MAXBUCKET	0x0800	/* Use largest buckets. */
255#define	UMA_ZONE_CACHESPREAD	0x2000	/*
256					 * Spread memory start locations across
257					 * all possible cache lines.  May
258					 * require many virtually contiguous
259					 * backend pages and can fail early.
260					 */
261#define	UMA_ZONE_NODUMP		0x4000	/*
262					 * Zone's pages will not be included in
263					 * mini-dumps.
264					 */
265#define	UMA_ZONE_PCPU		0x8000	/*
266					 * Allocates mp_maxid + 1 slabs of
267					 * PAGE_SIZE
268					 */
269#define	UMA_ZONE_FIRSTTOUCH	0x10000	/* First touch NUMA policy */
270#define	UMA_ZONE_ROUNDROBIN	0x20000	/* Round-robin NUMA policy. */
271#define	UMA_ZONE_SMR		0x40000 /*
272					 * Safe memory reclamation defers
273					 * frees until all read sections
274					 * have exited.  This flag creates
275					 * a unique SMR context for this
276					 * zone.  To share contexts see
277					 * uma_zone_set_smr() below.
278					 *
279					 * See sys/smr.h for more details.
280					 */
281#define	UMA_ZONE_NOKASAN	0x80000	/*
282					 * Disable KASAN verification.  This is
283					 * implied by NOFREE.  Cache zones are
284					 * not verified by default.
285					 */
286/* In use by UMA_ZFLAGs:	0xffe00000 */
287
288/*
289 * These flags are shared between the keg and zone.  Some are determined
290 * based on physical parameters of the request and may not be provided by
291 * the consumer.
292 */
293#define	UMA_ZONE_INHERIT						\
294    (UMA_ZONE_NOTOUCH | UMA_ZONE_MALLOC | UMA_ZONE_NOFREE |		\
295     UMA_ZONE_VM | UMA_ZONE_NOTPAGE | UMA_ZONE_PCPU |			\
296     UMA_ZONE_FIRSTTOUCH | UMA_ZONE_ROUNDROBIN | UMA_ZONE_NOKASAN)
297
298/* Definitions for align */
299#define UMA_ALIGN_PTR	(sizeof(void *) - 1)	/* Alignment fit for ptr */
300#define UMA_ALIGN_LONG	(sizeof(long) - 1)	/* "" long */
301#define UMA_ALIGN_INT	(sizeof(int) - 1)	/* "" int */
302#define UMA_ALIGN_SHORT	(sizeof(short) - 1)	/* "" short */
303#define UMA_ALIGN_CHAR	(sizeof(char) - 1)	/* "" char */
304#define UMA_ALIGN_CACHE	(uma_get_cache_align_mask()) /* Cache line size align */
305/* Align both to cache line size and an explicit alignment (through mask). */
306#define UMA_ALIGN_CACHE_AND_MASK(mask) (uma_get_cache_align_mask() | (mask))
307#define	UMA_ALIGNOF(type) (_Alignof(type) - 1)	/* Alignment fit for 'type' */
308
309#define	UMA_ANYDOMAIN	-1	/* Special value for domain search. */
310
311/*
312 * Destroys an empty uma zone.  If the zone is not empty uma complains loudly.
313 *
314 * Arguments:
315 *	zone  The zone we want to destroy.
316 *
317 */
318void uma_zdestroy(uma_zone_t zone);
319
320/*
321 * Allocates an item out of a zone
322 *
323 * Arguments:
324 *	zone  The zone we are allocating from
325 *	arg   This data is passed to the ctor function
326 *	flags See sys/malloc.h for available flags.
327 *
328 * Returns:
329 *	A non-null pointer to an initialized element from the zone is
330 *	guaranteed if the wait flag is M_WAITOK.  Otherwise a null pointer
331 *	may be returned if the zone is empty or the ctor failed.
332 */
333
334void *uma_zalloc_arg(uma_zone_t zone, void *arg, int flags);
335
336/* Allocate per-cpu data.  Access the correct data with zpcpu_get(). */
337void *uma_zalloc_pcpu_arg(uma_zone_t zone, void *arg, int flags);
338
339/* Use with SMR zones. */
340void *uma_zalloc_smr(uma_zone_t zone, int flags);
341
342/*
343 * Allocate an item from a specific NUMA domain.  This uses a slow path in
344 * the allocator but is guaranteed to allocate memory from the requested
345 * domain if M_WAITOK is set.
346 *
347 * Arguments:
348 *	zone  The zone we are allocating from
349 *	arg   This data is passed to the ctor function
350 *	domain The domain to allocate from.
351 *	flags See sys/malloc.h for available flags.
352 */
353void *uma_zalloc_domain(uma_zone_t zone, void *arg, int domain, int flags);
354
355/*
356 * Allocates an item out of a zone without supplying an argument
357 *
358 * This is just a wrapper for uma_zalloc_arg for convenience.
359 *
360 */
361static __inline void *uma_zalloc(uma_zone_t zone, int flags);
362static __inline void *uma_zalloc_pcpu(uma_zone_t zone, int flags);
363
364static __inline void *
365uma_zalloc(uma_zone_t zone, int flags)
366{
367	return uma_zalloc_arg(zone, NULL, flags);
368}
369
370static __inline void *
371uma_zalloc_pcpu(uma_zone_t zone, int flags)
372{
373	return uma_zalloc_pcpu_arg(zone, NULL, flags);
374}
375
376/*
377 * Frees an item back into the specified zone.
378 *
379 * Arguments:
380 *	zone  The zone the item was originally allocated out of.
381 *	item  The memory to be freed.
382 *	arg   Argument passed to the destructor
383 *
384 * Returns:
385 *	Nothing.
386 */
387
388void uma_zfree_arg(uma_zone_t zone, void *item, void *arg);
389
390/* Use with PCPU zones. */
391void uma_zfree_pcpu_arg(uma_zone_t zone, void *item, void *arg);
392
393/* Use with SMR zones. */
394void uma_zfree_smr(uma_zone_t zone, void *item);
395
396/*
397 * Frees an item back to a zone without supplying an argument
398 *
399 * This is just a wrapper for uma_zfree_arg for convenience.
400 *
401 */
402static __inline void uma_zfree(uma_zone_t zone, void *item);
403static __inline void uma_zfree_pcpu(uma_zone_t zone, void *item);
404
405static __inline void
406uma_zfree(uma_zone_t zone, void *item)
407{
408	uma_zfree_arg(zone, item, NULL);
409}
410
411static __inline void
412uma_zfree_pcpu(uma_zone_t zone, void *item)
413{
414	uma_zfree_pcpu_arg(zone, item, NULL);
415}
416
417/*
418 * Wait until the specified zone can allocate an item.
419 */
420void uma_zwait(uma_zone_t zone);
421
422/*
423 * Backend page supplier routines
424 *
425 * Arguments:
426 *	zone  The zone that is requesting pages.
427 *	size  The number of bytes being requested.
428 *	pflag Flags for these memory pages, see below.
429 *	domain The NUMA domain that we prefer for this allocation.
430 *	wait  Indicates our willingness to block.
431 *
432 * Returns:
433 *	A pointer to the allocated memory or NULL on failure.
434 */
435
436typedef void *(*uma_alloc)(uma_zone_t zone, vm_size_t size, int domain,
437    uint8_t *pflag, int wait);
438
439/*
440 * Backend page free routines
441 *
442 * Arguments:
443 *	item  A pointer to the previously allocated pages.
444 *	size  The original size of the allocation.
445 *	pflag The flags for the slab.  See UMA_SLAB_* below.
446 *
447 * Returns:
448 *	None
449 */
450typedef void (*uma_free)(void *item, vm_size_t size, uint8_t pflag);
451
452/*
453 * Reclaims unused memory.  If no NUMA domain is specified, memory from all
454 * domains is reclaimed.
455 *
456 * Arguments:
457 *	req    Reclamation request type.
458 *	domain The target NUMA domain.
459 * Returns:
460 *	None
461 */
462#define	UMA_RECLAIM_DRAIN	1	/* release bucket cache */
463#define	UMA_RECLAIM_DRAIN_CPU	2	/* release bucket and per-CPU caches */
464#define	UMA_RECLAIM_TRIM	3	/* trim bucket cache to WSS */
465void uma_reclaim(int req);
466void uma_reclaim_domain(int req, int domain);
467void uma_zone_reclaim(uma_zone_t, int req);
468void uma_zone_reclaim_domain(uma_zone_t, int req, int domain);
469
470/*
471 * Sets the alignment mask to be used for all zones requesting cache
472 * alignment.  Should be called by MD boot code prior to starting VM/UMA.
473 *
474 * Arguments:
475 *	mask The alignment mask
476 *
477 * Returns:
478 *	Nothing
479 */
480void uma_set_cache_align_mask(unsigned int mask);
481
482#include <vm/uma_align_mask.h>
483
484/*
485 * Set a reserved number of items to hold for M_USE_RESERVE allocations.  All
486 * other requests must allocate new backing pages.
487 */
488void uma_zone_reserve(uma_zone_t zone, int nitems);
489
490/*
491 * Reserves the maximum KVA space required by the zone and configures the zone
492 * to use a backend that allocates physical memory and maps it using the
493 * reserved KVA.
494 *
495 * Arguments:
496 *	zone  The zone to update.
497 *	nitems  The upper limit on the number of items that can be allocated.
498 *
499 * Returns:
500 *	0  if KVA space can not be allocated
501 *	1  if successful
502 *
503 * Discussion:
504 *	When the machine supports a direct map and the zone's items are smaller
505 *	than a page, the zone will use the direct map instead of allocating KVA
506 *	space.
507 */
508int uma_zone_reserve_kva(uma_zone_t zone, int nitems);
509
510/*
511 * Sets an upper limit on the number of items allocated from a zone
512 *
513 * Arguments:
514 *	zone  The zone to limit
515 *	nitems  The requested upper limit on the number of items allowed
516 *
517 * Returns:
518 *	int  The effective value of nitems
519 */
520int uma_zone_set_max(uma_zone_t zone, int nitems);
521
522/*
523 * Sets an upper limit on the number of items allowed in zone's caches
524 *
525 * Arguments:
526 *      zone  The zone to limit
527 *      nitems  The requested upper limit on the number of items allowed
528 */
529void uma_zone_set_maxcache(uma_zone_t zone, int nitems);
530
531/*
532 * Obtains the effective limit on the number of items in a zone
533 *
534 * Arguments:
535 *	zone  The zone to obtain the effective limit from
536 *
537 * Return:
538 *	0  No limit
539 *	int  The effective limit of the zone
540 */
541int uma_zone_get_max(uma_zone_t zone);
542
543/*
544 * Sets a warning to be printed when limit is reached
545 *
546 * Arguments:
547 *	zone  The zone we will warn about
548 *	warning  Warning content
549 *
550 * Returns:
551 *	Nothing
552 */
553void uma_zone_set_warning(uma_zone_t zone, const char *warning);
554
555/*
556 * Sets a function to run when limit is reached
557 *
558 * Arguments:
559 *	zone  The zone to which this applies
560 *	fx  The function ro run
561 *
562 * Returns:
563 *	Nothing
564 */
565typedef void (*uma_maxaction_t)(uma_zone_t, int);
566void uma_zone_set_maxaction(uma_zone_t zone, uma_maxaction_t);
567
568/*
569 * Obtains the approximate current number of items allocated from a zone
570 *
571 * Arguments:
572 *	zone  The zone to obtain the current allocation count from
573 *
574 * Return:
575 *	int  The approximate current number of items allocated from the zone
576 */
577int uma_zone_get_cur(uma_zone_t zone);
578
579/*
580 * The following two routines (uma_zone_set_init/fini)
581 * are used to set the backend init/fini pair which acts on an
582 * object as it becomes allocated and is placed in a slab within
583 * the specified zone's backing keg.  These should probably not
584 * be changed once allocations have already begun, but only be set
585 * immediately upon zone creation.
586 */
587void uma_zone_set_init(uma_zone_t zone, uma_init uminit);
588void uma_zone_set_fini(uma_zone_t zone, uma_fini fini);
589
590/*
591 * The following two routines (uma_zone_set_zinit/zfini) are
592 * used to set the zinit/zfini pair which acts on an object as
593 * it passes from the backing Keg's slab cache to the
594 * specified Zone's bucket cache.  These should probably not
595 * be changed once allocations have already begun, but only be set
596 * immediately upon zone creation.
597 */
598void uma_zone_set_zinit(uma_zone_t zone, uma_init zinit);
599void uma_zone_set_zfini(uma_zone_t zone, uma_fini zfini);
600
601/*
602 * Replaces the standard backend allocator for this zone.
603 *
604 * Arguments:
605 *	zone   The zone whose backend allocator is being changed.
606 *	allocf A pointer to the allocation function
607 *
608 * Returns:
609 *	Nothing
610 *
611 * Discussion:
612 *	This could be used to implement pageable allocation, or perhaps
613 *	even DMA allocators if used in conjunction with the OFFPAGE
614 *	zone flag.
615 */
616
617void uma_zone_set_allocf(uma_zone_t zone, uma_alloc allocf);
618
619/*
620 * Used for freeing memory provided by the allocf above
621 *
622 * Arguments:
623 *	zone  The zone that intends to use this free routine.
624 *	freef The page freeing routine.
625 *
626 * Returns:
627 *	Nothing
628 */
629
630void uma_zone_set_freef(uma_zone_t zone, uma_free freef);
631
632/*
633 * Associate a zone with a smr context that is allocated after creation
634 * so that multiple zones may share the same context.
635 */
636void uma_zone_set_smr(uma_zone_t zone, smr_t smr);
637
638/*
639 * Fetch the smr context that was set or made in uma_zcreate().
640 */
641smr_t uma_zone_get_smr(uma_zone_t zone);
642
643/*
644 * These flags are settable in the allocf and visible in the freef.
645 */
646#define UMA_SLAB_BOOT	0x01		/* Slab alloced from boot pages */
647#define UMA_SLAB_KERNEL	0x04		/* Slab alloced from kmem */
648#define UMA_SLAB_PRIV	0x08		/* Slab alloced from priv allocator */
649/* 0x02, 0x10, 0x40, and 0x80 are available */
650
651/*
652 * Used to pre-fill a zone with some number of items
653 *
654 * Arguments:
655 *	zone    The zone to fill
656 *	itemcnt The number of items to reserve
657 *
658 * Returns:
659 *	Nothing
660 *
661 * NOTE: This is blocking and should only be done at startup
662 */
663void uma_prealloc(uma_zone_t zone, int itemcnt);
664
665/*
666 * Used to determine if a fixed-size zone is exhausted.
667 *
668 * Arguments:
669 *	zone    The zone to check
670 *
671 * Returns:
672 *	Non-zero if zone is exhausted.
673 */
674int uma_zone_exhausted(uma_zone_t zone);
675
676/*
677 * Returns the bytes of memory consumed by the zone.
678 */
679size_t uma_zone_memory(uma_zone_t zone);
680
681/*
682 * Common UMA_ZONE_PCPU zones.
683 */
684extern uma_zone_t pcpu_zone_4;
685extern uma_zone_t pcpu_zone_8;
686extern uma_zone_t pcpu_zone_16;
687extern uma_zone_t pcpu_zone_32;
688extern uma_zone_t pcpu_zone_64;
689
690/*
691 * Exported statistics structures to be used by user space monitoring tools.
692 * Statistics stream consists of a uma_stream_header, followed by a series of
693 * alternative uma_type_header and uma_type_stat structures.
694 */
695#define	UMA_STREAM_VERSION	0x00000001
696struct uma_stream_header {
697	uint32_t	ush_version;	/* Stream format version. */
698	uint32_t	ush_maxcpus;	/* Value of MAXCPU for stream. */
699	uint32_t	ush_count;	/* Number of records. */
700	uint32_t	_ush_pad;	/* Pad/reserved field. */
701};
702
703#define	UTH_MAX_NAME	32
704#define	UTH_ZONE_SECONDARY	0x00000001
705struct uma_type_header {
706	/*
707	 * Static per-zone data, some extracted from the supporting keg.
708	 */
709	char		uth_name[UTH_MAX_NAME];
710	uint32_t	uth_align;	/* Keg: alignment. */
711	uint32_t	uth_size;	/* Keg: requested size of item. */
712	uint32_t	uth_rsize;	/* Keg: real size of item. */
713	uint32_t	uth_maxpages;	/* Keg: maximum number of pages. */
714	uint32_t	uth_limit;	/* Keg: max items to allocate. */
715
716	/*
717	 * Current dynamic zone/keg-derived statistics.
718	 */
719	uint32_t	uth_pages;	/* Keg: pages allocated. */
720	uint32_t	uth_keg_free;	/* Keg: items free. */
721	uint32_t	uth_zone_free;	/* Zone: items free. */
722	uint32_t	uth_bucketsize;	/* Zone: desired bucket size. */
723	uint32_t	uth_zone_flags;	/* Zone: flags. */
724	uint64_t	uth_allocs;	/* Zone: number of allocations. */
725	uint64_t	uth_frees;	/* Zone: number of frees. */
726	uint64_t	uth_fails;	/* Zone: number of alloc failures. */
727	uint64_t	uth_sleeps;	/* Zone: number of alloc sleeps. */
728	uint64_t	uth_xdomain;	/* Zone: Number of cross domain frees. */
729	uint64_t	_uth_reserved1[1];	/* Reserved. */
730};
731
732struct uma_percpu_stat {
733	uint64_t	ups_allocs;	/* Cache: number of allocations. */
734	uint64_t	ups_frees;	/* Cache: number of frees. */
735	uint64_t	ups_cache_free;	/* Cache: free items in cache. */
736	uint64_t	_ups_reserved[5];	/* Reserved. */
737};
738
739void uma_reclaim_wakeup(void);
740void uma_reclaim_worker(void *);
741
742unsigned long uma_limit(void);
743
744/* Return the amount of memory managed by UMA. */
745unsigned long uma_size(void);
746
747/* Return the amount of memory remaining.  May be negative. */
748long uma_avail(void);
749
750#endif	/* _VM_UMA_H_ */
751