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