]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - share/man/man9/zone.9
MFV r355071: libbsdxml (expat) 2.2.9.
[FreeBSD/FreeBSD.git] / share / man / man9 / zone.9
1 .\"-
2 .\" Copyright (c) 2001 Dag-Erling Coïdan Smørgrav
3 .\" All rights reserved.
4 .\"
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
7 .\" are met:
8 .\" 1. Redistributions of source code must retain the above copyright
9 .\"    notice, this list of conditions and the following disclaimer.
10 .\" 2. Redistributions in binary form must reproduce the above copyright
11 .\"    notice, this list of conditions and the following disclaimer in the
12 .\"    documentation and/or other materials provided with the distribution.
13 .\"
14 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 .\" SUCH DAMAGE.
25 .\"
26 .\" $FreeBSD$
27 .\"
28 .Dd November 22, 2019
29 .Dt UMA 9
30 .Os
31 .Sh NAME
32 .Nm UMA
33 .Nd general-purpose kernel object allocator
34 .Sh SYNOPSIS
35 .In sys/param.h
36 .In sys/queue.h
37 .In vm/uma.h
38 .Cd "options UMA_FIRSTTOUCH"
39 .Cd "options UMA_XDOMAIN"
40 .Bd -literal
41 typedef int (*uma_ctor)(void *mem, int size, void *arg, int flags);
42 typedef void (*uma_dtor)(void *mem, int size, void *arg);
43 typedef int (*uma_init)(void *mem, int size, int flags);
44 typedef void (*uma_fini)(void *mem, int size);
45 typedef int (*uma_import)(void *arg, void **store, int count, int domain,
46     int flags);
47 typedef void (*uma_release)(void *arg, void **store, int count);
48 typedef void *(*uma_alloc)(uma_zone_t zone, vm_size_t size, int domain,
49     uint8_t *pflag, int wait);
50 typedef void (*uma_free)(void *item, vm_size_t size, uint8_t pflag);
51
52 .Ed
53 .Ft uma_zone_t
54 .Fo uma_zcreate
55 .Fa "char *name" "int size"
56 .Fa "uma_ctor ctor" "uma_dtor dtor" "uma_init zinit" "uma_fini zfini"
57 .Fa "int align" "uint16_t flags"
58 .Fc
59 .Ft uma_zone_t
60 .Fo uma_zcache_create
61 .Fa "char *name" "int size"
62 .Fa "uma_ctor ctor" "uma_dtor dtor" "uma_init zinit" "uma_fini zfini"
63 .Fa "uma_import zimport" "uma_release zrelease"
64 .Fa "void *arg" "int flags"
65 .Fc
66 .Ft uma_zone_t
67 .Fo uma_zsecond_create
68 .Fa "char *name"
69 .Fa "uma_ctor ctor" "uma_dtor dtor" "uma_init zinit" "uma_fini zfini"
70 .Fa "uma_zone_t master"
71 .Fc
72 .Ft void
73 .Fn uma_zdestroy "uma_zone_t zone"
74 .Ft "void *"
75 .Fn uma_zalloc "uma_zone_t zone" "int flags"
76 .Ft "void *"
77 .Fn uma_zalloc_arg "uma_zone_t zone" "void *arg" "int flags"
78 .Ft "void *"
79 .Fn uma_zalloc_domain "uma_zone_t zone" "void *arg" "int domain" "int flags"
80 .Ft "void *"
81 .Fn uma_zalloc_pcpu "uma_zone_t zone" "int flags"
82 .Ft "void *"
83 .Fn uma_zalloc_pcpu_arg "uma_zone_t zone" "void *arg" "int flags"
84 .Ft void
85 .Fn uma_zfree "uma_zone_t zone" "void *item"
86 .Ft void
87 .Fn uma_zfree_arg "uma_zone_t zone" "void *item" "void *arg"
88 .Ft void
89 .Fn uma_zfree_domain "uma_zone_t zone" "void *item" "void *arg"
90 .Ft void
91 .Fn uma_zfree_pcpu "uma_zone_t zone" "void *item"
92 .Ft void
93 .Fn uma_zfree_pcpu_arg "uma_zone_t zone" "void *item" "void *arg"
94 .Ft void
95 .Fn uma_prealloc "uma_zone_t zone" "int nitems"
96 .Ft void
97 .Fn uma_zone_reserve "uma_zone_t zone" "int nitems"
98 .Ft void
99 .Fn uma_zone_reserve_kva "uma_zone_t zone" "int nitems"
100 .Ft void
101 .Fn uma_reclaim "int req"
102 .Ft void
103 .Fn uma_zone_reclaim "uma_zone_t zone" "int req"
104 .Ft void
105 .Fn uma_zone_set_allocf "uma_zone_t zone" "uma_alloc allocf"
106 .Ft void
107 .Fn uma_zone_set_freef "uma_zone_t zone" "uma_free freef"
108 .Ft int
109 .Fn uma_zone_set_max "uma_zone_t zone" "int nitems"
110 .Ft void
111 .Fn uma_zone_set_maxcache "uma_zone_t zone" "int nitems"
112 .Ft int
113 .Fn uma_zone_get_max "uma_zone_t zone"
114 .Ft int
115 .Fn uma_zone_get_cur "uma_zone_t zone"
116 .Ft void
117 .Fn uma_zone_set_warning "uma_zone_t zone" "const char *warning"
118 .Ft void
119 .Fn uma_zone_set_maxaction "uma_zone_t zone" "void (*maxaction)(uma_zone_t)"
120 .Ft void
121 .Fn uma_reclaim
122 .In sys/sysctl.h
123 .Fn SYSCTL_UMA_MAX parent nbr name access zone descr
124 .Fn SYSCTL_ADD_UMA_MAX ctx parent nbr name access zone descr
125 .Fn SYSCTL_UMA_CUR parent nbr name access zone descr
126 .Fn SYSCTL_ADD_UMA_CUR ctx parent nbr name access zone descr
127 .Sh DESCRIPTION
128 UMA (Universal Memory Allocator) provides an efficient interface for managing
129 dynamically-sized collections of items of identical size, referred to as zones.
130 Zones keep track of which items are in use and which
131 are not, and UMA provides functions for allocating items from a zone and
132 for releasing them back, making them available for subsequent allocation requests.
133 Zones maintain per-CPU caches with linear scalability on SMP
134 systems as well as round-robin and first-touch policies for NUMA
135 systems.
136 The number of items cached per CPU is bounded, and each zone additionally
137 maintains an unbounded cache of items that is used to quickly satisfy
138 per-CPU cache allocation misses.
139 .Pp
140 Two types of zones exist: regular zones and cache zones.
141 In a regular zone, items are allocated from a slab, which is one or more
142 virtually contiguous memory pages that have been allocated from the kernel's
143 page allocator.
144 Internally, slabs are managed by a UMA keg, which is responsible for allocating
145 slabs and keeping track of their usage by one or more zones.
146 In typical usage, there is one keg per zone, so slabs are not shared among
147 multiple zones.
148 .Pp
149 Normal zones import items from a keg, and release items back to that keg if
150 requested.
151 Cache zones do not have a keg, and instead use custom import and release
152 methods.
153 For example, some collections of kernel objects are statically allocated
154 at boot-time, and the size of the collection does not change.
155 A cache zone can be used to implement an efficient allocator for the objects in
156 such a collection.
157 .Pp
158 The
159 .Fn uma_zcreate
160 and
161 .Fn uma_zcache_create
162 functions create a new regular zone and cache zone, respectively.
163 The
164 .Fn uma_zsecond_create
165 function creates a regular zone which shares the keg of the zone
166 specified by the
167 .Fa master
168 argument.
169 The
170 .Fa name
171 argument is a text name of the zone for debugging and stats; this memory
172 should not be freed until the zone has been deallocated.
173 .Pp
174 The
175 .Fa ctor
176 and
177 .Fa dtor
178 arguments are callback functions that are called by
179 the UMA subsystem at the time of the call to
180 .Fn uma_zalloc
181 and
182 .Fn uma_zfree
183 respectively.
184 Their purpose is to provide hooks for initializing or
185 destroying things that need to be done at the time of the allocation
186 or release of a resource.
187 A good usage for the
188 .Fa ctor
189 and
190 .Fa dtor
191 callbacks might be to initialize a data structure embedded in the item,
192 such as a
193 .Xr queue 3
194 head.
195 .Pp
196 The
197 .Fa zinit
198 and
199 .Fa zfini
200 arguments are used to optimize the allocation of items from the zone.
201 They are called by the UMA subsystem whenever
202 it needs to allocate or free items to satisfy requests or memory pressure.
203 A good use for the
204 .Fa zinit
205 and
206 .Fa zfini
207 callbacks might be to
208 initialize and destroy a mutex contained within an item.
209 This would allow one to avoid destroying and re-initializing the mutex
210 each time the item is freed and re-allocated.
211 They are not called on each call to
212 .Fn uma_zalloc
213 and
214 .Fn uma_zfree
215 but rather when an item is imported into a zone's cache, and when a zone
216 releases an item to the slab allocator, typically as a response to memory
217 pressure.
218 .Pp
219 For
220 .Fn uma_zcache_create ,
221 the
222 .Fa zimport
223 and
224 .Fa zrelease
225 functions are called to import items into the zone and to release items
226 from the zone, respectively.
227 The
228 .Fa zimport
229 function should store pointers to items in the
230 .Fa store
231 array, which contains a maximum of
232 .Fa count
233 entries.
234 The function must return the number of imported items, which may be less than
235 the maximum.
236 Similarly, the
237 .Fa store
238 parameter to the
239 .Fa zrelease
240 function contains an array of
241 .Fa count
242 pointers to items.
243 The
244 .Fa arg
245 parameter passed to
246 .Fn uma_zcache_create
247 is provided to the import and release functions.
248 The
249 .Fa domain
250 parameter to
251 .Fa zimport
252 specifies the requested
253 .Xr numa 4
254 domain for the allocation.
255 It is either a NUMA domain number or the special value
256 .Dv UMA_ANYDOMAIN .
257 .Pp
258 The
259 .Fa flags
260 argument of
261 .Fn uma_zcreate
262 and
263 .Fn uma_zcache_create
264 is a subset of the following flags:
265 .Bl -tag -width "foo"
266 .It Dv UMA_ZONE_NOFREE
267 Slabs allocated to the zone's keg are never freed.
268 .It Dv UMA_ZONE_NODUMP
269 Pages belonging to the zone will not be included in minidumps.
270 .It Dv UMA_ZONE_PCPU
271 An allocation from zone would have
272 .Va mp_ncpu
273 shadow copies, that are privately assigned to CPUs.
274 A CPU can address its private copy using base the allocation address plus
275 a multiple of the current CPU ID and
276 .Fn sizeof "struct pcpu" :
277 .Bd -literal -offset indent
278 foo_zone = uma_zcreate(..., UMA_ZONE_PCPU);
279  ...
280 foo_base = uma_zalloc(foo_zone, ...);
281  ...
282 critical_enter();
283 foo_pcpu = (foo_t *)zpcpu_get(foo_base);
284 /* do something with foo_pcpu */
285 critical_exit();
286
287 .Ed
288 Note that
289 .Dv M_ZERO
290 cannot be used when allocating items from a PCPU zone.
291 To obtain zeroed memory from a PCPU zone, use the
292 .Fn uma_zalloc_pcpu
293 function and its variants instead, and pass
294 .Dv M_ZERO .
295 .It Dv UMA_ZONE_OFFPAGE
296 By default book-keeping of items within a slab is done in the slab page itself.
297 This flag explicitly tells subsystem that book-keeping structure should be
298 allocated separately from special internal zone.
299 This flag requires either
300 .Dv UMA_ZONE_VTOSLAB
301 or
302 .Dv UMA_ZONE_HASH ,
303 since subsystem requires a mechanism to find a book-keeping structure
304 to an item being freed.
305 The subsystem may choose to prefer offpage book-keeping for certain zones
306 implicitly.
307 .It Dv UMA_ZONE_ZINIT
308 The zone will have its
309 .Ft uma_init
310 method set to internal method that initializes a new allocated slab
311 to all zeros.
312 Do not mistake
313 .Ft uma_init
314 method with
315 .Ft uma_ctor .
316 A zone with
317 .Dv UMA_ZONE_ZINIT
318 flag would not return zeroed memory on every
319 .Fn uma_zalloc .
320 .It Dv UMA_ZONE_HASH
321 The zone should use an internal hash table to find slab book-keeping
322 structure where an allocation being freed belongs to.
323 .It Dv UMA_ZONE_VTOSLAB
324 The zone should use special field of
325 .Vt vm_page_t
326 to find slab book-keeping structure where an allocation being freed belongs to.
327 .It Dv UMA_ZONE_MALLOC
328 The zone is for the
329 .Xr malloc 9
330 subsystem.
331 .It Dv UMA_ZONE_VM
332 The zone is for the VM subsystem.
333 .It Dv UMA_ZONE_NUMA
334 The zone should use a first-touch NUMA policy rather than the round-robin
335 default.
336 If the
337 .Dv UMA_FIRSTTOUCH
338 kernel option is configured, all zones implicitly use a first-touch policy,
339 and the
340 .Dv UMA_ZONE_NUMA
341 flag has no effect.
342 The
343 .Dv UMA_XDOMAIN
344 kernel option, when configured, causes UMA to do the extra tracking to ensure
345 that allocations from first-touch zones are always local.
346 Otherwise, consumers that do not free memory on the same domain from which it
347 was allocated will cause mixing in per-CPU caches.
348 See
349 .Xr numa 4
350 for more details.
351 .El
352 .Pp
353 Zones can be destroyed using
354 .Fn uma_zdestroy ,
355 freeing all memory that is cached in the zone.
356 All items allocated from the zone must be freed to the zone before the zone
357 may be safely destroyed.
358 .Pp
359 To allocate an item from a zone, simply call
360 .Fn uma_zalloc
361 with a pointer to that zone and set the
362 .Fa flags
363 argument to selected flags as documented in
364 .Xr malloc 9 .
365 It will return a pointer to an item if successful, or
366 .Dv NULL
367 in the rare case where all items in the zone are in use and the
368 allocator is unable to grow the zone and
369 .Dv M_NOWAIT
370 is specified.
371 .Pp
372 Items are released back to the zone from which they were allocated by
373 calling
374 .Fn uma_zfree
375 with a pointer to the zone and a pointer to the item.
376 If
377 .Fa item
378 is
379 .Dv NULL ,
380 then
381 .Fn uma_zfree
382 does nothing.
383 .Pp
384 The variants
385 .Fn uma_zalloc_arg
386 and
387 .Fn uma_zfree_arg
388 allow callers to
389 specify an argument for the
390 .Dv ctor
391 and
392 .Dv dtor
393 functions of the zone, respectively.
394 The
395 .Fn uma_zalloc_domain
396 function allows callers to specify a fixed
397 .Xr numa 4
398 domain to allocate from.
399 This uses a guaranteed but slow path in the allocator which reduces
400 concurrency.
401 The
402 .Fn uma_zfree_domain
403 function should be used to return memory allocated in this fashion.
404 This function infers the domain from the pointer and does not require it as an
405 argument.
406 .Pp
407 The
408 .Fn uma_zone_prealloc
409 function allocates slabs for the requested number of items, typically following
410 the initial creation of a zone.
411 Subsequent allocations from the zone will be satisfied using the pre-allocated
412 slabs.
413 Note that slab allocation is performed with the
414 .Dv M_WAITOK
415 flag, so
416 .Fn uma_zone_prealloc
417 may sleep.
418 .Pp
419 The
420 .Fn uma_zone_reserve
421 function sets the number of reserved items for the zone.
422 .Fn uma_zalloc
423 and variants will ensure that the zone contains at least the reserved number
424 of free items.
425 Reserved items may be allocated by specifying
426 .Dv M_USE_RESERVE
427 in the allocation request flags.
428 .Fn uma_zone_reserve
429 does not perform any pre-allocation by itself.
430 .Pp
431 The
432 .Fn uma_zone_reserve_kva
433 function pre-allocates kernel virtual address space for the requested
434 number of items.
435 Subsequent allocations from the zone will be satisfied using the pre-allocated
436 address space.
437 Note that unlike
438 .Fn uma_zone_reserve ,
439 .Fn uma_zone_reserve_kva
440 does not restrict the use of the pre-allocation to
441 .Dv M_USE_RESERVE
442 requests.
443 .Pp
444 The
445 .Fn uma_reclaim
446 and
447 .Fn uma_zone_reclaim
448 functions reclaim cached items from UMA zones, releasing unused memory.
449 The
450 .Fn uma_reclaim
451 function reclaims items from all regular zones, while
452 .Fn uma_zone_reclaim
453 reclaims items only from the specified zone.
454 The
455 .Fa req
456 parameter must be one of three values which specify how aggressively
457 items are to be reclaimed:
458 .Bl -tag -width indent
459 .It Dv UMA_RECLAIM_TRIM
460 Reclaim items only in excess of the zone's estimated working set size.
461 The working set size is periodically updated and tracks the recent history
462 of the zone's usage.
463 .It Dv UMA_RECLAIM_DRAIN
464 Reclaim all items from the unbounded cache.
465 Free items in the per-CPU caches are left alone.
466 .It Dv UMA_RECLAIM_DRAIN_CPU
467 Reclaim all cached items.
468 .El
469 .Pp
470 The
471 .Fn uma_zone_set_allocf
472 and
473 .Fn uma_zone_set_freef
474 functions allow a zone's default slab allocation and free functions to be
475 overridden.
476 This is useful if the zone's items have special memory allocation constraints.
477 For example, if multi-page objects are required to be physically contiguous,
478 an
479 .Fa allocf
480 function which requests contiguous memory from the kernel's page allocator
481 may be used.
482 .Pp
483 The
484 .Fn uma_zone_set_max
485 function limits the number of items
486 .Pq and therefore memory
487 that can be allocated to
488 .Fa zone .
489 The
490 .Fa nitems
491 argument specifies the requested upper limit number of items.
492 The effective limit is returned to the caller, as it may end up being higher
493 than requested due to the implementation rounding up to ensure all memory pages
494 allocated to the zone are utilised to capacity.
495 The limit applies to the total number of items in the zone, which includes
496 allocated items, free items and free items in the per-cpu caches.
497 On systems with more than one CPU it may not be possible to allocate
498 the specified number of items even when there is no shortage of memory,
499 because all of the remaining free items may be in the caches of the
500 other CPUs when the limit is hit.
501 .Pp
502 The
503 .Fn uma_zone_set_maxcache
504 function limits the number of free items which may be cached in the zone.
505 This limit applies to both the per-CPU caches and the cache of free buckets.
506 .Pp
507 The
508 .Fn uma_zone_get_max
509 function returns the effective upper limit number of items for a zone.
510 .Pp
511 The
512 .Fn uma_zone_get_cur
513 function returns an approximation of the number of items currently allocated
514 from the zone.
515 The returned value is approximate because appropriate synchronisation to
516 determine an exact value is not performed by the implementation.
517 This ensures low overhead at the expense of potentially stale data being used
518 in the calculation.
519 .Pp
520 The
521 .Fn uma_zone_set_warning
522 function sets a warning that will be printed on the system console when the
523 given zone becomes full and fails to allocate an item.
524 The warning will be printed no more often than every five minutes.
525 Warnings can be turned off globally by setting the
526 .Va vm.zone_warnings
527 sysctl tunable to
528 .Va 0 .
529 .Pp
530 The
531 .Fn uma_zone_set_maxaction
532 function sets a function that will be called when the given zone becomes full
533 and fails to allocate an item.
534 The function will be called with the zone locked.
535 Also, the function
536 that called the allocation function may have held additional locks.
537 Therefore,
538 this function should do very little work (similar to a signal handler).
539 .Pp
540 The
541 .Fn SYSCTL_UMA_MAX parent nbr name access zone descr
542 macro declares a static
543 .Xr sysctl 9
544 oid that exports the effective upper limit number of items for a zone.
545 The
546 .Fa zone
547 argument should be a pointer to
548 .Vt uma_zone_t .
549 A read of the oid returns value obtained through
550 .Fn uma_zone_get_max .
551 A write to the oid sets new value via
552 .Fn uma_zone_set_max .
553 The
554 .Fn SYSCTL_ADD_UMA_MAX ctx parent nbr name access zone descr
555 macro is provided to create this type of oid dynamically.
556 .Pp
557 The
558 .Fn SYSCTL_UMA_CUR parent nbr name access zone descr
559 macro declares a static read-only
560 .Xr sysctl 9
561 oid that exports the approximate current occupancy of the zone.
562 The
563 .Fa zone
564 argument should be a pointer to
565 .Vt uma_zone_t .
566 A read of the oid returns value obtained through
567 .Fn uma_zone_get_cur .
568 The
569 .Fn SYSCTL_ADD_UMA_CUR ctx parent nbr name zone descr
570 macro is provided to create this type of oid dynamically.
571 .Sh IMPLEMENTATION NOTES
572 The memory that these allocation calls return is not executable.
573 The
574 .Fn uma_zalloc
575 function does not support the
576 .Dv M_EXEC
577 flag to allocate executable memory.
578 Not all platforms enforce a distinction between executable and
579 non-executable memory.
580 .Sh SEE ALSO
581 .Xr numa 4 ,
582 .Xr vmstat 8 ,
583 .Xr malloc 9
584 .Rs
585 .%A Jeff Bonwick
586 .%T "The Slab Allocator: An Object-Caching Kernel Memory Allocator"
587 .%D 1994
588 .Re
589 .Sh HISTORY
590 The zone allocator first appeared in
591 .Fx 3.0 .
592 It was radically changed in
593 .Fx 5.0
594 to function as a slab allocator.
595 .Sh AUTHORS
596 .An -nosplit
597 The zone allocator was written by
598 .An John S. Dyson .
599 The zone allocator was rewritten in large parts by
600 .An Jeff Roberson Aq Mt jeff@FreeBSD.org
601 to function as a slab allocator.
602 .Pp
603 This manual page was written by
604 .An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
605 Changes for UMA by
606 .An Jeroen Ruigrok van der Werven Aq Mt asmodai@FreeBSD.org .