implement kva reclamation for kmem_alloc quantum cache.

This commit is contained in:
yamt 2006-08-20 09:45:59 +00:00
parent fc12b34a0a
commit 0406a06106
3 changed files with 61 additions and 5 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_kmem.c,v 1.5 2006/08/20 09:44:06 yamt Exp $ */
/* $NetBSD: subr_kmem.c,v 1.6 2006/08/20 09:45:59 yamt Exp $ */
/*-
* Copyright (c)2006 YAMAMOTO Takashi,
@ -34,17 +34,22 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,v 1.5 2006/08/20 09:44:06 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,v 1.6 2006/08/20 09:45:59 yamt Exp $");
#include <sys/param.h>
#include <sys/callback.h>
#include <sys/kmem.h>
#include <sys/vmem.h>
#include <uvm/uvm_extern.h>
#include <uvm/uvm_map.h>
#include <lib/libkern/libkern.h>
#define KMEM_QUANTUM_SIZE (ALIGNBYTES + 1)
static vmem_t *kmem_arena;
static struct callback_entry kmem_kva_reclaim_entry;
#if defined(DEBUG)
static void kmem_poison_fill(void *, size_t);
@ -57,6 +62,7 @@ static void kmem_poison_check(void *, size_t);
static vmem_addr_t kmem_backend_alloc(vmem_t *, vmem_size_t, vmem_size_t *,
vm_flag_t);
static void kmem_backend_free(vmem_t *, vmem_addr_t, vmem_size_t);
static int kmem_kva_reclaim_callback(struct callback_entry *, void *, void *);
static inline vm_flag_t
kmf_to_vmf(km_flag_t kmflags)
@ -135,6 +141,8 @@ kmem_init(void)
kmem_arena = vmem_create("kmem", 0, 0, KMEM_QUANTUM_SIZE,
kmem_backend_alloc, kmem_backend_free, NULL,
KMEM_QUANTUM_SIZE * 32, VM_SLEEP);
callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
&kmem_kva_reclaim_entry, kmem_arena, kmem_kva_reclaim_callback);
}
size_t
@ -236,4 +244,13 @@ kmem_poison_check(void *p, size_t sz)
}
}
static int
kmem_kva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)
{
vmem_t *vm = obj;
vmem_reap(vm);
return CALLBACK_CHAIN_CONTINUE;
}
#endif /* defined(DEBUG) */

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_vmem.c,v 1.5 2006/08/20 09:43:08 yamt Exp $ */
/* $NetBSD: subr_vmem.c,v 1.6 2006/08/20 09:45:59 yamt Exp $ */
/*-
* Copyright (c)2006 YAMAMOTO Takashi,
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.5 2006/08/20 09:43:08 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.6 2006/08/20 09:45:59 yamt Exp $");
#define VMEM_DEBUG
#if defined(_KERNEL)
@ -487,6 +487,25 @@ qc_init(vmem_t *vm, size_t qcache_max)
pool_cache_init(&qc->qc_cache, &qc->qc_pool, NULL, NULL, NULL);
}
}
static boolean_t
qc_reap(vmem_t *vm)
{
int i;
int qcache_idx_max;
boolean_t didsomething = FALSE;
qcache_idx_max = vm->vm_qcache_max >> vm->vm_quantum_shift;
for (i = 1; i <= qcache_idx_max; i++) {
qcache_t *qc = &vm->vm_qcache[i - 1];
if (pool_reclaim(&qc->qc_pool) != 0) {
didsomething = TRUE;
}
}
return didsomething;
}
#endif /* defined(QCACHE) */
#if defined(_KERNEL)
@ -901,6 +920,25 @@ vmem_add(vmem_t *vm, vmem_addr_t addr, vmem_size_t size, vm_flag_t flags)
return vmem_add1(vm, addr, size, flags, BT_TYPE_SPAN_STATIC);
}
/*
* vmem_reap: reap unused resources.
*
* => return TRUE if we successfully reaped something.
*/
boolean_t
vmem_reap(vmem_t *vm)
{
boolean_t didsomething = FALSE;
VMEM_ASSERT_UNLOCKED(vm);
#if defined(QCACHE)
didsomething = qc_reap(vm);
#endif /* defined(QCACHE) */
return didsomething;
}
/* ---- debug */
#if defined(VMEM_DEBUG)

View File

@ -1,4 +1,4 @@
/* $NetBSD: vmem.h,v 1.1 2006/06/25 08:00:01 yamt Exp $ */
/* $NetBSD: vmem.h,v 1.2 2006/08/20 09:45:59 yamt Exp $ */
/*-
* Copyright (c)2006 YAMAMOTO Takashi,
@ -48,6 +48,7 @@ vmem_addr_t vmem_alloc(vmem_t *, vmem_size_t, vm_flag_t);
void vmem_free(vmem_t *, vmem_addr_t, vmem_size_t);
vmem_addr_t vmem_add(vmem_t *, vmem_addr_t, vmem_size_t, vm_flag_t);
vmem_size_t vmem_roundup_size(vmem_t *, vmem_size_t);
boolean_t vmem_reap(vmem_t *);
/* vm_flag_t */
#define VM_SLEEP 0x00000001