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