]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/vm/uma_core.c
uma: Use LIFO for non-SMR bucket caches
[FreeBSD/FreeBSD.git] / sys / vm / uma_core.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2002-2019 Jeffrey Roberson <jeff@FreeBSD.org>
5  * Copyright (c) 2004, 2005 Bosko Milekic <bmilekic@FreeBSD.org>
6  * Copyright (c) 2004-2006 Robert N. M. Watson
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice unmodified, this list of conditions, and the following
14  *    disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 /*
32  * uma_core.c  Implementation of the Universal Memory allocator
33  *
34  * This allocator is intended to replace the multitude of similar object caches
35  * in the standard FreeBSD kernel.  The intent is to be flexible as well as
36  * efficient.  A primary design goal is to return unused memory to the rest of
37  * the system.  This will make the system as a whole more flexible due to the
38  * ability to move memory to subsystems which most need it instead of leaving
39  * pools of reserved memory unused.
40  *
41  * The basic ideas stem from similar slab/zone based allocators whose algorithms
42  * are well known.
43  *
44  */
45
46 /*
47  * TODO:
48  *      - Improve memory usage for large allocations
49  *      - Investigate cache size adjustments
50  */
51
52 #include <sys/cdefs.h>
53 __FBSDID("$FreeBSD$");
54
55 #include "opt_ddb.h"
56 #include "opt_param.h"
57 #include "opt_vm.h"
58
59 #include <sys/param.h>
60 #include <sys/systm.h>
61 #include <sys/bitset.h>
62 #include <sys/domainset.h>
63 #include <sys/eventhandler.h>
64 #include <sys/kernel.h>
65 #include <sys/types.h>
66 #include <sys/limits.h>
67 #include <sys/queue.h>
68 #include <sys/malloc.h>
69 #include <sys/ktr.h>
70 #include <sys/lock.h>
71 #include <sys/sysctl.h>
72 #include <sys/mutex.h>
73 #include <sys/proc.h>
74 #include <sys/random.h>
75 #include <sys/rwlock.h>
76 #include <sys/sbuf.h>
77 #include <sys/sched.h>
78 #include <sys/sleepqueue.h>
79 #include <sys/smp.h>
80 #include <sys/smr.h>
81 #include <sys/taskqueue.h>
82 #include <sys/vmmeter.h>
83
84 #include <vm/vm.h>
85 #include <vm/vm_domainset.h>
86 #include <vm/vm_object.h>
87 #include <vm/vm_page.h>
88 #include <vm/vm_pageout.h>
89 #include <vm/vm_param.h>
90 #include <vm/vm_phys.h>
91 #include <vm/vm_pagequeue.h>
92 #include <vm/vm_map.h>
93 #include <vm/vm_kern.h>
94 #include <vm/vm_extern.h>
95 #include <vm/uma.h>
96 #include <vm/uma_int.h>
97 #include <vm/uma_dbg.h>
98
99 #include <ddb/ddb.h>
100
101 #ifdef DEBUG_MEMGUARD
102 #include <vm/memguard.h>
103 #endif
104
105 #include <machine/md_var.h>
106
107 #ifdef INVARIANTS
108 #define UMA_ALWAYS_CTORDTOR     1
109 #else
110 #define UMA_ALWAYS_CTORDTOR     0
111 #endif
112
113 /*
114  * This is the zone and keg from which all zones are spawned.
115  */
116 static uma_zone_t kegs;
117 static uma_zone_t zones;
118
119 /*
120  * On INVARIANTS builds, the slab contains a second bitset of the same size,
121  * "dbg_bits", which is laid out immediately after us_free.
122  */
123 #ifdef INVARIANTS
124 #define SLAB_BITSETS    2
125 #else
126 #define SLAB_BITSETS    1
127 #endif
128
129 /*
130  * These are the two zones from which all offpage uma_slab_ts are allocated.
131  *
132  * One zone is for slab headers that can represent a larger number of items,
133  * making the slabs themselves more efficient, and the other zone is for
134  * headers that are smaller and represent fewer items, making the headers more
135  * efficient.
136  */
137 #define SLABZONE_SIZE(setsize)                                  \
138     (sizeof(struct uma_hash_slab) + BITSET_SIZE(setsize) * SLAB_BITSETS)
139 #define SLABZONE0_SETSIZE       (PAGE_SIZE / 16)
140 #define SLABZONE1_SETSIZE       SLAB_MAX_SETSIZE
141 #define SLABZONE0_SIZE  SLABZONE_SIZE(SLABZONE0_SETSIZE)
142 #define SLABZONE1_SIZE  SLABZONE_SIZE(SLABZONE1_SETSIZE)
143 static uma_zone_t slabzones[2];
144
145 /*
146  * The initial hash tables come out of this zone so they can be allocated
147  * prior to malloc coming up.
148  */
149 static uma_zone_t hashzone;
150
151 /* The boot-time adjusted value for cache line alignment. */
152 int uma_align_cache = 64 - 1;
153
154 static MALLOC_DEFINE(M_UMAHASH, "UMAHash", "UMA Hash Buckets");
155 static MALLOC_DEFINE(M_UMA, "UMA", "UMA Misc");
156
157 /*
158  * Are we allowed to allocate buckets?
159  */
160 static int bucketdisable = 1;
161
162 /* Linked list of all kegs in the system */
163 static LIST_HEAD(,uma_keg) uma_kegs = LIST_HEAD_INITIALIZER(uma_kegs);
164
165 /* Linked list of all cache-only zones in the system */
166 static LIST_HEAD(,uma_zone) uma_cachezones =
167     LIST_HEAD_INITIALIZER(uma_cachezones);
168
169 /* This RW lock protects the keg list */
170 static struct rwlock_padalign __exclusive_cache_line uma_rwlock;
171
172 /*
173  * First available virual address for boot time allocations.
174  */
175 static vm_offset_t bootstart;
176 static vm_offset_t bootmem;
177
178 static struct sx uma_reclaim_lock;
179
180 /*
181  * kmem soft limit, initialized by uma_set_limit().  Ensure that early
182  * allocations don't trigger a wakeup of the reclaim thread.
183  */
184 unsigned long uma_kmem_limit = LONG_MAX;
185 SYSCTL_ULONG(_vm, OID_AUTO, uma_kmem_limit, CTLFLAG_RD, &uma_kmem_limit, 0,
186     "UMA kernel memory soft limit");
187 unsigned long uma_kmem_total;
188 SYSCTL_ULONG(_vm, OID_AUTO, uma_kmem_total, CTLFLAG_RD, &uma_kmem_total, 0,
189     "UMA kernel memory usage");
190
191 /* Is the VM done starting up? */
192 static enum {
193         BOOT_COLD,
194         BOOT_KVA,
195         BOOT_PCPU,
196         BOOT_RUNNING,
197         BOOT_SHUTDOWN,
198 } booted = BOOT_COLD;
199
200 /*
201  * This is the handle used to schedule events that need to happen
202  * outside of the allocation fast path.
203  */
204 static struct callout uma_callout;
205 #define UMA_TIMEOUT     20              /* Seconds for callout interval. */
206
207 /*
208  * This structure is passed as the zone ctor arg so that I don't have to create
209  * a special allocation function just for zones.
210  */
211 struct uma_zctor_args {
212         const char *name;
213         size_t size;
214         uma_ctor ctor;
215         uma_dtor dtor;
216         uma_init uminit;
217         uma_fini fini;
218         uma_import import;
219         uma_release release;
220         void *arg;
221         uma_keg_t keg;
222         int align;
223         uint32_t flags;
224 };
225
226 struct uma_kctor_args {
227         uma_zone_t zone;
228         size_t size;
229         uma_init uminit;
230         uma_fini fini;
231         int align;
232         uint32_t flags;
233 };
234
235 struct uma_bucket_zone {
236         uma_zone_t      ubz_zone;
237         const char      *ubz_name;
238         int             ubz_entries;    /* Number of items it can hold. */
239         int             ubz_maxsize;    /* Maximum allocation size per-item. */
240 };
241
242 /*
243  * Compute the actual number of bucket entries to pack them in power
244  * of two sizes for more efficient space utilization.
245  */
246 #define BUCKET_SIZE(n)                                          \
247     (((sizeof(void *) * (n)) - sizeof(struct uma_bucket)) / sizeof(void *))
248
249 #define BUCKET_MAX      BUCKET_SIZE(256)
250 #define BUCKET_MIN      2
251
252 struct uma_bucket_zone bucket_zones[] = {
253         /* Literal bucket sizes. */
254         { NULL, "2 Bucket", 2, 4096 },
255         { NULL, "4 Bucket", 4, 3072 },
256         { NULL, "8 Bucket", 8, 2048 },
257         { NULL, "16 Bucket", 16, 1024 },
258         /* Rounded down power of 2 sizes for efficiency. */
259         { NULL, "32 Bucket", BUCKET_SIZE(32), 512 },
260         { NULL, "64 Bucket", BUCKET_SIZE(64), 256 },
261         { NULL, "128 Bucket", BUCKET_SIZE(128), 128 },
262         { NULL, "256 Bucket", BUCKET_SIZE(256), 64 },
263         { NULL, NULL, 0}
264 };
265
266 /*
267  * Flags and enumerations to be passed to internal functions.
268  */
269 enum zfreeskip {
270         SKIP_NONE =     0,
271         SKIP_CNT =      0x00000001,
272         SKIP_DTOR =     0x00010000,
273         SKIP_FINI =     0x00020000,
274 };
275
276 /* Prototypes.. */
277
278 void    uma_startup1(vm_offset_t);
279 void    uma_startup2(void);
280
281 static void *noobj_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int);
282 static void *page_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int);
283 static void *pcpu_page_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int);
284 static void *startup_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int);
285 static void *contig_alloc(uma_zone_t, vm_size_t, int, uint8_t *, int);
286 static void page_free(void *, vm_size_t, uint8_t);
287 static void pcpu_page_free(void *, vm_size_t, uint8_t);
288 static uma_slab_t keg_alloc_slab(uma_keg_t, uma_zone_t, int, int, int);
289 static void cache_drain(uma_zone_t);
290 static void bucket_drain(uma_zone_t, uma_bucket_t);
291 static void bucket_cache_reclaim(uma_zone_t zone, bool);
292 static int keg_ctor(void *, int, void *, int);
293 static void keg_dtor(void *, int, void *);
294 static int zone_ctor(void *, int, void *, int);
295 static void zone_dtor(void *, int, void *);
296 static inline void item_dtor(uma_zone_t zone, void *item, int size,
297     void *udata, enum zfreeskip skip);
298 static int zero_init(void *, int, int);
299 static void zone_free_bucket(uma_zone_t zone, uma_bucket_t bucket, void *udata,
300     int itemdomain, bool ws);
301 static void zone_foreach(void (*zfunc)(uma_zone_t, void *), void *);
302 static void zone_foreach_unlocked(void (*zfunc)(uma_zone_t, void *), void *);
303 static void zone_timeout(uma_zone_t zone, void *);
304 static int hash_alloc(struct uma_hash *, u_int);
305 static int hash_expand(struct uma_hash *, struct uma_hash *);
306 static void hash_free(struct uma_hash *hash);
307 static void uma_timeout(void *);
308 static void uma_shutdown(void);
309 static void *zone_alloc_item(uma_zone_t, void *, int, int);
310 static void zone_free_item(uma_zone_t, void *, void *, enum zfreeskip);
311 static int zone_alloc_limit(uma_zone_t zone, int count, int flags);
312 static void zone_free_limit(uma_zone_t zone, int count);
313 static void bucket_enable(void);
314 static void bucket_init(void);
315 static uma_bucket_t bucket_alloc(uma_zone_t zone, void *, int);
316 static void bucket_free(uma_zone_t zone, uma_bucket_t, void *);
317 static void bucket_zone_drain(void);
318 static uma_bucket_t zone_alloc_bucket(uma_zone_t, void *, int, int);
319 static void *slab_alloc_item(uma_keg_t keg, uma_slab_t slab);
320 static void slab_free_item(uma_zone_t zone, uma_slab_t slab, void *item);
321 static uma_keg_t uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit,
322     uma_fini fini, int align, uint32_t flags);
323 static int zone_import(void *, void **, int, int, int);
324 static void zone_release(void *, void **, int);
325 static bool cache_alloc(uma_zone_t, uma_cache_t, void *, int);
326 static bool cache_free(uma_zone_t, uma_cache_t, void *, void *, int);
327
328 static int sysctl_vm_zone_count(SYSCTL_HANDLER_ARGS);
329 static int sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS);
330 static int sysctl_handle_uma_zone_allocs(SYSCTL_HANDLER_ARGS);
331 static int sysctl_handle_uma_zone_frees(SYSCTL_HANDLER_ARGS);
332 static int sysctl_handle_uma_zone_flags(SYSCTL_HANDLER_ARGS);
333 static int sysctl_handle_uma_slab_efficiency(SYSCTL_HANDLER_ARGS);
334 static int sysctl_handle_uma_zone_items(SYSCTL_HANDLER_ARGS);
335
336 static uint64_t uma_zone_get_allocs(uma_zone_t zone);
337
338 static SYSCTL_NODE(_vm, OID_AUTO, debug, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
339     "Memory allocation debugging");
340
341 #ifdef INVARIANTS
342 static uint64_t uma_keg_get_allocs(uma_keg_t zone);
343 static inline struct noslabbits *slab_dbg_bits(uma_slab_t slab, uma_keg_t keg);
344
345 static bool uma_dbg_kskip(uma_keg_t keg, void *mem);
346 static bool uma_dbg_zskip(uma_zone_t zone, void *mem);
347 static void uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item);
348 static void uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item);
349
350 static u_int dbg_divisor = 1;
351 SYSCTL_UINT(_vm_debug, OID_AUTO, divisor,
352     CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &dbg_divisor, 0,
353     "Debug & thrash every this item in memory allocator");
354
355 static counter_u64_t uma_dbg_cnt = EARLY_COUNTER;
356 static counter_u64_t uma_skip_cnt = EARLY_COUNTER;
357 SYSCTL_COUNTER_U64(_vm_debug, OID_AUTO, trashed, CTLFLAG_RD,
358     &uma_dbg_cnt, "memory items debugged");
359 SYSCTL_COUNTER_U64(_vm_debug, OID_AUTO, skipped, CTLFLAG_RD,
360     &uma_skip_cnt, "memory items skipped, not debugged");
361 #endif
362
363 SYSCTL_NODE(_vm, OID_AUTO, uma, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
364     "Universal Memory Allocator");
365
366 SYSCTL_PROC(_vm, OID_AUTO, zone_count, CTLFLAG_RD|CTLFLAG_MPSAFE|CTLTYPE_INT,
367     0, 0, sysctl_vm_zone_count, "I", "Number of UMA zones");
368
369 SYSCTL_PROC(_vm, OID_AUTO, zone_stats, CTLFLAG_RD|CTLFLAG_MPSAFE|CTLTYPE_STRUCT,
370     0, 0, sysctl_vm_zone_stats, "s,struct uma_type_header", "Zone Stats");
371
372 static int zone_warnings = 1;
373 SYSCTL_INT(_vm, OID_AUTO, zone_warnings, CTLFLAG_RWTUN, &zone_warnings, 0,
374     "Warn when UMA zones becomes full");
375
376 static int multipage_slabs = 1;
377 TUNABLE_INT("vm.debug.uma_multipage_slabs", &multipage_slabs);
378 SYSCTL_INT(_vm_debug, OID_AUTO, uma_multipage_slabs,
379     CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &multipage_slabs, 0,
380     "UMA may choose larger slab sizes for better efficiency");
381
382 /*
383  * Select the slab zone for an offpage slab with the given maximum item count.
384  */
385 static inline uma_zone_t
386 slabzone(int ipers)
387 {
388
389         return (slabzones[ipers > SLABZONE0_SETSIZE]);
390 }
391
392 /*
393  * This routine checks to see whether or not it's safe to enable buckets.
394  */
395 static void
396 bucket_enable(void)
397 {
398
399         KASSERT(booted >= BOOT_KVA, ("Bucket enable before init"));
400         bucketdisable = vm_page_count_min();
401 }
402
403 /*
404  * Initialize bucket_zones, the array of zones of buckets of various sizes.
405  *
406  * For each zone, calculate the memory required for each bucket, consisting
407  * of the header and an array of pointers.
408  */
409 static void
410 bucket_init(void)
411 {
412         struct uma_bucket_zone *ubz;
413         int size;
414
415         for (ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++) {
416                 size = roundup(sizeof(struct uma_bucket), sizeof(void *));
417                 size += sizeof(void *) * ubz->ubz_entries;
418                 ubz->ubz_zone = uma_zcreate(ubz->ubz_name, size,
419                     NULL, NULL, NULL, NULL, UMA_ALIGN_PTR,
420                     UMA_ZONE_MTXCLASS | UMA_ZFLAG_BUCKET |
421                     UMA_ZONE_FIRSTTOUCH);
422         }
423 }
424
425 /*
426  * Given a desired number of entries for a bucket, return the zone from which
427  * to allocate the bucket.
428  */
429 static struct uma_bucket_zone *
430 bucket_zone_lookup(int entries)
431 {
432         struct uma_bucket_zone *ubz;
433
434         for (ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++)
435                 if (ubz->ubz_entries >= entries)
436                         return (ubz);
437         ubz--;
438         return (ubz);
439 }
440
441 static struct uma_bucket_zone *
442 bucket_zone_max(uma_zone_t zone, int nitems)
443 {
444         struct uma_bucket_zone *ubz;
445         int bpcpu;
446
447         bpcpu = 2;
448         if ((zone->uz_flags & UMA_ZONE_FIRSTTOUCH) != 0)
449                 /* Count the cross-domain bucket. */
450                 bpcpu++;
451
452         for (ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++)
453                 if (ubz->ubz_entries * bpcpu * mp_ncpus > nitems)
454                         break;
455         if (ubz == &bucket_zones[0])
456                 ubz = NULL;
457         else
458                 ubz--;
459         return (ubz);
460 }
461
462 static int
463 bucket_select(int size)
464 {
465         struct uma_bucket_zone *ubz;
466
467         ubz = &bucket_zones[0];
468         if (size > ubz->ubz_maxsize)
469                 return MAX((ubz->ubz_maxsize * ubz->ubz_entries) / size, 1);
470
471         for (; ubz->ubz_entries != 0; ubz++)
472                 if (ubz->ubz_maxsize < size)
473                         break;
474         ubz--;
475         return (ubz->ubz_entries);
476 }
477
478 static uma_bucket_t
479 bucket_alloc(uma_zone_t zone, void *udata, int flags)
480 {
481         struct uma_bucket_zone *ubz;
482         uma_bucket_t bucket;
483
484         /*
485          * Don't allocate buckets early in boot.
486          */
487         if (__predict_false(booted < BOOT_KVA))
488                 return (NULL);
489
490         /*
491          * To limit bucket recursion we store the original zone flags
492          * in a cookie passed via zalloc_arg/zfree_arg.  This allows the
493          * NOVM flag to persist even through deep recursions.  We also
494          * store ZFLAG_BUCKET once we have recursed attempting to allocate
495          * a bucket for a bucket zone so we do not allow infinite bucket
496          * recursion.  This cookie will even persist to frees of unused
497          * buckets via the allocation path or bucket allocations in the
498          * free path.
499          */
500         if ((zone->uz_flags & UMA_ZFLAG_BUCKET) == 0)
501                 udata = (void *)(uintptr_t)zone->uz_flags;
502         else {
503                 if ((uintptr_t)udata & UMA_ZFLAG_BUCKET)
504                         return (NULL);
505                 udata = (void *)((uintptr_t)udata | UMA_ZFLAG_BUCKET);
506         }
507         if (((uintptr_t)udata & UMA_ZONE_VM) != 0)
508                 flags |= M_NOVM;
509         ubz = bucket_zone_lookup(zone->uz_bucket_size);
510         if (ubz->ubz_zone == zone && (ubz + 1)->ubz_entries != 0)
511                 ubz++;
512         bucket = uma_zalloc_arg(ubz->ubz_zone, udata, flags);
513         if (bucket) {
514 #ifdef INVARIANTS
515                 bzero(bucket->ub_bucket, sizeof(void *) * ubz->ubz_entries);
516 #endif
517                 bucket->ub_cnt = 0;
518                 bucket->ub_entries = ubz->ubz_entries;
519                 bucket->ub_seq = SMR_SEQ_INVALID;
520                 CTR3(KTR_UMA, "bucket_alloc: zone %s(%p) allocated bucket %p",
521                     zone->uz_name, zone, bucket);
522         }
523
524         return (bucket);
525 }
526
527 static void
528 bucket_free(uma_zone_t zone, uma_bucket_t bucket, void *udata)
529 {
530         struct uma_bucket_zone *ubz;
531
532         if (bucket->ub_cnt != 0)
533                 bucket_drain(zone, bucket);
534
535         KASSERT(bucket->ub_cnt == 0,
536             ("bucket_free: Freeing a non free bucket."));
537         KASSERT(bucket->ub_seq == SMR_SEQ_INVALID,
538             ("bucket_free: Freeing an SMR bucket."));
539         if ((zone->uz_flags & UMA_ZFLAG_BUCKET) == 0)
540                 udata = (void *)(uintptr_t)zone->uz_flags;
541         ubz = bucket_zone_lookup(bucket->ub_entries);
542         uma_zfree_arg(ubz->ubz_zone, bucket, udata);
543 }
544
545 static void
546 bucket_zone_drain(void)
547 {
548         struct uma_bucket_zone *ubz;
549
550         for (ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++)
551                 uma_zone_reclaim(ubz->ubz_zone, UMA_RECLAIM_DRAIN);
552 }
553
554 /*
555  * Acquire the domain lock and record contention.
556  */
557 static uma_zone_domain_t
558 zone_domain_lock(uma_zone_t zone, int domain)
559 {
560         uma_zone_domain_t zdom;
561         bool lockfail;
562
563         zdom = ZDOM_GET(zone, domain);
564         lockfail = false;
565         if (ZDOM_OWNED(zdom))
566                 lockfail = true;
567         ZDOM_LOCK(zdom);
568         /* This is unsynchronized.  The counter does not need to be precise. */
569         if (lockfail && zone->uz_bucket_size < zone->uz_bucket_size_max)
570                 zone->uz_bucket_size++;
571         return (zdom);
572 }
573
574 /*
575  * Search for the domain with the least cached items and return it if it
576  * is out of balance with the preferred domain.
577  */
578 static __noinline int
579 zone_domain_lowest(uma_zone_t zone, int pref)
580 {
581         long least, nitems, prefitems;
582         int domain;
583         int i;
584
585         prefitems = least = LONG_MAX;
586         domain = 0;
587         for (i = 0; i < vm_ndomains; i++) {
588                 nitems = ZDOM_GET(zone, i)->uzd_nitems;
589                 if (nitems < least) {
590                         domain = i;
591                         least = nitems;
592                 }
593                 if (domain == pref)
594                         prefitems = nitems;
595         }
596         if (prefitems < least * 2)
597                 return (pref);
598
599         return (domain);
600 }
601
602 /*
603  * Search for the domain with the most cached items and return it or the
604  * preferred domain if it has enough to proceed.
605  */
606 static __noinline int
607 zone_domain_highest(uma_zone_t zone, int pref)
608 {
609         long most, nitems;
610         int domain;
611         int i;
612
613         if (ZDOM_GET(zone, pref)->uzd_nitems > BUCKET_MAX)
614                 return (pref);
615
616         most = 0;
617         domain = 0;
618         for (i = 0; i < vm_ndomains; i++) {
619                 nitems = ZDOM_GET(zone, i)->uzd_nitems;
620                 if (nitems > most) {
621                         domain = i;
622                         most = nitems;
623                 }
624         }
625
626         return (domain);
627 }
628
629 /*
630  * Safely subtract cnt from imax.
631  */
632 static void
633 zone_domain_imax_sub(uma_zone_domain_t zdom, int cnt)
634 {
635         long new;
636         long old;
637
638         old = zdom->uzd_imax;
639         do {
640                 if (old <= cnt)
641                         new = 0;
642                 else
643                         new = old - cnt;
644         } while (atomic_fcmpset_long(&zdom->uzd_imax, &old, new) == 0);
645 }
646
647 /*
648  * Set the maximum imax value.
649  */
650 static void
651 zone_domain_imax_set(uma_zone_domain_t zdom, int nitems)
652 {
653         long old;
654
655         old = zdom->uzd_imax;
656         do {
657                 if (old >= nitems)
658                         break;
659         } while (atomic_fcmpset_long(&zdom->uzd_imax, &old, nitems) == 0);
660 }
661
662 /*
663  * Attempt to satisfy an allocation by retrieving a full bucket from one of the
664  * zone's caches.  If a bucket is found the zone is not locked on return.
665  */
666 static uma_bucket_t
667 zone_fetch_bucket(uma_zone_t zone, uma_zone_domain_t zdom, bool reclaim)
668 {
669         uma_bucket_t bucket;
670         int i;
671         bool dtor = false;
672
673         ZDOM_LOCK_ASSERT(zdom);
674
675         if ((bucket = STAILQ_FIRST(&zdom->uzd_buckets)) == NULL)
676                 return (NULL);
677
678         /* SMR Buckets can not be re-used until readers expire. */
679         if ((zone->uz_flags & UMA_ZONE_SMR) != 0 &&
680             bucket->ub_seq != SMR_SEQ_INVALID) {
681                 if (!smr_poll(zone->uz_smr, bucket->ub_seq, false))
682                         return (NULL);
683                 bucket->ub_seq = SMR_SEQ_INVALID;
684                 dtor = (zone->uz_dtor != NULL) || UMA_ALWAYS_CTORDTOR;
685                 if (STAILQ_NEXT(bucket, ub_link) != NULL)
686                         zdom->uzd_seq = STAILQ_NEXT(bucket, ub_link)->ub_seq;
687         }
688         MPASS(zdom->uzd_nitems >= bucket->ub_cnt);
689         STAILQ_REMOVE_HEAD(&zdom->uzd_buckets, ub_link);
690         zdom->uzd_nitems -= bucket->ub_cnt;
691
692         /*
693          * Shift the bounds of the current WSS interval to avoid
694          * perturbing the estimate.
695          */
696         if (reclaim) {
697                 zdom->uzd_imin -= lmin(zdom->uzd_imin, bucket->ub_cnt);
698                 zone_domain_imax_sub(zdom, bucket->ub_cnt);
699         } else if (zdom->uzd_imin > zdom->uzd_nitems)
700                 zdom->uzd_imin = zdom->uzd_nitems;
701
702         ZDOM_UNLOCK(zdom);
703         if (dtor)
704                 for (i = 0; i < bucket->ub_cnt; i++)
705                         item_dtor(zone, bucket->ub_bucket[i], zone->uz_size,
706                             NULL, SKIP_NONE);
707
708         return (bucket);
709 }
710
711 /*
712  * Insert a full bucket into the specified cache.  The "ws" parameter indicates
713  * whether the bucket's contents should be counted as part of the zone's working
714  * set.  The bucket may be freed if it exceeds the bucket limit.
715  */
716 static void
717 zone_put_bucket(uma_zone_t zone, int domain, uma_bucket_t bucket, void *udata,
718     const bool ws)
719 {
720         uma_zone_domain_t zdom;
721
722         /* We don't cache empty buckets.  This can happen after a reclaim. */
723         if (bucket->ub_cnt == 0)
724                 goto out;
725         zdom = zone_domain_lock(zone, domain);
726
727         /*
728          * Conditionally set the maximum number of items.
729          */
730         zdom->uzd_nitems += bucket->ub_cnt;
731         if (__predict_true(zdom->uzd_nitems < zone->uz_bucket_max)) {
732                 if (ws)
733                         zone_domain_imax_set(zdom, zdom->uzd_nitems);
734                 if (STAILQ_EMPTY(&zdom->uzd_buckets))
735                         zdom->uzd_seq = bucket->ub_seq;
736
737                 /*
738                  * Try to promote reuse of recently used items.  For items
739                  * protected by SMR, try to defer reuse to minimize polling.
740                  */
741                 if (bucket->ub_seq == SMR_SEQ_INVALID)
742                         STAILQ_INSERT_HEAD(&zdom->uzd_buckets, bucket, ub_link);
743                 else
744                         STAILQ_INSERT_TAIL(&zdom->uzd_buckets, bucket, ub_link);
745                 ZDOM_UNLOCK(zdom);
746                 return;
747         }
748         zdom->uzd_nitems -= bucket->ub_cnt;
749         ZDOM_UNLOCK(zdom);
750 out:
751         bucket_free(zone, bucket, udata);
752 }
753
754 /* Pops an item out of a per-cpu cache bucket. */
755 static inline void *
756 cache_bucket_pop(uma_cache_t cache, uma_cache_bucket_t bucket)
757 {
758         void *item;
759
760         CRITICAL_ASSERT(curthread);
761
762         bucket->ucb_cnt--;
763         item = bucket->ucb_bucket->ub_bucket[bucket->ucb_cnt];
764 #ifdef INVARIANTS
765         bucket->ucb_bucket->ub_bucket[bucket->ucb_cnt] = NULL;
766         KASSERT(item != NULL, ("uma_zalloc: Bucket pointer mangled."));
767 #endif
768         cache->uc_allocs++;
769
770         return (item);
771 }
772
773 /* Pushes an item into a per-cpu cache bucket. */
774 static inline void
775 cache_bucket_push(uma_cache_t cache, uma_cache_bucket_t bucket, void *item)
776 {
777
778         CRITICAL_ASSERT(curthread);
779         KASSERT(bucket->ucb_bucket->ub_bucket[bucket->ucb_cnt] == NULL,
780             ("uma_zfree: Freeing to non free bucket index."));
781
782         bucket->ucb_bucket->ub_bucket[bucket->ucb_cnt] = item;
783         bucket->ucb_cnt++;
784         cache->uc_frees++;
785 }
786
787 /*
788  * Unload a UMA bucket from a per-cpu cache.
789  */
790 static inline uma_bucket_t
791 cache_bucket_unload(uma_cache_bucket_t bucket)
792 {
793         uma_bucket_t b;
794
795         b = bucket->ucb_bucket;
796         if (b != NULL) {
797                 MPASS(b->ub_entries == bucket->ucb_entries);
798                 b->ub_cnt = bucket->ucb_cnt;
799                 bucket->ucb_bucket = NULL;
800                 bucket->ucb_entries = bucket->ucb_cnt = 0;
801         }
802
803         return (b);
804 }
805
806 static inline uma_bucket_t
807 cache_bucket_unload_alloc(uma_cache_t cache)
808 {
809
810         return (cache_bucket_unload(&cache->uc_allocbucket));
811 }
812
813 static inline uma_bucket_t
814 cache_bucket_unload_free(uma_cache_t cache)
815 {
816
817         return (cache_bucket_unload(&cache->uc_freebucket));
818 }
819
820 static inline uma_bucket_t
821 cache_bucket_unload_cross(uma_cache_t cache)
822 {
823
824         return (cache_bucket_unload(&cache->uc_crossbucket));
825 }
826
827 /*
828  * Load a bucket into a per-cpu cache bucket.
829  */
830 static inline void
831 cache_bucket_load(uma_cache_bucket_t bucket, uma_bucket_t b)
832 {
833
834         CRITICAL_ASSERT(curthread);
835         MPASS(bucket->ucb_bucket == NULL);
836         MPASS(b->ub_seq == SMR_SEQ_INVALID);
837
838         bucket->ucb_bucket = b;
839         bucket->ucb_cnt = b->ub_cnt;
840         bucket->ucb_entries = b->ub_entries;
841 }
842
843 static inline void
844 cache_bucket_load_alloc(uma_cache_t cache, uma_bucket_t b)
845 {
846
847         cache_bucket_load(&cache->uc_allocbucket, b);
848 }
849
850 static inline void
851 cache_bucket_load_free(uma_cache_t cache, uma_bucket_t b)
852 {
853
854         cache_bucket_load(&cache->uc_freebucket, b);
855 }
856
857 #ifdef NUMA
858 static inline void 
859 cache_bucket_load_cross(uma_cache_t cache, uma_bucket_t b)
860 {
861
862         cache_bucket_load(&cache->uc_crossbucket, b);
863 }
864 #endif
865
866 /*
867  * Copy and preserve ucb_spare.
868  */
869 static inline void
870 cache_bucket_copy(uma_cache_bucket_t b1, uma_cache_bucket_t b2)
871 {
872
873         b1->ucb_bucket = b2->ucb_bucket;
874         b1->ucb_entries = b2->ucb_entries;
875         b1->ucb_cnt = b2->ucb_cnt;
876 }
877
878 /*
879  * Swap two cache buckets.
880  */
881 static inline void
882 cache_bucket_swap(uma_cache_bucket_t b1, uma_cache_bucket_t b2)
883 {
884         struct uma_cache_bucket b3;
885
886         CRITICAL_ASSERT(curthread);
887
888         cache_bucket_copy(&b3, b1);
889         cache_bucket_copy(b1, b2);
890         cache_bucket_copy(b2, &b3);
891 }
892
893 /*
894  * Attempt to fetch a bucket from a zone on behalf of the current cpu cache.
895  */
896 static uma_bucket_t
897 cache_fetch_bucket(uma_zone_t zone, uma_cache_t cache, int domain)
898 {
899         uma_zone_domain_t zdom;
900         uma_bucket_t bucket;
901
902         /*
903          * Avoid the lock if possible.
904          */
905         zdom = ZDOM_GET(zone, domain);
906         if (zdom->uzd_nitems == 0)
907                 return (NULL);
908
909         if ((cache_uz_flags(cache) & UMA_ZONE_SMR) != 0 &&
910             !smr_poll(zone->uz_smr, zdom->uzd_seq, false))
911                 return (NULL);
912
913         /*
914          * Check the zone's cache of buckets.
915          */
916         zdom = zone_domain_lock(zone, domain);
917         if ((bucket = zone_fetch_bucket(zone, zdom, false)) != NULL) {
918                 KASSERT(bucket->ub_cnt != 0,
919                     ("cache_fetch_bucket: Returning an empty bucket."));
920                 return (bucket);
921         }
922         ZDOM_UNLOCK(zdom);
923
924         return (NULL);
925 }
926
927 static void
928 zone_log_warning(uma_zone_t zone)
929 {
930         static const struct timeval warninterval = { 300, 0 };
931
932         if (!zone_warnings || zone->uz_warning == NULL)
933                 return;
934
935         if (ratecheck(&zone->uz_ratecheck, &warninterval))
936                 printf("[zone: %s] %s\n", zone->uz_name, zone->uz_warning);
937 }
938
939 static inline void
940 zone_maxaction(uma_zone_t zone)
941 {
942
943         if (zone->uz_maxaction.ta_func != NULL)
944                 taskqueue_enqueue(taskqueue_thread, &zone->uz_maxaction);
945 }
946
947 /*
948  * Routine called by timeout which is used to fire off some time interval
949  * based calculations.  (stats, hash size, etc.)
950  *
951  * Arguments:
952  *      arg   Unused
953  *
954  * Returns:
955  *      Nothing
956  */
957 static void
958 uma_timeout(void *unused)
959 {
960         bucket_enable();
961         zone_foreach(zone_timeout, NULL);
962
963         /* Reschedule this event */
964         callout_reset(&uma_callout, UMA_TIMEOUT * hz, uma_timeout, NULL);
965 }
966
967 /*
968  * Update the working set size estimate for the zone's bucket cache.
969  * The constants chosen here are somewhat arbitrary.  With an update period of
970  * 20s (UMA_TIMEOUT), this estimate is dominated by zone activity over the
971  * last 100s.
972  */
973 static void
974 zone_domain_update_wss(uma_zone_domain_t zdom)
975 {
976         long wss;
977
978         ZDOM_LOCK(zdom);
979         MPASS(zdom->uzd_imax >= zdom->uzd_imin);
980         wss = zdom->uzd_imax - zdom->uzd_imin;
981         zdom->uzd_imax = zdom->uzd_imin = zdom->uzd_nitems;
982         zdom->uzd_wss = (4 * wss + zdom->uzd_wss) / 5;
983         ZDOM_UNLOCK(zdom);
984 }
985
986 /*
987  * Routine to perform timeout driven calculations.  This expands the
988  * hashes and does per cpu statistics aggregation.
989  *
990  *  Returns nothing.
991  */
992 static void
993 zone_timeout(uma_zone_t zone, void *unused)
994 {
995         uma_keg_t keg;
996         u_int slabs, pages;
997
998         if ((zone->uz_flags & UMA_ZFLAG_HASH) == 0)
999                 goto update_wss;
1000
1001         keg = zone->uz_keg;
1002
1003         /*
1004          * Hash zones are non-numa by definition so the first domain
1005          * is the only one present.
1006          */
1007         KEG_LOCK(keg, 0);
1008         pages = keg->uk_domain[0].ud_pages;
1009
1010         /*
1011          * Expand the keg hash table.
1012          *
1013          * This is done if the number of slabs is larger than the hash size.
1014          * What I'm trying to do here is completely reduce collisions.  This
1015          * may be a little aggressive.  Should I allow for two collisions max?
1016          */
1017         if ((slabs = pages / keg->uk_ppera) > keg->uk_hash.uh_hashsize) {
1018                 struct uma_hash newhash;
1019                 struct uma_hash oldhash;
1020                 int ret;
1021
1022                 /*
1023                  * This is so involved because allocating and freeing
1024                  * while the keg lock is held will lead to deadlock.
1025                  * I have to do everything in stages and check for
1026                  * races.
1027                  */
1028                 KEG_UNLOCK(keg, 0);
1029                 ret = hash_alloc(&newhash, 1 << fls(slabs));
1030                 KEG_LOCK(keg, 0);
1031                 if (ret) {
1032                         if (hash_expand(&keg->uk_hash, &newhash)) {
1033                                 oldhash = keg->uk_hash;
1034                                 keg->uk_hash = newhash;
1035                         } else
1036                                 oldhash = newhash;
1037
1038                         KEG_UNLOCK(keg, 0);
1039                         hash_free(&oldhash);
1040                         goto update_wss;
1041                 }
1042         }
1043         KEG_UNLOCK(keg, 0);
1044
1045 update_wss:
1046         for (int i = 0; i < vm_ndomains; i++)
1047                 zone_domain_update_wss(ZDOM_GET(zone, i));
1048 }
1049
1050 /*
1051  * Allocate and zero fill the next sized hash table from the appropriate
1052  * backing store.
1053  *
1054  * Arguments:
1055  *      hash  A new hash structure with the old hash size in uh_hashsize
1056  *
1057  * Returns:
1058  *      1 on success and 0 on failure.
1059  */
1060 static int
1061 hash_alloc(struct uma_hash *hash, u_int size)
1062 {
1063         size_t alloc;
1064
1065         KASSERT(powerof2(size), ("hash size must be power of 2"));
1066         if (size > UMA_HASH_SIZE_INIT)  {
1067                 hash->uh_hashsize = size;
1068                 alloc = sizeof(hash->uh_slab_hash[0]) * hash->uh_hashsize;
1069                 hash->uh_slab_hash = malloc(alloc, M_UMAHASH, M_NOWAIT);
1070         } else {
1071                 alloc = sizeof(hash->uh_slab_hash[0]) * UMA_HASH_SIZE_INIT;
1072                 hash->uh_slab_hash = zone_alloc_item(hashzone, NULL,
1073                     UMA_ANYDOMAIN, M_WAITOK);
1074                 hash->uh_hashsize = UMA_HASH_SIZE_INIT;
1075         }
1076         if (hash->uh_slab_hash) {
1077                 bzero(hash->uh_slab_hash, alloc);
1078                 hash->uh_hashmask = hash->uh_hashsize - 1;
1079                 return (1);
1080         }
1081
1082         return (0);
1083 }
1084
1085 /*
1086  * Expands the hash table for HASH zones.  This is done from zone_timeout
1087  * to reduce collisions.  This must not be done in the regular allocation
1088  * path, otherwise, we can recurse on the vm while allocating pages.
1089  *
1090  * Arguments:
1091  *      oldhash  The hash you want to expand
1092  *      newhash  The hash structure for the new table
1093  *
1094  * Returns:
1095  *      Nothing
1096  *
1097  * Discussion:
1098  */
1099 static int
1100 hash_expand(struct uma_hash *oldhash, struct uma_hash *newhash)
1101 {
1102         uma_hash_slab_t slab;
1103         u_int hval;
1104         u_int idx;
1105
1106         if (!newhash->uh_slab_hash)
1107                 return (0);
1108
1109         if (oldhash->uh_hashsize >= newhash->uh_hashsize)
1110                 return (0);
1111
1112         /*
1113          * I need to investigate hash algorithms for resizing without a
1114          * full rehash.
1115          */
1116
1117         for (idx = 0; idx < oldhash->uh_hashsize; idx++)
1118                 while (!LIST_EMPTY(&oldhash->uh_slab_hash[idx])) {
1119                         slab = LIST_FIRST(&oldhash->uh_slab_hash[idx]);
1120                         LIST_REMOVE(slab, uhs_hlink);
1121                         hval = UMA_HASH(newhash, slab->uhs_data);
1122                         LIST_INSERT_HEAD(&newhash->uh_slab_hash[hval],
1123                             slab, uhs_hlink);
1124                 }
1125
1126         return (1);
1127 }
1128
1129 /*
1130  * Free the hash bucket to the appropriate backing store.
1131  *
1132  * Arguments:
1133  *      slab_hash  The hash bucket we're freeing
1134  *      hashsize   The number of entries in that hash bucket
1135  *
1136  * Returns:
1137  *      Nothing
1138  */
1139 static void
1140 hash_free(struct uma_hash *hash)
1141 {
1142         if (hash->uh_slab_hash == NULL)
1143                 return;
1144         if (hash->uh_hashsize == UMA_HASH_SIZE_INIT)
1145                 zone_free_item(hashzone, hash->uh_slab_hash, NULL, SKIP_NONE);
1146         else
1147                 free(hash->uh_slab_hash, M_UMAHASH);
1148 }
1149
1150 /*
1151  * Frees all outstanding items in a bucket
1152  *
1153  * Arguments:
1154  *      zone   The zone to free to, must be unlocked.
1155  *      bucket The free/alloc bucket with items.
1156  *
1157  * Returns:
1158  *      Nothing
1159  */
1160 static void
1161 bucket_drain(uma_zone_t zone, uma_bucket_t bucket)
1162 {
1163         int i;
1164
1165         if (bucket->ub_cnt == 0)
1166                 return;
1167
1168         if ((zone->uz_flags & UMA_ZONE_SMR) != 0 &&
1169             bucket->ub_seq != SMR_SEQ_INVALID) {
1170                 smr_wait(zone->uz_smr, bucket->ub_seq);
1171                 bucket->ub_seq = SMR_SEQ_INVALID;
1172                 for (i = 0; i < bucket->ub_cnt; i++)
1173                         item_dtor(zone, bucket->ub_bucket[i],
1174                             zone->uz_size, NULL, SKIP_NONE);
1175         }
1176         if (zone->uz_fini)
1177                 for (i = 0; i < bucket->ub_cnt; i++) 
1178                         zone->uz_fini(bucket->ub_bucket[i], zone->uz_size);
1179         zone->uz_release(zone->uz_arg, bucket->ub_bucket, bucket->ub_cnt);
1180         if (zone->uz_max_items > 0)
1181                 zone_free_limit(zone, bucket->ub_cnt);
1182 #ifdef INVARIANTS
1183         bzero(bucket->ub_bucket, sizeof(void *) * bucket->ub_cnt);
1184 #endif
1185         bucket->ub_cnt = 0;
1186 }
1187
1188 /*
1189  * Drains the per cpu caches for a zone.
1190  *
1191  * NOTE: This may only be called while the zone is being torn down, and not
1192  * during normal operation.  This is necessary in order that we do not have
1193  * to migrate CPUs to drain the per-CPU caches.
1194  *
1195  * Arguments:
1196  *      zone     The zone to drain, must be unlocked.
1197  *
1198  * Returns:
1199  *      Nothing
1200  */
1201 static void
1202 cache_drain(uma_zone_t zone)
1203 {
1204         uma_cache_t cache;
1205         uma_bucket_t bucket;
1206         smr_seq_t seq;
1207         int cpu;
1208
1209         /*
1210          * XXX: It is safe to not lock the per-CPU caches, because we're
1211          * tearing down the zone anyway.  I.e., there will be no further use
1212          * of the caches at this point.
1213          *
1214          * XXX: It would good to be able to assert that the zone is being
1215          * torn down to prevent improper use of cache_drain().
1216          */
1217         seq = SMR_SEQ_INVALID;
1218         if ((zone->uz_flags & UMA_ZONE_SMR) != 0)
1219                 seq = smr_advance(zone->uz_smr);
1220         CPU_FOREACH(cpu) {
1221                 cache = &zone->uz_cpu[cpu];
1222                 bucket = cache_bucket_unload_alloc(cache);
1223                 if (bucket != NULL)
1224                         bucket_free(zone, bucket, NULL);
1225                 bucket = cache_bucket_unload_free(cache);
1226                 if (bucket != NULL) {
1227                         bucket->ub_seq = seq;
1228                         bucket_free(zone, bucket, NULL);
1229                 }
1230                 bucket = cache_bucket_unload_cross(cache);
1231                 if (bucket != NULL) {
1232                         bucket->ub_seq = seq;
1233                         bucket_free(zone, bucket, NULL);
1234                 }
1235         }
1236         bucket_cache_reclaim(zone, true);
1237 }
1238
1239 static void
1240 cache_shrink(uma_zone_t zone, void *unused)
1241 {
1242
1243         if (zone->uz_flags & UMA_ZFLAG_INTERNAL)
1244                 return;
1245
1246         zone->uz_bucket_size =
1247             (zone->uz_bucket_size_min + zone->uz_bucket_size) / 2;
1248 }
1249
1250 static void
1251 cache_drain_safe_cpu(uma_zone_t zone, void *unused)
1252 {
1253         uma_cache_t cache;
1254         uma_bucket_t b1, b2, b3;
1255         int domain;
1256
1257         if (zone->uz_flags & UMA_ZFLAG_INTERNAL)
1258                 return;
1259
1260         b1 = b2 = b3 = NULL;
1261         critical_enter();
1262         cache = &zone->uz_cpu[curcpu];
1263         domain = PCPU_GET(domain);
1264         b1 = cache_bucket_unload_alloc(cache);
1265
1266         /*
1267          * Don't flush SMR zone buckets.  This leaves the zone without a
1268          * bucket and forces every free to synchronize().
1269          */
1270         if ((zone->uz_flags & UMA_ZONE_SMR) == 0) {
1271                 b2 = cache_bucket_unload_free(cache);
1272                 b3 = cache_bucket_unload_cross(cache);
1273         }
1274         critical_exit();
1275
1276         if (b1 != NULL)
1277                 zone_free_bucket(zone, b1, NULL, domain, false);
1278         if (b2 != NULL)
1279                 zone_free_bucket(zone, b2, NULL, domain, false);
1280         if (b3 != NULL) {
1281                 /* Adjust the domain so it goes to zone_free_cross. */
1282                 domain = (domain + 1) % vm_ndomains;
1283                 zone_free_bucket(zone, b3, NULL, domain, false);
1284         }
1285 }
1286
1287 /*
1288  * Safely drain per-CPU caches of a zone(s) to alloc bucket.
1289  * This is an expensive call because it needs to bind to all CPUs
1290  * one by one and enter a critical section on each of them in order
1291  * to safely access their cache buckets.
1292  * Zone lock must not be held on call this function.
1293  */
1294 static void
1295 pcpu_cache_drain_safe(uma_zone_t zone)
1296 {
1297         int cpu;
1298
1299         /*
1300          * Polite bucket sizes shrinking was not enough, shrink aggressively.
1301          */
1302         if (zone)
1303                 cache_shrink(zone, NULL);
1304         else
1305                 zone_foreach(cache_shrink, NULL);
1306
1307         CPU_FOREACH(cpu) {
1308                 thread_lock(curthread);
1309                 sched_bind(curthread, cpu);
1310                 thread_unlock(curthread);
1311
1312                 if (zone)
1313                         cache_drain_safe_cpu(zone, NULL);
1314                 else
1315                         zone_foreach(cache_drain_safe_cpu, NULL);
1316         }
1317         thread_lock(curthread);
1318         sched_unbind(curthread);
1319         thread_unlock(curthread);
1320 }
1321
1322 /*
1323  * Reclaim cached buckets from a zone.  All buckets are reclaimed if the caller
1324  * requested a drain, otherwise the per-domain caches are trimmed to either
1325  * estimated working set size.
1326  */
1327 static void
1328 bucket_cache_reclaim(uma_zone_t zone, bool drain)
1329 {
1330         uma_zone_domain_t zdom;
1331         uma_bucket_t bucket;
1332         long target;
1333         int i;
1334
1335         /*
1336          * Shrink the zone bucket size to ensure that the per-CPU caches
1337          * don't grow too large.
1338          */
1339         if (zone->uz_bucket_size > zone->uz_bucket_size_min)
1340                 zone->uz_bucket_size--;
1341
1342         for (i = 0; i < vm_ndomains; i++) {
1343                 /*
1344                  * The cross bucket is partially filled and not part of
1345                  * the item count.  Reclaim it individually here.
1346                  */
1347                 zdom = ZDOM_GET(zone, i);
1348                 if ((zone->uz_flags & UMA_ZONE_SMR) == 0 || drain) {
1349                         ZONE_CROSS_LOCK(zone);
1350                         bucket = zdom->uzd_cross;
1351                         zdom->uzd_cross = NULL;
1352                         ZONE_CROSS_UNLOCK(zone);
1353                         if (bucket != NULL)
1354                                 bucket_free(zone, bucket, NULL);
1355                 }
1356
1357                 /*
1358                  * If we were asked to drain the zone, we are done only once
1359                  * this bucket cache is empty.  Otherwise, we reclaim items in
1360                  * excess of the zone's estimated working set size.  If the
1361                  * difference nitems - imin is larger than the WSS estimate,
1362                  * then the estimate will grow at the end of this interval and
1363                  * we ignore the historical average.
1364                  */
1365                 ZDOM_LOCK(zdom);
1366                 target = drain ? 0 : lmax(zdom->uzd_wss, zdom->uzd_nitems -
1367                     zdom->uzd_imin);
1368                 while (zdom->uzd_nitems > target) {
1369                         bucket = zone_fetch_bucket(zone, zdom, true);
1370                         if (bucket == NULL)
1371                                 break;
1372                         bucket_free(zone, bucket, NULL);
1373                         ZDOM_LOCK(zdom);
1374                 }
1375                 ZDOM_UNLOCK(zdom);
1376         }
1377 }
1378
1379 static void
1380 keg_free_slab(uma_keg_t keg, uma_slab_t slab, int start)
1381 {
1382         uint8_t *mem;
1383         int i;
1384         uint8_t flags;
1385
1386         CTR4(KTR_UMA, "keg_free_slab keg %s(%p) slab %p, returning %d bytes",
1387             keg->uk_name, keg, slab, PAGE_SIZE * keg->uk_ppera);
1388
1389         mem = slab_data(slab, keg);
1390         flags = slab->us_flags;
1391         i = start;
1392         if (keg->uk_fini != NULL) {
1393                 for (i--; i > -1; i--)
1394 #ifdef INVARIANTS
1395                 /*
1396                  * trash_fini implies that dtor was trash_dtor. trash_fini
1397                  * would check that memory hasn't been modified since free,
1398                  * which executed trash_dtor.
1399                  * That's why we need to run uma_dbg_kskip() check here,
1400                  * albeit we don't make skip check for other init/fini
1401                  * invocations.
1402                  */
1403                 if (!uma_dbg_kskip(keg, slab_item(slab, keg, i)) ||
1404                     keg->uk_fini != trash_fini)
1405 #endif
1406                         keg->uk_fini(slab_item(slab, keg, i), keg->uk_size);
1407         }
1408         if (keg->uk_flags & UMA_ZFLAG_OFFPAGE)
1409                 zone_free_item(slabzone(keg->uk_ipers), slab_tohashslab(slab),
1410                     NULL, SKIP_NONE);
1411         keg->uk_freef(mem, PAGE_SIZE * keg->uk_ppera, flags);
1412         uma_total_dec(PAGE_SIZE * keg->uk_ppera);
1413 }
1414
1415 /*
1416  * Frees pages from a keg back to the system.  This is done on demand from
1417  * the pageout daemon.
1418  *
1419  * Returns nothing.
1420  */
1421 static void
1422 keg_drain(uma_keg_t keg)
1423 {
1424         struct slabhead freeslabs;
1425         uma_domain_t dom;
1426         uma_slab_t slab, tmp;
1427         int i, n;
1428
1429         if (keg->uk_flags & UMA_ZONE_NOFREE || keg->uk_freef == NULL)
1430                 return;
1431
1432         for (i = 0; i < vm_ndomains; i++) {
1433                 CTR4(KTR_UMA, "keg_drain %s(%p) domain %d free items: %u",
1434                     keg->uk_name, keg, i, dom->ud_free_items);
1435                 dom = &keg->uk_domain[i];
1436                 LIST_INIT(&freeslabs);
1437
1438                 KEG_LOCK(keg, i);
1439                 if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0) {
1440                         LIST_FOREACH(slab, &dom->ud_free_slab, us_link)
1441                                 UMA_HASH_REMOVE(&keg->uk_hash, slab);
1442                 }
1443                 n = dom->ud_free_slabs;
1444                 LIST_SWAP(&freeslabs, &dom->ud_free_slab, uma_slab, us_link);
1445                 dom->ud_free_slabs = 0;
1446                 dom->ud_free_items -= n * keg->uk_ipers;
1447                 dom->ud_pages -= n * keg->uk_ppera;
1448                 KEG_UNLOCK(keg, i);
1449
1450                 LIST_FOREACH_SAFE(slab, &freeslabs, us_link, tmp)
1451                         keg_free_slab(keg, slab, keg->uk_ipers);
1452         }
1453 }
1454
1455 static void
1456 zone_reclaim(uma_zone_t zone, int waitok, bool drain)
1457 {
1458
1459         /*
1460          * Set draining to interlock with zone_dtor() so we can release our
1461          * locks as we go.  Only dtor() should do a WAITOK call since it
1462          * is the only call that knows the structure will still be available
1463          * when it wakes up.
1464          */
1465         ZONE_LOCK(zone);
1466         while (zone->uz_flags & UMA_ZFLAG_RECLAIMING) {
1467                 if (waitok == M_NOWAIT)
1468                         goto out;
1469                 msleep(zone, &ZDOM_GET(zone, 0)->uzd_lock, PVM, "zonedrain",
1470                     1);
1471         }
1472         zone->uz_flags |= UMA_ZFLAG_RECLAIMING;
1473         ZONE_UNLOCK(zone);
1474         bucket_cache_reclaim(zone, drain);
1475
1476         /*
1477          * The DRAINING flag protects us from being freed while
1478          * we're running.  Normally the uma_rwlock would protect us but we
1479          * must be able to release and acquire the right lock for each keg.
1480          */
1481         if ((zone->uz_flags & UMA_ZFLAG_CACHE) == 0)
1482                 keg_drain(zone->uz_keg);
1483         ZONE_LOCK(zone);
1484         zone->uz_flags &= ~UMA_ZFLAG_RECLAIMING;
1485         wakeup(zone);
1486 out:
1487         ZONE_UNLOCK(zone);
1488 }
1489
1490 static void
1491 zone_drain(uma_zone_t zone, void *unused)
1492 {
1493
1494         zone_reclaim(zone, M_NOWAIT, true);
1495 }
1496
1497 static void
1498 zone_trim(uma_zone_t zone, void *unused)
1499 {
1500
1501         zone_reclaim(zone, M_NOWAIT, false);
1502 }
1503
1504 /*
1505  * Allocate a new slab for a keg and inserts it into the partial slab list.
1506  * The keg should be unlocked on entry.  If the allocation succeeds it will
1507  * be locked on return.
1508  *
1509  * Arguments:
1510  *      flags   Wait flags for the item initialization routine
1511  *      aflags  Wait flags for the slab allocation
1512  *
1513  * Returns:
1514  *      The slab that was allocated or NULL if there is no memory and the
1515  *      caller specified M_NOWAIT.
1516  */
1517 static uma_slab_t
1518 keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int flags,
1519     int aflags)
1520 {
1521         uma_domain_t dom;
1522         uma_alloc allocf;
1523         uma_slab_t slab;
1524         unsigned long size;
1525         uint8_t *mem;
1526         uint8_t sflags;
1527         int i;
1528
1529         KASSERT(domain >= 0 && domain < vm_ndomains,
1530             ("keg_alloc_slab: domain %d out of range", domain));
1531
1532         allocf = keg->uk_allocf;
1533         slab = NULL;
1534         mem = NULL;
1535         if (keg->uk_flags & UMA_ZFLAG_OFFPAGE) {
1536                 uma_hash_slab_t hslab;
1537                 hslab = zone_alloc_item(slabzone(keg->uk_ipers), NULL,
1538                     domain, aflags);
1539                 if (hslab == NULL)
1540                         goto fail;
1541                 slab = &hslab->uhs_slab;
1542         }
1543
1544         /*
1545          * This reproduces the old vm_zone behavior of zero filling pages the
1546          * first time they are added to a zone.
1547          *
1548          * Malloced items are zeroed in uma_zalloc.
1549          */
1550
1551         if ((keg->uk_flags & UMA_ZONE_MALLOC) == 0)
1552                 aflags |= M_ZERO;
1553         else
1554                 aflags &= ~M_ZERO;
1555
1556         if (keg->uk_flags & UMA_ZONE_NODUMP)
1557                 aflags |= M_NODUMP;
1558
1559         /* zone is passed for legacy reasons. */
1560         size = keg->uk_ppera * PAGE_SIZE;
1561         mem = allocf(zone, size, domain, &sflags, aflags);
1562         if (mem == NULL) {
1563                 if (keg->uk_flags & UMA_ZFLAG_OFFPAGE)
1564                         zone_free_item(slabzone(keg->uk_ipers),
1565                             slab_tohashslab(slab), NULL, SKIP_NONE);
1566                 goto fail;
1567         }
1568         uma_total_inc(size);
1569
1570         /* For HASH zones all pages go to the same uma_domain. */
1571         if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0)
1572                 domain = 0;
1573
1574         /* Point the slab into the allocated memory */
1575         if (!(keg->uk_flags & UMA_ZFLAG_OFFPAGE))
1576                 slab = (uma_slab_t )(mem + keg->uk_pgoff);
1577         else
1578                 slab_tohashslab(slab)->uhs_data = mem;
1579
1580         if (keg->uk_flags & UMA_ZFLAG_VTOSLAB)
1581                 for (i = 0; i < keg->uk_ppera; i++)
1582                         vsetzoneslab((vm_offset_t)mem + (i * PAGE_SIZE),
1583                             zone, slab);
1584
1585         slab->us_freecount = keg->uk_ipers;
1586         slab->us_flags = sflags;
1587         slab->us_domain = domain;
1588
1589         BIT_FILL(keg->uk_ipers, &slab->us_free);
1590 #ifdef INVARIANTS
1591         BIT_ZERO(keg->uk_ipers, slab_dbg_bits(slab, keg));
1592 #endif
1593
1594         if (keg->uk_init != NULL) {
1595                 for (i = 0; i < keg->uk_ipers; i++)
1596                         if (keg->uk_init(slab_item(slab, keg, i),
1597                             keg->uk_size, flags) != 0)
1598                                 break;
1599                 if (i != keg->uk_ipers) {
1600                         keg_free_slab(keg, slab, i);
1601                         goto fail;
1602                 }
1603         }
1604         KEG_LOCK(keg, domain);
1605
1606         CTR3(KTR_UMA, "keg_alloc_slab: allocated slab %p for %s(%p)",
1607             slab, keg->uk_name, keg);
1608
1609         if (keg->uk_flags & UMA_ZFLAG_HASH)
1610                 UMA_HASH_INSERT(&keg->uk_hash, slab, mem);
1611
1612         /*
1613          * If we got a slab here it's safe to mark it partially used
1614          * and return.  We assume that the caller is going to remove
1615          * at least one item.
1616          */
1617         dom = &keg->uk_domain[domain];
1618         LIST_INSERT_HEAD(&dom->ud_part_slab, slab, us_link);
1619         dom->ud_pages += keg->uk_ppera;
1620         dom->ud_free_items += keg->uk_ipers;
1621
1622         return (slab);
1623
1624 fail:
1625         return (NULL);
1626 }
1627
1628 /*
1629  * This function is intended to be used early on in place of page_alloc() so
1630  * that we may use the boot time page cache to satisfy allocations before
1631  * the VM is ready.
1632  */
1633 static void *
1634 startup_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *pflag,
1635     int wait)
1636 {
1637         vm_paddr_t pa;
1638         vm_page_t m;
1639         void *mem;
1640         int pages;
1641         int i;
1642
1643         pages = howmany(bytes, PAGE_SIZE);
1644         KASSERT(pages > 0, ("%s can't reserve 0 pages", __func__));
1645
1646         *pflag = UMA_SLAB_BOOT;
1647         m = vm_page_alloc_contig_domain(NULL, 0, domain,
1648             malloc2vm_flags(wait) | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED, pages, 
1649             (vm_paddr_t)0, ~(vm_paddr_t)0, 1, 0, VM_MEMATTR_DEFAULT);
1650         if (m == NULL)
1651                 return (NULL);
1652
1653         pa = VM_PAGE_TO_PHYS(m);
1654         for (i = 0; i < pages; i++, pa += PAGE_SIZE) {
1655 #if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) || \
1656     defined(__riscv) || defined(__powerpc64__)
1657                 if ((wait & M_NODUMP) == 0)
1658                         dump_add_page(pa);
1659 #endif
1660         }
1661         /* Allocate KVA and indirectly advance bootmem. */
1662         mem = (void *)pmap_map(&bootmem, m->phys_addr,
1663             m->phys_addr + (pages * PAGE_SIZE), VM_PROT_READ | VM_PROT_WRITE);
1664         if ((wait & M_ZERO) != 0)
1665                 bzero(mem, pages * PAGE_SIZE);
1666
1667         return (mem);
1668 }
1669
1670 static void
1671 startup_free(void *mem, vm_size_t bytes)
1672 {
1673         vm_offset_t va;
1674         vm_page_t m;
1675
1676         va = (vm_offset_t)mem;
1677         m = PHYS_TO_VM_PAGE(pmap_kextract(va));
1678         pmap_remove(kernel_pmap, va, va + bytes);
1679         for (; bytes != 0; bytes -= PAGE_SIZE, m++) {
1680 #if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) || \
1681     defined(__riscv) || defined(__powerpc64__)
1682                 dump_drop_page(VM_PAGE_TO_PHYS(m));
1683 #endif
1684                 vm_page_unwire_noq(m);
1685                 vm_page_free(m);
1686         }
1687 }
1688
1689 /*
1690  * Allocates a number of pages from the system
1691  *
1692  * Arguments:
1693  *      bytes  The number of bytes requested
1694  *      wait  Shall we wait?
1695  *
1696  * Returns:
1697  *      A pointer to the alloced memory or possibly
1698  *      NULL if M_NOWAIT is set.
1699  */
1700 static void *
1701 page_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *pflag,
1702     int wait)
1703 {
1704         void *p;        /* Returned page */
1705
1706         *pflag = UMA_SLAB_KERNEL;
1707         p = (void *)kmem_malloc_domainset(DOMAINSET_FIXED(domain), bytes, wait);
1708
1709         return (p);
1710 }
1711
1712 static void *
1713 pcpu_page_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *pflag,
1714     int wait)
1715 {
1716         struct pglist alloctail;
1717         vm_offset_t addr, zkva;
1718         int cpu, flags;
1719         vm_page_t p, p_next;
1720 #ifdef NUMA
1721         struct pcpu *pc;
1722 #endif
1723
1724         MPASS(bytes == (mp_maxid + 1) * PAGE_SIZE);
1725
1726         TAILQ_INIT(&alloctail);
1727         flags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ |
1728             malloc2vm_flags(wait);
1729         *pflag = UMA_SLAB_KERNEL;
1730         for (cpu = 0; cpu <= mp_maxid; cpu++) {
1731                 if (CPU_ABSENT(cpu)) {
1732                         p = vm_page_alloc(NULL, 0, flags);
1733                 } else {
1734 #ifndef NUMA
1735                         p = vm_page_alloc(NULL, 0, flags);
1736 #else
1737                         pc = pcpu_find(cpu);
1738                         if (__predict_false(VM_DOMAIN_EMPTY(pc->pc_domain)))
1739                                 p = NULL;
1740                         else
1741                                 p = vm_page_alloc_domain(NULL, 0,
1742                                     pc->pc_domain, flags);
1743                         if (__predict_false(p == NULL))
1744                                 p = vm_page_alloc(NULL, 0, flags);
1745 #endif
1746                 }
1747                 if (__predict_false(p == NULL))
1748                         goto fail;
1749                 TAILQ_INSERT_TAIL(&alloctail, p, listq);
1750         }
1751         if ((addr = kva_alloc(bytes)) == 0)
1752                 goto fail;
1753         zkva = addr;
1754         TAILQ_FOREACH(p, &alloctail, listq) {
1755                 pmap_qenter(zkva, &p, 1);
1756                 zkva += PAGE_SIZE;
1757         }
1758         return ((void*)addr);
1759 fail:
1760         TAILQ_FOREACH_SAFE(p, &alloctail, listq, p_next) {
1761                 vm_page_unwire_noq(p);
1762                 vm_page_free(p);
1763         }
1764         return (NULL);
1765 }
1766
1767 /*
1768  * Allocates a number of pages from within an object
1769  *
1770  * Arguments:
1771  *      bytes  The number of bytes requested
1772  *      wait   Shall we wait?
1773  *
1774  * Returns:
1775  *      A pointer to the alloced memory or possibly
1776  *      NULL if M_NOWAIT is set.
1777  */
1778 static void *
1779 noobj_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *flags,
1780     int wait)
1781 {
1782         TAILQ_HEAD(, vm_page) alloctail;
1783         u_long npages;
1784         vm_offset_t retkva, zkva;
1785         vm_page_t p, p_next;
1786         uma_keg_t keg;
1787
1788         TAILQ_INIT(&alloctail);
1789         keg = zone->uz_keg;
1790
1791         npages = howmany(bytes, PAGE_SIZE);
1792         while (npages > 0) {
1793                 p = vm_page_alloc_domain(NULL, 0, domain, VM_ALLOC_INTERRUPT |
1794                     VM_ALLOC_WIRED | VM_ALLOC_NOOBJ |
1795                     ((wait & M_WAITOK) != 0 ? VM_ALLOC_WAITOK :
1796                     VM_ALLOC_NOWAIT));
1797                 if (p != NULL) {
1798                         /*
1799                          * Since the page does not belong to an object, its
1800                          * listq is unused.
1801                          */
1802                         TAILQ_INSERT_TAIL(&alloctail, p, listq);
1803                         npages--;
1804                         continue;
1805                 }
1806                 /*
1807                  * Page allocation failed, free intermediate pages and
1808                  * exit.
1809                  */
1810                 TAILQ_FOREACH_SAFE(p, &alloctail, listq, p_next) {
1811                         vm_page_unwire_noq(p);
1812                         vm_page_free(p); 
1813                 }
1814                 return (NULL);
1815         }
1816         *flags = UMA_SLAB_PRIV;
1817         zkva = keg->uk_kva +
1818             atomic_fetchadd_long(&keg->uk_offset, round_page(bytes));
1819         retkva = zkva;
1820         TAILQ_FOREACH(p, &alloctail, listq) {
1821                 pmap_qenter(zkva, &p, 1);
1822                 zkva += PAGE_SIZE;
1823         }
1824
1825         return ((void *)retkva);
1826 }
1827
1828 /*
1829  * Allocate physically contiguous pages.
1830  */
1831 static void *
1832 contig_alloc(uma_zone_t zone, vm_size_t bytes, int domain, uint8_t *pflag,
1833     int wait)
1834 {
1835
1836         *pflag = UMA_SLAB_KERNEL;
1837         return ((void *)kmem_alloc_contig_domainset(DOMAINSET_FIXED(domain),
1838             bytes, wait, 0, ~(vm_paddr_t)0, 1, 0, VM_MEMATTR_DEFAULT));
1839 }
1840
1841 /*
1842  * Frees a number of pages to the system
1843  *
1844  * Arguments:
1845  *      mem   A pointer to the memory to be freed
1846  *      size  The size of the memory being freed
1847  *      flags The original p->us_flags field
1848  *
1849  * Returns:
1850  *      Nothing
1851  */
1852 static void
1853 page_free(void *mem, vm_size_t size, uint8_t flags)
1854 {
1855
1856         if ((flags & UMA_SLAB_BOOT) != 0) {
1857                 startup_free(mem, size);
1858                 return;
1859         }
1860
1861         KASSERT((flags & UMA_SLAB_KERNEL) != 0,
1862             ("UMA: page_free used with invalid flags %x", flags));
1863
1864         kmem_free((vm_offset_t)mem, size);
1865 }
1866
1867 /*
1868  * Frees pcpu zone allocations
1869  *
1870  * Arguments:
1871  *      mem   A pointer to the memory to be freed
1872  *      size  The size of the memory being freed
1873  *      flags The original p->us_flags field
1874  *
1875  * Returns:
1876  *      Nothing
1877  */
1878 static void
1879 pcpu_page_free(void *mem, vm_size_t size, uint8_t flags)
1880 {
1881         vm_offset_t sva, curva;
1882         vm_paddr_t paddr;
1883         vm_page_t m;
1884
1885         MPASS(size == (mp_maxid+1)*PAGE_SIZE);
1886
1887         if ((flags & UMA_SLAB_BOOT) != 0) {
1888                 startup_free(mem, size);
1889                 return;
1890         }
1891
1892         sva = (vm_offset_t)mem;
1893         for (curva = sva; curva < sva + size; curva += PAGE_SIZE) {
1894                 paddr = pmap_kextract(curva);
1895                 m = PHYS_TO_VM_PAGE(paddr);
1896                 vm_page_unwire_noq(m);
1897                 vm_page_free(m);
1898         }
1899         pmap_qremove(sva, size >> PAGE_SHIFT);
1900         kva_free(sva, size);
1901 }
1902
1903 /*
1904  * Zero fill initializer
1905  *
1906  * Arguments/Returns follow uma_init specifications
1907  */
1908 static int
1909 zero_init(void *mem, int size, int flags)
1910 {
1911         bzero(mem, size);
1912         return (0);
1913 }
1914
1915 #ifdef INVARIANTS
1916 static struct noslabbits *
1917 slab_dbg_bits(uma_slab_t slab, uma_keg_t keg)
1918 {
1919
1920         return ((void *)((char *)&slab->us_free + BITSET_SIZE(keg->uk_ipers)));
1921 }
1922 #endif
1923
1924 /*
1925  * Actual size of embedded struct slab (!OFFPAGE).
1926  */
1927 static size_t
1928 slab_sizeof(int nitems)
1929 {
1930         size_t s;
1931
1932         s = sizeof(struct uma_slab) + BITSET_SIZE(nitems) * SLAB_BITSETS;
1933         return (roundup(s, UMA_ALIGN_PTR + 1));
1934 }
1935
1936 #define UMA_FIXPT_SHIFT 31
1937 #define UMA_FRAC_FIXPT(n, d)                                            \
1938         ((uint32_t)(((uint64_t)(n) << UMA_FIXPT_SHIFT) / (d)))
1939 #define UMA_FIXPT_PCT(f)                                                \
1940         ((u_int)(((uint64_t)100 * (f)) >> UMA_FIXPT_SHIFT))
1941 #define UMA_PCT_FIXPT(pct)      UMA_FRAC_FIXPT((pct), 100)
1942 #define UMA_MIN_EFF     UMA_PCT_FIXPT(100 - UMA_MAX_WASTE)
1943
1944 /*
1945  * Compute the number of items that will fit in a slab.  If hdr is true, the
1946  * item count may be limited to provide space in the slab for an inline slab
1947  * header.  Otherwise, all slab space will be provided for item storage.
1948  */
1949 static u_int
1950 slab_ipers_hdr(u_int size, u_int rsize, u_int slabsize, bool hdr)
1951 {
1952         u_int ipers;
1953         u_int padpi;
1954
1955         /* The padding between items is not needed after the last item. */
1956         padpi = rsize - size;
1957
1958         if (hdr) {
1959                 /*
1960                  * Start with the maximum item count and remove items until
1961                  * the slab header first alongside the allocatable memory.
1962                  */
1963                 for (ipers = MIN(SLAB_MAX_SETSIZE,
1964                     (slabsize + padpi - slab_sizeof(1)) / rsize);
1965                     ipers > 0 &&
1966                     ipers * rsize - padpi + slab_sizeof(ipers) > slabsize;
1967                     ipers--)
1968                         continue;
1969         } else {
1970                 ipers = MIN((slabsize + padpi) / rsize, SLAB_MAX_SETSIZE);
1971         }
1972
1973         return (ipers);
1974 }
1975
1976 struct keg_layout_result {
1977         u_int format;
1978         u_int slabsize;
1979         u_int ipers;
1980         u_int eff;
1981 };
1982
1983 static void
1984 keg_layout_one(uma_keg_t keg, u_int rsize, u_int slabsize, u_int fmt,
1985     struct keg_layout_result *kl)
1986 {
1987         u_int total;
1988
1989         kl->format = fmt;
1990         kl->slabsize = slabsize;
1991
1992         /* Handle INTERNAL as inline with an extra page. */
1993         if ((fmt & UMA_ZFLAG_INTERNAL) != 0) {
1994                 kl->format &= ~UMA_ZFLAG_INTERNAL;
1995                 kl->slabsize += PAGE_SIZE;
1996         }
1997
1998         kl->ipers = slab_ipers_hdr(keg->uk_size, rsize, kl->slabsize,
1999             (fmt & UMA_ZFLAG_OFFPAGE) == 0);
2000
2001         /* Account for memory used by an offpage slab header. */
2002         total = kl->slabsize;
2003         if ((fmt & UMA_ZFLAG_OFFPAGE) != 0)
2004                 total += slabzone(kl->ipers)->uz_keg->uk_rsize;
2005
2006         kl->eff = UMA_FRAC_FIXPT(kl->ipers * rsize, total);
2007 }
2008
2009 /*
2010  * Determine the format of a uma keg.  This determines where the slab header
2011  * will be placed (inline or offpage) and calculates ipers, rsize, and ppera.
2012  *
2013  * Arguments
2014  *      keg  The zone we should initialize
2015  *
2016  * Returns
2017  *      Nothing
2018  */
2019 static void
2020 keg_layout(uma_keg_t keg)
2021 {
2022         struct keg_layout_result kl = {}, kl_tmp;
2023         u_int fmts[2];
2024         u_int alignsize;
2025         u_int nfmt;
2026         u_int pages;
2027         u_int rsize;
2028         u_int slabsize;
2029         u_int i, j;
2030
2031         KASSERT((keg->uk_flags & UMA_ZONE_PCPU) == 0 ||
2032             (keg->uk_size <= UMA_PCPU_ALLOC_SIZE &&
2033              (keg->uk_flags & UMA_ZONE_CACHESPREAD) == 0),
2034             ("%s: cannot configure for PCPU: keg=%s, size=%u, flags=0x%b",
2035              __func__, keg->uk_name, keg->uk_size, keg->uk_flags,
2036              PRINT_UMA_ZFLAGS));
2037         KASSERT((keg->uk_flags & (UMA_ZFLAG_INTERNAL | UMA_ZONE_VM)) == 0 ||
2038             (keg->uk_flags & (UMA_ZONE_NOTOUCH | UMA_ZONE_PCPU)) == 0,
2039             ("%s: incompatible flags 0x%b", __func__, keg->uk_flags,
2040              PRINT_UMA_ZFLAGS));
2041
2042         alignsize = keg->uk_align + 1;
2043
2044         /*
2045          * Calculate the size of each allocation (rsize) according to
2046          * alignment.  If the requested size is smaller than we have
2047          * allocation bits for we round it up.
2048          */
2049         rsize = MAX(keg->uk_size, UMA_SMALLEST_UNIT);
2050         rsize = roundup2(rsize, alignsize);
2051
2052         if ((keg->uk_flags & UMA_ZONE_CACHESPREAD) != 0) {
2053                 /*
2054                  * We want one item to start on every align boundary in a page.
2055                  * To do this we will span pages.  We will also extend the item
2056                  * by the size of align if it is an even multiple of align.
2057                  * Otherwise, it would fall on the same boundary every time.
2058                  */
2059                 if ((rsize & alignsize) == 0)
2060                         rsize += alignsize;
2061                 slabsize = rsize * (PAGE_SIZE / alignsize);
2062                 slabsize = MIN(slabsize, rsize * SLAB_MAX_SETSIZE);
2063                 slabsize = MIN(slabsize, UMA_CACHESPREAD_MAX_SIZE);
2064                 slabsize = round_page(slabsize);
2065         } else {
2066                 /*
2067                  * Start with a slab size of as many pages as it takes to
2068                  * represent a single item.  We will try to fit as many
2069                  * additional items into the slab as possible.
2070                  */
2071                 slabsize = round_page(keg->uk_size);
2072         }
2073
2074         /* Build a list of all of the available formats for this keg. */
2075         nfmt = 0;
2076
2077         /* Evaluate an inline slab layout. */
2078         if ((keg->uk_flags & (UMA_ZONE_NOTOUCH | UMA_ZONE_PCPU)) == 0)
2079                 fmts[nfmt++] = 0;
2080
2081         /* TODO: vm_page-embedded slab. */
2082
2083         /*
2084          * We can't do OFFPAGE if we're internal or if we've been
2085          * asked to not go to the VM for buckets.  If we do this we
2086          * may end up going to the VM for slabs which we do not want
2087          * to do if we're UMA_ZONE_VM, which clearly forbids it.
2088          * In those cases, evaluate a pseudo-format called INTERNAL
2089          * which has an inline slab header and one extra page to
2090          * guarantee that it fits.
2091          *
2092          * Otherwise, see if using an OFFPAGE slab will improve our
2093          * efficiency.
2094          */
2095         if ((keg->uk_flags & (UMA_ZFLAG_INTERNAL | UMA_ZONE_VM)) != 0)
2096                 fmts[nfmt++] = UMA_ZFLAG_INTERNAL;
2097         else
2098                 fmts[nfmt++] = UMA_ZFLAG_OFFPAGE;
2099
2100         /*
2101          * Choose a slab size and format which satisfy the minimum efficiency.
2102          * Prefer the smallest slab size that meets the constraints.
2103          *
2104          * Start with a minimum slab size, to accommodate CACHESPREAD.  Then,
2105          * for small items (up to PAGE_SIZE), the iteration increment is one
2106          * page; and for large items, the increment is one item.
2107          */
2108         i = (slabsize + rsize - keg->uk_size) / MAX(PAGE_SIZE, rsize);
2109         KASSERT(i >= 1, ("keg %s(%p) flags=0x%b slabsize=%u, rsize=%u, i=%u",
2110             keg->uk_name, keg, keg->uk_flags, PRINT_UMA_ZFLAGS, slabsize,
2111             rsize, i));
2112         for ( ; ; i++) {
2113                 slabsize = (rsize <= PAGE_SIZE) ? ptoa(i) :
2114                     round_page(rsize * (i - 1) + keg->uk_size);
2115
2116                 for (j = 0; j < nfmt; j++) {
2117                         /* Only if we have no viable format yet. */
2118                         if ((fmts[j] & UMA_ZFLAG_INTERNAL) != 0 &&
2119                             kl.ipers > 0)
2120                                 continue;
2121
2122                         keg_layout_one(keg, rsize, slabsize, fmts[j], &kl_tmp);
2123                         if (kl_tmp.eff <= kl.eff)
2124                                 continue;
2125
2126                         kl = kl_tmp;
2127
2128                         CTR6(KTR_UMA, "keg %s layout: format %#x "
2129                             "(ipers %u * rsize %u) / slabsize %#x = %u%% eff",
2130                             keg->uk_name, kl.format, kl.ipers, rsize,
2131                             kl.slabsize, UMA_FIXPT_PCT(kl.eff));
2132
2133                         /* Stop when we reach the minimum efficiency. */
2134                         if (kl.eff >= UMA_MIN_EFF)
2135                                 break;
2136                 }
2137
2138                 if (kl.eff >= UMA_MIN_EFF || !multipage_slabs ||
2139                     slabsize >= SLAB_MAX_SETSIZE * rsize ||
2140                     (keg->uk_flags & (UMA_ZONE_PCPU | UMA_ZONE_CONTIG)) != 0)
2141                         break;
2142         }
2143
2144         pages = atop(kl.slabsize);
2145         if ((keg->uk_flags & UMA_ZONE_PCPU) != 0)
2146                 pages *= mp_maxid + 1;
2147
2148         keg->uk_rsize = rsize;
2149         keg->uk_ipers = kl.ipers;
2150         keg->uk_ppera = pages;
2151         keg->uk_flags |= kl.format;
2152
2153         /*
2154          * How do we find the slab header if it is offpage or if not all item
2155          * start addresses are in the same page?  We could solve the latter
2156          * case with vaddr alignment, but we don't.
2157          */
2158         if ((keg->uk_flags & UMA_ZFLAG_OFFPAGE) != 0 ||
2159             (keg->uk_ipers - 1) * rsize >= PAGE_SIZE) {
2160                 if ((keg->uk_flags & UMA_ZONE_NOTPAGE) != 0)
2161                         keg->uk_flags |= UMA_ZFLAG_HASH;
2162                 else
2163                         keg->uk_flags |= UMA_ZFLAG_VTOSLAB;
2164         }
2165
2166         CTR6(KTR_UMA, "%s: keg=%s, flags=%#x, rsize=%u, ipers=%u, ppera=%u",
2167             __func__, keg->uk_name, keg->uk_flags, rsize, keg->uk_ipers,
2168             pages);
2169         KASSERT(keg->uk_ipers > 0 && keg->uk_ipers <= SLAB_MAX_SETSIZE,
2170             ("%s: keg=%s, flags=0x%b, rsize=%u, ipers=%u, ppera=%u", __func__,
2171              keg->uk_name, keg->uk_flags, PRINT_UMA_ZFLAGS, rsize,
2172              keg->uk_ipers, pages));
2173 }
2174
2175 /*
2176  * Keg header ctor.  This initializes all fields, locks, etc.  And inserts
2177  * the keg onto the global keg list.
2178  *
2179  * Arguments/Returns follow uma_ctor specifications
2180  *      udata  Actually uma_kctor_args
2181  */
2182 static int
2183 keg_ctor(void *mem, int size, void *udata, int flags)
2184 {
2185         struct uma_kctor_args *arg = udata;
2186         uma_keg_t keg = mem;
2187         uma_zone_t zone;
2188         int i;
2189
2190         bzero(keg, size);
2191         keg->uk_size = arg->size;
2192         keg->uk_init = arg->uminit;
2193         keg->uk_fini = arg->fini;
2194         keg->uk_align = arg->align;
2195         keg->uk_reserve = 0;
2196         keg->uk_flags = arg->flags;
2197
2198         /*
2199          * We use a global round-robin policy by default.  Zones with
2200          * UMA_ZONE_FIRSTTOUCH set will use first-touch instead, in which
2201          * case the iterator is never run.
2202          */
2203         keg->uk_dr.dr_policy = DOMAINSET_RR();
2204         keg->uk_dr.dr_iter = 0;
2205
2206         /*
2207          * The primary zone is passed to us at keg-creation time.
2208          */
2209         zone = arg->zone;
2210         keg->uk_name = zone->uz_name;
2211
2212         if (arg->flags & UMA_ZONE_ZINIT)
2213                 keg->uk_init = zero_init;
2214
2215         if (arg->flags & UMA_ZONE_MALLOC)
2216                 keg->uk_flags |= UMA_ZFLAG_VTOSLAB;
2217
2218 #ifndef SMP
2219         keg->uk_flags &= ~UMA_ZONE_PCPU;
2220 #endif
2221
2222         keg_layout(keg);
2223
2224         /*
2225          * Use a first-touch NUMA policy for kegs that pmap_extract() will
2226          * work on.  Use round-robin for everything else.
2227          *
2228          * Zones may override the default by specifying either.
2229          */
2230 #ifdef NUMA
2231         if ((keg->uk_flags &
2232             (UMA_ZONE_ROUNDROBIN | UMA_ZFLAG_CACHE | UMA_ZONE_NOTPAGE)) == 0)
2233                 keg->uk_flags |= UMA_ZONE_FIRSTTOUCH;
2234         else if ((keg->uk_flags & UMA_ZONE_FIRSTTOUCH) == 0)
2235                 keg->uk_flags |= UMA_ZONE_ROUNDROBIN;
2236 #endif
2237
2238         /*
2239          * If we haven't booted yet we need allocations to go through the
2240          * startup cache until the vm is ready.
2241          */
2242 #ifdef UMA_MD_SMALL_ALLOC
2243         if (keg->uk_ppera == 1)
2244                 keg->uk_allocf = uma_small_alloc;
2245         else
2246 #endif
2247         if (booted < BOOT_KVA)
2248                 keg->uk_allocf = startup_alloc;
2249         else if (keg->uk_flags & UMA_ZONE_PCPU)
2250                 keg->uk_allocf = pcpu_page_alloc;
2251         else if ((keg->uk_flags & UMA_ZONE_CONTIG) != 0 && keg->uk_ppera > 1)
2252                 keg->uk_allocf = contig_alloc;
2253         else
2254                 keg->uk_allocf = page_alloc;
2255 #ifdef UMA_MD_SMALL_ALLOC
2256         if (keg->uk_ppera == 1)
2257                 keg->uk_freef = uma_small_free;
2258         else
2259 #endif
2260         if (keg->uk_flags & UMA_ZONE_PCPU)
2261                 keg->uk_freef = pcpu_page_free;
2262         else
2263                 keg->uk_freef = page_free;
2264
2265         /*
2266          * Initialize keg's locks.
2267          */
2268         for (i = 0; i < vm_ndomains; i++)
2269                 KEG_LOCK_INIT(keg, i, (arg->flags & UMA_ZONE_MTXCLASS));
2270
2271         /*
2272          * If we're putting the slab header in the actual page we need to
2273          * figure out where in each page it goes.  See slab_sizeof
2274          * definition.
2275          */
2276         if (!(keg->uk_flags & UMA_ZFLAG_OFFPAGE)) {
2277                 size_t shsize;
2278
2279                 shsize = slab_sizeof(keg->uk_ipers);
2280                 keg->uk_pgoff = (PAGE_SIZE * keg->uk_ppera) - shsize;
2281                 /*
2282                  * The only way the following is possible is if with our
2283                  * UMA_ALIGN_PTR adjustments we are now bigger than
2284                  * UMA_SLAB_SIZE.  I haven't checked whether this is
2285                  * mathematically possible for all cases, so we make
2286                  * sure here anyway.
2287                  */
2288                 KASSERT(keg->uk_pgoff + shsize <= PAGE_SIZE * keg->uk_ppera,
2289                     ("zone %s ipers %d rsize %d size %d slab won't fit",
2290                     zone->uz_name, keg->uk_ipers, keg->uk_rsize, keg->uk_size));
2291         }
2292
2293         if (keg->uk_flags & UMA_ZFLAG_HASH)
2294                 hash_alloc(&keg->uk_hash, 0);
2295
2296         CTR3(KTR_UMA, "keg_ctor %p zone %s(%p)", keg, zone->uz_name, zone);
2297
2298         LIST_INSERT_HEAD(&keg->uk_zones, zone, uz_link);
2299
2300         rw_wlock(&uma_rwlock);
2301         LIST_INSERT_HEAD(&uma_kegs, keg, uk_link);
2302         rw_wunlock(&uma_rwlock);
2303         return (0);
2304 }
2305
2306 static void
2307 zone_kva_available(uma_zone_t zone, void *unused)
2308 {
2309         uma_keg_t keg;
2310
2311         if ((zone->uz_flags & UMA_ZFLAG_CACHE) != 0)
2312                 return;
2313         KEG_GET(zone, keg);
2314
2315         if (keg->uk_allocf == startup_alloc) {
2316                 /* Switch to the real allocator. */
2317                 if (keg->uk_flags & UMA_ZONE_PCPU)
2318                         keg->uk_allocf = pcpu_page_alloc;
2319                 else if ((keg->uk_flags & UMA_ZONE_CONTIG) != 0 &&
2320                     keg->uk_ppera > 1)
2321                         keg->uk_allocf = contig_alloc;
2322                 else
2323                         keg->uk_allocf = page_alloc;
2324         }
2325 }
2326
2327 static void
2328 zone_alloc_counters(uma_zone_t zone, void *unused)
2329 {
2330
2331         zone->uz_allocs = counter_u64_alloc(M_WAITOK);
2332         zone->uz_frees = counter_u64_alloc(M_WAITOK);
2333         zone->uz_fails = counter_u64_alloc(M_WAITOK);
2334         zone->uz_xdomain = counter_u64_alloc(M_WAITOK);
2335 }
2336
2337 static void
2338 zone_alloc_sysctl(uma_zone_t zone, void *unused)
2339 {
2340         uma_zone_domain_t zdom;
2341         uma_domain_t dom;
2342         uma_keg_t keg;
2343         struct sysctl_oid *oid, *domainoid;
2344         int domains, i, cnt;
2345         static const char *nokeg = "cache zone";
2346         char *c;
2347
2348         /*
2349          * Make a sysctl safe copy of the zone name by removing
2350          * any special characters and handling dups by appending
2351          * an index.
2352          */
2353         if (zone->uz_namecnt != 0) {
2354                 /* Count the number of decimal digits and '_' separator. */
2355                 for (i = 1, cnt = zone->uz_namecnt; cnt != 0; i++)
2356                         cnt /= 10;
2357                 zone->uz_ctlname = malloc(strlen(zone->uz_name) + i + 1,
2358                     M_UMA, M_WAITOK);
2359                 sprintf(zone->uz_ctlname, "%s_%d", zone->uz_name,
2360                     zone->uz_namecnt);
2361         } else
2362                 zone->uz_ctlname = strdup(zone->uz_name, M_UMA);
2363         for (c = zone->uz_ctlname; *c != '\0'; c++)
2364                 if (strchr("./\\ -", *c) != NULL)
2365                         *c = '_';
2366
2367         /*
2368          * Basic parameters at the root.
2369          */
2370         zone->uz_oid = SYSCTL_ADD_NODE(NULL, SYSCTL_STATIC_CHILDREN(_vm_uma),
2371             OID_AUTO, zone->uz_ctlname, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2372         oid = zone->uz_oid;
2373         SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2374             "size", CTLFLAG_RD, &zone->uz_size, 0, "Allocation size");
2375         SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2376             "flags", CTLFLAG_RD | CTLTYPE_STRING | CTLFLAG_MPSAFE,
2377             zone, 0, sysctl_handle_uma_zone_flags, "A",
2378             "Allocator configuration flags");
2379         SYSCTL_ADD_U16(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2380             "bucket_size", CTLFLAG_RD, &zone->uz_bucket_size, 0,
2381             "Desired per-cpu cache size");
2382         SYSCTL_ADD_U16(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2383             "bucket_size_max", CTLFLAG_RD, &zone->uz_bucket_size_max, 0,
2384             "Maximum allowed per-cpu cache size");
2385
2386         /*
2387          * keg if present.
2388          */
2389         if ((zone->uz_flags & UMA_ZFLAG_HASH) == 0)
2390                 domains = vm_ndomains;
2391         else
2392                 domains = 1;
2393         oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid), OID_AUTO,
2394             "keg", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2395         keg = zone->uz_keg;
2396         if ((zone->uz_flags & UMA_ZFLAG_CACHE) == 0) {
2397                 SYSCTL_ADD_CONST_STRING(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2398                     "name", CTLFLAG_RD, keg->uk_name, "Keg name");
2399                 SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2400                     "rsize", CTLFLAG_RD, &keg->uk_rsize, 0,
2401                     "Real object size with alignment");
2402                 SYSCTL_ADD_U16(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2403                     "ppera", CTLFLAG_RD, &keg->uk_ppera, 0,
2404                     "pages per-slab allocation");
2405                 SYSCTL_ADD_U16(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2406                     "ipers", CTLFLAG_RD, &keg->uk_ipers, 0,
2407                     "items available per-slab");
2408                 SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2409                     "align", CTLFLAG_RD, &keg->uk_align, 0,
2410                     "item alignment mask");
2411                 SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2412                     "efficiency", CTLFLAG_RD | CTLTYPE_INT | CTLFLAG_MPSAFE,
2413                     keg, 0, sysctl_handle_uma_slab_efficiency, "I",
2414                     "Slab utilization (100 - internal fragmentation %)");
2415                 domainoid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(oid),
2416                     OID_AUTO, "domain", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2417                 for (i = 0; i < domains; i++) {
2418                         dom = &keg->uk_domain[i];
2419                         oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(domainoid),
2420                             OID_AUTO, VM_DOMAIN(i)->vmd_name,
2421                             CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2422                         SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2423                             "pages", CTLFLAG_RD, &dom->ud_pages, 0,
2424                             "Total pages currently allocated from VM");
2425                         SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2426                             "free_items", CTLFLAG_RD, &dom->ud_free_items, 0,
2427                             "items free in the slab layer");
2428                 }
2429         } else
2430                 SYSCTL_ADD_CONST_STRING(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2431                     "name", CTLFLAG_RD, nokeg, "Keg name");
2432
2433         /*
2434          * Information about zone limits.
2435          */
2436         oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid), OID_AUTO,
2437             "limit", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2438         SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2439             "items", CTLFLAG_RD | CTLTYPE_U64 | CTLFLAG_MPSAFE,
2440             zone, 0, sysctl_handle_uma_zone_items, "QU",
2441             "current number of allocated items if limit is set");
2442         SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2443             "max_items", CTLFLAG_RD, &zone->uz_max_items, 0,
2444             "Maximum number of cached items");
2445         SYSCTL_ADD_U32(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2446             "sleepers", CTLFLAG_RD, &zone->uz_sleepers, 0,
2447             "Number of threads sleeping at limit");
2448         SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2449             "sleeps", CTLFLAG_RD, &zone->uz_sleeps, 0,
2450             "Total zone limit sleeps");
2451         SYSCTL_ADD_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2452             "bucket_max", CTLFLAG_RD, &zone->uz_bucket_max, 0,
2453             "Maximum number of items in each domain's bucket cache");
2454
2455         /*
2456          * Per-domain zone information.
2457          */
2458         domainoid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid),
2459             OID_AUTO, "domain", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2460         for (i = 0; i < domains; i++) {
2461                 zdom = ZDOM_GET(zone, i);
2462                 oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(domainoid),
2463                     OID_AUTO, VM_DOMAIN(i)->vmd_name,
2464                     CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2465                 SYSCTL_ADD_LONG(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2466                     "nitems", CTLFLAG_RD, &zdom->uzd_nitems,
2467                     "number of items in this domain");
2468                 SYSCTL_ADD_LONG(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2469                     "imax", CTLFLAG_RD, &zdom->uzd_imax,
2470                     "maximum item count in this period");
2471                 SYSCTL_ADD_LONG(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2472                     "imin", CTLFLAG_RD, &zdom->uzd_imin,
2473                     "minimum item count in this period");
2474                 SYSCTL_ADD_LONG(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2475                     "wss", CTLFLAG_RD, &zdom->uzd_wss,
2476                     "Working set size");
2477         }
2478
2479         /*
2480          * General statistics.
2481          */
2482         oid = SYSCTL_ADD_NODE(NULL, SYSCTL_CHILDREN(zone->uz_oid), OID_AUTO,
2483             "stats", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "");
2484         SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2485             "current", CTLFLAG_RD | CTLTYPE_INT | CTLFLAG_MPSAFE,
2486             zone, 1, sysctl_handle_uma_zone_cur, "I",
2487             "Current number of allocated items");
2488         SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2489             "allocs", CTLFLAG_RD | CTLTYPE_U64 | CTLFLAG_MPSAFE,
2490             zone, 0, sysctl_handle_uma_zone_allocs, "QU",
2491             "Total allocation calls");
2492         SYSCTL_ADD_PROC(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2493             "frees", CTLFLAG_RD | CTLTYPE_U64 | CTLFLAG_MPSAFE,
2494             zone, 0, sysctl_handle_uma_zone_frees, "QU",
2495             "Total free calls");
2496         SYSCTL_ADD_COUNTER_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2497             "fails", CTLFLAG_RD, &zone->uz_fails,
2498             "Number of allocation failures");
2499         SYSCTL_ADD_COUNTER_U64(NULL, SYSCTL_CHILDREN(oid), OID_AUTO,
2500             "xdomain", CTLFLAG_RD, &zone->uz_xdomain,
2501             "Free calls from the wrong domain");
2502 }
2503
2504 struct uma_zone_count {
2505         const char      *name;
2506         int             count;
2507 };
2508
2509 static void
2510 zone_count(uma_zone_t zone, void *arg)
2511 {
2512         struct uma_zone_count *cnt;
2513
2514         cnt = arg;
2515         /*
2516          * Some zones are rapidly created with identical names and
2517          * destroyed out of order.  This can lead to gaps in the count.
2518          * Use one greater than the maximum observed for this name.
2519          */
2520         if (strcmp(zone->uz_name, cnt->name) == 0)
2521                 cnt->count = MAX(cnt->count,
2522                     zone->uz_namecnt + 1);
2523 }
2524
2525 static void
2526 zone_update_caches(uma_zone_t zone)
2527 {
2528         int i;
2529
2530         for (i = 0; i <= mp_maxid; i++) {
2531                 cache_set_uz_size(&zone->uz_cpu[i], zone->uz_size);
2532                 cache_set_uz_flags(&zone->uz_cpu[i], zone->uz_flags);
2533         }
2534 }
2535
2536 /*
2537  * Zone header ctor.  This initializes all fields, locks, etc.
2538  *
2539  * Arguments/Returns follow uma_ctor specifications
2540  *      udata  Actually uma_zctor_args
2541  */
2542 static int
2543 zone_ctor(void *mem, int size, void *udata, int flags)
2544 {
2545         struct uma_zone_count cnt;
2546         struct uma_zctor_args *arg = udata;
2547         uma_zone_domain_t zdom;
2548         uma_zone_t zone = mem;
2549         uma_zone_t z;
2550         uma_keg_t keg;
2551         int i;
2552
2553         bzero(zone, size);
2554         zone->uz_name = arg->name;
2555         zone->uz_ctor = arg->ctor;
2556         zone->uz_dtor = arg->dtor;
2557         zone->uz_init = NULL;
2558         zone->uz_fini = NULL;
2559         zone->uz_sleeps = 0;
2560         zone->uz_bucket_size = 0;
2561         zone->uz_bucket_size_min = 0;
2562         zone->uz_bucket_size_max = BUCKET_MAX;
2563         zone->uz_flags = (arg->flags & UMA_ZONE_SMR);
2564         zone->uz_warning = NULL;
2565         /* The domain structures follow the cpu structures. */
2566         zone->uz_bucket_max = ULONG_MAX;
2567         timevalclear(&zone->uz_ratecheck);
2568
2569         /* Count the number of duplicate names. */
2570         cnt.name = arg->name;
2571         cnt.count = 0;
2572         zone_foreach(zone_count, &cnt);
2573         zone->uz_namecnt = cnt.count;
2574         ZONE_CROSS_LOCK_INIT(zone);
2575
2576         for (i = 0; i < vm_ndomains; i++) {
2577                 zdom = ZDOM_GET(zone, i);
2578                 ZDOM_LOCK_INIT(zone, zdom, (arg->flags & UMA_ZONE_MTXCLASS));
2579                 STAILQ_INIT(&zdom->uzd_buckets);
2580         }
2581
2582 #ifdef INVARIANTS
2583         if (arg->uminit == trash_init && arg->fini == trash_fini)
2584                 zone->uz_flags |= UMA_ZFLAG_TRASH | UMA_ZFLAG_CTORDTOR;
2585 #endif
2586
2587         /*
2588          * This is a pure cache zone, no kegs.
2589          */
2590         if (arg->import) {
2591                 KASSERT((arg->flags & UMA_ZFLAG_CACHE) != 0,
2592                     ("zone_ctor: Import specified for non-cache zone."));
2593                 zone->uz_flags = arg->flags;
2594                 zone->uz_size = arg->size;
2595                 zone->uz_import = arg->import;
2596                 zone->uz_release = arg->release;
2597                 zone->uz_arg = arg->arg;
2598 #ifdef NUMA
2599                 /*
2600                  * Cache zones are round-robin unless a policy is
2601                  * specified because they may have incompatible
2602                  * constraints.
2603                  */
2604                 if ((zone->uz_flags & UMA_ZONE_FIRSTTOUCH) == 0)
2605                         zone->uz_flags |= UMA_ZONE_ROUNDROBIN;
2606 #endif
2607                 rw_wlock(&uma_rwlock);
2608                 LIST_INSERT_HEAD(&uma_cachezones, zone, uz_link);
2609                 rw_wunlock(&uma_rwlock);
2610                 goto out;
2611         }
2612
2613         /*
2614          * Use the regular zone/keg/slab allocator.
2615          */
2616         zone->uz_import = zone_import;
2617         zone->uz_release = zone_release;
2618         zone->uz_arg = zone; 
2619         keg = arg->keg;
2620
2621         if (arg->flags & UMA_ZONE_SECONDARY) {
2622                 KASSERT((zone->uz_flags & UMA_ZONE_SECONDARY) == 0,
2623                     ("Secondary zone requested UMA_ZFLAG_INTERNAL"));
2624                 KASSERT(arg->keg != NULL, ("Secondary zone on zero'd keg"));
2625                 zone->uz_init = arg->uminit;
2626                 zone->uz_fini = arg->fini;
2627                 zone->uz_flags |= UMA_ZONE_SECONDARY;
2628                 rw_wlock(&uma_rwlock);
2629                 ZONE_LOCK(zone);
2630                 LIST_FOREACH(z, &keg->uk_zones, uz_link) {
2631                         if (LIST_NEXT(z, uz_link) == NULL) {
2632                                 LIST_INSERT_AFTER(z, zone, uz_link);
2633                                 break;
2634                         }
2635                 }
2636                 ZONE_UNLOCK(zone);
2637                 rw_wunlock(&uma_rwlock);
2638         } else if (keg == NULL) {
2639                 if ((keg = uma_kcreate(zone, arg->size, arg->uminit, arg->fini,
2640                     arg->align, arg->flags)) == NULL)
2641                         return (ENOMEM);
2642         } else {
2643                 struct uma_kctor_args karg;
2644                 int error;
2645
2646                 /* We should only be here from uma_startup() */
2647                 karg.size = arg->size;
2648                 karg.uminit = arg->uminit;
2649                 karg.fini = arg->fini;
2650                 karg.align = arg->align;
2651                 karg.flags = (arg->flags & ~UMA_ZONE_SMR);
2652                 karg.zone = zone;
2653                 error = keg_ctor(arg->keg, sizeof(struct uma_keg), &karg,
2654                     flags);
2655                 if (error)
2656                         return (error);
2657         }
2658
2659         /* Inherit properties from the keg. */
2660         zone->uz_keg = keg;
2661         zone->uz_size = keg->uk_size;
2662         zone->uz_flags |= (keg->uk_flags &
2663             (UMA_ZONE_INHERIT | UMA_ZFLAG_INHERIT));
2664
2665 out:
2666         if (booted >= BOOT_PCPU) {
2667                 zone_alloc_counters(zone, NULL);
2668                 if (booted >= BOOT_RUNNING)
2669                         zone_alloc_sysctl(zone, NULL);
2670         } else {
2671                 zone->uz_allocs = EARLY_COUNTER;
2672                 zone->uz_frees = EARLY_COUNTER;
2673                 zone->uz_fails = EARLY_COUNTER;
2674         }
2675
2676         /* Caller requests a private SMR context. */
2677         if ((zone->uz_flags & UMA_ZONE_SMR) != 0)
2678                 zone->uz_smr = smr_create(zone->uz_name, 0, 0);
2679
2680         KASSERT((arg->flags & (UMA_ZONE_MAXBUCKET | UMA_ZONE_NOBUCKET)) !=
2681             (UMA_ZONE_MAXBUCKET | UMA_ZONE_NOBUCKET),
2682             ("Invalid zone flag combination"));
2683         if (arg->flags & UMA_ZFLAG_INTERNAL)
2684                 zone->uz_bucket_size_max = zone->uz_bucket_size = 0;
2685         if ((arg->flags & UMA_ZONE_MAXBUCKET) != 0)
2686                 zone->uz_bucket_size = BUCKET_MAX;
2687         else if ((arg->flags & UMA_ZONE_MINBUCKET) != 0)
2688                 zone->uz_bucket_size_max = zone->uz_bucket_size = BUCKET_MIN;
2689         else if ((arg->flags & UMA_ZONE_NOBUCKET) != 0)
2690                 zone->uz_bucket_size = 0;
2691         else
2692                 zone->uz_bucket_size = bucket_select(zone->uz_size);
2693         zone->uz_bucket_size_min = zone->uz_bucket_size;
2694         if (zone->uz_dtor != NULL || zone->uz_ctor != NULL)
2695                 zone->uz_flags |= UMA_ZFLAG_CTORDTOR;
2696         zone_update_caches(zone);
2697
2698         return (0);
2699 }
2700
2701 /*
2702  * Keg header dtor.  This frees all data, destroys locks, frees the hash
2703  * table and removes the keg from the global list.
2704  *
2705  * Arguments/Returns follow uma_dtor specifications
2706  *      udata  unused
2707  */
2708 static void
2709 keg_dtor(void *arg, int size, void *udata)
2710 {
2711         uma_keg_t keg;
2712         uint32_t free, pages;
2713         int i;
2714
2715         keg = (uma_keg_t)arg;
2716         free = pages = 0;
2717         for (i = 0; i < vm_ndomains; i++) {
2718                 free += keg->uk_domain[i].ud_free_items;
2719                 pages += keg->uk_domain[i].ud_pages;
2720                 KEG_LOCK_FINI(keg, i);
2721         }
2722         if (pages != 0)
2723                 printf("Freed UMA keg (%s) was not empty (%u items). "
2724                     " Lost %u pages of memory.\n",
2725                     keg->uk_name ? keg->uk_name : "",
2726                     pages / keg->uk_ppera * keg->uk_ipers - free, pages);
2727
2728         hash_free(&keg->uk_hash);
2729 }
2730
2731 /*
2732  * Zone header dtor.
2733  *
2734  * Arguments/Returns follow uma_dtor specifications
2735  *      udata  unused
2736  */
2737 static void
2738 zone_dtor(void *arg, int size, void *udata)
2739 {
2740         uma_zone_t zone;
2741         uma_keg_t keg;
2742         int i;
2743
2744         zone = (uma_zone_t)arg;
2745
2746         sysctl_remove_oid(zone->uz_oid, 1, 1);
2747
2748         if (!(zone->uz_flags & UMA_ZFLAG_INTERNAL))
2749                 cache_drain(zone);
2750
2751         rw_wlock(&uma_rwlock);
2752         LIST_REMOVE(zone, uz_link);
2753         rw_wunlock(&uma_rwlock);
2754         zone_reclaim(zone, M_WAITOK, true);
2755
2756         /*
2757          * We only destroy kegs from non secondary/non cache zones.
2758          */
2759         if ((zone->uz_flags & (UMA_ZONE_SECONDARY | UMA_ZFLAG_CACHE)) == 0) {
2760                 keg = zone->uz_keg;
2761                 rw_wlock(&uma_rwlock);
2762                 LIST_REMOVE(keg, uk_link);
2763                 rw_wunlock(&uma_rwlock);
2764                 zone_free_item(kegs, keg, NULL, SKIP_NONE);
2765         }
2766         counter_u64_free(zone->uz_allocs);
2767         counter_u64_free(zone->uz_frees);
2768         counter_u64_free(zone->uz_fails);
2769         counter_u64_free(zone->uz_xdomain);
2770         free(zone->uz_ctlname, M_UMA);
2771         for (i = 0; i < vm_ndomains; i++)
2772                 ZDOM_LOCK_FINI(ZDOM_GET(zone, i));
2773         ZONE_CROSS_LOCK_FINI(zone);
2774 }
2775
2776 static void
2777 zone_foreach_unlocked(void (*zfunc)(uma_zone_t, void *arg), void *arg)
2778 {
2779         uma_keg_t keg;
2780         uma_zone_t zone;
2781
2782         LIST_FOREACH(keg, &uma_kegs, uk_link) {
2783                 LIST_FOREACH(zone, &keg->uk_zones, uz_link)
2784                         zfunc(zone, arg);
2785         }
2786         LIST_FOREACH(zone, &uma_cachezones, uz_link)
2787                 zfunc(zone, arg);
2788 }
2789
2790 /*
2791  * Traverses every zone in the system and calls a callback
2792  *
2793  * Arguments:
2794  *      zfunc  A pointer to a function which accepts a zone
2795  *              as an argument.
2796  *
2797  * Returns:
2798  *      Nothing
2799  */
2800 static void
2801 zone_foreach(void (*zfunc)(uma_zone_t, void *arg), void *arg)
2802 {
2803
2804         rw_rlock(&uma_rwlock);
2805         zone_foreach_unlocked(zfunc, arg);
2806         rw_runlock(&uma_rwlock);
2807 }
2808
2809 /*
2810  * Initialize the kernel memory allocator.  This is done after pages can be
2811  * allocated but before general KVA is available.
2812  */
2813 void
2814 uma_startup1(vm_offset_t virtual_avail)
2815 {
2816         struct uma_zctor_args args;
2817         size_t ksize, zsize, size;
2818         uma_keg_t primarykeg;
2819         uintptr_t m;
2820         int domain;
2821         uint8_t pflag;
2822
2823         bootstart = bootmem = virtual_avail;
2824
2825         rw_init(&uma_rwlock, "UMA lock");
2826         sx_init(&uma_reclaim_lock, "umareclaim");
2827
2828         ksize = sizeof(struct uma_keg) +
2829             (sizeof(struct uma_domain) * vm_ndomains);
2830         ksize = roundup(ksize, UMA_SUPER_ALIGN);
2831         zsize = sizeof(struct uma_zone) +
2832             (sizeof(struct uma_cache) * (mp_maxid + 1)) +
2833             (sizeof(struct uma_zone_domain) * vm_ndomains);
2834         zsize = roundup(zsize, UMA_SUPER_ALIGN);
2835
2836         /* Allocate the zone of zones, zone of kegs, and zone of zones keg. */
2837         size = (zsize * 2) + ksize;
2838         for (domain = 0; domain < vm_ndomains; domain++) {
2839                 m = (uintptr_t)startup_alloc(NULL, size, domain, &pflag,
2840                     M_NOWAIT | M_ZERO);
2841                 if (m != 0)
2842                         break;
2843         }
2844         zones = (uma_zone_t)m;
2845         m += zsize;
2846         kegs = (uma_zone_t)m;
2847         m += zsize;
2848         primarykeg = (uma_keg_t)m;
2849
2850         /* "manually" create the initial zone */
2851         memset(&args, 0, sizeof(args));
2852         args.name = "UMA Kegs";
2853         args.size = ksize;
2854         args.ctor = keg_ctor;
2855         args.dtor = keg_dtor;
2856         args.uminit = zero_init;
2857         args.fini = NULL;
2858         args.keg = primarykeg;
2859         args.align = UMA_SUPER_ALIGN - 1;
2860         args.flags = UMA_ZFLAG_INTERNAL;
2861         zone_ctor(kegs, zsize, &args, M_WAITOK);
2862
2863         args.name = "UMA Zones";
2864         args.size = zsize;
2865         args.ctor = zone_ctor;
2866         args.dtor = zone_dtor;
2867         args.uminit = zero_init;
2868         args.fini = NULL;
2869         args.keg = NULL;
2870         args.align = UMA_SUPER_ALIGN - 1;
2871         args.flags = UMA_ZFLAG_INTERNAL;
2872         zone_ctor(zones, zsize, &args, M_WAITOK);
2873
2874         /* Now make zones for slab headers */
2875         slabzones[0] = uma_zcreate("UMA Slabs 0", SLABZONE0_SIZE,
2876             NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZFLAG_INTERNAL);
2877         slabzones[1] = uma_zcreate("UMA Slabs 1", SLABZONE1_SIZE,
2878             NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZFLAG_INTERNAL);
2879
2880         hashzone = uma_zcreate("UMA Hash",
2881             sizeof(struct slabhead *) * UMA_HASH_SIZE_INIT,
2882             NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZFLAG_INTERNAL);
2883
2884         bucket_init();
2885         smr_init();
2886 }
2887
2888 #ifndef UMA_MD_SMALL_ALLOC
2889 extern void vm_radix_reserve_kva(void);
2890 #endif
2891
2892 /*
2893  * Advertise the availability of normal kva allocations and switch to
2894  * the default back-end allocator.  Marks the KVA we consumed on startup
2895  * as used in the map.
2896  */
2897 void
2898 uma_startup2(void)
2899 {
2900
2901         if (bootstart != bootmem) {
2902                 vm_map_lock(kernel_map);
2903                 (void)vm_map_insert(kernel_map, NULL, 0, bootstart, bootmem,
2904                     VM_PROT_RW, VM_PROT_RW, MAP_NOFAULT);
2905                 vm_map_unlock(kernel_map);
2906         }
2907
2908 #ifndef UMA_MD_SMALL_ALLOC
2909         /* Set up radix zone to use noobj_alloc. */
2910         vm_radix_reserve_kva();
2911 #endif
2912
2913         booted = BOOT_KVA;
2914         zone_foreach_unlocked(zone_kva_available, NULL);
2915         bucket_enable();
2916 }
2917
2918 /*
2919  * Allocate counters as early as possible so that boot-time allocations are
2920  * accounted more precisely.
2921  */
2922 static void
2923 uma_startup_pcpu(void *arg __unused)
2924 {
2925
2926         zone_foreach_unlocked(zone_alloc_counters, NULL);
2927         booted = BOOT_PCPU;
2928 }
2929 SYSINIT(uma_startup_pcpu, SI_SUB_COUNTER, SI_ORDER_ANY, uma_startup_pcpu, NULL);
2930
2931 /*
2932  * Finish our initialization steps.
2933  */
2934 static void
2935 uma_startup3(void *arg __unused)
2936 {
2937
2938 #ifdef INVARIANTS
2939         TUNABLE_INT_FETCH("vm.debug.divisor", &dbg_divisor);
2940         uma_dbg_cnt = counter_u64_alloc(M_WAITOK);
2941         uma_skip_cnt = counter_u64_alloc(M_WAITOK);
2942 #endif
2943         zone_foreach_unlocked(zone_alloc_sysctl, NULL);
2944         callout_init(&uma_callout, 1);
2945         callout_reset(&uma_callout, UMA_TIMEOUT * hz, uma_timeout, NULL);
2946         booted = BOOT_RUNNING;
2947
2948         EVENTHANDLER_REGISTER(shutdown_post_sync, uma_shutdown, NULL,
2949             EVENTHANDLER_PRI_FIRST);
2950 }
2951 SYSINIT(uma_startup3, SI_SUB_VM_CONF, SI_ORDER_SECOND, uma_startup3, NULL);
2952
2953 static void
2954 uma_shutdown(void)
2955 {
2956
2957         booted = BOOT_SHUTDOWN;
2958 }
2959
2960 static uma_keg_t
2961 uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini,
2962                 int align, uint32_t flags)
2963 {
2964         struct uma_kctor_args args;
2965
2966         args.size = size;
2967         args.uminit = uminit;
2968         args.fini = fini;
2969         args.align = (align == UMA_ALIGN_CACHE) ? uma_align_cache : align;
2970         args.flags = flags;
2971         args.zone = zone;
2972         return (zone_alloc_item(kegs, &args, UMA_ANYDOMAIN, M_WAITOK));
2973 }
2974
2975 /* Public functions */
2976 /* See uma.h */
2977 void
2978 uma_set_align(int align)
2979 {
2980
2981         if (align != UMA_ALIGN_CACHE)
2982                 uma_align_cache = align;
2983 }
2984
2985 /* See uma.h */
2986 uma_zone_t
2987 uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor,
2988                 uma_init uminit, uma_fini fini, int align, uint32_t flags)
2989
2990 {
2991         struct uma_zctor_args args;
2992         uma_zone_t res;
2993
2994         KASSERT(powerof2(align + 1), ("invalid zone alignment %d for \"%s\"",
2995             align, name));
2996
2997         /* This stuff is essential for the zone ctor */
2998         memset(&args, 0, sizeof(args));
2999         args.name = name;
3000         args.size = size;
3001         args.ctor = ctor;
3002         args.dtor = dtor;
3003         args.uminit = uminit;
3004         args.fini = fini;
3005 #ifdef  INVARIANTS
3006         /*
3007          * Inject procedures which check for memory use after free if we are
3008          * allowed to scramble the memory while it is not allocated.  This
3009          * requires that: UMA is actually able to access the memory, no init
3010          * or fini procedures, no dependency on the initial value of the
3011          * memory, and no (legitimate) use of the memory after free.  Note,
3012          * the ctor and dtor do not need to be empty.
3013          */
3014         if ((!(flags & (UMA_ZONE_ZINIT | UMA_ZONE_NOTOUCH |
3015             UMA_ZONE_NOFREE))) && uminit == NULL && fini == NULL) {
3016                 args.uminit = trash_init;
3017                 args.fini = trash_fini;
3018         }
3019 #endif
3020         args.align = align;
3021         args.flags = flags;
3022         args.keg = NULL;
3023
3024         sx_slock(&uma_reclaim_lock);
3025         res = zone_alloc_item(zones, &args, UMA_ANYDOMAIN, M_WAITOK);
3026         sx_sunlock(&uma_reclaim_lock);
3027
3028         return (res);
3029 }
3030
3031 /* See uma.h */
3032 uma_zone_t
3033 uma_zsecond_create(const char *name, uma_ctor ctor, uma_dtor dtor,
3034     uma_init zinit, uma_fini zfini, uma_zone_t primary)
3035 {
3036         struct uma_zctor_args args;
3037         uma_keg_t keg;
3038         uma_zone_t res;
3039
3040         keg = primary->uz_keg;
3041         memset(&args, 0, sizeof(args));
3042         args.name = name;
3043         args.size = keg->uk_size;
3044         args.ctor = ctor;
3045         args.dtor = dtor;
3046         args.uminit = zinit;
3047         args.fini = zfini;
3048         args.align = keg->uk_align;
3049         args.flags = keg->uk_flags | UMA_ZONE_SECONDARY;
3050         args.keg = keg;
3051
3052         sx_slock(&uma_reclaim_lock);
3053         res = zone_alloc_item(zones, &args, UMA_ANYDOMAIN, M_WAITOK);
3054         sx_sunlock(&uma_reclaim_lock);
3055
3056         return (res);
3057 }
3058
3059 /* See uma.h */
3060 uma_zone_t
3061 uma_zcache_create(const char *name, int size, uma_ctor ctor, uma_dtor dtor,
3062     uma_init zinit, uma_fini zfini, uma_import zimport, uma_release zrelease,
3063     void *arg, int flags)
3064 {
3065         struct uma_zctor_args args;
3066
3067         memset(&args, 0, sizeof(args));
3068         args.name = name;
3069         args.size = size;
3070         args.ctor = ctor;
3071         args.dtor = dtor;
3072         args.uminit = zinit;
3073         args.fini = zfini;
3074         args.import = zimport;
3075         args.release = zrelease;
3076         args.arg = arg;
3077         args.align = 0;
3078         args.flags = flags | UMA_ZFLAG_CACHE;
3079
3080         return (zone_alloc_item(zones, &args, UMA_ANYDOMAIN, M_WAITOK));
3081 }
3082
3083 /* See uma.h */
3084 void
3085 uma_zdestroy(uma_zone_t zone)
3086 {
3087
3088         /*
3089          * Large slabs are expensive to reclaim, so don't bother doing
3090          * unnecessary work if we're shutting down.
3091          */
3092         if (booted == BOOT_SHUTDOWN &&
3093             zone->uz_fini == NULL && zone->uz_release == zone_release)
3094                 return;
3095         sx_slock(&uma_reclaim_lock);
3096         zone_free_item(zones, zone, NULL, SKIP_NONE);
3097         sx_sunlock(&uma_reclaim_lock);
3098 }
3099
3100 void
3101 uma_zwait(uma_zone_t zone)
3102 {
3103
3104         if ((zone->uz_flags & UMA_ZONE_SMR) != 0)
3105                 uma_zfree_smr(zone, uma_zalloc_smr(zone, M_WAITOK));
3106         else if ((zone->uz_flags & UMA_ZONE_PCPU) != 0)
3107                 uma_zfree_pcpu(zone, uma_zalloc_pcpu(zone, M_WAITOK));
3108         else
3109                 uma_zfree(zone, uma_zalloc(zone, M_WAITOK));
3110 }
3111
3112 void *
3113 uma_zalloc_pcpu_arg(uma_zone_t zone, void *udata, int flags)
3114 {
3115         void *item, *pcpu_item;
3116 #ifdef SMP
3117         int i;
3118
3119         MPASS(zone->uz_flags & UMA_ZONE_PCPU);
3120 #endif
3121         item = uma_zalloc_arg(zone, udata, flags & ~M_ZERO);
3122         if (item == NULL)
3123                 return (NULL);
3124         pcpu_item = zpcpu_base_to_offset(item);
3125         if (flags & M_ZERO) {
3126 #ifdef SMP
3127                 for (i = 0; i <= mp_maxid; i++)
3128                         bzero(zpcpu_get_cpu(pcpu_item, i), zone->uz_size);
3129 #else
3130                 bzero(item, zone->uz_size);
3131 #endif
3132         }
3133         return (pcpu_item);
3134 }
3135
3136 /*
3137  * A stub while both regular and pcpu cases are identical.
3138  */
3139 void
3140 uma_zfree_pcpu_arg(uma_zone_t zone, void *pcpu_item, void *udata)
3141 {
3142         void *item;
3143
3144 #ifdef SMP
3145         MPASS(zone->uz_flags & UMA_ZONE_PCPU);
3146 #endif
3147         item = zpcpu_offset_to_base(pcpu_item);
3148         uma_zfree_arg(zone, item, udata);
3149 }
3150
3151 static inline void *
3152 item_ctor(uma_zone_t zone, int uz_flags, int size, void *udata, int flags,
3153     void *item)
3154 {
3155 #ifdef INVARIANTS
3156         bool skipdbg;
3157
3158         skipdbg = uma_dbg_zskip(zone, item);
3159         if (!skipdbg && (zone->uz_flags & UMA_ZFLAG_TRASH) != 0 &&
3160             zone->uz_ctor != trash_ctor)
3161                 trash_ctor(item, size, udata, flags);
3162 #endif
3163         /* Check flags before loading ctor pointer. */
3164         if (__predict_false((uz_flags & UMA_ZFLAG_CTORDTOR) != 0) &&
3165             __predict_false(zone->uz_ctor != NULL) &&
3166             zone->uz_ctor(item, size, udata, flags) != 0) {
3167                 counter_u64_add(zone->uz_fails, 1);
3168                 zone_free_item(zone, item, udata, SKIP_DTOR | SKIP_CNT);
3169                 return (NULL);
3170         }
3171 #ifdef INVARIANTS
3172         if (!skipdbg)
3173                 uma_dbg_alloc(zone, NULL, item);
3174 #endif
3175         if (__predict_false(flags & M_ZERO))
3176                 return (memset(item, 0, size));
3177
3178         return (item);
3179 }
3180
3181 static inline void
3182 item_dtor(uma_zone_t zone, void *item, int size, void *udata,
3183     enum zfreeskip skip)
3184 {
3185 #ifdef INVARIANTS
3186         bool skipdbg;
3187
3188         skipdbg = uma_dbg_zskip(zone, item);
3189         if (skip == SKIP_NONE && !skipdbg) {
3190                 if ((zone->uz_flags & UMA_ZONE_MALLOC) != 0)
3191                         uma_dbg_free(zone, udata, item);
3192                 else
3193                         uma_dbg_free(zone, NULL, item);
3194         }
3195 #endif
3196         if (__predict_true(skip < SKIP_DTOR)) {
3197                 if (zone->uz_dtor != NULL)
3198                         zone->uz_dtor(item, size, udata);
3199 #ifdef INVARIANTS
3200                 if (!skipdbg && (zone->uz_flags & UMA_ZFLAG_TRASH) != 0 &&
3201                     zone->uz_dtor != trash_dtor)
3202                         trash_dtor(item, size, udata);
3203 #endif
3204         }
3205 }
3206
3207 #ifdef NUMA
3208 static int
3209 item_domain(void *item)
3210 {
3211         int domain;
3212
3213         domain = _vm_phys_domain(vtophys(item));
3214         KASSERT(domain >= 0 && domain < vm_ndomains,
3215             ("%s: unknown domain for item %p", __func__, item));
3216         return (domain);
3217 }
3218 #endif
3219
3220 #if defined(INVARIANTS) || defined(DEBUG_MEMGUARD) || defined(WITNESS)
3221 #define UMA_ZALLOC_DEBUG
3222 static int
3223 uma_zalloc_debug(uma_zone_t zone, void **itemp, void *udata, int flags)
3224 {
3225         int error;
3226
3227         error = 0;
3228 #ifdef WITNESS
3229         if (flags & M_WAITOK) {
3230                 WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
3231                     "uma_zalloc_debug: zone \"%s\"", zone->uz_name);
3232         }
3233 #endif
3234
3235 #ifdef INVARIANTS
3236         KASSERT((flags & M_EXEC) == 0,
3237             ("uma_zalloc_debug: called with M_EXEC"));
3238         KASSERT(curthread->td_critnest == 0 || SCHEDULER_STOPPED(),
3239             ("uma_zalloc_debug: called within spinlock or critical section"));
3240         KASSERT((zone->uz_flags & UMA_ZONE_PCPU) == 0 || (flags & M_ZERO) == 0,
3241             ("uma_zalloc_debug: allocating from a pcpu zone with M_ZERO"));
3242 #endif
3243
3244 #ifdef DEBUG_MEMGUARD
3245         if ((zone->uz_flags & UMA_ZONE_SMR) == 0 && memguard_cmp_zone(zone)) {
3246                 void *item;
3247                 item = memguard_alloc(zone->uz_size, flags);
3248                 if (item != NULL) {
3249                         error = EJUSTRETURN;
3250                         if (zone->uz_init != NULL &&
3251                             zone->uz_init(item, zone->uz_size, flags) != 0) {
3252                                 *itemp = NULL;
3253                                 return (error);
3254                         }
3255                         if (zone->uz_ctor != NULL &&
3256                             zone->uz_ctor(item, zone->uz_size, udata,
3257                             flags) != 0) {
3258                                 counter_u64_add(zone->uz_fails, 1);
3259                                 zone->uz_fini(item, zone->uz_size);
3260                                 *itemp = NULL;
3261                                 return (error);
3262                         }
3263                         *itemp = item;
3264                         return (error);
3265                 }
3266                 /* This is unfortunate but should not be fatal. */
3267         }
3268 #endif
3269         return (error);
3270 }
3271
3272 static int
3273 uma_zfree_debug(uma_zone_t zone, void *item, void *udata)
3274 {
3275         KASSERT(curthread->td_critnest == 0 || SCHEDULER_STOPPED(),
3276             ("uma_zfree_debug: called with spinlock or critical section held"));
3277
3278 #ifdef DEBUG_MEMGUARD
3279         if ((zone->uz_flags & UMA_ZONE_SMR) == 0 && is_memguard_addr(item)) {
3280                 if (zone->uz_dtor != NULL)
3281                         zone->uz_dtor(item, zone->uz_size, udata);
3282                 if (zone->uz_fini != NULL)
3283                         zone->uz_fini(item, zone->uz_size);
3284                 memguard_free(item);
3285                 return (EJUSTRETURN);
3286         }
3287 #endif
3288         return (0);
3289 }
3290 #endif
3291
3292 static inline void *
3293 cache_alloc_item(uma_zone_t zone, uma_cache_t cache, uma_cache_bucket_t bucket,
3294     void *udata, int flags)
3295 {
3296         void *item;
3297         int size, uz_flags;
3298
3299         item = cache_bucket_pop(cache, bucket);
3300         size = cache_uz_size(cache);
3301         uz_flags = cache_uz_flags(cache);
3302         critical_exit();
3303         return (item_ctor(zone, uz_flags, size, udata, flags, item));
3304 }
3305
3306 static __noinline void *
3307 cache_alloc_retry(uma_zone_t zone, uma_cache_t cache, void *udata, int flags)
3308 {
3309         uma_cache_bucket_t bucket;
3310         int domain;
3311
3312         while (cache_alloc(zone, cache, udata, flags)) {
3313                 cache = &zone->uz_cpu[curcpu];
3314                 bucket = &cache->uc_allocbucket;
3315                 if (__predict_false(bucket->ucb_cnt == 0))
3316                         continue;
3317                 return (cache_alloc_item(zone, cache, bucket, udata, flags));
3318         }
3319         critical_exit();
3320
3321         /*
3322          * We can not get a bucket so try to return a single item.
3323          */
3324         if (zone->uz_flags & UMA_ZONE_FIRSTTOUCH)
3325                 domain = PCPU_GET(domain);
3326         else
3327                 domain = UMA_ANYDOMAIN;
3328         return (zone_alloc_item(zone, udata, domain, flags));
3329 }
3330
3331 /* See uma.h */
3332 void *
3333 uma_zalloc_smr(uma_zone_t zone, int flags)
3334 {
3335         uma_cache_bucket_t bucket;
3336         uma_cache_t cache;
3337
3338 #ifdef UMA_ZALLOC_DEBUG
3339         void *item;
3340
3341         KASSERT((zone->uz_flags & UMA_ZONE_SMR) != 0,
3342             ("uma_zalloc_arg: called with non-SMR zone."));
3343         if (uma_zalloc_debug(zone, &item, NULL, flags) == EJUSTRETURN)
3344                 return (item);
3345 #endif
3346
3347         critical_enter();
3348         cache = &zone->uz_cpu[curcpu];
3349         bucket = &cache->uc_allocbucket;
3350         if (__predict_false(bucket->ucb_cnt == 0))
3351                 return (cache_alloc_retry(zone, cache, NULL, flags));
3352         return (cache_alloc_item(zone, cache, bucket, NULL, flags));
3353 }
3354
3355 /* See uma.h */
3356 void *
3357 uma_zalloc_arg(uma_zone_t zone, void *udata, int flags)
3358 {
3359         uma_cache_bucket_t bucket;
3360         uma_cache_t cache;
3361
3362         /* Enable entropy collection for RANDOM_ENABLE_UMA kernel option */
3363         random_harvest_fast_uma(&zone, sizeof(zone), RANDOM_UMA);
3364
3365         /* This is the fast path allocation */
3366         CTR3(KTR_UMA, "uma_zalloc_arg zone %s(%p) flags %d", zone->uz_name,
3367             zone, flags);
3368
3369 #ifdef UMA_ZALLOC_DEBUG
3370         void *item;
3371
3372         KASSERT((zone->uz_flags & UMA_ZONE_SMR) == 0,
3373             ("uma_zalloc_arg: called with SMR zone."));
3374         if (uma_zalloc_debug(zone, &item, udata, flags) == EJUSTRETURN)
3375                 return (item);
3376 #endif
3377
3378         /*
3379          * If possible, allocate from the per-CPU cache.  There are two
3380          * requirements for safe access to the per-CPU cache: (1) the thread
3381          * accessing the cache must not be preempted or yield during access,
3382          * and (2) the thread must not migrate CPUs without switching which
3383          * cache it accesses.  We rely on a critical section to prevent
3384          * preemption and migration.  We release the critical section in
3385          * order to acquire the zone mutex if we are unable to allocate from
3386          * the current cache; when we re-acquire the critical section, we
3387          * must detect and handle migration if it has occurred.
3388          */
3389         critical_enter();
3390         cache = &zone->uz_cpu[curcpu];
3391         bucket = &cache->uc_allocbucket;
3392         if (__predict_false(bucket->ucb_cnt == 0))
3393                 return (cache_alloc_retry(zone, cache, udata, flags));
3394         return (cache_alloc_item(zone, cache, bucket, udata, flags));
3395 }
3396
3397 /*
3398  * Replenish an alloc bucket and possibly restore an old one.  Called in
3399  * a critical section.  Returns in a critical section.
3400  *
3401  * A false return value indicates an allocation failure.
3402  * A true return value indicates success and the caller should retry.
3403  */
3404 static __noinline bool
3405 cache_alloc(uma_zone_t zone, uma_cache_t cache, void *udata, int flags)
3406 {
3407         uma_bucket_t bucket;
3408         int curdomain, domain;
3409         bool new;
3410
3411         CRITICAL_ASSERT(curthread);
3412
3413         /*
3414          * If we have run out of items in our alloc bucket see
3415          * if we can switch with the free bucket.
3416          *
3417          * SMR Zones can't re-use the free bucket until the sequence has
3418          * expired.
3419          */
3420         if ((cache_uz_flags(cache) & UMA_ZONE_SMR) == 0 &&
3421             cache->uc_freebucket.ucb_cnt != 0) {
3422                 cache_bucket_swap(&cache->uc_freebucket,
3423                     &cache->uc_allocbucket);
3424                 return (true);
3425         }
3426
3427         /*
3428          * Discard any empty allocation bucket while we hold no locks.
3429          */
3430         bucket = cache_bucket_unload_alloc(cache);
3431         critical_exit();
3432
3433         if (bucket != NULL) {
3434                 KASSERT(bucket->ub_cnt == 0,
3435                     ("cache_alloc: Entered with non-empty alloc bucket."));
3436                 bucket_free(zone, bucket, udata);
3437         }
3438
3439         /*
3440          * Attempt to retrieve the item from the per-CPU cache has failed, so
3441          * we must go back to the zone.  This requires the zdom lock, so we
3442          * must drop the critical section, then re-acquire it when we go back
3443          * to the cache.  Since the critical section is released, we may be
3444          * preempted or migrate.  As such, make sure not to maintain any
3445          * thread-local state specific to the cache from prior to releasing
3446          * the critical section.
3447          */
3448         domain = PCPU_GET(domain);
3449         if ((cache_uz_flags(cache) & UMA_ZONE_ROUNDROBIN) != 0 ||
3450             VM_DOMAIN_EMPTY(domain))
3451                 domain = zone_domain_highest(zone, domain);
3452         bucket = cache_fetch_bucket(zone, cache, domain);
3453         if (bucket == NULL && zone->uz_bucket_size != 0 && !bucketdisable) {
3454                 bucket = zone_alloc_bucket(zone, udata, domain, flags);
3455                 new = true;
3456         } else {
3457                 new = false;
3458         }
3459
3460         CTR3(KTR_UMA, "uma_zalloc: zone %s(%p) bucket zone returned %p",
3461             zone->uz_name, zone, bucket);
3462         if (bucket == NULL) {
3463                 critical_enter();
3464                 return (false);
3465         }
3466
3467         /*
3468          * See if we lost the race or were migrated.  Cache the
3469          * initialized bucket to make this less likely or claim
3470          * the memory directly.
3471          */
3472         critical_enter();
3473         cache = &zone->uz_cpu[curcpu];
3474         if (cache->uc_allocbucket.ucb_bucket == NULL &&
3475             ((cache_uz_flags(cache) & UMA_ZONE_FIRSTTOUCH) == 0 ||
3476             (curdomain = PCPU_GET(domain)) == domain ||
3477             VM_DOMAIN_EMPTY(curdomain))) {
3478                 if (new)
3479                         atomic_add_long(&ZDOM_GET(zone, domain)->uzd_imax,
3480                             bucket->ub_cnt);
3481                 cache_bucket_load_alloc(cache, bucket);
3482                 return (true);
3483         }
3484
3485         /*
3486          * We lost the race, release this bucket and start over.
3487          */
3488         critical_exit();
3489         zone_put_bucket(zone, domain, bucket, udata, false);
3490         critical_enter();
3491
3492         return (true);
3493 }
3494
3495 void *
3496 uma_zalloc_domain(uma_zone_t zone, void *udata, int domain, int flags)
3497 {
3498
3499         /* Enable entropy collection for RANDOM_ENABLE_UMA kernel option */
3500         random_harvest_fast_uma(&zone, sizeof(zone), RANDOM_UMA);
3501
3502         /* This is the fast path allocation */
3503         CTR4(KTR_UMA, "uma_zalloc_domain zone %s(%p) domain %d flags %d",
3504             zone->uz_name, zone, domain, flags);
3505
3506         if (flags & M_WAITOK) {
3507                 WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
3508                     "uma_zalloc_domain: zone \"%s\"", zone->uz_name);
3509         }
3510         KASSERT(curthread->td_critnest == 0 || SCHEDULER_STOPPED(),
3511             ("uma_zalloc_domain: called with spinlock or critical section held"));
3512
3513         return (zone_alloc_item(zone, udata, domain, flags));
3514 }
3515
3516 /*
3517  * Find a slab with some space.  Prefer slabs that are partially used over those
3518  * that are totally full.  This helps to reduce fragmentation.
3519  *
3520  * If 'rr' is 1, search all domains starting from 'domain'.  Otherwise check
3521  * only 'domain'.
3522  */
3523 static uma_slab_t
3524 keg_first_slab(uma_keg_t keg, int domain, bool rr)
3525 {
3526         uma_domain_t dom;
3527         uma_slab_t slab;
3528         int start;
3529
3530         KASSERT(domain >= 0 && domain < vm_ndomains,
3531             ("keg_first_slab: domain %d out of range", domain));
3532         KEG_LOCK_ASSERT(keg, domain);
3533
3534         slab = NULL;
3535         start = domain;
3536         do {
3537                 dom = &keg->uk_domain[domain];
3538                 if ((slab = LIST_FIRST(&dom->ud_part_slab)) != NULL)
3539                         return (slab);
3540                 if ((slab = LIST_FIRST(&dom->ud_free_slab)) != NULL) {
3541                         LIST_REMOVE(slab, us_link);
3542                         dom->ud_free_slabs--;
3543                         LIST_INSERT_HEAD(&dom->ud_part_slab, slab, us_link);
3544                         return (slab);
3545                 }
3546                 if (rr)
3547                         domain = (domain + 1) % vm_ndomains;
3548         } while (domain != start);
3549
3550         return (NULL);
3551 }
3552
3553 /*
3554  * Fetch an existing slab from a free or partial list.  Returns with the
3555  * keg domain lock held if a slab was found or unlocked if not.
3556  */
3557 static uma_slab_t
3558 keg_fetch_free_slab(uma_keg_t keg, int domain, bool rr, int flags)
3559 {
3560         uma_slab_t slab;
3561         uint32_t reserve;
3562
3563         /* HASH has a single free list. */
3564         if ((keg->uk_flags & UMA_ZFLAG_HASH) != 0)
3565                 domain = 0;
3566
3567         KEG_LOCK(keg, domain);
3568         reserve = (flags & M_USE_RESERVE) != 0 ? 0 : keg->uk_reserve;
3569         if (keg->uk_domain[domain].ud_free_items <= reserve ||
3570             (slab = keg_first_slab(keg, domain, rr)) == NULL) {
3571                 KEG_UNLOCK(keg, domain);
3572                 return (NULL);
3573         }
3574         return (slab);
3575 }
3576
3577 static uma_slab_t
3578 keg_fetch_slab(uma_keg_t keg, uma_zone_t zone, int rdomain, const int flags)
3579 {
3580         struct vm_domainset_iter di;
3581         uma_slab_t slab;
3582         int aflags, domain;
3583         bool rr;
3584
3585 restart:
3586         /*
3587          * Use the keg's policy if upper layers haven't already specified a
3588          * domain (as happens with first-touch zones).
3589          *
3590          * To avoid races we run the iterator with the keg lock held, but that
3591          * means that we cannot allow the vm_domainset layer to sleep.  Thus,
3592          * clear M_WAITOK and handle low memory conditions locally.
3593          */
3594         rr = rdomain == UMA_ANYDOMAIN;
3595         if (rr) {
3596                 aflags = (flags & ~M_WAITOK) | M_NOWAIT;
3597                 vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
3598                     &aflags);
3599         } else {
3600                 aflags = flags;
3601                 domain = rdomain;
3602         }
3603
3604         for (;;) {
3605                 slab = keg_fetch_free_slab(keg, domain, rr, flags);
3606                 if (slab != NULL)
3607                         return (slab);
3608
3609                 /*
3610                  * M_NOVM means don't ask at all!
3611                  */
3612                 if (flags & M_NOVM)
3613                         break;
3614
3615                 slab = keg_alloc_slab(keg, zone, domain, flags, aflags);
3616                 if (slab != NULL)
3617                         return (slab);
3618                 if (!rr && (flags & M_WAITOK) == 0)
3619                         break;
3620                 if (rr && vm_domainset_iter_policy(&di, &domain) != 0) {
3621                         if ((flags & M_WAITOK) != 0) {
3622                                 vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
3623                                 goto restart;
3624                         }
3625                         break;
3626                 }
3627         }
3628
3629         /*
3630          * We might not have been able to get a slab but another cpu
3631          * could have while we were unlocked.  Check again before we
3632          * fail.
3633          */
3634         if ((slab = keg_fetch_free_slab(keg, domain, rr, flags)) != NULL)
3635                 return (slab);
3636
3637         return (NULL);
3638 }
3639
3640 static void *
3641 slab_alloc_item(uma_keg_t keg, uma_slab_t slab)
3642 {
3643         uma_domain_t dom;
3644         void *item;
3645         int freei;
3646
3647         KEG_LOCK_ASSERT(keg, slab->us_domain);
3648
3649         dom = &keg->uk_domain[slab->us_domain];
3650         freei = BIT_FFS(keg->uk_ipers, &slab->us_free) - 1;
3651         BIT_CLR(keg->uk_ipers, freei, &slab->us_free);
3652         item = slab_item(slab, keg, freei);
3653         slab->us_freecount--;
3654         dom->ud_free_items--;
3655
3656         /*
3657          * Move this slab to the full list.  It must be on the partial list, so
3658          * we do not need to update the free slab count.  In particular,
3659          * keg_fetch_slab() always returns slabs on the partial list.
3660          */
3661         if (slab->us_freecount == 0) {
3662                 LIST_REMOVE(slab, us_link);
3663                 LIST_INSERT_HEAD(&dom->ud_full_slab, slab, us_link);
3664         }
3665
3666         return (item);
3667 }
3668
3669 static int
3670 zone_import(void *arg, void **bucket, int max, int domain, int flags)
3671 {
3672         uma_domain_t dom;
3673         uma_zone_t zone;
3674         uma_slab_t slab;
3675         uma_keg_t keg;
3676 #ifdef NUMA
3677         int stripe;
3678 #endif
3679         int i;
3680
3681         zone = arg;
3682         slab = NULL;
3683         keg = zone->uz_keg;
3684         /* Try to keep the buckets totally full */
3685         for (i = 0; i < max; ) {
3686                 if ((slab = keg_fetch_slab(keg, zone, domain, flags)) == NULL)
3687                         break;
3688 #ifdef NUMA
3689                 stripe = howmany(max, vm_ndomains);
3690 #endif
3691                 dom = &keg->uk_domain[slab->us_domain];
3692                 while (slab->us_freecount && i < max) { 
3693                         bucket[i++] = slab_alloc_item(keg, slab);
3694                         if (dom->ud_free_items <= keg->uk_reserve)
3695                                 break;
3696 #ifdef NUMA
3697                         /*
3698                          * If the zone is striped we pick a new slab for every
3699                          * N allocations.  Eliminating this conditional will
3700                          * instead pick a new domain for each bucket rather
3701                          * than stripe within each bucket.  The current option
3702                          * produces more fragmentation and requires more cpu
3703                          * time but yields better distribution.
3704                          */
3705                         if ((zone->uz_flags & UMA_ZONE_ROUNDROBIN) != 0 &&
3706                             vm_ndomains > 1 && --stripe == 0)
3707                                 break;
3708 #endif
3709                 }
3710                 KEG_UNLOCK(keg, slab->us_domain);
3711                 /* Don't block if we allocated any successfully. */
3712                 flags &= ~M_WAITOK;
3713                 flags |= M_NOWAIT;
3714         }
3715
3716         return i;
3717 }
3718
3719 static int
3720 zone_alloc_limit_hard(uma_zone_t zone, int count, int flags)
3721 {
3722         uint64_t old, new, total, max;
3723
3724         /*
3725          * The hard case.  We're going to sleep because there were existing
3726          * sleepers or because we ran out of items.  This routine enforces
3727          * fairness by keeping fifo order.
3728          *
3729          * First release our ill gotten gains and make some noise.
3730          */
3731         for (;;) {
3732                 zone_free_limit(zone, count);
3733                 zone_log_warning(zone);
3734                 zone_maxaction(zone);
3735                 if (flags & M_NOWAIT)
3736                         return (0);
3737
3738                 /*
3739                  * We need to allocate an item or set ourself as a sleeper
3740                  * while the sleepq lock is held to avoid wakeup races.  This
3741                  * is essentially a home rolled semaphore.
3742                  */
3743                 sleepq_lock(&zone->uz_max_items);
3744                 old = zone->uz_items;
3745                 do {
3746                         MPASS(UZ_ITEMS_SLEEPERS(old) < UZ_ITEMS_SLEEPERS_MAX);
3747                         /* Cache the max since we will evaluate twice. */
3748                         max = zone->uz_max_items;
3749                         if (UZ_ITEMS_SLEEPERS(old) != 0 ||
3750                             UZ_ITEMS_COUNT(old) >= max)
3751                                 new = old + UZ_ITEMS_SLEEPER;
3752                         else
3753                                 new = old + MIN(count, max - old);
3754                 } while (atomic_fcmpset_64(&zone->uz_items, &old, new) == 0);
3755
3756                 /* We may have successfully allocated under the sleepq lock. */
3757                 if (UZ_ITEMS_SLEEPERS(new) == 0) {
3758                         sleepq_release(&zone->uz_max_items);
3759                         return (new - old);
3760                 }
3761
3762                 /*
3763                  * This is in a different cacheline from uz_items so that we
3764                  * don't constantly invalidate the fastpath cacheline when we
3765                  * adjust item counts.  This could be limited to toggling on
3766                  * transitions.
3767                  */
3768                 atomic_add_32(&zone->uz_sleepers, 1);
3769                 atomic_add_64(&zone->uz_sleeps, 1);
3770
3771                 /*
3772                  * We have added ourselves as a sleeper.  The sleepq lock
3773                  * protects us from wakeup races.  Sleep now and then retry.
3774                  */
3775                 sleepq_add(&zone->uz_max_items, NULL, "zonelimit", 0, 0);
3776                 sleepq_wait(&zone->uz_max_items, PVM);
3777
3778                 /*
3779                  * After wakeup, remove ourselves as a sleeper and try
3780                  * again.  We no longer have the sleepq lock for protection.
3781                  *
3782                  * Subract ourselves as a sleeper while attempting to add
3783                  * our count.
3784                  */
3785                 atomic_subtract_32(&zone->uz_sleepers, 1);
3786                 old = atomic_fetchadd_64(&zone->uz_items,
3787                     -(UZ_ITEMS_SLEEPER - count));
3788                 /* We're no longer a sleeper. */
3789                 old -= UZ_ITEMS_SLEEPER;
3790
3791                 /*
3792                  * If we're still at the limit, restart.  Notably do not
3793                  * block on other sleepers.  Cache the max value to protect
3794                  * against changes via sysctl.
3795                  */
3796                 total = UZ_ITEMS_COUNT(old);
3797                 max = zone->uz_max_items;
3798                 if (total >= max)
3799                         continue;
3800                 /* Truncate if necessary, otherwise wake other sleepers. */
3801                 if (total + count > max) {
3802                         zone_free_limit(zone, total + count - max);
3803                         count = max - total;
3804                 } else if (total + count < max && UZ_ITEMS_SLEEPERS(old) != 0)
3805                         wakeup_one(&zone->uz_max_items);
3806
3807                 return (count);
3808         }
3809 }
3810
3811 /*
3812  * Allocate 'count' items from our max_items limit.  Returns the number
3813  * available.  If M_NOWAIT is not specified it will sleep until at least
3814  * one item can be allocated.
3815  */
3816 static int
3817 zone_alloc_limit(uma_zone_t zone, int count, int flags)
3818 {
3819         uint64_t old;
3820         uint64_t max;
3821
3822         max = zone->uz_max_items;
3823         MPASS(max > 0);
3824
3825         /*
3826          * We expect normal allocations to succeed with a simple
3827          * fetchadd.
3828          */
3829         old = atomic_fetchadd_64(&zone->uz_items, count);
3830         if (__predict_true(old + count <= max))
3831                 return (count);
3832
3833         /*
3834          * If we had some items and no sleepers just return the
3835          * truncated value.  We have to release the excess space
3836          * though because that may wake sleepers who weren't woken
3837          * because we were temporarily over the limit.
3838          */
3839         if (old < max) {
3840                 zone_free_limit(zone, (old + count) - max);
3841                 return (max - old);
3842         }
3843         return (zone_alloc_limit_hard(zone, count, flags));
3844 }
3845
3846 /*
3847  * Free a number of items back to the limit.
3848  */
3849 static void
3850 zone_free_limit(uma_zone_t zone, int count)
3851 {
3852         uint64_t old;
3853
3854         MPASS(count > 0);
3855
3856         /*
3857          * In the common case we either have no sleepers or
3858          * are still over the limit and can just return.
3859          */
3860         old = atomic_fetchadd_64(&zone->uz_items, -count);
3861         if (__predict_true(UZ_ITEMS_SLEEPERS(old) == 0 ||
3862            UZ_ITEMS_COUNT(old) - count >= zone->uz_max_items))
3863                 return;
3864
3865         /*
3866          * Moderate the rate of wakeups.  Sleepers will continue
3867          * to generate wakeups if necessary.
3868          */
3869         wakeup_one(&zone->uz_max_items);
3870 }
3871
3872 static uma_bucket_t
3873 zone_alloc_bucket(uma_zone_t zone, void *udata, int domain, int flags)
3874 {
3875         uma_bucket_t bucket;
3876         int maxbucket, cnt;
3877
3878         CTR3(KTR_UMA, "zone_alloc_bucket zone %s(%p) domain %d", zone->uz_name,
3879             zone, domain);
3880
3881         /* Avoid allocs targeting empty domains. */
3882         if (domain != UMA_ANYDOMAIN && VM_DOMAIN_EMPTY(domain))
3883                 domain = UMA_ANYDOMAIN;
3884         else if ((zone->uz_flags & UMA_ZONE_ROUNDROBIN) != 0)
3885                 domain = UMA_ANYDOMAIN;
3886
3887         if (zone->uz_max_items > 0)
3888                 maxbucket = zone_alloc_limit(zone, zone->uz_bucket_size,
3889                     M_NOWAIT);
3890         else
3891                 maxbucket = zone->uz_bucket_size;
3892         if (maxbucket == 0)
3893                 return (false);
3894
3895         /* Don't wait for buckets, preserve caller's NOVM setting. */
3896         bucket = bucket_alloc(zone, udata, M_NOWAIT | (flags & M_NOVM));
3897         if (bucket == NULL) {
3898                 cnt = 0;
3899                 goto out;
3900         }
3901
3902         bucket->ub_cnt = zone->uz_import(zone->uz_arg, bucket->ub_bucket,
3903             MIN(maxbucket, bucket->ub_entries), domain, flags);
3904
3905         /*
3906          * Initialize the memory if necessary.
3907          */
3908         if (bucket->ub_cnt != 0 && zone->uz_init != NULL) {
3909                 int i;
3910
3911                 for (i = 0; i < bucket->ub_cnt; i++)
3912                         if (zone->uz_init(bucket->ub_bucket[i], zone->uz_size,
3913                             flags) != 0)
3914                                 break;
3915                 /*
3916                  * If we couldn't initialize the whole bucket, put the
3917                  * rest back onto the freelist.
3918                  */
3919                 if (i != bucket->ub_cnt) {
3920                         zone->uz_release(zone->uz_arg, &bucket->ub_bucket[i],
3921                             bucket->ub_cnt - i);
3922 #ifdef INVARIANTS
3923                         bzero(&bucket->ub_bucket[i],
3924                             sizeof(void *) * (bucket->ub_cnt - i));
3925 #endif
3926                         bucket->ub_cnt = i;
3927                 }
3928         }
3929
3930         cnt = bucket->ub_cnt;
3931         if (bucket->ub_cnt == 0) {
3932                 bucket_free(zone, bucket, udata);
3933                 counter_u64_add(zone->uz_fails, 1);
3934                 bucket = NULL;
3935         }
3936 out:
3937         if (zone->uz_max_items > 0 && cnt < maxbucket)
3938                 zone_free_limit(zone, maxbucket - cnt);
3939
3940         return (bucket);
3941 }
3942
3943 /*
3944  * Allocates a single item from a zone.
3945  *
3946  * Arguments
3947  *      zone   The zone to alloc for.
3948  *      udata  The data to be passed to the constructor.
3949  *      domain The domain to allocate from or UMA_ANYDOMAIN.
3950  *      flags  M_WAITOK, M_NOWAIT, M_ZERO.
3951  *
3952  * Returns
3953  *      NULL if there is no memory and M_NOWAIT is set
3954  *      An item if successful
3955  */
3956
3957 static void *
3958 zone_alloc_item(uma_zone_t zone, void *udata, int domain, int flags)
3959 {
3960         void *item;
3961
3962         if (zone->uz_max_items > 0 && zone_alloc_limit(zone, 1, flags) == 0) {
3963                 counter_u64_add(zone->uz_fails, 1);
3964                 return (NULL);
3965         }
3966
3967         /* Avoid allocs targeting empty domains. */
3968         if (domain != UMA_ANYDOMAIN && VM_DOMAIN_EMPTY(domain))
3969                 domain = UMA_ANYDOMAIN;
3970
3971         if (zone->uz_import(zone->uz_arg, &item, 1, domain, flags) != 1)
3972                 goto fail_cnt;
3973
3974         /*
3975          * We have to call both the zone's init (not the keg's init)
3976          * and the zone's ctor.  This is because the item is going from
3977          * a keg slab directly to the user, and the user is expecting it
3978          * to be both zone-init'd as well as zone-ctor'd.
3979          */
3980         if (zone->uz_init != NULL) {
3981                 if (zone->uz_init(item, zone->uz_size, flags) != 0) {
3982                         zone_free_item(zone, item, udata, SKIP_FINI | SKIP_CNT);
3983                         goto fail_cnt;
3984                 }
3985         }
3986         item = item_ctor(zone, zone->uz_flags, zone->uz_size, udata, flags,
3987             item);
3988         if (item == NULL)
3989                 goto fail;
3990
3991         counter_u64_add(zone->uz_allocs, 1);
3992         CTR3(KTR_UMA, "zone_alloc_item item %p from %s(%p)", item,
3993             zone->uz_name, zone);
3994
3995         return (item);
3996
3997 fail_cnt:
3998         counter_u64_add(zone->uz_fails, 1);
3999 fail:
4000         if (zone->uz_max_items > 0)
4001                 zone_free_limit(zone, 1);
4002         CTR2(KTR_UMA, "zone_alloc_item failed from %s(%p)",
4003             zone->uz_name, zone);
4004
4005         return (NULL);
4006 }
4007
4008 /* See uma.h */
4009 void
4010 uma_zfree_smr(uma_zone_t zone, void *item)
4011 {
4012         uma_cache_t cache;
4013         uma_cache_bucket_t bucket;
4014         int itemdomain, uz_flags;
4015
4016 #ifdef UMA_ZALLOC_DEBUG
4017         KASSERT((zone->uz_flags & UMA_ZONE_SMR) != 0,
4018             ("uma_zfree_smr: called with non-SMR zone."));
4019         KASSERT(item != NULL, ("uma_zfree_smr: Called with NULL pointer."));
4020         SMR_ASSERT_NOT_ENTERED(zone->uz_smr);
4021         if (uma_zfree_debug(zone, item, NULL) == EJUSTRETURN)
4022                 return;
4023 #endif
4024         cache = &zone->uz_cpu[curcpu];
4025         uz_flags = cache_uz_flags(cache);
4026         itemdomain = 0;
4027 #ifdef NUMA
4028         if ((uz_flags & UMA_ZONE_FIRSTTOUCH) != 0)
4029                 itemdomain = item_domain(item);
4030 #endif
4031         critical_enter();
4032         do {
4033                 cache = &zone->uz_cpu[curcpu];
4034                 /* SMR Zones must free to the free bucket. */
4035                 bucket = &cache->uc_freebucket;
4036 #ifdef NUMA
4037                 if ((uz_flags & UMA_ZONE_FIRSTTOUCH) != 0 &&
4038                     PCPU_GET(domain) != itemdomain) {
4039                         bucket = &cache->uc_crossbucket;
4040                 }
4041 #endif
4042                 if (__predict_true(bucket->ucb_cnt < bucket->ucb_entries)) {
4043                         cache_bucket_push(cache, bucket, item);
4044                         critical_exit();
4045                         return;
4046                 }
4047         } while (cache_free(zone, cache, NULL, item, itemdomain));
4048         critical_exit();
4049
4050         /*
4051          * If nothing else caught this, we'll just do an internal free.
4052          */
4053         zone_free_item(zone, item, NULL, SKIP_NONE);
4054 }
4055
4056 /* See uma.h */
4057 void
4058 uma_zfree_arg(uma_zone_t zone, void *item, void *udata)
4059 {
4060         uma_cache_t cache;
4061         uma_cache_bucket_t bucket;
4062         int itemdomain, uz_flags;
4063
4064         /* Enable entropy collection for RANDOM_ENABLE_UMA kernel option */
4065         random_harvest_fast_uma(&zone, sizeof(zone), RANDOM_UMA);
4066
4067         CTR2(KTR_UMA, "uma_zfree_arg zone %s(%p)", zone->uz_name, zone);
4068
4069 #ifdef UMA_ZALLOC_DEBUG
4070         KASSERT((zone->uz_flags & UMA_ZONE_SMR) == 0,
4071             ("uma_zfree_arg: called with SMR zone."));
4072         if (uma_zfree_debug(zone, item, udata) == EJUSTRETURN)
4073                 return;
4074 #endif
4075         /* uma_zfree(..., NULL) does nothing, to match free(9). */
4076         if (item == NULL)
4077                 return;
4078
4079         /*
4080          * We are accessing the per-cpu cache without a critical section to
4081          * fetch size and flags.  This is acceptable, if we are preempted we
4082          * will simply read another cpu's line.
4083          */
4084         cache = &zone->uz_cpu[curcpu];
4085         uz_flags = cache_uz_flags(cache);
4086         if (UMA_ALWAYS_CTORDTOR ||
4087             __predict_false((uz_flags & UMA_ZFLAG_CTORDTOR) != 0))
4088                 item_dtor(zone, item, cache_uz_size(cache), udata, SKIP_NONE);
4089
4090         /*
4091          * The race here is acceptable.  If we miss it we'll just have to wait
4092          * a little longer for the limits to be reset.
4093          */
4094         if (__predict_false(uz_flags & UMA_ZFLAG_LIMIT)) {
4095                 if (zone->uz_sleepers > 0)
4096                         goto zfree_item;
4097         }
4098
4099         /*
4100          * If possible, free to the per-CPU cache.  There are two
4101          * requirements for safe access to the per-CPU cache: (1) the thread
4102          * accessing the cache must not be preempted or yield during access,
4103          * and (2) the thread must not migrate CPUs without switching which
4104          * cache it accesses.  We rely on a critical section to prevent
4105          * preemption and migration.  We release the critical section in
4106          * order to acquire the zone mutex if we are unable to free to the
4107          * current cache; when we re-acquire the critical section, we must
4108          * detect and handle migration if it has occurred.
4109          */
4110         itemdomain = 0;
4111 #ifdef NUMA
4112         if ((uz_flags & UMA_ZONE_FIRSTTOUCH) != 0)
4113                 itemdomain = item_domain(item);
4114 #endif
4115         critical_enter();
4116         do {
4117                 cache = &zone->uz_cpu[curcpu];
4118                 /*
4119                  * Try to free into the allocbucket first to give LIFO
4120                  * ordering for cache-hot datastructures.  Spill over
4121                  * into the freebucket if necessary.  Alloc will swap
4122                  * them if one runs dry.
4123                  */
4124                 bucket = &cache->uc_allocbucket;
4125 #ifdef NUMA
4126                 if ((uz_flags & UMA_ZONE_FIRSTTOUCH) != 0 &&
4127                     PCPU_GET(domain) != itemdomain) {
4128                         bucket = &cache->uc_crossbucket;
4129                 } else
4130 #endif
4131                 if (bucket->ucb_cnt == bucket->ucb_entries &&
4132                    cache->uc_freebucket.ucb_cnt <
4133                    cache->uc_freebucket.ucb_entries)
4134                         cache_bucket_swap(&cache->uc_freebucket,
4135                             &cache->uc_allocbucket);
4136                 if (__predict_true(bucket->ucb_cnt < bucket->ucb_entries)) {
4137                         cache_bucket_push(cache, bucket, item);
4138                         critical_exit();
4139                         return;
4140                 }
4141         } while (cache_free(zone, cache, udata, item, itemdomain));
4142         critical_exit();
4143
4144         /*
4145          * If nothing else caught this, we'll just do an internal free.
4146          */
4147 zfree_item:
4148         zone_free_item(zone, item, udata, SKIP_DTOR);
4149 }
4150
4151 #ifdef NUMA
4152 /*
4153  * sort crossdomain free buckets to domain correct buckets and cache
4154  * them.
4155  */
4156 static void
4157 zone_free_cross(uma_zone_t zone, uma_bucket_t bucket, void *udata)
4158 {
4159         struct uma_bucketlist fullbuckets;
4160         uma_zone_domain_t zdom;
4161         uma_bucket_t b;
4162         smr_seq_t seq;
4163         void *item;
4164         int domain;
4165
4166         CTR3(KTR_UMA,
4167             "uma_zfree: zone %s(%p) draining cross bucket %p",
4168             zone->uz_name, zone, bucket);
4169
4170         /*
4171          * It is possible for buckets to arrive here out of order so we fetch
4172          * the current smr seq rather than accepting the bucket's.
4173          */
4174         seq = SMR_SEQ_INVALID;
4175         if ((zone->uz_flags & UMA_ZONE_SMR) != 0)
4176                 seq = smr_advance(zone->uz_smr);
4177
4178         /*
4179          * To avoid having ndomain * ndomain buckets for sorting we have a
4180          * lock on the current crossfree bucket.  A full matrix with
4181          * per-domain locking could be used if necessary.
4182          */
4183         STAILQ_INIT(&fullbuckets);
4184         ZONE_CROSS_LOCK(zone);
4185         while (bucket->ub_cnt > 0) {
4186                 item = bucket->ub_bucket[bucket->ub_cnt - 1];
4187                 domain = item_domain(item);
4188                 zdom = ZDOM_GET(zone, domain);
4189                 if (zdom->uzd_cross == NULL) {
4190                         zdom->uzd_cross = bucket_alloc(zone, udata, M_NOWAIT);
4191                         if (zdom->uzd_cross == NULL)
4192                                 break;
4193                 }
4194                 b = zdom->uzd_cross;
4195                 b->ub_bucket[b->ub_cnt++] = item;
4196                 b->ub_seq = seq;
4197                 if (b->ub_cnt == b->ub_entries) {
4198                         STAILQ_INSERT_HEAD(&fullbuckets, b, ub_link);
4199                         zdom->uzd_cross = NULL;
4200                 }
4201                 bucket->ub_cnt--;
4202         }
4203         ZONE_CROSS_UNLOCK(zone);
4204         if (bucket->ub_cnt == 0)
4205                 bucket->ub_seq = SMR_SEQ_INVALID;
4206         bucket_free(zone, bucket, udata);
4207
4208         while ((b = STAILQ_FIRST(&fullbuckets)) != NULL) {
4209                 STAILQ_REMOVE_HEAD(&fullbuckets, ub_link);
4210                 domain = item_domain(b->ub_bucket[0]);
4211                 zone_put_bucket(zone, domain, b, udata, true);
4212         }
4213 }
4214 #endif
4215
4216 static void
4217 zone_free_bucket(uma_zone_t zone, uma_bucket_t bucket, void *udata,
4218     int itemdomain, bool ws)
4219 {
4220
4221 #ifdef NUMA
4222         /*
4223          * Buckets coming from the wrong domain will be entirely for the
4224          * only other domain on two domain systems.  In this case we can
4225          * simply cache them.  Otherwise we need to sort them back to
4226          * correct domains.
4227          */
4228         if ((zone->uz_flags & UMA_ZONE_FIRSTTOUCH) != 0 &&
4229             vm_ndomains > 2 && PCPU_GET(domain) != itemdomain) {
4230                 zone_free_cross(zone, bucket, udata);
4231                 return;
4232         }
4233 #endif
4234
4235         /*
4236          * Attempt to save the bucket in the zone's domain bucket cache.
4237          */
4238         CTR3(KTR_UMA,
4239             "uma_zfree: zone %s(%p) putting bucket %p on free list",
4240             zone->uz_name, zone, bucket);
4241         /* ub_cnt is pointing to the last free item */
4242         if ((zone->uz_flags & UMA_ZONE_ROUNDROBIN) != 0)
4243                 itemdomain = zone_domain_lowest(zone, itemdomain);
4244         zone_put_bucket(zone, itemdomain, bucket, udata, ws);
4245 }
4246
4247 /*
4248  * Populate a free or cross bucket for the current cpu cache.  Free any
4249  * existing full bucket either to the zone cache or back to the slab layer.
4250  *
4251  * Enters and returns in a critical section.  false return indicates that
4252  * we can not satisfy this free in the cache layer.  true indicates that
4253  * the caller should retry.
4254  */
4255 static __noinline bool
4256 cache_free(uma_zone_t zone, uma_cache_t cache, void *udata, void *item,
4257     int itemdomain)
4258 {
4259         uma_cache_bucket_t cbucket;
4260         uma_bucket_t newbucket, bucket;
4261
4262         CRITICAL_ASSERT(curthread);
4263
4264         if (zone->uz_bucket_size == 0)
4265                 return false;
4266
4267         cache = &zone->uz_cpu[curcpu];
4268         newbucket = NULL;
4269
4270         /*
4271          * FIRSTTOUCH domains need to free to the correct zdom.  When
4272          * enabled this is the zdom of the item.   The bucket is the
4273          * cross bucket if the current domain and itemdomain do not match.
4274          */
4275         cbucket = &cache->uc_freebucket;
4276 #ifdef NUMA
4277         if ((cache_uz_flags(cache) & UMA_ZONE_FIRSTTOUCH) != 0) {
4278                 if (PCPU_GET(domain) != itemdomain) {
4279                         cbucket = &cache->uc_crossbucket;
4280                         if (cbucket->ucb_cnt != 0)
4281                                 counter_u64_add(zone->uz_xdomain,
4282                                     cbucket->ucb_cnt);
4283                 }
4284         }
4285 #endif
4286         bucket = cache_bucket_unload(cbucket);
4287         KASSERT(bucket == NULL || bucket->ub_cnt == bucket->ub_entries,
4288             ("cache_free: Entered with non-full free bucket."));
4289
4290         /* We are no longer associated with this CPU. */
4291         critical_exit();
4292
4293         /*
4294          * Don't let SMR zones operate without a free bucket.  Force
4295          * a synchronize and re-use this one.  We will only degrade
4296          * to a synchronize every bucket_size items rather than every
4297          * item if we fail to allocate a bucket.
4298          */
4299         if ((zone->uz_flags & UMA_ZONE_SMR) != 0) {
4300                 if (bucket != NULL)
4301                         bucket->ub_seq = smr_advance(zone->uz_smr);
4302                 newbucket = bucket_alloc(zone, udata, M_NOWAIT);
4303                 if (newbucket == NULL && bucket != NULL) {
4304                         bucket_drain(zone, bucket);
4305                         newbucket = bucket;
4306                         bucket = NULL;
4307                 }
4308         } else if (!bucketdisable)
4309                 newbucket = bucket_alloc(zone, udata, M_NOWAIT);
4310
4311         if (bucket != NULL)
4312                 zone_free_bucket(zone, bucket, udata, itemdomain, true);
4313
4314         critical_enter();
4315         if ((bucket = newbucket) == NULL)
4316                 return (false);
4317         cache = &zone->uz_cpu[curcpu];
4318 #ifdef NUMA
4319         /*
4320          * Check to see if we should be populating the cross bucket.  If it
4321          * is already populated we will fall through and attempt to populate
4322          * the free bucket.
4323          */
4324         if ((cache_uz_flags(cache) & UMA_ZONE_FIRSTTOUCH) != 0) {
4325                 if (PCPU_GET(domain) != itemdomain &&
4326                     cache->uc_crossbucket.ucb_bucket == NULL) {
4327                         cache_bucket_load_cross(cache, bucket);
4328                         return (true);
4329                 }
4330         }
4331 #endif
4332         /*
4333          * We may have lost the race to fill the bucket or switched CPUs.
4334          */
4335         if (cache->uc_freebucket.ucb_bucket != NULL) {
4336                 critical_exit();
4337                 bucket_free(zone, bucket, udata);
4338                 critical_enter();
4339         } else
4340                 cache_bucket_load_free(cache, bucket);
4341
4342         return (true);
4343 }
4344
4345 static void
4346 slab_free_item(uma_zone_t zone, uma_slab_t slab, void *item)
4347 {
4348         uma_keg_t keg;
4349         uma_domain_t dom;
4350         int freei;
4351
4352         keg = zone->uz_keg;
4353         KEG_LOCK_ASSERT(keg, slab->us_domain);
4354
4355         /* Do we need to remove from any lists? */
4356         dom = &keg->uk_domain[slab->us_domain];
4357         if (slab->us_freecount + 1 == keg->uk_ipers) {
4358                 LIST_REMOVE(slab, us_link);
4359                 LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
4360                 dom->ud_free_slabs++;
4361         } else if (slab->us_freecount == 0) {
4362                 LIST_REMOVE(slab, us_link);
4363                 LIST_INSERT_HEAD(&dom->ud_part_slab, slab, us_link);
4364         }
4365
4366         /* Slab management. */
4367         freei = slab_item_index(slab, keg, item);
4368         BIT_SET(keg->uk_ipers, freei, &slab->us_free);
4369         slab->us_freecount++;
4370
4371         /* Keg statistics. */
4372         dom->ud_free_items++;
4373 }
4374
4375 static void
4376 zone_release(void *arg, void **bucket, int cnt)
4377 {
4378         struct mtx *lock;
4379         uma_zone_t zone;
4380         uma_slab_t slab;
4381         uma_keg_t keg;
4382         uint8_t *mem;
4383         void *item;
4384         int i;
4385
4386         zone = arg;
4387         keg = zone->uz_keg;
4388         lock = NULL;
4389         if (__predict_false((zone->uz_flags & UMA_ZFLAG_HASH) != 0))
4390                 lock = KEG_LOCK(keg, 0);
4391         for (i = 0; i < cnt; i++) {
4392                 item = bucket[i];
4393                 if (__predict_true((zone->uz_flags & UMA_ZFLAG_VTOSLAB) != 0)) {
4394                         slab = vtoslab((vm_offset_t)item);
4395                 } else {
4396                         mem = (uint8_t *)((uintptr_t)item & (~UMA_SLAB_MASK));
4397                         if ((zone->uz_flags & UMA_ZFLAG_HASH) != 0)
4398                                 slab = hash_sfind(&keg->uk_hash, mem);
4399                         else
4400                                 slab = (uma_slab_t)(mem + keg->uk_pgoff);
4401                 }
4402                 if (lock != KEG_LOCKPTR(keg, slab->us_domain)) {
4403                         if (lock != NULL)
4404                                 mtx_unlock(lock);
4405                         lock = KEG_LOCK(keg, slab->us_domain);
4406                 }
4407                 slab_free_item(zone, slab, item);
4408         }
4409         if (lock != NULL)
4410                 mtx_unlock(lock);
4411 }
4412
4413 /*
4414  * Frees a single item to any zone.
4415  *
4416  * Arguments:
4417  *      zone   The zone to free to
4418  *      item   The item we're freeing
4419  *      udata  User supplied data for the dtor
4420  *      skip   Skip dtors and finis
4421  */
4422 static __noinline void
4423 zone_free_item(uma_zone_t zone, void *item, void *udata, enum zfreeskip skip)
4424 {
4425
4426         /*
4427          * If a free is sent directly to an SMR zone we have to
4428          * synchronize immediately because the item can instantly
4429          * be reallocated. This should only happen in degenerate
4430          * cases when no memory is available for per-cpu caches.
4431          */
4432         if ((zone->uz_flags & UMA_ZONE_SMR) != 0 && skip == SKIP_NONE)
4433                 smr_synchronize(zone->uz_smr);
4434
4435         item_dtor(zone, item, zone->uz_size, udata, skip);
4436
4437         if (skip < SKIP_FINI && zone->uz_fini)
4438                 zone->uz_fini(item, zone->uz_size);
4439
4440         zone->uz_release(zone->uz_arg, &item, 1);
4441
4442         if (skip & SKIP_CNT)
4443                 return;
4444
4445         counter_u64_add(zone->uz_frees, 1);
4446
4447         if (zone->uz_max_items > 0)
4448                 zone_free_limit(zone, 1);
4449 }
4450
4451 /* See uma.h */
4452 int
4453 uma_zone_set_max(uma_zone_t zone, int nitems)
4454 {
4455         struct uma_bucket_zone *ubz;
4456         int count;
4457
4458         /*
4459          * XXX This can misbehave if the zone has any allocations with
4460          * no limit and a limit is imposed.  There is currently no
4461          * way to clear a limit.
4462          */
4463         ZONE_LOCK(zone);
4464         ubz = bucket_zone_max(zone, nitems);
4465         count = ubz != NULL ? ubz->ubz_entries : 0;
4466         zone->uz_bucket_size_max = zone->uz_bucket_size = count;
4467         if (zone->uz_bucket_size_min > zone->uz_bucket_size_max)
4468                 zone->uz_bucket_size_min = zone->uz_bucket_size_max;
4469         zone->uz_max_items = nitems;
4470         zone->uz_flags |= UMA_ZFLAG_LIMIT;
4471         zone_update_caches(zone);
4472         /* We may need to wake waiters. */
4473         wakeup(&zone->uz_max_items);
4474         ZONE_UNLOCK(zone);
4475
4476         return (nitems);
4477 }
4478
4479 /* See uma.h */
4480 void
4481 uma_zone_set_maxcache(uma_zone_t zone, int nitems)
4482 {
4483         struct uma_bucket_zone *ubz;
4484         int bpcpu;
4485
4486         ZONE_LOCK(zone);
4487         ubz = bucket_zone_max(zone, nitems);
4488         if (ubz != NULL) {
4489                 bpcpu = 2;
4490                 if ((zone->uz_flags & UMA_ZONE_FIRSTTOUCH) != 0)
4491                         /* Count the cross-domain bucket. */
4492                         bpcpu++;
4493                 nitems -= ubz->ubz_entries * bpcpu * mp_ncpus;
4494                 zone->uz_bucket_size_max = ubz->ubz_entries;
4495         } else {
4496                 zone->uz_bucket_size_max = zone->uz_bucket_size = 0;
4497         }
4498         if (zone->uz_bucket_size_min > zone->uz_bucket_size_max)
4499                 zone->uz_bucket_size_min = zone->uz_bucket_size_max;
4500         zone->uz_bucket_max = nitems / vm_ndomains;
4501         ZONE_UNLOCK(zone);
4502 }
4503
4504 /* See uma.h */
4505 int
4506 uma_zone_get_max(uma_zone_t zone)
4507 {
4508         int nitems;
4509
4510         nitems = atomic_load_64(&zone->uz_max_items);
4511
4512         return (nitems);
4513 }
4514
4515 /* See uma.h */
4516 void
4517 uma_zone_set_warning(uma_zone_t zone, const char *warning)
4518 {
4519
4520         ZONE_ASSERT_COLD(zone);
4521         zone->uz_warning = warning;
4522 }
4523
4524 /* See uma.h */
4525 void
4526 uma_zone_set_maxaction(uma_zone_t zone, uma_maxaction_t maxaction)
4527 {
4528
4529         ZONE_ASSERT_COLD(zone);
4530         TASK_INIT(&zone->uz_maxaction, 0, (task_fn_t *)maxaction, zone);
4531 }
4532
4533 /* See uma.h */
4534 int
4535 uma_zone_get_cur(uma_zone_t zone)
4536 {
4537         int64_t nitems;
4538         u_int i;
4539
4540         nitems = 0;
4541         if (zone->uz_allocs != EARLY_COUNTER && zone->uz_frees != EARLY_COUNTER)
4542                 nitems = counter_u64_fetch(zone->uz_allocs) -
4543                     counter_u64_fetch(zone->uz_frees);
4544         CPU_FOREACH(i)
4545                 nitems += atomic_load_64(&zone->uz_cpu[i].uc_allocs) -
4546                     atomic_load_64(&zone->uz_cpu[i].uc_frees);
4547
4548         return (nitems < 0 ? 0 : nitems);
4549 }
4550
4551 static uint64_t
4552 uma_zone_get_allocs(uma_zone_t zone)
4553 {
4554         uint64_t nitems;
4555         u_int i;
4556
4557         nitems = 0;
4558         if (zone->uz_allocs != EARLY_COUNTER)
4559                 nitems = counter_u64_fetch(zone->uz_allocs);
4560         CPU_FOREACH(i)
4561                 nitems += atomic_load_64(&zone->uz_cpu[i].uc_allocs);
4562
4563         return (nitems);
4564 }
4565
4566 static uint64_t
4567 uma_zone_get_frees(uma_zone_t zone)
4568 {
4569         uint64_t nitems;
4570         u_int i;
4571
4572         nitems = 0;
4573         if (zone->uz_frees != EARLY_COUNTER)
4574                 nitems = counter_u64_fetch(zone->uz_frees);
4575         CPU_FOREACH(i)
4576                 nitems += atomic_load_64(&zone->uz_cpu[i].uc_frees);
4577
4578         return (nitems);
4579 }
4580
4581 #ifdef INVARIANTS
4582 /* Used only for KEG_ASSERT_COLD(). */
4583 static uint64_t
4584 uma_keg_get_allocs(uma_keg_t keg)
4585 {
4586         uma_zone_t z;
4587         uint64_t nitems;
4588
4589         nitems = 0;
4590         LIST_FOREACH(z, &keg->uk_zones, uz_link)
4591                 nitems += uma_zone_get_allocs(z);
4592
4593         return (nitems);
4594 }
4595 #endif
4596
4597 /* See uma.h */
4598 void
4599 uma_zone_set_init(uma_zone_t zone, uma_init uminit)
4600 {
4601         uma_keg_t keg;
4602
4603         KEG_GET(zone, keg);
4604         KEG_ASSERT_COLD(keg);
4605         keg->uk_init = uminit;
4606 }
4607
4608 /* See uma.h */
4609 void
4610 uma_zone_set_fini(uma_zone_t zone, uma_fini fini)
4611 {
4612         uma_keg_t keg;
4613
4614         KEG_GET(zone, keg);
4615         KEG_ASSERT_COLD(keg);
4616         keg->uk_fini = fini;
4617 }
4618
4619 /* See uma.h */
4620 void
4621 uma_zone_set_zinit(uma_zone_t zone, uma_init zinit)
4622 {
4623
4624         ZONE_ASSERT_COLD(zone);
4625         zone->uz_init = zinit;
4626 }
4627
4628 /* See uma.h */
4629 void
4630 uma_zone_set_zfini(uma_zone_t zone, uma_fini zfini)
4631 {
4632
4633         ZONE_ASSERT_COLD(zone);
4634         zone->uz_fini = zfini;
4635 }
4636
4637 /* See uma.h */
4638 void
4639 uma_zone_set_freef(uma_zone_t zone, uma_free freef)
4640 {
4641         uma_keg_t keg;
4642
4643         KEG_GET(zone, keg);
4644         KEG_ASSERT_COLD(keg);
4645         keg->uk_freef = freef;
4646 }
4647
4648 /* See uma.h */
4649 void
4650 uma_zone_set_allocf(uma_zone_t zone, uma_alloc allocf)
4651 {
4652         uma_keg_t keg;
4653
4654         KEG_GET(zone, keg);
4655         KEG_ASSERT_COLD(keg);
4656         keg->uk_allocf = allocf;
4657 }
4658
4659 /* See uma.h */
4660 void
4661 uma_zone_set_smr(uma_zone_t zone, smr_t smr)
4662 {
4663
4664         ZONE_ASSERT_COLD(zone);
4665
4666         KASSERT(smr != NULL, ("Got NULL smr"));
4667         KASSERT((zone->uz_flags & UMA_ZONE_SMR) == 0,
4668             ("zone %p (%s) already uses SMR", zone, zone->uz_name));
4669         zone->uz_flags |= UMA_ZONE_SMR;
4670         zone->uz_smr = smr;
4671         zone_update_caches(zone);
4672 }
4673
4674 smr_t
4675 uma_zone_get_smr(uma_zone_t zone)
4676 {
4677
4678         return (zone->uz_smr);
4679 }
4680
4681 /* See uma.h */
4682 void
4683 uma_zone_reserve(uma_zone_t zone, int items)
4684 {
4685         uma_keg_t keg;
4686
4687         KEG_GET(zone, keg);
4688         KEG_ASSERT_COLD(keg);
4689         keg->uk_reserve = items;
4690 }
4691
4692 /* See uma.h */
4693 int
4694 uma_zone_reserve_kva(uma_zone_t zone, int count)
4695 {
4696         uma_keg_t keg;
4697         vm_offset_t kva;
4698         u_int pages;
4699
4700         KEG_GET(zone, keg);
4701         KEG_ASSERT_COLD(keg);
4702         ZONE_ASSERT_COLD(zone);
4703
4704         pages = howmany(count, keg->uk_ipers) * keg->uk_ppera;
4705
4706 #ifdef UMA_MD_SMALL_ALLOC
4707         if (keg->uk_ppera > 1) {
4708 #else
4709         if (1) {
4710 #endif
4711                 kva = kva_alloc((vm_size_t)pages * PAGE_SIZE);
4712                 if (kva == 0)
4713                         return (0);
4714         } else
4715                 kva = 0;
4716
4717         MPASS(keg->uk_kva == 0);
4718         keg->uk_kva = kva;
4719         keg->uk_offset = 0;
4720         zone->uz_max_items = pages * keg->uk_ipers;
4721 #ifdef UMA_MD_SMALL_ALLOC
4722         keg->uk_allocf = (keg->uk_ppera > 1) ? noobj_alloc : uma_small_alloc;
4723 #else
4724         keg->uk_allocf = noobj_alloc;
4725 #endif
4726         keg->uk_flags |= UMA_ZFLAG_LIMIT | UMA_ZONE_NOFREE;
4727         zone->uz_flags |= UMA_ZFLAG_LIMIT | UMA_ZONE_NOFREE;
4728         zone_update_caches(zone);
4729
4730         return (1);
4731 }
4732
4733 /* See uma.h */
4734 void
4735 uma_prealloc(uma_zone_t zone, int items)
4736 {
4737         struct vm_domainset_iter di;
4738         uma_domain_t dom;
4739         uma_slab_t slab;
4740         uma_keg_t keg;
4741         int aflags, domain, slabs;
4742
4743         KEG_GET(zone, keg);
4744         slabs = howmany(items, keg->uk_ipers);
4745         while (slabs-- > 0) {
4746                 aflags = M_NOWAIT;
4747                 vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
4748                     &aflags);
4749                 for (;;) {
4750                         slab = keg_alloc_slab(keg, zone, domain, M_WAITOK,
4751                             aflags);
4752                         if (slab != NULL) {
4753                                 dom = &keg->uk_domain[slab->us_domain];
4754                                 /*
4755                                  * keg_alloc_slab() always returns a slab on the
4756                                  * partial list.
4757                                  */
4758                                 LIST_REMOVE(slab, us_link);
4759                                 LIST_INSERT_HEAD(&dom->ud_free_slab, slab,
4760                                     us_link);
4761                                 dom->ud_free_slabs++;
4762                                 KEG_UNLOCK(keg, slab->us_domain);
4763                                 break;
4764                         }
4765                         if (vm_domainset_iter_policy(&di, &domain) != 0)
4766                                 vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
4767                 }
4768         }
4769 }
4770
4771 /*
4772  * Returns a snapshot of memory consumption in bytes.
4773  */
4774 size_t
4775 uma_zone_memory(uma_zone_t zone)
4776 {
4777         size_t sz;
4778         int i;
4779
4780         sz = 0;
4781         if (zone->uz_flags & UMA_ZFLAG_CACHE) {
4782                 for (i = 0; i < vm_ndomains; i++)
4783                         sz += ZDOM_GET(zone, i)->uzd_nitems;
4784                 return (sz * zone->uz_size);
4785         }
4786         for (i = 0; i < vm_ndomains; i++)
4787                 sz += zone->uz_keg->uk_domain[i].ud_pages;
4788
4789         return (sz * PAGE_SIZE);
4790 }
4791
4792 /* See uma.h */
4793 void
4794 uma_reclaim(int req)
4795 {
4796
4797         CTR0(KTR_UMA, "UMA: vm asked us to release pages!");
4798         sx_xlock(&uma_reclaim_lock);
4799         bucket_enable();
4800
4801         switch (req) {
4802         case UMA_RECLAIM_TRIM:
4803                 zone_foreach(zone_trim, NULL);
4804                 break;
4805         case UMA_RECLAIM_DRAIN:
4806         case UMA_RECLAIM_DRAIN_CPU:
4807                 zone_foreach(zone_drain, NULL);
4808                 if (req == UMA_RECLAIM_DRAIN_CPU) {
4809                         pcpu_cache_drain_safe(NULL);
4810                         zone_foreach(zone_drain, NULL);
4811                 }
4812                 break;
4813         default:
4814                 panic("unhandled reclamation request %d", req);
4815         }
4816
4817         /*
4818          * Some slabs may have been freed but this zone will be visited early
4819          * we visit again so that we can free pages that are empty once other
4820          * zones are drained.  We have to do the same for buckets.
4821          */
4822         zone_drain(slabzones[0], NULL);
4823         zone_drain(slabzones[1], NULL);
4824         bucket_zone_drain();
4825         sx_xunlock(&uma_reclaim_lock);
4826 }
4827
4828 static volatile int uma_reclaim_needed;
4829
4830 void
4831 uma_reclaim_wakeup(void)
4832 {
4833
4834         if (atomic_fetchadd_int(&uma_reclaim_needed, 1) == 0)
4835                 wakeup(uma_reclaim);
4836 }
4837
4838 void
4839 uma_reclaim_worker(void *arg __unused)
4840 {
4841
4842         for (;;) {
4843                 sx_xlock(&uma_reclaim_lock);
4844                 while (atomic_load_int(&uma_reclaim_needed) == 0)
4845                         sx_sleep(uma_reclaim, &uma_reclaim_lock, PVM, "umarcl",
4846                             hz);
4847                 sx_xunlock(&uma_reclaim_lock);
4848                 EVENTHANDLER_INVOKE(vm_lowmem, VM_LOW_KMEM);
4849                 uma_reclaim(UMA_RECLAIM_DRAIN_CPU);
4850                 atomic_store_int(&uma_reclaim_needed, 0);
4851                 /* Don't fire more than once per-second. */
4852                 pause("umarclslp", hz);
4853         }
4854 }
4855
4856 /* See uma.h */
4857 void
4858 uma_zone_reclaim(uma_zone_t zone, int req)
4859 {
4860
4861         switch (req) {
4862         case UMA_RECLAIM_TRIM:
4863                 zone_trim(zone, NULL);
4864                 break;
4865         case UMA_RECLAIM_DRAIN:
4866                 zone_drain(zone, NULL);
4867                 break;
4868         case UMA_RECLAIM_DRAIN_CPU:
4869                 pcpu_cache_drain_safe(zone);
4870                 zone_drain(zone, NULL);
4871                 break;
4872         default:
4873                 panic("unhandled reclamation request %d", req);
4874         }
4875 }
4876
4877 /* See uma.h */
4878 int
4879 uma_zone_exhausted(uma_zone_t zone)
4880 {
4881
4882         return (atomic_load_32(&zone->uz_sleepers) > 0);
4883 }
4884
4885 unsigned long
4886 uma_limit(void)
4887 {
4888
4889         return (uma_kmem_limit);
4890 }
4891
4892 void
4893 uma_set_limit(unsigned long limit)
4894 {
4895
4896         uma_kmem_limit = limit;
4897 }
4898
4899 unsigned long
4900 uma_size(void)
4901 {
4902
4903         return (atomic_load_long(&uma_kmem_total));
4904 }
4905
4906 long
4907 uma_avail(void)
4908 {
4909
4910         return (uma_kmem_limit - uma_size());
4911 }
4912
4913 #ifdef DDB
4914 /*
4915  * Generate statistics across both the zone and its per-cpu cache's.  Return
4916  * desired statistics if the pointer is non-NULL for that statistic.
4917  *
4918  * Note: does not update the zone statistics, as it can't safely clear the
4919  * per-CPU cache statistic.
4920  *
4921  */
4922 static void
4923 uma_zone_sumstat(uma_zone_t z, long *cachefreep, uint64_t *allocsp,
4924     uint64_t *freesp, uint64_t *sleepsp, uint64_t *xdomainp)
4925 {
4926         uma_cache_t cache;
4927         uint64_t allocs, frees, sleeps, xdomain;
4928         int cachefree, cpu;
4929
4930         allocs = frees = sleeps = xdomain = 0;
4931         cachefree = 0;
4932         CPU_FOREACH(cpu) {
4933                 cache = &z->uz_cpu[cpu];
4934                 cachefree += cache->uc_allocbucket.ucb_cnt;
4935                 cachefree += cache->uc_freebucket.ucb_cnt;
4936                 xdomain += cache->uc_crossbucket.ucb_cnt;
4937                 cachefree += cache->uc_crossbucket.ucb_cnt;
4938                 allocs += cache->uc_allocs;
4939                 frees += cache->uc_frees;
4940         }
4941         allocs += counter_u64_fetch(z->uz_allocs);
4942         frees += counter_u64_fetch(z->uz_frees);
4943         xdomain += counter_u64_fetch(z->uz_xdomain);
4944         sleeps += z->uz_sleeps;
4945         if (cachefreep != NULL)
4946                 *cachefreep = cachefree;
4947         if (allocsp != NULL)
4948                 *allocsp = allocs;
4949         if (freesp != NULL)
4950                 *freesp = frees;
4951         if (sleepsp != NULL)
4952                 *sleepsp = sleeps;
4953         if (xdomainp != NULL)
4954                 *xdomainp = xdomain;
4955 }
4956 #endif /* DDB */
4957
4958 static int
4959 sysctl_vm_zone_count(SYSCTL_HANDLER_ARGS)
4960 {
4961         uma_keg_t kz;
4962         uma_zone_t z;
4963         int count;
4964
4965         count = 0;
4966         rw_rlock(&uma_rwlock);
4967         LIST_FOREACH(kz, &uma_kegs, uk_link) {
4968                 LIST_FOREACH(z, &kz->uk_zones, uz_link)
4969                         count++;
4970         }
4971         LIST_FOREACH(z, &uma_cachezones, uz_link)
4972                 count++;
4973
4974         rw_runlock(&uma_rwlock);
4975         return (sysctl_handle_int(oidp, &count, 0, req));
4976 }
4977
4978 static void
4979 uma_vm_zone_stats(struct uma_type_header *uth, uma_zone_t z, struct sbuf *sbuf,
4980     struct uma_percpu_stat *ups, bool internal)
4981 {
4982         uma_zone_domain_t zdom;
4983         uma_cache_t cache;
4984         int i;
4985
4986         for (i = 0; i < vm_ndomains; i++) {
4987                 zdom = ZDOM_GET(z, i);
4988                 uth->uth_zone_free += zdom->uzd_nitems;
4989         }
4990         uth->uth_allocs = counter_u64_fetch(z->uz_allocs);
4991         uth->uth_frees = counter_u64_fetch(z->uz_frees);
4992         uth->uth_fails = counter_u64_fetch(z->uz_fails);
4993         uth->uth_xdomain = counter_u64_fetch(z->uz_xdomain);
4994         uth->uth_sleeps = z->uz_sleeps;
4995
4996         for (i = 0; i < mp_maxid + 1; i++) {
4997                 bzero(&ups[i], sizeof(*ups));
4998                 if (internal || CPU_ABSENT(i))
4999                         continue;
5000                 cache = &z->uz_cpu[i];
5001                 ups[i].ups_cache_free += cache->uc_allocbucket.ucb_cnt;
5002                 ups[i].ups_cache_free += cache->uc_freebucket.ucb_cnt;
5003                 ups[i].ups_cache_free += cache->uc_crossbucket.ucb_cnt;
5004                 ups[i].ups_allocs = cache->uc_allocs;
5005                 ups[i].ups_frees = cache->uc_frees;
5006         }
5007 }
5008
5009 static int
5010 sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS)
5011 {
5012         struct uma_stream_header ush;
5013         struct uma_type_header uth;
5014         struct uma_percpu_stat *ups;
5015         struct sbuf sbuf;
5016         uma_keg_t kz;
5017         uma_zone_t z;
5018         uint64_t items;
5019         uint32_t kfree, pages;
5020         int count, error, i;
5021
5022         error = sysctl_wire_old_buffer(req, 0);
5023         if (error != 0)
5024                 return (error);
5025         sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
5026         sbuf_clear_flags(&sbuf, SBUF_INCLUDENUL);
5027         ups = malloc((mp_maxid + 1) * sizeof(*ups), M_TEMP, M_WAITOK);
5028
5029         count = 0;
5030         rw_rlock(&uma_rwlock);
5031         LIST_FOREACH(kz, &uma_kegs, uk_link) {
5032                 LIST_FOREACH(z, &kz->uk_zones, uz_link)
5033                         count++;
5034         }
5035
5036         LIST_FOREACH(z, &uma_cachezones, uz_link)
5037                 count++;
5038
5039         /*
5040          * Insert stream header.
5041          */
5042         bzero(&ush, sizeof(ush));
5043         ush.ush_version = UMA_STREAM_VERSION;
5044         ush.ush_maxcpus = (mp_maxid + 1);
5045         ush.ush_count = count;
5046         (void)sbuf_bcat(&sbuf, &ush, sizeof(ush));
5047
5048         LIST_FOREACH(kz, &uma_kegs, uk_link) {
5049                 kfree = pages = 0;
5050                 for (i = 0; i < vm_ndomains; i++) {
5051                         kfree += kz->uk_domain[i].ud_free_items;
5052                         pages += kz->uk_domain[i].ud_pages;
5053                 }
5054                 LIST_FOREACH(z, &kz->uk_zones, uz_link) {
5055                         bzero(&uth, sizeof(uth));
5056                         strlcpy(uth.uth_name, z->uz_name, UTH_MAX_NAME);
5057                         uth.uth_align = kz->uk_align;
5058                         uth.uth_size = kz->uk_size;
5059                         uth.uth_rsize = kz->uk_rsize;
5060                         if (z->uz_max_items > 0) {
5061                                 items = UZ_ITEMS_COUNT(z->uz_items);
5062                                 uth.uth_pages = (items / kz->uk_ipers) *
5063                                         kz->uk_ppera;
5064                         } else
5065                                 uth.uth_pages = pages;
5066                         uth.uth_maxpages = (z->uz_max_items / kz->uk_ipers) *
5067                             kz->uk_ppera;
5068                         uth.uth_limit = z->uz_max_items;
5069                         uth.uth_keg_free = kfree;
5070
5071                         /*
5072                          * A zone is secondary is it is not the first entry
5073                          * on the keg's zone list.
5074                          */
5075                         if ((z->uz_flags & UMA_ZONE_SECONDARY) &&
5076                             (LIST_FIRST(&kz->uk_zones) != z))
5077                                 uth.uth_zone_flags = UTH_ZONE_SECONDARY;
5078                         uma_vm_zone_stats(&uth, z, &sbuf, ups,
5079                             kz->uk_flags & UMA_ZFLAG_INTERNAL);
5080                         (void)sbuf_bcat(&sbuf, &uth, sizeof(uth));
5081                         for (i = 0; i < mp_maxid + 1; i++)
5082                                 (void)sbuf_bcat(&sbuf, &ups[i], sizeof(ups[i]));
5083                 }
5084         }
5085         LIST_FOREACH(z, &uma_cachezones, uz_link) {
5086                 bzero(&uth, sizeof(uth));
5087                 strlcpy(uth.uth_name, z->uz_name, UTH_MAX_NAME);
5088                 uth.uth_size = z->uz_size;
5089                 uma_vm_zone_stats(&uth, z, &sbuf, ups, false);
5090                 (void)sbuf_bcat(&sbuf, &uth, sizeof(uth));
5091                 for (i = 0; i < mp_maxid + 1; i++)
5092                         (void)sbuf_bcat(&sbuf, &ups[i], sizeof(ups[i]));
5093         }
5094
5095         rw_runlock(&uma_rwlock);
5096         error = sbuf_finish(&sbuf);
5097         sbuf_delete(&sbuf);
5098         free(ups, M_TEMP);
5099         return (error);
5100 }
5101
5102 int
5103 sysctl_handle_uma_zone_max(SYSCTL_HANDLER_ARGS)
5104 {
5105         uma_zone_t zone = *(uma_zone_t *)arg1;
5106         int error, max;
5107
5108         max = uma_zone_get_max(zone);
5109         error = sysctl_handle_int(oidp, &max, 0, req);
5110         if (error || !req->newptr)
5111                 return (error);
5112
5113         uma_zone_set_max(zone, max);
5114
5115         return (0);
5116 }
5117
5118 int
5119 sysctl_handle_uma_zone_cur(SYSCTL_HANDLER_ARGS)
5120 {
5121         uma_zone_t zone;
5122         int cur;
5123
5124         /*
5125          * Some callers want to add sysctls for global zones that
5126          * may not yet exist so they pass a pointer to a pointer.
5127          */
5128         if (arg2 == 0)
5129                 zone = *(uma_zone_t *)arg1;
5130         else
5131                 zone = arg1;
5132         cur = uma_zone_get_cur(zone);
5133         return (sysctl_handle_int(oidp, &cur, 0, req));
5134 }
5135
5136 static int
5137 sysctl_handle_uma_zone_allocs(SYSCTL_HANDLER_ARGS)
5138 {
5139         uma_zone_t zone = arg1;
5140         uint64_t cur;
5141
5142         cur = uma_zone_get_allocs(zone);
5143         return (sysctl_handle_64(oidp, &cur, 0, req));
5144 }
5145
5146 static int
5147 sysctl_handle_uma_zone_frees(SYSCTL_HANDLER_ARGS)
5148 {
5149         uma_zone_t zone = arg1;
5150         uint64_t cur;
5151
5152         cur = uma_zone_get_frees(zone);
5153         return (sysctl_handle_64(oidp, &cur, 0, req));
5154 }
5155
5156 static int
5157 sysctl_handle_uma_zone_flags(SYSCTL_HANDLER_ARGS)
5158 {
5159         struct sbuf sbuf;
5160         uma_zone_t zone = arg1;
5161         int error;
5162
5163         sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
5164         if (zone->uz_flags != 0)
5165                 sbuf_printf(&sbuf, "0x%b", zone->uz_flags, PRINT_UMA_ZFLAGS);
5166         else
5167                 sbuf_printf(&sbuf, "0");
5168         error = sbuf_finish(&sbuf);
5169         sbuf_delete(&sbuf);
5170
5171         return (error);
5172 }
5173
5174 static int
5175 sysctl_handle_uma_slab_efficiency(SYSCTL_HANDLER_ARGS)
5176 {
5177         uma_keg_t keg = arg1;
5178         int avail, effpct, total;
5179
5180         total = keg->uk_ppera * PAGE_SIZE;
5181         if ((keg->uk_flags & UMA_ZFLAG_OFFPAGE) != 0)
5182                 total += slabzone(keg->uk_ipers)->uz_keg->uk_rsize;
5183         /*
5184          * We consider the client's requested size and alignment here, not the
5185          * real size determination uk_rsize, because we also adjust the real
5186          * size for internal implementation reasons (max bitset size).
5187          */
5188         avail = keg->uk_ipers * roundup2(keg->uk_size, keg->uk_align + 1);
5189         if ((keg->uk_flags & UMA_ZONE_PCPU) != 0)
5190                 avail *= mp_maxid + 1;
5191         effpct = 100 * avail / total;
5192         return (sysctl_handle_int(oidp, &effpct, 0, req));
5193 }
5194
5195 static int
5196 sysctl_handle_uma_zone_items(SYSCTL_HANDLER_ARGS)
5197 {
5198         uma_zone_t zone = arg1;
5199         uint64_t cur;
5200
5201         cur = UZ_ITEMS_COUNT(atomic_load_64(&zone->uz_items));
5202         return (sysctl_handle_64(oidp, &cur, 0, req));
5203 }
5204
5205 #ifdef INVARIANTS
5206 static uma_slab_t
5207 uma_dbg_getslab(uma_zone_t zone, void *item)
5208 {
5209         uma_slab_t slab;
5210         uma_keg_t keg;
5211         uint8_t *mem;
5212
5213         /*
5214          * It is safe to return the slab here even though the
5215          * zone is unlocked because the item's allocation state
5216          * essentially holds a reference.
5217          */
5218         mem = (uint8_t *)((uintptr_t)item & (~UMA_SLAB_MASK));
5219         if ((zone->uz_flags & UMA_ZFLAG_CACHE) != 0)
5220                 return (NULL);
5221         if (zone->uz_flags & UMA_ZFLAG_VTOSLAB)
5222                 return (vtoslab((vm_offset_t)mem));
5223         keg = zone->uz_keg;
5224         if ((keg->uk_flags & UMA_ZFLAG_HASH) == 0)
5225                 return ((uma_slab_t)(mem + keg->uk_pgoff));
5226         KEG_LOCK(keg, 0);
5227         slab = hash_sfind(&keg->uk_hash, mem);
5228         KEG_UNLOCK(keg, 0);
5229
5230         return (slab);
5231 }
5232
5233 static bool
5234 uma_dbg_zskip(uma_zone_t zone, void *mem)
5235 {
5236
5237         if ((zone->uz_flags & UMA_ZFLAG_CACHE) != 0)
5238                 return (true);
5239
5240         return (uma_dbg_kskip(zone->uz_keg, mem));
5241 }
5242
5243 static bool
5244 uma_dbg_kskip(uma_keg_t keg, void *mem)
5245 {
5246         uintptr_t idx;
5247
5248         if (dbg_divisor == 0)
5249                 return (true);
5250
5251         if (dbg_divisor == 1)
5252                 return (false);
5253
5254         idx = (uintptr_t)mem >> PAGE_SHIFT;
5255         if (keg->uk_ipers > 1) {
5256                 idx *= keg->uk_ipers;
5257                 idx += ((uintptr_t)mem & PAGE_MASK) / keg->uk_rsize;
5258         }
5259
5260         if ((idx / dbg_divisor) * dbg_divisor != idx) {
5261                 counter_u64_add(uma_skip_cnt, 1);
5262                 return (true);
5263         }
5264         counter_u64_add(uma_dbg_cnt, 1);
5265
5266         return (false);
5267 }
5268
5269 /*
5270  * Set up the slab's freei data such that uma_dbg_free can function.
5271  *
5272  */
5273 static void
5274 uma_dbg_alloc(uma_zone_t zone, uma_slab_t slab, void *item)
5275 {
5276         uma_keg_t keg;
5277         int freei;
5278
5279         if (slab == NULL) {
5280                 slab = uma_dbg_getslab(zone, item);
5281                 if (slab == NULL) 
5282                         panic("uma: item %p did not belong to zone %s",
5283                             item, zone->uz_name);
5284         }
5285         keg = zone->uz_keg;
5286         freei = slab_item_index(slab, keg, item);
5287
5288         if (BIT_ISSET(keg->uk_ipers, freei, slab_dbg_bits(slab, keg)))
5289                 panic("Duplicate alloc of %p from zone %p(%s) slab %p(%d)",
5290                     item, zone, zone->uz_name, slab, freei);
5291         BIT_SET_ATOMIC(keg->uk_ipers, freei, slab_dbg_bits(slab, keg));
5292 }
5293
5294 /*
5295  * Verifies freed addresses.  Checks for alignment, valid slab membership
5296  * and duplicate frees.
5297  *
5298  */
5299 static void
5300 uma_dbg_free(uma_zone_t zone, uma_slab_t slab, void *item)
5301 {
5302         uma_keg_t keg;
5303         int freei;
5304
5305         if (slab == NULL) {
5306                 slab = uma_dbg_getslab(zone, item);
5307                 if (slab == NULL) 
5308                         panic("uma: Freed item %p did not belong to zone %s",
5309                             item, zone->uz_name);
5310         }
5311         keg = zone->uz_keg;
5312         freei = slab_item_index(slab, keg, item);
5313
5314         if (freei >= keg->uk_ipers)
5315                 panic("Invalid free of %p from zone %p(%s) slab %p(%d)",
5316                     item, zone, zone->uz_name, slab, freei);
5317
5318         if (slab_item(slab, keg, freei) != item)
5319                 panic("Unaligned free of %p from zone %p(%s) slab %p(%d)",
5320                     item, zone, zone->uz_name, slab, freei);
5321
5322         if (!BIT_ISSET(keg->uk_ipers, freei, slab_dbg_bits(slab, keg)))
5323                 panic("Duplicate free of %p from zone %p(%s) slab %p(%d)",
5324                     item, zone, zone->uz_name, slab, freei);
5325
5326         BIT_CLR_ATOMIC(keg->uk_ipers, freei, slab_dbg_bits(slab, keg));
5327 }
5328 #endif /* INVARIANTS */
5329
5330 #ifdef DDB
5331 static int64_t
5332 get_uma_stats(uma_keg_t kz, uma_zone_t z, uint64_t *allocs, uint64_t *used,
5333     uint64_t *sleeps, long *cachefree, uint64_t *xdomain)
5334 {
5335         uint64_t frees;
5336         int i;
5337
5338         if (kz->uk_flags & UMA_ZFLAG_INTERNAL) {
5339                 *allocs = counter_u64_fetch(z->uz_allocs);
5340                 frees = counter_u64_fetch(z->uz_frees);
5341                 *sleeps = z->uz_sleeps;
5342                 *cachefree = 0;
5343                 *xdomain = 0;
5344         } else
5345                 uma_zone_sumstat(z, cachefree, allocs, &frees, sleeps,
5346                     xdomain);
5347         for (i = 0; i < vm_ndomains; i++) {
5348                 *cachefree += ZDOM_GET(z, i)->uzd_nitems;
5349                 if (!((z->uz_flags & UMA_ZONE_SECONDARY) &&
5350                     (LIST_FIRST(&kz->uk_zones) != z)))
5351                         *cachefree += kz->uk_domain[i].ud_free_items;
5352         }
5353         *used = *allocs - frees;
5354         return (((int64_t)*used + *cachefree) * kz->uk_size);
5355 }
5356
5357 DB_SHOW_COMMAND(uma, db_show_uma)
5358 {
5359         const char *fmt_hdr, *fmt_entry;
5360         uma_keg_t kz;
5361         uma_zone_t z;
5362         uint64_t allocs, used, sleeps, xdomain;
5363         long cachefree;
5364         /* variables for sorting */
5365         uma_keg_t cur_keg;
5366         uma_zone_t cur_zone, last_zone;
5367         int64_t cur_size, last_size, size;
5368         int ties;
5369
5370         /* /i option produces machine-parseable CSV output */
5371         if (modif[0] == 'i') {
5372                 fmt_hdr = "%s,%s,%s,%s,%s,%s,%s,%s,%s\n";
5373                 fmt_entry = "\"%s\",%ju,%jd,%ld,%ju,%ju,%u,%jd,%ju\n";
5374         } else {
5375                 fmt_hdr = "%18s %6s %7s %7s %11s %7s %7s %10s %8s\n";
5376                 fmt_entry = "%18s %6ju %7jd %7ld %11ju %7ju %7u %10jd %8ju\n";
5377         }
5378
5379         db_printf(fmt_hdr, "Zone", "Size", "Used", "Free", "Requests",
5380             "Sleeps", "Bucket", "Total Mem", "XFree");
5381
5382         /* Sort the zones with largest size first. */
5383         last_zone = NULL;
5384         last_size = INT64_MAX;
5385         for (;;) {
5386                 cur_zone = NULL;
5387                 cur_size = -1;
5388                 ties = 0;
5389                 LIST_FOREACH(kz, &uma_kegs, uk_link) {
5390                         LIST_FOREACH(z, &kz->uk_zones, uz_link) {
5391                                 /*
5392                                  * In the case of size ties, print out zones
5393                                  * in the order they are encountered.  That is,
5394                                  * when we encounter the most recently output
5395                                  * zone, we have already printed all preceding
5396                                  * ties, and we must print all following ties.
5397                                  */
5398                                 if (z == last_zone) {
5399                                         ties = 1;
5400                                         continue;
5401                                 }
5402                                 size = get_uma_stats(kz, z, &allocs, &used,
5403                                     &sleeps, &cachefree, &xdomain);
5404                                 if (size > cur_size && size < last_size + ties)
5405                                 {
5406                                         cur_size = size;
5407                                         cur_zone = z;
5408                                         cur_keg = kz;
5409                                 }
5410                         }
5411                 }
5412                 if (cur_zone == NULL)
5413                         break;
5414
5415                 size = get_uma_stats(cur_keg, cur_zone, &allocs, &used,
5416                     &sleeps, &cachefree, &xdomain);
5417                 db_printf(fmt_entry, cur_zone->uz_name,
5418                     (uintmax_t)cur_keg->uk_size, (intmax_t)used, cachefree,
5419                     (uintmax_t)allocs, (uintmax_t)sleeps,
5420                     (unsigned)cur_zone->uz_bucket_size, (intmax_t)size,
5421                     xdomain);
5422
5423                 if (db_pager_quit)
5424                         return;
5425                 last_zone = cur_zone;
5426                 last_size = cur_size;
5427         }
5428 }
5429
5430 DB_SHOW_COMMAND(umacache, db_show_umacache)
5431 {
5432         uma_zone_t z;
5433         uint64_t allocs, frees;
5434         long cachefree;
5435         int i;
5436
5437         db_printf("%18s %8s %8s %8s %12s %8s\n", "Zone", "Size", "Used", "Free",
5438             "Requests", "Bucket");
5439         LIST_FOREACH(z, &uma_cachezones, uz_link) {
5440                 uma_zone_sumstat(z, &cachefree, &allocs, &frees, NULL, NULL);
5441                 for (i = 0; i < vm_ndomains; i++)
5442                         cachefree += ZDOM_GET(z, i)->uzd_nitems;
5443                 db_printf("%18s %8ju %8jd %8ld %12ju %8u\n",
5444                     z->uz_name, (uintmax_t)z->uz_size,
5445                     (intmax_t)(allocs - frees), cachefree,
5446                     (uintmax_t)allocs, z->uz_bucket_size);
5447                 if (db_pager_quit)
5448                         return;
5449         }
5450 }
5451 #endif  /* DDB */