summaryrefslogtreecommitdiff
path: root/usr/src/lib/libfakekernel/common/kmem.c
diff options
context:
space:
mode:
authorGordon Ross <gwr@nexenta.com>2013-06-17 10:34:00 -0400
committerGordon Ross <gwr@nexenta.com>2015-06-04 16:46:25 -0400
commitb819cea2f73f98c5662230cc9affc8cc84f77fcf (patch)
treea3677952ded5706400717b9b79b0aeaa3d93a739 /usr/src/lib/libfakekernel/common/kmem.c
parent83d2dfe69259e79314662cf95e6d1f9103dcffe2 (diff)
downloadillumos-joyent-b819cea2f73f98c5662230cc9affc8cc84f77fcf.tar.gz
5917 User-mode SMB server
Authored by: Thomas Keiser <thomas.keiser@nexenta.com> Authored by: Albert Lee <trisk@nexenta.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Reviewed by: Albert Lee <trisk@omniti.com> Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src/lib/libfakekernel/common/kmem.c')
-rw-r--r--usr/src/lib/libfakekernel/common/kmem.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/usr/src/lib/libfakekernel/common/kmem.c b/usr/src/lib/libfakekernel/common/kmem.c
new file mode 100644
index 0000000000..82d1cfeaef
--- /dev/null
+++ b/usr/src/lib/libfakekernel/common/kmem.c
@@ -0,0 +1,151 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ */
+
+#include <sys/kmem.h>
+
+#include <sys/debug.h>
+#include <sys/ksynch.h>
+#include <sys/systm.h>
+
+#include <umem.h>
+
+void abort(void) __NORETURN;
+
+static int
+kmem_failed_cb(void)
+{
+ abort();
+ return (UMEM_CALLBACK_RETRY);
+}
+
+#pragma init(_kmem_init)
+static int
+_kmem_init(void)
+{
+ umem_nofail_callback(kmem_failed_cb);
+ return (0);
+}
+
+static int
+kmem2umem_flags(int kmflags)
+{
+ int umflags = UMEM_NOFAIL;
+ if (kmflags & KM_NOSLEEP)
+ umflags = UMEM_DEFAULT;
+ return (umflags);
+}
+
+int
+kmem_debugging(void)
+{
+ return (0);
+}
+
+void *
+kmem_alloc(size_t size, int kmflags)
+{
+ return (umem_alloc(size, kmem2umem_flags(kmflags)));
+}
+
+void *
+kmem_zalloc(size_t size, int kmflags)
+{
+ return (umem_zalloc(size, kmem2umem_flags(kmflags)));
+}
+
+
+void
+kmem_free(void *buf, size_t size)
+{
+ umem_free(buf, size);
+}
+
+/* void *kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags); */
+
+kmem_cache_t *
+kmem_cache_create(
+ char *name, /* descriptive name for this cache */
+ size_t bufsize, /* size of the objects it manages */
+ size_t align, /* required object alignment */
+ int (*constructor)(void *, void *, int), /* object constructor */
+ void (*destructor)(void *, void *), /* object destructor */
+ void (*reclaim)(void *), /* memory reclaim callback */
+ void *private, /* pass-thru arg for constr/destr/reclaim */
+ vmem_t *vmp, /* vmem source for slab allocation */
+ int kcflags) /* cache creation flags */
+{
+ umem_cache_t *uc;
+ int ucflags = 0;
+
+ /* Ignore KMC_NOTOUCH - not needed for userland caches */
+ if (kcflags & KMC_NODEBUG)
+ ucflags |= UMC_NODEBUG;
+ if (kcflags & KMC_NOMAGAZINE)
+ ucflags |= UMC_NOMAGAZINE;
+ if (kcflags & KMC_NOHASH)
+ ucflags |= UMC_NOHASH;
+
+ uc = umem_cache_create(name, bufsize, align,
+ constructor, destructor, reclaim,
+ private, vmp, ucflags);
+ return ((kmem_cache_t *)uc);
+}
+
+void
+kmem_cache_destroy(kmem_cache_t *kc)
+{
+ umem_cache_destroy((umem_cache_t *)kc);
+}
+
+void *
+kmem_cache_alloc(kmem_cache_t *kc, int kmflags)
+{
+ return (umem_cache_alloc((umem_cache_t *)kc,
+ kmem2umem_flags(kmflags)));
+}
+
+void
+kmem_cache_free(kmem_cache_t *kc, void *p)
+{
+ umem_cache_free((umem_cache_t *)kc, p);
+}
+
+/* ARGSUSED */
+void
+kmem_cache_set_move(kmem_cache_t *kc,
+ kmem_cbrc_t (*fun)(void *, void *, size_t, void *))
+{
+}
+
+/* ARGSUSED */
+void
+kmem_cache_reap_now(kmem_cache_t *kc)
+{
+}
+
+/* uint64_t kmem_cache_stat(kmem_cache_t *, char *); */
+
+/* ARGSUSED */
+void
+vmem_qcache_reap(struct vmem *vmp)
+{
+}
+
+void
+strfree(char *str)
+{
+ ASSERT(str != NULL);
+ kmem_free(str, strlen(str) + 1);
+}