1b819cea2SGordon Ross /* 2b819cea2SGordon Ross * This file and its contents are supplied under the terms of the 3b819cea2SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0. 4b819cea2SGordon Ross * You may only use this file in accordance with the terms of version 5b819cea2SGordon Ross * 1.0 of the CDDL. 6b819cea2SGordon Ross * 7b819cea2SGordon Ross * A full copy of the text of the CDDL should have accompanied this 8b819cea2SGordon Ross * source. A copy of the CDDL is also available via the Internet at 9b819cea2SGordon Ross * http://www.illumos.org/license/CDDL. 10b819cea2SGordon Ross */ 11b819cea2SGordon Ross 12b819cea2SGordon Ross /* 13b819cea2SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 14*36a64e62STim Kordas * Copyright 2018, Joyent, Inc. 15b819cea2SGordon Ross */ 16b819cea2SGordon Ross 17b819cea2SGordon Ross #include <sys/kmem.h> 18b819cea2SGordon Ross 19b819cea2SGordon Ross #include <sys/debug.h> 20b819cea2SGordon Ross #include <sys/ksynch.h> 21b819cea2SGordon Ross #include <sys/systm.h> 22b819cea2SGordon Ross 23b819cea2SGordon Ross #include <umem.h> 24b819cea2SGordon Ross 25b819cea2SGordon Ross void abort(void) __NORETURN; 26b819cea2SGordon Ross 27b819cea2SGordon Ross static int 28b819cea2SGordon Ross kmem_failed_cb(void) 29b819cea2SGordon Ross { 30b819cea2SGordon Ross abort(); 31b819cea2SGordon Ross return (UMEM_CALLBACK_RETRY); 32b819cea2SGordon Ross } 33b819cea2SGordon Ross 34b819cea2SGordon Ross #pragma init(_kmem_init) 35b819cea2SGordon Ross static int 36b819cea2SGordon Ross _kmem_init(void) 37b819cea2SGordon Ross { 38b819cea2SGordon Ross umem_nofail_callback(kmem_failed_cb); 39b819cea2SGordon Ross return (0); 40b819cea2SGordon Ross } 41b819cea2SGordon Ross 42b819cea2SGordon Ross static int 43b819cea2SGordon Ross kmem2umem_flags(int kmflags) 44b819cea2SGordon Ross { 45b819cea2SGordon Ross int umflags = UMEM_NOFAIL; 46b819cea2SGordon Ross if (kmflags & KM_NOSLEEP) 47b819cea2SGordon Ross umflags = UMEM_DEFAULT; 48b819cea2SGordon Ross return (umflags); 49b819cea2SGordon Ross } 50b819cea2SGordon Ross 51b819cea2SGordon Ross int 52b819cea2SGordon Ross kmem_debugging(void) 53b819cea2SGordon Ross { 54b819cea2SGordon Ross return (0); 55b819cea2SGordon Ross } 56b819cea2SGordon Ross 57b819cea2SGordon Ross void * 58b819cea2SGordon Ross kmem_alloc(size_t size, int kmflags) 59b819cea2SGordon Ross { 60b819cea2SGordon Ross return (umem_alloc(size, kmem2umem_flags(kmflags))); 61b819cea2SGordon Ross } 62b819cea2SGordon Ross 63b819cea2SGordon Ross void * 64b819cea2SGordon Ross kmem_zalloc(size_t size, int kmflags) 65b819cea2SGordon Ross { 66b819cea2SGordon Ross return (umem_zalloc(size, kmem2umem_flags(kmflags))); 67b819cea2SGordon Ross } 68b819cea2SGordon Ross 69b819cea2SGordon Ross 70b819cea2SGordon Ross void 71b819cea2SGordon Ross kmem_free(void *buf, size_t size) 72b819cea2SGordon Ross { 73b819cea2SGordon Ross umem_free(buf, size); 74b819cea2SGordon Ross } 75b819cea2SGordon Ross 76b819cea2SGordon Ross /* void *kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags); */ 77b819cea2SGordon Ross 78b819cea2SGordon Ross kmem_cache_t * 79b819cea2SGordon Ross kmem_cache_create( 80b819cea2SGordon Ross char *name, /* descriptive name for this cache */ 81b819cea2SGordon Ross size_t bufsize, /* size of the objects it manages */ 82b819cea2SGordon Ross size_t align, /* required object alignment */ 83b819cea2SGordon Ross int (*constructor)(void *, void *, int), /* object constructor */ 84b819cea2SGordon Ross void (*destructor)(void *, void *), /* object destructor */ 85b819cea2SGordon Ross void (*reclaim)(void *), /* memory reclaim callback */ 86b819cea2SGordon Ross void *private, /* pass-thru arg for constr/destr/reclaim */ 87b819cea2SGordon Ross vmem_t *vmp, /* vmem source for slab allocation */ 88b819cea2SGordon Ross int kcflags) /* cache creation flags */ 89b819cea2SGordon Ross { 90b819cea2SGordon Ross umem_cache_t *uc; 91b819cea2SGordon Ross int ucflags = 0; 92b819cea2SGordon Ross 93b819cea2SGordon Ross /* Ignore KMC_NOTOUCH - not needed for userland caches */ 94b819cea2SGordon Ross if (kcflags & KMC_NODEBUG) 95b819cea2SGordon Ross ucflags |= UMC_NODEBUG; 96b819cea2SGordon Ross if (kcflags & KMC_NOMAGAZINE) 97b819cea2SGordon Ross ucflags |= UMC_NOMAGAZINE; 98b819cea2SGordon Ross if (kcflags & KMC_NOHASH) 99b819cea2SGordon Ross ucflags |= UMC_NOHASH; 100b819cea2SGordon Ross 101b819cea2SGordon Ross uc = umem_cache_create(name, bufsize, align, 102b819cea2SGordon Ross constructor, destructor, reclaim, 103b819cea2SGordon Ross private, vmp, ucflags); 104b819cea2SGordon Ross return ((kmem_cache_t *)uc); 105b819cea2SGordon Ross } 106b819cea2SGordon Ross 107b819cea2SGordon Ross void 108b819cea2SGordon Ross kmem_cache_destroy(kmem_cache_t *kc) 109b819cea2SGordon Ross { 110b819cea2SGordon Ross umem_cache_destroy((umem_cache_t *)kc); 111b819cea2SGordon Ross } 112b819cea2SGordon Ross 113b819cea2SGordon Ross void * 114b819cea2SGordon Ross kmem_cache_alloc(kmem_cache_t *kc, int kmflags) 115b819cea2SGordon Ross { 116b819cea2SGordon Ross return (umem_cache_alloc((umem_cache_t *)kc, 117b819cea2SGordon Ross kmem2umem_flags(kmflags))); 118b819cea2SGordon Ross } 119b819cea2SGordon Ross 120b819cea2SGordon Ross void 121b819cea2SGordon Ross kmem_cache_free(kmem_cache_t *kc, void *p) 122b819cea2SGordon Ross { 123b819cea2SGordon Ross umem_cache_free((umem_cache_t *)kc, p); 124b819cea2SGordon Ross } 125b819cea2SGordon Ross 126b819cea2SGordon Ross /* ARGSUSED */ 127b819cea2SGordon Ross void 128b819cea2SGordon Ross kmem_cache_set_move(kmem_cache_t *kc, 129*36a64e62STim Kordas kmem_cbrc_t (*fun)(void *, void *, size_t, void *)) 130b819cea2SGordon Ross { 131b819cea2SGordon Ross } 132b819cea2SGordon Ross 133*36a64e62STim Kordas boolean_t 134*36a64e62STim Kordas kmem_cache_reap_active(void) 135*36a64e62STim Kordas { 136*36a64e62STim Kordas return (B_FALSE); 137*36a64e62STim Kordas } 138*36a64e62STim Kordas 139b819cea2SGordon Ross /* ARGSUSED */ 140b819cea2SGordon Ross void 141*36a64e62STim Kordas kmem_cache_reap_soon(kmem_cache_t *kc) 142b819cea2SGordon Ross { 143b819cea2SGordon Ross } 144b819cea2SGordon Ross 145b819cea2SGordon Ross /* uint64_t kmem_cache_stat(kmem_cache_t *, char *); */ 146b819cea2SGordon Ross 147b819cea2SGordon Ross /* ARGSUSED */ 148b819cea2SGordon Ross void 149b819cea2SGordon Ross vmem_qcache_reap(struct vmem *vmp) 150b819cea2SGordon Ross { 151b819cea2SGordon Ross } 152b819cea2SGordon Ross 153b819cea2SGordon Ross void 154b819cea2SGordon Ross strfree(char *str) 155b819cea2SGordon Ross { 156b819cea2SGordon Ross ASSERT(str != NULL); 157b819cea2SGordon Ross kmem_free(str, strlen(str) + 1); 158b819cea2SGordon Ross } 159