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