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
kmem_failed_cb(void)28 kmem_failed_cb(void)
29 {
30 abort();
31 return (UMEM_CALLBACK_RETRY);
32 }
33
34 #pragma init(_kmem_init)
35 static int
_kmem_init(void)36 _kmem_init(void)
37 {
38 umem_nofail_callback(kmem_failed_cb);
39 return (0);
40 }
41
42 static int
kmem2umem_flags(int kmflags)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
kmem_debugging(void)52 kmem_debugging(void)
53 {
54 return (0);
55 }
56
57 void *
kmem_alloc(size_t size,int kmflags)58 kmem_alloc(size_t size, int kmflags)
59 {
60 return (umem_alloc(size, kmem2umem_flags(kmflags)));
61 }
62
63 void *
kmem_zalloc(size_t size,int kmflags)64 kmem_zalloc(size_t size, int kmflags)
65 {
66 return (umem_zalloc(size, kmem2umem_flags(kmflags)));
67 }
68
69
70 void
kmem_free(void * buf,size_t size)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 *
kmem_cache_create(char * name,size_t bufsize,size_t align,int (* constructor)(void *,void *,int),void (* destructor)(void *,void *),void (* reclaim)(void *),void * private,vmem_t * vmp,int kcflags)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
kmem_cache_destroy(kmem_cache_t * kc)108 kmem_cache_destroy(kmem_cache_t *kc)
109 {
110 umem_cache_destroy((umem_cache_t *)kc);
111 }
112
113 void *
kmem_cache_alloc(kmem_cache_t * kc,int kmflags)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
kmem_cache_free(kmem_cache_t * kc,void * p)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
kmem_cache_set_move(kmem_cache_t * kc,kmem_cbrc_t (* fun)(void *,void *,size_t,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
kmem_cache_reap_active(void)134 kmem_cache_reap_active(void)
135 {
136 return (B_FALSE);
137 }
138
139 /* ARGSUSED */
140 void
kmem_cache_reap_soon(kmem_cache_t * kc)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
vmem_qcache_reap(struct vmem * vmp)149 vmem_qcache_reap(struct vmem *vmp)
150 {
151 }
152
153 void
strfree(char * str)154 strfree(char *str)
155 {
156 ASSERT(str != NULL);
157 kmem_free(str, strlen(str) + 1);
158 }
159