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