diff options
Diffstat (limited to 'zfs/lib/libumem/include')
-rw-r--r-- | zfs/lib/libumem/include/misc.h | 141 | ||||
-rw-r--r-- | zfs/lib/libumem/include/sys/vmem.h | 145 | ||||
-rw-r--r-- | zfs/lib/libumem/include/sys/vmem_impl_user.h | 152 | ||||
-rw-r--r-- | zfs/lib/libumem/include/umem.h | 86 | ||||
-rw-r--r-- | zfs/lib/libumem/include/umem_base.h | 146 | ||||
-rw-r--r-- | zfs/lib/libumem/include/umem_impl.h | 403 | ||||
-rw-r--r-- | zfs/lib/libumem/include/vmem_base.h | 85 | ||||
-rw-r--r-- | zfs/lib/libumem/include/vmem_stand.h | 49 |
8 files changed, 0 insertions, 1207 deletions
diff --git a/zfs/lib/libumem/include/misc.h b/zfs/lib/libumem/include/misc.h deleted file mode 100644 index f1fdcc181..000000000 --- a/zfs/lib/libumem/include/misc.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _MISC_H -#define _MISC_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/time.h> -#include <thread.h> -#include <pthread.h> -#include <stdarg.h> - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint_t umem_abort; /* abort when errors occur */ -extern uint_t umem_output; /* output error messages to stderr */ -extern caddr_t umem_min_stack; /* max stack address for audit log */ -extern caddr_t umem_max_stack; /* min stack address for audit log */ - -/* - * various utility functions - * These are globally implemented. - */ - -#undef offsetof -#define offsetof(s, m) ((size_t)(&(((s *)0)->m))) - -/* - * a safe printf -- do not use for error messages. - */ -void debug_printf(const char *format, ...); - -/* - * adds a message to the log without writing it out. - */ -void log_message(const char *format, ...); - -/* - * returns the index of the (high/low) bit + 1 - */ -int highbit(ulong_t); -int lowbit(ulong_t); -#pragma no_side_effect(highbit, lowbit) - -/* - * Converts a hrtime_t to a timestruc_t - */ -void hrt2ts(hrtime_t hrt, timestruc_t *tsp); - -/* - * tries to print out the symbol and offset of a pointer using umem_error_info - */ -int print_sym(void *pointer); - -/* - * Information about the current error. Can be called multiple times, should - * be followed eventually with a call to umem_err or umem_err_recoverable. - */ -void umem_printf(const char *format, ...); -void umem_vprintf(const char *format, va_list); - -void umem_printf_warn(void *ignored, const char *format, ...); - -void umem_error_enter(const char *); - -/* - * prints error message and stack trace, then aborts. Cannot return. - */ -void umem_panic(const char *format, ...) __NORETURN; -#pragma does_not_return(umem_panic) -#pragma rarely_called(umem_panic) - -/* - * like umem_err, but only aborts if umem_abort > 0 - */ -void umem_err_recoverable(const char *format, ...); - -/* - * We define our own assertion handling since libc's assert() calls malloc() - */ -#ifdef NDEBUG -#define ASSERT(assertion) (void)0 -#else -#define ASSERT(assertion) (void)((assertion) || \ - __umem_assert_failed(#assertion, __FILE__, __LINE__)) -#endif - -int __umem_assert_failed(const char *assertion, const char *file, int line); -#pragma does_not_return(__umem_assert_failed) -#pragma rarely_called(__umem_assert_failed) -/* - * These have architecture-specific implementations. - */ - -/* - * Returns the current function's frame pointer. - */ -extern void *getfp(void); - -/* - * puts a pc-only stack trace of up to pcstack_limit frames into pcstack. - * Returns the number of stacks written. - * - * if check_sighandler != 0, and we are in a signal context, calls - * umem_err_recoverable. - */ -extern int getpcstack(uintptr_t *pcstack, int pcstack_limit, - int check_sighandler); - -#ifdef __cplusplus -} -#endif - -#endif /* _MISC_H */ diff --git a/zfs/lib/libumem/include/sys/vmem.h b/zfs/lib/libumem/include/sys/vmem.h deleted file mode 100644 index abcc8b26b..000000000 --- a/zfs/lib/libumem/include/sys/vmem.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SYS_VMEM_H -#define _SYS_VMEM_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> - -#ifdef __cplusplus -extern "C" { -#endif - - -/* - * Per-allocation flags - */ -#define VM_SLEEP 0x00000000 /* same as KM_SLEEP */ -#define VM_NOSLEEP 0x00000001 /* same as KM_NOSLEEP */ -#define VM_PANIC 0x00000002 /* same as KM_PANIC */ -#define VM_PUSHPAGE 0x00000004 /* same as KM_PUSHPAGE */ -#define VM_KMFLAGS 0x000000ff /* flags that must match KM_* flags */ - -#define VM_BESTFIT 0x00000100 -#define VM_FIRSTFIT 0x00000200 -#define VM_NEXTFIT 0x00000400 - -/* - * The following flags are restricted for use only within the kernel. - * VM_MEMLOAD is for use by the HAT to avoid infinite recursion. - * VM_NORELOC is used by the kernel when static VA->PA mappings are required. - */ -#define VM_MEMLOAD 0x00000800 -#define VM_NORELOC 0x00001000 -/* - * VM_ABORT requests that vmem_alloc() *ignore* the VM_SLEEP/VM_NOSLEEP flags - * and forgo reaping if the allocation or attempted import, fails. This - * flag is a segkmem-specific flag, and should not be used by anyone else. - */ -#define VM_ABORT 0x00002000 - -#define VM_FLAGS 0x0000FFFF - -/* - * Arena creation flags - */ -#define VMC_POPULATOR 0x00010000 -#define VMC_NO_QCACHE 0x00020000 /* cannot use quantum caches */ -#define VMC_IDENTIFIER 0x00040000 /* not backed by memory */ -/* - * internal use only; the import function uses the vmem_ximport_t interface - * and may increase the request size if it so desires. - * VMC_XALIGN, for use with vmem_xcreate, specifies that - * the address returned by the import function will be - * aligned according to the alignment argument. - */ -#define VMC_XALLOC 0x00080000 -#define VMC_XALIGN 0x00100000 -#define VMC_FLAGS 0xFFFF0000 - -/* - * Public segment types - */ -#define VMEM_ALLOC 0x01 -#define VMEM_FREE 0x02 - -/* - * Implementation-private segment types - */ -#define VMEM_SPAN 0x10 -#define VMEM_ROTOR 0x20 -#define VMEM_WALKER 0x40 - -/* - * VMEM_REENTRANT indicates to vmem_walk() that the callback routine may - * call back into the arena being walked, so vmem_walk() must drop the - * arena lock before each callback. The caveat is that since the arena - * isn't locked, its state can change. Therefore it is up to the callback - * routine to handle cases where the segment isn't of the expected type. - * For example, we use this to walk heap_arena when generating a crash dump; - * see segkmem_dump() for sample usage. - */ -#define VMEM_REENTRANT 0x80000000 - -typedef struct vmem vmem_t; -typedef void *(vmem_alloc_t)(vmem_t *, size_t, int); -typedef void (vmem_free_t)(vmem_t *, void *, size_t); - -/* - * Alternate import style; the requested size is passed in a pointer, - * which can be increased by the import function if desired. - */ -typedef void *(vmem_ximport_t)(vmem_t *, size_t *, size_t, int); - -#ifdef _KERNEL -extern vmem_t *vmem_init(const char *, void *, size_t, size_t, - vmem_alloc_t *, vmem_free_t *); -extern void vmem_update(void *); -extern int vmem_is_populator(); -extern size_t vmem_seg_size; -#endif - -extern vmem_t *vmem_create(const char *, void *, size_t, size_t, - vmem_alloc_t *, vmem_free_t *, vmem_t *, size_t, int); -extern vmem_t *vmem_xcreate(const char *, void *, size_t, size_t, - vmem_ximport_t *, vmem_free_t *, vmem_t *, size_t, int); -extern void vmem_destroy(vmem_t *); -extern void *vmem_alloc(vmem_t *, size_t, int); -extern void *vmem_xalloc(vmem_t *, size_t, size_t, size_t, size_t, - void *, void *, int); -extern void vmem_free(vmem_t *, void *, size_t); -extern void vmem_xfree(vmem_t *, void *, size_t); -extern void *vmem_add(vmem_t *, void *, size_t, int); -extern int vmem_contains(vmem_t *, void *, size_t); -extern void vmem_walk(vmem_t *, int, void (*)(void *, void *, size_t), void *); -extern size_t vmem_size(vmem_t *, int); - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_VMEM_H */ diff --git a/zfs/lib/libumem/include/sys/vmem_impl_user.h b/zfs/lib/libumem/include/sys/vmem_impl_user.h deleted file mode 100644 index cc9da6679..000000000 --- a/zfs/lib/libumem/include/sys/vmem_impl_user.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SYS_VMEM_IMPL_USER_H -#define _SYS_VMEM_IMPL_USER_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/kstat.h> -#include <sys/time.h> -#include <sys/vmem.h> -#include <thread.h> -#include <synch.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct vmem_seg vmem_seg_t; - -#define VMEM_STACK_DEPTH 20 - -struct vmem_seg { - /* - * The first four fields must match vmem_freelist_t exactly. - */ - uintptr_t vs_start; /* start of segment (inclusive) */ - uintptr_t vs_end; /* end of segment (exclusive) */ - vmem_seg_t *vs_knext; /* next of kin (alloc, free, span) */ - vmem_seg_t *vs_kprev; /* prev of kin */ - - vmem_seg_t *vs_anext; /* next in arena */ - vmem_seg_t *vs_aprev; /* prev in arena */ - uint8_t vs_type; /* alloc, free, span */ - uint8_t vs_import; /* non-zero if segment was imported */ - uint8_t vs_depth; /* stack depth if UMF_AUDIT active */ - /* - * The following fields are present only when UMF_AUDIT is set. - */ - thread_t vs_thread; - hrtime_t vs_timestamp; - uintptr_t vs_stack[VMEM_STACK_DEPTH]; -}; - -typedef struct vmem_freelist { - uintptr_t vs_start; /* always zero */ - uintptr_t vs_end; /* segment size */ - vmem_seg_t *vs_knext; /* next of kin */ - vmem_seg_t *vs_kprev; /* prev of kin */ -} vmem_freelist_t; - -#define VS_SIZE(vsp) ((vsp)->vs_end - (vsp)->vs_start) - -/* - * Segment hashing - */ -#define VMEM_HASH_INDEX(a, s, q, m) \ - ((((a) + ((a) >> (s)) + ((a) >> ((s) << 1))) >> (q)) & (m)) - -#define VMEM_HASH(vmp, addr) \ - (&(vmp)->vm_hash_table[VMEM_HASH_INDEX(addr, \ - (vmp)->vm_hash_shift, (vmp)->vm_qshift, (vmp)->vm_hash_mask)]) - -#define VMEM_NAMELEN 30 -#define VMEM_HASH_INITIAL 16 -#define VMEM_NQCACHE_MAX 16 -#define VMEM_FREELISTS (sizeof (void *) * 8) - -typedef struct vmem_kstat { - uint64_t vk_mem_inuse; /* memory in use */ - uint64_t vk_mem_import; /* memory imported */ - uint64_t vk_mem_total; /* total memory in arena */ - uint32_t vk_source_id; /* vmem id of vmem source */ - uint64_t vk_alloc; /* number of allocations */ - uint64_t vk_free; /* number of frees */ - uint64_t vk_wait; /* number of allocations that waited */ - uint64_t vk_fail; /* number of allocations that failed */ - uint64_t vk_lookup; /* hash lookup count */ - uint64_t vk_search; /* freelist search count */ - uint64_t vk_populate_wait; /* populates that waited */ - uint64_t vk_populate_fail; /* populates that failed */ - uint64_t vk_contains; /* vmem_contains() calls */ - uint64_t vk_contains_search; /* vmem_contains() search cnt */ -} vmem_kstat_t; - -struct vmem { - char vm_name[VMEM_NAMELEN]; /* arena name */ - cond_t vm_cv; /* cv for blocking allocations */ - mutex_t vm_lock; /* arena lock */ - uint32_t vm_id; /* vmem id */ - uint32_t vm_mtbf; /* induced alloc failure rate */ - int vm_cflags; /* arena creation flags */ - int vm_qshift; /* log2(vm_quantum) */ - size_t vm_quantum; /* vmem quantum */ - size_t vm_qcache_max; /* maximum size to front by umem */ - vmem_alloc_t *vm_source_alloc; - vmem_free_t *vm_source_free; - vmem_t *vm_source; /* vmem source for imported memory */ - vmem_t *vm_next; /* next in vmem_list */ - ssize_t vm_nsegfree; /* number of free vmem_seg_t's */ - vmem_seg_t *vm_segfree; /* free vmem_seg_t list */ - vmem_seg_t **vm_hash_table; /* allocated-segment hash table */ - size_t vm_hash_mask; /* hash_size - 1 */ - size_t vm_hash_shift; /* log2(vm_hash_mask + 1) */ - ulong_t vm_freemap; /* bitmap of non-empty freelists */ - vmem_seg_t vm_seg0; /* anchor segment */ - vmem_seg_t vm_rotor; /* rotor for VM_NEXTFIT allocations */ - vmem_seg_t *vm_hash0[VMEM_HASH_INITIAL]; /* initial hash table */ - void *vm_qcache[VMEM_NQCACHE_MAX]; /* quantum caches */ - vmem_freelist_t vm_freelist[VMEM_FREELISTS + 1]; /* power-of-2 flists */ - vmem_kstat_t vm_kstat; /* kstat data */ -}; - -/* - * We cannot use a mutex_t and MUTEX_HELD, since that will not work - * when libthread is not linked. - */ -typedef struct vmem_populate_lock { - mutex_t vmpl_mutex; - thread_t vmpl_thr; -} vmem_populate_lock_t; - -#define VM_UMFLAGS VM_KMFLAGS - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_VMEM_IMPL_USER_H */ diff --git a/zfs/lib/libumem/include/umem.h b/zfs/lib/libumem/include/umem.h deleted file mode 100644 index f8dc47529..000000000 --- a/zfs/lib/libumem/include/umem.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _UMEM_H -#define _UMEM_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/vmem.h> -#include <stdlib.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define UMEM_DEFAULT 0x0000 /* normal -- may fail */ -#define UMEM_NOFAIL 0x0100 /* Never fails -- may call exit(2) */ - -#define UMEM_FLAGS 0xffff /* all settable umem flags */ - -extern void *umem_alloc(size_t, int); -extern void *umem_alloc_align(size_t, size_t, int); -extern void *umem_zalloc(size_t, int); -extern void umem_free(void *, size_t); -extern void umem_free_align(void *, size_t); - -/* - * Flags for umem_cache_create() - */ -#define UMC_NOTOUCH 0x00010000 -#define UMC_NODEBUG 0x00020000 -#define UMC_NOMAGAZINE 0x00040000 -#define UMC_NOHASH 0x00080000 - -struct umem_cache; /* cache structure is opaque to umem clients */ - -typedef struct umem_cache umem_cache_t; -typedef int umem_constructor_t(void *, void *, int); -typedef void umem_destructor_t(void *, void *); -typedef void umem_reclaim_t(void *); - -typedef int umem_nofail_callback_t(void); -#define UMEM_CALLBACK_RETRY 0 -#define UMEM_CALLBACK_EXIT(status) (0x100 | ((status) & 0xFF)) - -extern void umem_nofail_callback(umem_nofail_callback_t *); - -extern umem_cache_t *umem_cache_create(char *, size_t, - size_t, umem_constructor_t *, umem_destructor_t *, umem_reclaim_t *, - void *, vmem_t *, int); -extern void umem_cache_destroy(umem_cache_t *); - -extern void *umem_cache_alloc(umem_cache_t *, int); -extern void umem_cache_free(umem_cache_t *, void *); - -extern void umem_reap(void); - -#ifdef __cplusplus -} -#endif - -#endif /* _UMEM_H */ diff --git a/zfs/lib/libumem/include/umem_base.h b/zfs/lib/libumem/include/umem_base.h deleted file mode 100644 index e78bebfb5..000000000 --- a/zfs/lib/libumem/include/umem_base.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _UMEM_BASE_H -#define _UMEM_BASE_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <umem_impl.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include "misc.h" - -extern size_t pagesize; -#undef PAGESIZE -#define PAGESIZE pagesize - -/* - * umem.c: non-tunables - */ -extern vmem_t *umem_memalign_arena; - -extern int umem_ready; -extern thread_t umem_init_thr; /* the thread doing the init */ - -extern int umem_init(void); /* do umem's initialization */ -#pragma rarely_called(umem_init) - -extern umem_log_header_t *umem_transaction_log; -extern umem_log_header_t *umem_content_log; -extern umem_log_header_t *umem_failure_log; -extern umem_log_header_t *umem_slab_log; - -extern mutex_t umem_init_lock; - -extern mutex_t umem_cache_lock; -extern umem_cache_t umem_null_cache; - -extern mutex_t umem_flags_lock; - -extern mutex_t umem_update_lock; -extern cond_t umem_update_cv; -extern volatile thread_t umem_st_update_thr; -extern thread_t umem_update_thr; -extern struct timeval umem_update_next; - -extern volatile hrtime_t umem_reap_next; -extern volatile uint32_t umem_reaping; -#define UMEM_REAP_DONE 0x00000000 /* inactive */ -#define UMEM_REAP_ADDING 0x00000001 /* umem_reap() is active */ -#define UMEM_REAP_ACTIVE 0x00000002 /* update thread is reaping */ - -/* - * umem.c: tunables - */ -extern uint32_t umem_max_ncpus; - -extern uint32_t umem_stack_depth; -extern uint32_t umem_reap_interval; -extern uint32_t umem_update_interval; -extern uint32_t umem_depot_contention; -extern uint32_t umem_abort; -extern uint32_t umem_output; -extern uint32_t umem_logging; -extern uint32_t umem_mtbf; -extern size_t umem_transaction_log_size; -extern size_t umem_content_log_size; -extern size_t umem_failure_log_size; -extern size_t umem_slab_log_size; -extern size_t umem_content_maxsave; -extern size_t umem_lite_minsize; -extern size_t umem_lite_maxalign; -extern size_t umem_maxverify; -extern size_t umem_minfirewall; - -extern uint32_t umem_flags; - -/* - * umem.c: Internal aliases (to avoid PLTs) - */ -extern void *_umem_alloc(size_t size, int umflags); -extern void *_umem_zalloc(size_t size, int umflags); -extern void _umem_free(void *buf, size_t size); - -extern void *_umem_cache_alloc(umem_cache_t *cache, int flags); -extern void _umem_cache_free(umem_cache_t *cache, void *buffer); - -/* - * umem.c: private interfaces - */ -extern void umem_type_init(caddr_t, size_t, size_t); -extern int umem_get_max_ncpus(void); -extern void umem_process_updates(void); -extern void umem_cache_applyall(void (*)(umem_cache_t *)); -extern void umem_cache_update(umem_cache_t *); - -extern void umem_alloc_sizes_add(size_t); -extern void umem_alloc_sizes_clear(void); -extern void umem_alloc_sizes_remove(size_t); - -/* - * umem_fork.c: private interfaces - */ -extern void umem_forkhandler_init(void); - -/* - * umem_update_thread.c - */ -extern int umem_create_update_thread(void); - -/* - * envvar.c: - */ -void umem_setup_envvars(int); -void umem_process_envvars(void); - -#ifdef __cplusplus -} -#endif - -#endif /* _UMEM_BASE_H */ diff --git a/zfs/lib/libumem/include/umem_impl.h b/zfs/lib/libumem/include/umem_impl.h deleted file mode 100644 index c6481d975..000000000 --- a/zfs/lib/libumem/include/umem_impl.h +++ /dev/null @@ -1,403 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _UMEM_IMPL_H -#define _UMEM_IMPL_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <umem.h> - -#include <sys/sysmacros.h> -#include <sys/time.h> -#include <sys/vmem.h> -#include <thread.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * umem memory allocator: implementation-private data structures - */ - -/* - * Internal flags for umem_cache_create - */ -#define UMC_QCACHE 0x00100000 -#define UMC_INTERNAL 0x80000000 - -/* - * Cache flags - */ -#define UMF_AUDIT 0x00000001 /* transaction auditing */ -#define UMF_DEADBEEF 0x00000002 /* deadbeef checking */ -#define UMF_REDZONE 0x00000004 /* redzone checking */ -#define UMF_CONTENTS 0x00000008 /* freed-buffer content logging */ -#define UMF_CHECKSIGNAL 0x00000010 /* abort when in signal context */ -#define UMF_NOMAGAZINE 0x00000020 /* disable per-cpu magazines */ -#define UMF_FIREWALL 0x00000040 /* put all bufs before unmapped pages */ -#define UMF_LITE 0x00000100 /* lightweight debugging */ - -#define UMF_HASH 0x00000200 /* cache has hash table */ -#define UMF_RANDOMIZE 0x00000400 /* randomize other umem_flags */ - -#define UMF_BUFTAG (UMF_DEADBEEF | UMF_REDZONE) -#define UMF_TOUCH (UMF_BUFTAG | UMF_LITE | UMF_CONTENTS) -#define UMF_RANDOM (UMF_TOUCH | UMF_AUDIT | UMF_NOMAGAZINE) -#define UMF_DEBUG (UMF_RANDOM | UMF_FIREWALL) - -#define UMEM_STACK_DEPTH umem_stack_depth - -#define UMEM_FREE_PATTERN 0xdeadbeefdeadbeefULL -#define UMEM_UNINITIALIZED_PATTERN 0xbaddcafebaddcafeULL -#define UMEM_REDZONE_PATTERN 0xfeedfacefeedfaceULL -#define UMEM_REDZONE_BYTE 0xbb - -#define UMEM_FATAL_FLAGS (UMEM_NOFAIL) -#define UMEM_SLEEP_FLAGS (0) - -/* - * Redzone size encodings for umem_alloc() / umem_free(). We encode the - * allocation size, rather than storing it directly, so that umem_free() - * can distinguish frees of the wrong size from redzone violations. - */ -#define UMEM_SIZE_ENCODE(x) (251 * (x) + 1) -#define UMEM_SIZE_DECODE(x) ((x) / 251) -#define UMEM_SIZE_VALID(x) ((x) % 251 == 1) - -/* - * The bufctl (buffer control) structure keeps some minimal information - * about each buffer: its address, its slab, and its current linkage, - * which is either on the slab's freelist (if the buffer is free), or - * on the cache's buf-to-bufctl hash table (if the buffer is allocated). - * In the case of non-hashed, or "raw", caches (the common case), only - * the freelist linkage is necessary: the buffer address is at a fixed - * offset from the bufctl address, and the slab is at the end of the page. - * - * NOTE: bc_next must be the first field; raw buffers have linkage only. - */ -typedef struct umem_bufctl { - struct umem_bufctl *bc_next; /* next bufctl struct */ - void *bc_addr; /* address of buffer */ - struct umem_slab *bc_slab; /* controlling slab */ -} umem_bufctl_t; - -/* - * The UMF_AUDIT version of the bufctl structure. The beginning of this - * structure must be identical to the normal bufctl structure so that - * pointers are interchangeable. - */ - -#define UMEM_BUFCTL_AUDIT_SIZE_DEPTH(frames) \ - ((size_t)(&((umem_bufctl_audit_t *)0)->bc_stack[frames])) - -/* - * umem_bufctl_audits must be allocated from a UMC_NOHASH cache, so we - * require that 2 of them, plus 2 buftags, plus a umem_slab_t, all fit on - * a single page. - * - * For ILP32, this is about 1000 frames. - * For LP64, this is about 490 frames. - */ - -#define UMEM_BUFCTL_AUDIT_ALIGN 32 - -#define UMEM_BUFCTL_AUDIT_MAX_SIZE \ - (P2ALIGN((PAGESIZE - sizeof (umem_slab_t))/2 - \ - sizeof (umem_buftag_t), UMEM_BUFCTL_AUDIT_ALIGN)) - -#define UMEM_MAX_STACK_DEPTH \ - ((UMEM_BUFCTL_AUDIT_MAX_SIZE - \ - UMEM_BUFCTL_AUDIT_SIZE_DEPTH(0)) / sizeof (uintptr_t)) - -typedef struct umem_bufctl_audit { - struct umem_bufctl *bc_next; /* next bufctl struct */ - void *bc_addr; /* address of buffer */ - struct umem_slab *bc_slab; /* controlling slab */ - umem_cache_t *bc_cache; /* controlling cache */ - hrtime_t bc_timestamp; /* transaction time */ - thread_t bc_thread; /* thread doing transaction */ - struct umem_bufctl *bc_lastlog; /* last log entry */ - void *bc_contents; /* contents at last free */ - int bc_depth; /* stack depth */ - uintptr_t bc_stack[1]; /* pc stack */ -} umem_bufctl_audit_t; - -#define UMEM_LOCAL_BUFCTL_AUDIT(bcpp) \ - *(bcpp) = (umem_bufctl_audit_t *) \ - alloca(UMEM_BUFCTL_AUDIT_SIZE) - -#define UMEM_BUFCTL_AUDIT_SIZE \ - UMEM_BUFCTL_AUDIT_SIZE_DEPTH(UMEM_STACK_DEPTH) - -/* - * A umem_buftag structure is appended to each buffer whenever any of the - * UMF_BUFTAG flags (UMF_DEADBEEF, UMF_REDZONE, UMF_VERIFY) are set. - */ -typedef struct umem_buftag { - uint64_t bt_redzone; /* 64-bit redzone pattern */ - umem_bufctl_t *bt_bufctl; /* bufctl */ - intptr_t bt_bxstat; /* bufctl ^ (alloc/free) */ -} umem_buftag_t; - -#define UMEM_BUFTAG(cp, buf) \ - ((umem_buftag_t *)((char *)(buf) + (cp)->cache_buftag)) - -#define UMEM_BUFCTL(cp, buf) \ - ((umem_bufctl_t *)((char *)(buf) + (cp)->cache_bufctl)) - -#define UMEM_BUF(cp, bcp) \ - ((void *)((char *)(bcp) - (cp)->cache_bufctl)) - -#define UMEM_SLAB(cp, buf) \ - ((umem_slab_t *)P2END((uintptr_t)(buf), (cp)->cache_slabsize) - 1) - -#define UMEM_CPU_CACHE(cp, cpu) \ - (umem_cpu_cache_t *)((char *)cp + cpu->cpu_cache_offset) - -#define UMEM_MAGAZINE_VALID(cp, mp) \ - (((umem_slab_t *)P2END((uintptr_t)(mp), PAGESIZE) - 1)->slab_cache == \ - (cp)->cache_magtype->mt_cache) - -#define UMEM_SLAB_MEMBER(sp, buf) \ - ((size_t)(buf) - (size_t)(sp)->slab_base < \ - (sp)->slab_cache->cache_slabsize) - -#define UMEM_BUFTAG_ALLOC 0xa110c8edUL -#define UMEM_BUFTAG_FREE 0xf4eef4eeUL - -typedef struct umem_slab { - struct umem_cache *slab_cache; /* controlling cache */ - void *slab_base; /* base of allocated memory */ - struct umem_slab *slab_next; /* next slab on freelist */ - struct umem_slab *slab_prev; /* prev slab on freelist */ - struct umem_bufctl *slab_head; /* first free buffer */ - long slab_refcnt; /* outstanding allocations */ - long slab_chunks; /* chunks (bufs) in this slab */ -} umem_slab_t; - -#define UMEM_HASH_INITIAL 64 - -#define UMEM_HASH(cp, buf) \ - ((cp)->cache_hash_table + \ - (((uintptr_t)(buf) >> (cp)->cache_hash_shift) & (cp)->cache_hash_mask)) - -typedef struct umem_magazine { - void *mag_next; - void *mag_round[1]; /* one or more rounds */ -} umem_magazine_t; - -/* - * The magazine types for fast per-cpu allocation - */ -typedef struct umem_magtype { - int mt_magsize; /* magazine size (number of rounds) */ - int mt_align; /* magazine alignment */ - size_t mt_minbuf; /* all smaller buffers qualify */ - size_t mt_maxbuf; /* no larger buffers qualify */ - umem_cache_t *mt_cache; /* magazine cache */ -} umem_magtype_t; - -#define UMEM_CPU_CACHE_SIZE 64 /* must be power of 2 */ -#define UMEM_CPU_PAD (UMEM_CPU_CACHE_SIZE - sizeof (mutex_t) - \ - 2 * sizeof (uint_t) - 2 * sizeof (void *) - 4 * sizeof (int)) -#define UMEM_CACHE_SIZE(ncpus) \ - ((size_t)(&((umem_cache_t *)0)->cache_cpu[ncpus])) - -typedef struct umem_cpu_cache { - mutex_t cc_lock; /* protects this cpu's local cache */ - uint_t cc_alloc; /* allocations from this cpu */ - uint_t cc_free; /* frees to this cpu */ - umem_magazine_t *cc_loaded; /* the currently loaded magazine */ - umem_magazine_t *cc_ploaded; /* the previously loaded magazine */ - int cc_rounds; /* number of objects in loaded mag */ - int cc_prounds; /* number of objects in previous mag */ - int cc_magsize; /* number of rounds in a full mag */ - int cc_flags; /* CPU-local copy of cache_flags */ -#ifndef _LP64 - char cc_pad[UMEM_CPU_PAD]; /* for nice alignment (32-bit) */ -#endif -} umem_cpu_cache_t; - -/* - * The magazine lists used in the depot. - */ -typedef struct umem_maglist { - umem_magazine_t *ml_list; /* magazine list */ - long ml_total; /* number of magazines */ - long ml_min; /* min since last update */ - long ml_reaplimit; /* max reapable magazines */ - uint64_t ml_alloc; /* allocations from this list */ -} umem_maglist_t; - -#define UMEM_CACHE_NAMELEN 31 - -struct umem_cache { - /* - * Statistics - */ - uint64_t cache_slab_create; /* slab creates */ - uint64_t cache_slab_destroy; /* slab destroys */ - uint64_t cache_slab_alloc; /* slab layer allocations */ - uint64_t cache_slab_free; /* slab layer frees */ - uint64_t cache_alloc_fail; /* total failed allocations */ - uint64_t cache_buftotal; /* total buffers */ - uint64_t cache_bufmax; /* max buffers ever */ - uint64_t cache_rescale; /* # of hash table rescales */ - uint64_t cache_lookup_depth; /* hash lookup depth */ - uint64_t cache_depot_contention; /* mutex contention count */ - uint64_t cache_depot_contention_prev; /* previous snapshot */ - - /* - * Cache properties - */ - char cache_name[UMEM_CACHE_NAMELEN + 1]; - size_t cache_bufsize; /* object size */ - size_t cache_align; /* object alignment */ - umem_constructor_t *cache_constructor; - umem_destructor_t *cache_destructor; - umem_reclaim_t *cache_reclaim; - void *cache_private; /* opaque arg to callbacks */ - vmem_t *cache_arena; /* vmem source for slabs */ - int cache_cflags; /* cache creation flags */ - int cache_flags; /* various cache state info */ - int cache_uflags; /* UMU_* flags */ - uint32_t cache_mtbf; /* induced alloc failure rate */ - umem_cache_t *cache_next; /* forward cache linkage */ - umem_cache_t *cache_prev; /* backward cache linkage */ - umem_cache_t *cache_unext; /* next in update list */ - umem_cache_t *cache_uprev; /* prev in update list */ - uint32_t cache_cpu_mask; /* mask for cpu offset */ - - /* - * Slab layer - */ - mutex_t cache_lock; /* protects slab layer */ - size_t cache_chunksize; /* buf + alignment [+ debug] */ - size_t cache_slabsize; /* size of a slab */ - size_t cache_bufctl; /* buf-to-bufctl distance */ - size_t cache_buftag; /* buf-to-buftag distance */ - size_t cache_verify; /* bytes to verify */ - size_t cache_contents; /* bytes of saved content */ - size_t cache_color; /* next slab color */ - size_t cache_mincolor; /* maximum slab color */ - size_t cache_maxcolor; /* maximum slab color */ - size_t cache_hash_shift; /* get to interesting bits */ - size_t cache_hash_mask; /* hash table mask */ - umem_slab_t *cache_freelist; /* slab free list */ - umem_slab_t cache_nullslab; /* end of freelist marker */ - umem_cache_t *cache_bufctl_cache; /* source of bufctls */ - umem_bufctl_t **cache_hash_table; /* hash table base */ - /* - * Depot layer - */ - mutex_t cache_depot_lock; /* protects depot */ - umem_magtype_t *cache_magtype; /* magazine type */ - umem_maglist_t cache_full; /* full magazines */ - umem_maglist_t cache_empty; /* empty magazines */ - - /* - * Per-CPU layer - */ - umem_cpu_cache_t cache_cpu[1]; /* cache_cpu_mask + 1 entries */ -}; - -typedef struct umem_cpu_log_header { - mutex_t clh_lock; - char *clh_current; - size_t clh_avail; - int clh_chunk; - int clh_hits; - char clh_pad[64 - sizeof (mutex_t) - sizeof (char *) - - sizeof (size_t) - 2 * sizeof (int)]; -} umem_cpu_log_header_t; - -typedef struct umem_log_header { - mutex_t lh_lock; - char *lh_base; - int *lh_free; - size_t lh_chunksize; - int lh_nchunks; - int lh_head; - int lh_tail; - int lh_hits; - umem_cpu_log_header_t lh_cpu[1]; /* actually umem_max_ncpus */ -} umem_log_header_t; - -typedef struct umem_cpu { - uint32_t cpu_cache_offset; - uint32_t cpu_number; -} umem_cpu_t; - -#define UMEM_MAXBUF 16384 - -#define UMEM_ALIGN 8 /* min guaranteed alignment */ -#define UMEM_ALIGN_SHIFT 3 /* log2(UMEM_ALIGN) */ -#define UMEM_VOID_FRACTION 8 /* never waste more than 1/8 of slab */ - -/* - * For 64 bits, buffers >= 16 bytes must be 16-byte aligned - */ -#ifdef _LP64 -#define UMEM_SECOND_ALIGN 16 -#else -#define UMEM_SECOND_ALIGN UMEM_ALIGN -#endif - -#define MALLOC_MAGIC 0x3a10c000 /* 8-byte tag */ -#define MEMALIGN_MAGIC 0x3e3a1000 - -#ifdef _LP64 -#define MALLOC_SECOND_MAGIC 0x16ba7000 /* 8-byte tag, 16-aligned */ -#define MALLOC_OVERSIZE_MAGIC 0x06e47000 /* 16-byte tag, _LP64 */ -#endif - -#define UMEM_MALLOC_ENCODE(type, sz) (uint32_t)((type) - (sz)) -#define UMEM_MALLOC_DECODE(stat, sz) (uint32_t)((stat) + (sz)) -#define UMEM_FREE_PATTERN_32 (uint32_t)(UMEM_FREE_PATTERN) - -#define UMU_MAGAZINE_RESIZE 0x00000001 -#define UMU_HASH_RESCALE 0x00000002 -#define UMU_REAP 0x00000004 -#define UMU_NOTIFY 0x08000000 -#define UMU_ACTIVE 0x80000000 - -#define UMEM_READY_INIT_FAILED -1 -#define UMEM_READY_STARTUP 1 -#define UMEM_READY_INITING 2 -#define UMEM_READY 3 - -#ifdef UMEM_STANDALONE -extern void umem_startup(caddr_t, size_t, size_t, caddr_t, caddr_t); -extern int umem_add(caddr_t, size_t); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _UMEM_IMPL_H */ diff --git a/zfs/lib/libumem/include/vmem_base.h b/zfs/lib/libumem/include/vmem_base.h deleted file mode 100644 index 46ed39734..000000000 --- a/zfs/lib/libumem/include/vmem_base.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _VMEM_BASE_H -#define _VMEM_BASE_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/vmem.h> -#include <umem.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include "misc.h" - -extern void vmem_startup(void); -extern vmem_t *vmem_init(const char *parent_name, size_t parent_quantum, - vmem_alloc_t *parent_alloc, vmem_free_t *parent_free, - const char *heap_name, - void *heap_start, size_t heap_size, size_t heap_quantum, - vmem_alloc_t *heap_alloc, vmem_free_t *heap_free); - -extern void *_vmem_extend_alloc(vmem_t *vmp, void *vaddr, size_t size, - size_t alloc, int vmflag); - -extern vmem_t *vmem_heap_arena(vmem_alloc_t **, vmem_free_t **); -extern void vmem_heap_init(void); - -extern vmem_t *vmem_sbrk_arena(vmem_alloc_t **, vmem_free_t **); -extern vmem_t *vmem_mmap_arena(vmem_alloc_t **, vmem_free_t **); -extern vmem_t *vmem_stand_arena(vmem_alloc_t **, vmem_free_t **); - -extern void vmem_update(void *); -extern void vmem_reap(void); /* vmem_populate()-safe reap */ - -extern size_t pagesize; -extern size_t vmem_sbrk_pagesize; -extern size_t vmem_sbrk_minalloc; - -extern uint_t vmem_backend; -#define VMEM_BACKEND_SBRK 0x0000001 -#define VMEM_BACKEND_MMAP 0x0000002 -#define VMEM_BACKEND_STAND 0x0000003 - -extern vmem_t *vmem_heap; -extern vmem_alloc_t *vmem_heap_alloc; -extern vmem_free_t *vmem_heap_free; - -extern void vmem_lockup(void); -extern void vmem_release(void); - -extern void vmem_sbrk_lockup(void); -extern void vmem_sbrk_release(void); - -extern void vmem_no_debug(void); - -#ifdef __cplusplus -} -#endif - -#endif /* _VMEM_BASE_H */ diff --git a/zfs/lib/libumem/include/vmem_stand.h b/zfs/lib/libumem/include/vmem_stand.h deleted file mode 100644 index fe72ed486..000000000 --- a/zfs/lib/libumem/include/vmem_stand.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _VMEM_STAND_H -#define _VMEM_STAND_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -/* - * additional functions defined by the standalone backend - */ - -#include <sys/types.h> - -#ifdef __cplusplus -extern "C" { -#endif - -extern void vmem_stand_init(void); -extern int vmem_stand_add(caddr_t, size_t); - -#ifdef __cplusplus -} -#endif - -#endif /* _VMEM_STAND_H */ |