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