implement kva reclamation for kmem_alloc quantum cache.
This commit is contained in:
parent
fc12b34a0a
commit
0406a06106
|
@ -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) */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue