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
25void	abort(void) __NORETURN;
26
27static int
28kmem_failed_cb(void)
29{
30	abort();
31	return (UMEM_CALLBACK_RETRY);
32}
33
34#pragma init(_kmem_init)
35static int
36_kmem_init(void)
37{
38	umem_nofail_callback(kmem_failed_cb);
39	return (0);
40}
41
42static int
43kmem2umem_flags(int kmflags)
44{
45	int umflags = UMEM_NOFAIL;
46	if (kmflags & KM_NOSLEEP)
47		umflags = UMEM_DEFAULT;
48	return (umflags);
49}
50
51int
52kmem_debugging(void)
53{
54	return (0);
55}
56
57void *
58kmem_alloc(size_t size, int kmflags)
59{
60	return (umem_alloc(size, kmem2umem_flags(kmflags)));
61}
62
63void *
64kmem_zalloc(size_t size, int kmflags)
65{
66	return (umem_zalloc(size, kmem2umem_flags(kmflags)));
67}
68
69
70void
71kmem_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
78kmem_cache_t *
79kmem_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
107void
108kmem_cache_destroy(kmem_cache_t *kc)
109{
110	umem_cache_destroy((umem_cache_t *)kc);
111}
112
113void *
114kmem_cache_alloc(kmem_cache_t *kc, int kmflags)
115{
116	return (umem_cache_alloc((umem_cache_t *)kc,
117	    kmem2umem_flags(kmflags)));
118}
119
120void
121kmem_cache_free(kmem_cache_t *kc, void *p)
122{
123	umem_cache_free((umem_cache_t *)kc, p);
124}
125
126/* ARGSUSED */
127void
128kmem_cache_set_move(kmem_cache_t *kc,
129    kmem_cbrc_t (*fun)(void *, void *, size_t, void *))
130{
131}
132
133boolean_t
134kmem_cache_reap_active(void)
135{
136	return (B_FALSE);
137}
138
139/* ARGSUSED */
140void
141kmem_cache_reap_soon(kmem_cache_t *kc)
142{
143}
144
145/* uint64_t kmem_cache_stat(kmem_cache_t *, char *); */
146
147/* ARGSUSED */
148void
149vmem_qcache_reap(struct  vmem *vmp)
150{
151}
152
153void
154strfree(char *str)
155{
156	ASSERT(str != NULL);
157	kmem_free(str, strlen(str) + 1);
158}
159