Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/subr_vmem.c
Show First 20 Lines • Show All 515 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
bt_insseg_tail(vmem_t *vm, bt_t *bt) | bt_insseg_tail(vmem_t *vm, bt_t *bt) | ||||
{ | { | ||||
TAILQ_INSERT_TAIL(&vm->vm_seglist, bt, bt_seglist); | TAILQ_INSERT_TAIL(&vm->vm_seglist, bt, bt_seglist); | ||||
} | } | ||||
static void | static void | ||||
bt_remfree(vmem_t *vm, bt_t *bt) | bt_remfree(vmem_t *vm __unused, bt_t *bt) | ||||
{ | { | ||||
MPASS(bt->bt_type == BT_TYPE_FREE); | MPASS(bt->bt_type == BT_TYPE_FREE); | ||||
LIST_REMOVE(bt, bt_freelist); | LIST_REMOVE(bt, bt_freelist); | ||||
} | } | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 196 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
/* ---- rehash */ | /* ---- rehash */ | ||||
static int | static int | ||||
vmem_rehash(vmem_t *vm, vmem_size_t newhashsize) | vmem_rehash(vmem_t *vm, vmem_size_t newhashsize) | ||||
{ | { | ||||
bt_t *bt; | bt_t *bt; | ||||
int i; | |||||
struct vmem_hashlist *newhashlist; | struct vmem_hashlist *newhashlist; | ||||
struct vmem_hashlist *oldhashlist; | struct vmem_hashlist *oldhashlist; | ||||
vmem_size_t oldhashsize; | vmem_size_t i, oldhashsize; | ||||
MPASS(newhashsize > 0); | MPASS(newhashsize > 0); | ||||
newhashlist = malloc(sizeof(struct vmem_hashlist) * newhashsize, | newhashlist = malloc(sizeof(struct vmem_hashlist) * newhashsize, | ||||
M_VMEM, M_NOWAIT); | M_VMEM, M_NOWAIT); | ||||
if (newhashlist == NULL) | if (newhashlist == NULL) | ||||
return ENOMEM; | return ENOMEM; | ||||
for (i = 0; i < newhashsize; i++) { | for (i = 0; i < newhashsize; i++) { | ||||
Show All 12 Lines | vmem_rehash(vmem_t *vm, vmem_size_t newhashsize) | ||||
for (i = 0; i < oldhashsize; i++) { | for (i = 0; i < oldhashsize; i++) { | ||||
while ((bt = LIST_FIRST(&oldhashlist[i])) != NULL) { | while ((bt = LIST_FIRST(&oldhashlist[i])) != NULL) { | ||||
bt_rembusy(vm, bt); | bt_rembusy(vm, bt); | ||||
bt_insbusy(vm, bt); | bt_insbusy(vm, bt); | ||||
} | } | ||||
} | } | ||||
VMEM_UNLOCK(vm); | VMEM_UNLOCK(vm); | ||||
if (oldhashlist != vm->vm_hash0) { | if (oldhashlist != vm->vm_hash0) | ||||
free(oldhashlist, M_VMEM); | free(oldhashlist, M_VMEM); | ||||
} | |||||
return 0; | return 0; | ||||
} | } | ||||
static void | static void | ||||
vmem_periodic_kick(void *dummy) | vmem_periodic_kick(void *dummy) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 457 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* vmem_init: Initializes vmem arena. | * vmem_init: Initializes vmem arena. | ||||
*/ | */ | ||||
vmem_t * | vmem_t * | ||||
vmem_init(vmem_t *vm, const char *name, vmem_addr_t base, vmem_size_t size, | vmem_init(vmem_t *vm, const char *name, vmem_addr_t base, vmem_size_t size, | ||||
vmem_size_t quantum, vmem_size_t qcache_max, int flags) | vmem_size_t quantum, vmem_size_t qcache_max, int flags) | ||||
{ | { | ||||
int i; | vmem_size_t i; | ||||
MPASS(quantum > 0); | MPASS(quantum > 0); | ||||
MPASS((quantum & (quantum - 1)) == 0); | MPASS((quantum & (quantum - 1)) == 0); | ||||
bzero(vm, sizeof(*vm)); | bzero(vm, sizeof(*vm)); | ||||
VMEM_CONDVAR_INIT(vm, name); | VMEM_CONDVAR_INIT(vm, name); | ||||
VMEM_LOCK_INIT(vm, name); | VMEM_LOCK_INIT(vm, name); | ||||
▲ Show 20 Lines • Show All 224 Lines • ▼ Show 20 Lines | if (size <= vm->vm_qcache_max && | ||||
__predict_true(addr >= VMEM_ADDR_QCACHE_MIN)) { | __predict_true(addr >= VMEM_ADDR_QCACHE_MIN)) { | ||||
qc = &vm->vm_qcache[(size - 1) >> vm->vm_quantum_shift]; | qc = &vm->vm_qcache[(size - 1) >> vm->vm_quantum_shift]; | ||||
uma_zfree(qc->qc_cache, (void *)addr); | uma_zfree(qc->qc_cache, (void *)addr); | ||||
} else | } else | ||||
vmem_xfree(vm, addr, size); | vmem_xfree(vm, addr, size); | ||||
} | } | ||||
void | void | ||||
vmem_xfree(vmem_t *vm, vmem_addr_t addr, vmem_size_t size) | vmem_xfree(vmem_t *vm, vmem_addr_t addr, vmem_size_t size __unused) | ||||
{ | { | ||||
bt_t *bt; | bt_t *bt; | ||||
bt_t *t; | bt_t *t; | ||||
MPASS(size > 0); | MPASS(size > 0); | ||||
VMEM_LOCK(vm); | VMEM_LOCK(vm); | ||||
bt = bt_lookupbusy(vm, addr); | bt = bt_lookupbusy(vm, addr); | ||||
▲ Show 20 Lines • Show All 336 Lines • Show Last 20 Lines |