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 }
152