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