1f0a75d27SPawel Jakub Dawidek /*- 2f0a75d27SPawel Jakub Dawidek * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3f0a75d27SPawel Jakub Dawidek * All rights reserved. 4f0a75d27SPawel Jakub Dawidek * 5f0a75d27SPawel Jakub Dawidek * Redistribution and use in source and binary forms, with or without 6f0a75d27SPawel Jakub Dawidek * modification, are permitted provided that the following conditions 7f0a75d27SPawel Jakub Dawidek * are met: 8f0a75d27SPawel Jakub Dawidek * 1. Redistributions of source code must retain the above copyright 9f0a75d27SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer. 10f0a75d27SPawel Jakub Dawidek * 2. Redistributions in binary form must reproduce the above copyright 11f0a75d27SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer in the 12f0a75d27SPawel Jakub Dawidek * documentation and/or other materials provided with the distribution. 13f0a75d27SPawel Jakub Dawidek * 14f0a75d27SPawel Jakub Dawidek * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15f0a75d27SPawel Jakub Dawidek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16f0a75d27SPawel Jakub Dawidek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17f0a75d27SPawel Jakub Dawidek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18f0a75d27SPawel Jakub Dawidek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19f0a75d27SPawel Jakub Dawidek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20f0a75d27SPawel Jakub Dawidek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21f0a75d27SPawel Jakub Dawidek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22f0a75d27SPawel Jakub Dawidek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23f0a75d27SPawel Jakub Dawidek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24f0a75d27SPawel Jakub Dawidek * SUCH DAMAGE. 25f0a75d27SPawel Jakub Dawidek */ 26f0a75d27SPawel Jakub Dawidek 27f0a75d27SPawel Jakub Dawidek #ifndef _OPENSOLARIS_SYS_KMEM_H_ 28f0a75d27SPawel Jakub Dawidek #define _OPENSOLARIS_SYS_KMEM_H_ 29f0a75d27SPawel Jakub Dawidek 30f0a75d27SPawel Jakub Dawidek #include <sys/param.h> 31f0a75d27SPawel Jakub Dawidek #include <sys/proc.h> 32f0a75d27SPawel Jakub Dawidek #include <sys/malloc.h> 335df87b21SJeff Roberson #include <sys/vmem.h> 349ed01c32SGleb Smirnoff #include <sys/vmmeter.h> 352d03e331SPawel Jakub Dawidek 36f0a75d27SPawel Jakub Dawidek #include <vm/uma.h> 37f0a75d27SPawel Jakub Dawidek #include <vm/vm.h> 38f0a75d27SPawel Jakub Dawidek #include <vm/vm_extern.h> 39f0a75d27SPawel Jakub Dawidek 4010b9d77bSPawel Jakub Dawidek MALLOC_DECLARE(M_SOLARIS); 4110b9d77bSPawel Jakub Dawidek 4210b9d77bSPawel Jakub Dawidek #define POINTER_IS_VALID(p) (!((uintptr_t)(p) & 0x3)) 4310b9d77bSPawel Jakub Dawidek #define POINTER_INVALIDATE(pp) (*(pp) = (void *)((uintptr_t)(*(pp)) | 0x1)) 4410b9d77bSPawel Jakub Dawidek 45f0a75d27SPawel Jakub Dawidek #define KM_SLEEP M_WAITOK 461ba4a712SPawel Jakub Dawidek #define KM_PUSHPAGE M_WAITOK 47f0a75d27SPawel Jakub Dawidek #define KM_NOSLEEP M_NOWAIT 48263811f7SKip Macy #define KM_NODEBUG M_NODUMP 49dc0f030eSMark Johnston #define KM_NORMALPRI 0 50263811f7SKip Macy #define KMC_NODEBUG UMA_ZONE_NODUMP 5110b9d77bSPawel Jakub Dawidek #define KMC_NOTOUCH 0 52f0a75d27SPawel Jakub Dawidek 53f0a75d27SPawel Jakub Dawidek typedef struct kmem_cache { 54f0a75d27SPawel Jakub Dawidek char kc_name[32]; 551ba4a712SPawel Jakub Dawidek #if defined(_KERNEL) && !defined(KMEM_DEBUG) 56f0a75d27SPawel Jakub Dawidek uma_zone_t kc_zone; 57f0a75d27SPawel Jakub Dawidek #else 581ba4a712SPawel Jakub Dawidek size_t kc_size; 59f0a75d27SPawel Jakub Dawidek #endif 60f0a75d27SPawel Jakub Dawidek int (*kc_constructor)(void *, void *, int); 61f0a75d27SPawel Jakub Dawidek void (*kc_destructor)(void *, void *); 62f0a75d27SPawel Jakub Dawidek void *kc_private; 63f0a75d27SPawel Jakub Dawidek } kmem_cache_t; 64f0a75d27SPawel Jakub Dawidek 65f0a75d27SPawel Jakub Dawidek void *zfs_kmem_alloc(size_t size, int kmflags); 66f0a75d27SPawel Jakub Dawidek void zfs_kmem_free(void *buf, size_t size); 6744ce1efdSPawel Jakub Dawidek uint64_t kmem_size(void); 68f0a75d27SPawel Jakub Dawidek kmem_cache_t *kmem_cache_create(char *name, size_t bufsize, size_t align, 69f0a75d27SPawel Jakub Dawidek int (*constructor)(void *, void *, int), void (*destructor)(void *, void *), 70f0a75d27SPawel Jakub Dawidek void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags); 71f0a75d27SPawel Jakub Dawidek void kmem_cache_destroy(kmem_cache_t *cache); 72f0a75d27SPawel Jakub Dawidek void *kmem_cache_alloc(kmem_cache_t *cache, int flags); 73f0a75d27SPawel Jakub Dawidek void kmem_cache_free(kmem_cache_t *cache, void *buf); 74b17bfcdeSAlexander Motin boolean_t kmem_cache_reap_active(void); 75b17bfcdeSAlexander Motin void kmem_cache_reap_soon(kmem_cache_t *); 76f0a75d27SPawel Jakub Dawidek void kmem_reap(void); 77f0a75d27SPawel Jakub Dawidek int kmem_debugging(void); 78f0a75d27SPawel Jakub Dawidek void *calloc(size_t n, size_t s); 79f0a75d27SPawel Jakub Dawidek 80e2068d0bSJeff Roberson #define freemem vm_free_count() 81c5f74c48SAlexander Motin #define minfree vm_cnt.v_free_min 82ad5b0f5bSJeff Roberson #define heap_arena kernel_arena 83ad5b0f5bSJeff Roberson #define zio_arena NULL 84f0a75d27SPawel Jakub Dawidek #define kmem_alloc(size, kmflags) zfs_kmem_alloc((size), (kmflags)) 852d03e331SPawel Jakub Dawidek #define kmem_zalloc(size, kmflags) zfs_kmem_alloc((size), (kmflags) | M_ZERO) 86f0a75d27SPawel Jakub Dawidek #define kmem_free(buf, size) zfs_kmem_free((buf), (size)) 87f0a75d27SPawel Jakub Dawidek 8810b9d77bSPawel Jakub Dawidek #define kmem_cache_set_move(cache, movefunc) do { } while (0) 8910b9d77bSPawel Jakub Dawidek 90f0a75d27SPawel Jakub Dawidek #endif /* _OPENSOLARIS_SYS_KMEM_H_ */ 91