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
kmem_failed_cb(void)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
_kmem_init(void)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
kmem2umem_flags(int kmflags)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
kmem_debugging(void)51*b819cea2SGordon Ross kmem_debugging(void)
52*b819cea2SGordon Ross {
53*b819cea2SGordon Ross return (0);
54*b819cea2SGordon Ross }
55*b819cea2SGordon Ross
56*b819cea2SGordon Ross void *
kmem_alloc(size_t size,int kmflags)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 *
kmem_zalloc(size_t size,int kmflags)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
kmem_free(void * buf,size_t size)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 *
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)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
kmem_cache_destroy(kmem_cache_t * kc)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 *
kmem_cache_alloc(kmem_cache_t * kc,int kmflags)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
kmem_cache_free(kmem_cache_t * kc,void * p)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
kmem_cache_set_move(kmem_cache_t * kc,kmem_cbrc_t (* fun)(void *,void *,size_t,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
kmem_cache_reap_now(kmem_cache_t * kc)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
vmem_qcache_reap(struct vmem * vmp)142*b819cea2SGordon Ross vmem_qcache_reap(struct vmem *vmp)
143*b819cea2SGordon Ross {
144*b819cea2SGordon Ross }
145*b819cea2SGordon Ross
146*b819cea2SGordon Ross void
strfree(char * str)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