#include "config.h"
#include <sys/vmem_impl_user.h>
#include <sys/sysmacros.h>
#include <stdio.h>
#include <strings.h>
#include "vmem_base.h"
#include "umem_base.h"
Defines | |
#define | VMEM_INITIAL 6 |
#define | VMEM_SEG_INITIAL 100 |
#define | VMEM_SEGS_PER_SPAN_CREATE 2 |
#define | VMEM_SEGS_PER_EXACT_ALLOC 0 |
#define | VMEM_SEGS_PER_LEFT_ALLOC 1 |
#define | VMEM_SEGS_PER_RIGHT_ALLOC 1 |
#define | VMEM_SEGS_PER_MIDDLE_ALLOC 2 |
#define | VMEM_SEGS_PER_ALLOC_MAX (VMEM_SEGS_PER_SPAN_CREATE + VMEM_SEGS_PER_MIDDLE_ALLOC) |
#define | VMEM_POPULATE_SEGS_PER_ARENA 4 |
#define | VMEM_POPULATE_LOCKS 1 |
#define | VMEM_POPULATE_RESERVE (VMEM_POPULATE_SEGS_PER_ARENA * VMEM_POPULATE_LOCKS) |
#define | VMEM_MINFREE (VMEM_POPULATE_RESERVE + VMEM_SEGS_PER_ALLOC_MAX) |
#define | IN_POPULATE() (vmem_nosleep_lock.vmpl_thr == thr_self()) |
#define | VMEM_INSERT(vprev, vsp, type) |
#define | VMEM_DELETE(vsp, type) |
Functions | |
int | _cond_wait (cond_t *cv, mutex_t *mutex) |
void | vmem_reap (void) |
void * | vmem_xalloc (vmem_t *vmp, size_t size, size_t align, size_t phase, size_t nocross, void *minaddr, void *maxaddr, int vmflag) |
void | vmem_xfree (vmem_t *vmp, void *vaddr, size_t size) |
void * | vmem_alloc (vmem_t *vmp, size_t size, int vmflag) |
void | vmem_free (vmem_t *vmp, void *vaddr, size_t size) |
int | vmem_contains (vmem_t *vmp, void *vaddr, size_t size) |
void * | vmem_add (vmem_t *vmp, void *vaddr, size_t size, int vmflag) |
void * | _vmem_extend_alloc (vmem_t *vmp, void *vaddr, size_t size, size_t alloc, int vmflag) |
void | vmem_walk (vmem_t *vmp, int typemask, void(*func)(void *, void *, size_t), void *arg) |
size_t | vmem_size (vmem_t *vmp, int typemask) |
vmem_t * | vmem_create (const char *name, void *base, size_t size, size_t quantum, vmem_alloc_t *afunc, vmem_free_t *ffunc, vmem_t *source, size_t qcache_max, int vmflag) |
void | vmem_destroy (vmem_t *vmp) |
void | vmem_update (void *dummy) |
void | vmem_startup (void) |
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) |
void | vmem_no_debug (void) |
void | vmem_lockup (void) |
void | vmem_release (void) |
Variables | |
vmem_t * | vmem_heap |
vmem_alloc_t * | vmem_heap_alloc |
vmem_free_t * | vmem_heap_free |
uint32_t | vmem_mtbf |
size_t | vmem_seg_size = sizeof (vmem_seg_t) |
#define IN_POPULATE | ( | ) | (vmem_nosleep_lock.vmpl_thr == thr_self()) |
Referenced by vmem_reap().
#define VMEM_DELETE | ( | vsp, | |||
type | ) |
Value:
{ \ vmem_seg_t *vprev = (vsp)->vs_##type##prev; \ vmem_seg_t *vnext = (vsp)->vs_##type##next; \ (vprev)->vs_##type##next = (vnext); \ (vnext)->vs_##type##prev = (vprev); \ }
Referenced by vmem_destroy().
#define VMEM_INITIAL 6 |
Referenced by vmem_create().
#define VMEM_INSERT | ( | vprev, | |||
vsp, | |||||
type | ) |
Value:
{ \ vmem_seg_t *vnext = (vprev)->vs_##type##next; \ (vsp)->vs_##type##next = (vnext); \ (vsp)->vs_##type##prev = (vprev); \ (vprev)->vs_##type##next = (vsp); \ (vnext)->vs_##type##prev = (vsp); \ }
Referenced by vmem_create(), and vmem_walk().
#define VMEM_MINFREE (VMEM_POPULATE_RESERVE + VMEM_SEGS_PER_ALLOC_MAX) |
Referenced by vmem_alloc(), and vmem_xalloc().
#define VMEM_POPULATE_LOCKS 1 |
#define VMEM_POPULATE_RESERVE (VMEM_POPULATE_SEGS_PER_ARENA * VMEM_POPULATE_LOCKS) |
#define VMEM_POPULATE_SEGS_PER_ARENA 4 |
#define VMEM_SEG_INITIAL 100 |
Referenced by vmem_init().
#define VMEM_SEGS_PER_ALLOC_MAX (VMEM_SEGS_PER_SPAN_CREATE + VMEM_SEGS_PER_MIDDLE_ALLOC) |
Referenced by vmem_xalloc().
#define VMEM_SEGS_PER_EXACT_ALLOC 0 |
Referenced by vmem_xalloc().
#define VMEM_SEGS_PER_LEFT_ALLOC 1 |
#define VMEM_SEGS_PER_MIDDLE_ALLOC 2 |
#define VMEM_SEGS_PER_RIGHT_ALLOC 1 |
#define VMEM_SEGS_PER_SPAN_CREATE 2 |
Referenced by vmem_xalloc().
void* _vmem_extend_alloc | ( | vmem_t * | vmp, | |
void * | vaddr, | |||
size_t | size, | |||
size_t | alloc, | |||
int | vmflag | |||
) |
References ASSERT, cond_broadcast, mutex_lock, mutex_unlock, vmem::vm_cv, vmem::vm_lock, vmem::vm_quantum, vmem::vm_source_alloc, vmem_contains(), VS_SIZE, and vmem_seg::vs_start.
void* vmem_add | ( | vmem_t * | vmp, | |
void * | vaddr, | |||
size_t | size, | |||
int | vmflag | |||
) |
References ASSERT, cond_broadcast, mutex_lock, mutex_unlock, umem_panic(), vmem::vm_cv, vmem::vm_lock, and vmem_contains().
Referenced by vmem_create().
void* vmem_alloc | ( | vmem_t * | vmp, | |
size_t | size, | |||
int | vmflag | |||
) |
References _umem_cache_alloc(), ASSERT, highbit(), lowbit(), mutex_lock, mutex_unlock, P2ALIGN, UMEM_DEFAULT, VM_BESTFIT, VM_FIRSTFIT, vmem::vm_freelist, vmem::vm_freemap, vmem::vm_lock, vmem::vm_mtbf, VM_NEXTFIT, vmem::vm_nsegfree, VM_PANIC, vmem::vm_qcache, vmem::vm_qcache_max, vmem::vm_qshift, vmem::vm_quantum, VMEM_FREELISTS, VMEM_MINFREE, vmem_mtbf, vmem_xalloc(), vmem_freelist::vs_knext, and vmem_seg::vs_start.
Referenced by _umem_alloc(), umem_cache_create(), umem_init(), vmem_create(), vmem_init(), and vmem_sbrk_arena().
int vmem_contains | ( | vmem_t * | vmp, | |
void * | vaddr, | |||
size_t | size | |||
) |
References ASSERT, mutex_lock, mutex_unlock, vmem_kstat::vk_contains, vmem_kstat::vk_contains_search, vmem::vm_kstat, vmem::vm_lock, vmem::vm_seg0, VMEM_SPAN, vmem_seg::vs_end, vmem_seg::vs_knext, vmem_seg::vs_start, and vmem_seg::vs_type.
Referenced by _vmem_extend_alloc(), and vmem_add().
vmem_t* vmem_create | ( | const char * | name, | |
void * | base, | |||
size_t | size, | |||
size_t | quantum, | |||
vmem_alloc_t * | afunc, | |||
vmem_free_t * | ffunc, | |||
vmem_t * | source, | |||
size_t | qcache_max, | |||
int | vmflag | |||
) |
References ASSERT, atomic_add_32_nv, cond_init, highbit(), MIN, mutex_init, mutex_lock, mutex_unlock, UMC_NOTOUCH, UMC_QCACHE, umem_cache_create(), vmem_kstat::vk_source_id, vmem::vm_cflags, vmem::vm_cv, vmem::vm_freelist, vmem::vm_hash0, vmem::vm_hash_mask, vmem::vm_hash_shift, vmem::vm_hash_table, vmem::vm_id, vmem::vm_kstat, vmem::vm_lock, vmem::vm_name, vmem::vm_next, VM_PANIC, vmem::vm_qcache, vmem::vm_qcache_max, vmem::vm_qshift, vmem::vm_quantum, vmem::vm_rotor, vmem::vm_seg0, vmem::vm_source, vmem::vm_source_alloc, vmem::vm_source_free, VM_UMFLAGS, VMC_POPULATOR, vmem_add(), vmem_alloc(), vmem_destroy(), VMEM_FREELISTS, VMEM_HASH_INITIAL, VMEM_INITIAL, VMEM_INSERT, VMEM_NAMELEN, VMEM_NQCACHE_MAX, VMEM_ROTOR, VMEM_SPAN, vmem_seg::vs_anext, vmem_seg::vs_aprev, vmem_freelist::vs_end, vmem_seg::vs_knext, vmem_freelist::vs_knext, vmem_seg::vs_kprev, vmem_freelist::vs_kprev, and vmem_seg::vs_type.
Referenced by umem_init(), and vmem_init().
void vmem_destroy | ( | vmem_t * | vmp | ) |
References cond_destroy, mutex_destroy, mutex_lock, mutex_unlock, umem_cache_destroy(), umem_printf(), vmem::vm_cv, vmem::vm_hash0, vmem::vm_hash_mask, vmem::vm_hash_table, vmem::vm_lock, vmem::vm_name, vmem::vm_next, vmem::vm_nsegfree, vmem::vm_qcache, vmem::vm_rotor, vmem::vm_seg0, VMEM_ALLOC, VMEM_DELETE, vmem_free(), VMEM_NQCACHE_MAX, vmem_size(), and vmem_seg::vs_anext.
Referenced by vmem_create().
void vmem_free | ( | vmem_t * | vmp, | |
void * | vaddr, | |||
size_t | size | |||
) |
References _umem_cache_free(), vmem::vm_qcache, vmem::vm_qcache_max, vmem::vm_qshift, and vmem_xfree().
Referenced by _umem_free(), umem_cache_destroy(), umem_init(), vmem_destroy(), vmem_init(), vmem_mmap_arena(), and vmem_sbrk_arena().
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 | |||
) |
References ASSERT, VM_BESTFIT, VM_PANIC, VM_SLEEP, VMC_POPULATOR, vmem_alloc(), vmem_create(), vmem_free(), vmem_heap_alloc, vmem_heap_free, VMEM_SEG_INITIAL, and vmem_xalloc().
Referenced by vmem_mmap_arena(), and vmem_sbrk_arena().
void vmem_lockup | ( | void | ) |
References cond_broadcast, mutex_lock, vmem::vm_cv, vmem::vm_lock, vmem::vm_next, and vmem_populate_lock::vmpl_mutex.
void vmem_no_debug | ( | void | ) |
void vmem_reap | ( | void | ) |
void vmem_release | ( | void | ) |
References mutex_unlock, vmem::vm_lock, vmem::vm_next, and vmem_populate_lock::vmpl_mutex.
size_t vmem_size | ( | vmem_t * | vmp, | |
int | typemask | |||
) |
References vmem_kstat::vk_mem_inuse, vmem_kstat::vk_mem_total, vmem::vm_kstat, VMEM_ALLOC, and VMEM_FREE.
Referenced by vmem_destroy().
void vmem_startup | ( | void | ) |
void vmem_update | ( | void * | dummy | ) |
References cond_broadcast, mutex_lock, mutex_unlock, vmem::vm_cv, and vmem::vm_next.
void vmem_walk | ( | vmem_t * | vmp, | |
int | typemask, | |||
void(*)(void *, void *, size_t) | func, | |||
void * | arg | |||
) |
References mutex_lock, mutex_unlock, vmem::vm_lock, vmem::vm_seg0, VMEM_INSERT, VMEM_REENTRANT, VMEM_WALKER, vmem_seg::vs_anext, VS_SIZE, vmem_seg::vs_start, and vmem_seg::vs_type.
void* vmem_xalloc | ( | vmem_t * | vmp, | |
size_t | size, | |||
size_t | align, | |||
size_t | phase, | |||
size_t | nocross, | |||
void * | minaddr, | |||
void * | maxaddr, | |||
int | vmflag | |||
) |
References _cond_wait, ASSERT, highbit(), lowbit(), MAX, MIN, mutex_lock, mutex_unlock, P2ALIGN, P2CROSS, P2NPHASE, P2PHASE, P2PHASEUP, P2ROUNDUP, umem_panic(), VM_BESTFIT, VM_FIRSTFIT, VM_PANIC, VM_UMFLAGS, VMEM_FREE, VMEM_FREELISTS, VMEM_MINFREE, vmem_mtbf, vmem_reap(), VMEM_SEGS_PER_ALLOC_MAX, VMEM_SEGS_PER_EXACT_ALLOC, VMEM_SEGS_PER_SPAN_CREATE, vmem_seg::vs_end, vmem_seg::vs_knext, VS_SIZE, vmem_seg::vs_start, and vmem_seg::vs_type.
Referenced by _umem_alloc_align(), memalign(), umem_cache_create(), vmem_alloc(), and vmem_init().
void vmem_xfree | ( | vmem_t * | vmp, | |
void * | vaddr, | |||
size_t | size | |||
) |
References ASSERT, mutex_lock, mutex_unlock, P2ROUNDUP, vmem::vm_lock, vmem::vm_quantum, vmem::vm_source, vmem::vm_source_free, VMEM_FREE, VMEM_SPAN, vmem_seg::vs_anext, vmem_seg::vs_aprev, vmem_seg::vs_end, vmem_seg::vs_import, VS_SIZE, vmem_seg::vs_start, and vmem_seg::vs_type.
Referenced by _umem_free_align(), umem_cache_create(), and vmem_free().
Referenced by vmem_heap_arena().
Referenced by vmem_heap_arena(), vmem_init(), and vmem_startup().
Referenced by vmem_heap_arena(), vmem_init(), and vmem_startup().
uint32_t vmem_mtbf |
Referenced by vmem_alloc(), and vmem_xalloc().
size_t vmem_seg_size = sizeof (vmem_seg_t) |
Referenced by vmem_no_debug().