b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * This file and its contents are supplied under the terms of the
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You may only use this file in accordance with the terms of version
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * 1.0 of the CDDL.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * A full copy of the text of the CDDL should have accompanied this
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * source. A copy of the CDDL is also available via the Internet at
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * http://www.illumos.org/license/CDDL.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/kmem.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/debug.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/ksynch.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/systm.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <umem.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid abort(void) __NORETURN;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic int
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_failed_cb(void)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross abort();
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (UMEM_CALLBACK_RETRY);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#pragma init(_kmem_init)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic int
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross_kmem_init(void)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umem_nofail_callback(kmem_failed_cb);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic int
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem2umem_flags(int kmflags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int umflags = UMEM_NOFAIL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (kmflags & KM_NOSLEEP)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umflags = UMEM_DEFAULT;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (umflags);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_debugging(void)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_alloc(size_t size, int kmflags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (umem_alloc(size, kmem2umem_flags(kmflags)));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_zalloc(size_t size, int kmflags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (umem_zalloc(size, kmem2umem_flags(kmflags)));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_free(void *buf, size_t size)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umem_free(buf, size);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* void *kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags); */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_t *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_create(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name, /* descriptive name for this cache */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t bufsize, /* size of the objects it manages */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t align, /* required object alignment */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int (*constructor)(void *, void *, int), /* object constructor */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross void (*destructor)(void *, void *), /* object destructor */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross void (*reclaim)(void *), /* memory reclaim callback */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross void *private, /* pass-thru arg for constr/destr/reclaim */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vmem_t *vmp, /* vmem source for slab allocation */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int kcflags) /* cache creation flags */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umem_cache_t *uc;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int ucflags = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* Ignore KMC_NOTOUCH - not needed for userland caches */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (kcflags & KMC_NODEBUG)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ucflags |= UMC_NODEBUG;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (kcflags & KMC_NOMAGAZINE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ucflags |= UMC_NOMAGAZINE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (kcflags & KMC_NOHASH)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ucflags |= UMC_NOHASH;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uc = umem_cache_create(name, bufsize, align,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross constructor, destructor, reclaim,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross private, vmp, ucflags);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return ((kmem_cache_t *)uc);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_destroy(kmem_cache_t *kc)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umem_cache_destroy((umem_cache_t *)kc);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_alloc(kmem_cache_t *kc, int kmflags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (umem_cache_alloc((umem_cache_t *)kc,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross kmem2umem_flags(kmflags)));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_free(kmem_cache_t *kc, void *p)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross umem_cache_free((umem_cache_t *)kc, p);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_set_move(kmem_cache_t *kc,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross kmem_cbrc_t (*fun)(void *, void *, size_t, void *))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosskmem_cache_reap_now(kmem_cache_t *kc)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* uint64_t kmem_cache_stat(kmem_cache_t *, char *); */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvmem_qcache_reap(struct vmem *vmp)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstrfree(char *str)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(str != NULL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross kmem_free(str, strlen(str) + 1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}