Module Name: src
Committed By: rmind
Date: Sun Oct 2 21:32:48 UTC 2011
Modified Files:
src/sys/kern: subr_vmem.c
Log Message:
- Replace calc_order() with ilog2(), wrap into SIZE2ORDER().
- Inline some functions, reduce some #ifdefs.
To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/kern/subr_vmem.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_vmem.c
diff -u src/sys/kern/subr_vmem.c:1.61 src/sys/kern/subr_vmem.c:1.62
--- src/sys/kern/subr_vmem.c:1.61 Fri Sep 2 22:25:08 2011
+++ src/sys/kern/subr_vmem.c Sun Oct 2 21:32:48 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_vmem.c,v 1.61 2011/09/02 22:25:08 dyoung Exp $ */
+/* $NetBSD: subr_vmem.c,v 1.62 2011/10/02 21:32:48 rmind Exp $ */
/*-
* Copyright (c)2006,2007,2008,2009 YAMAMOTO Takashi,
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.61 2011/09/02 22:25:08 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.62 2011/10/02 21:32:48 rmind Exp $");
#if defined(_KERNEL)
#include "opt_ddb.h"
@@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,
#include <sys/param.h>
#include <sys/hash.h>
#include <sys/queue.h>
+#include <sys/bitops.h>
#if defined(_KERNEL)
#include <sys/systm.h>
@@ -180,90 +181,54 @@ typedef struct vmem_btag bt_t;
#define VMEM_ALIGNUP(addr, align) \
(-(-(addr) & -(align)))
+
#define VMEM_CROSS_P(addr1, addr2, boundary) \
((((addr1) ^ (addr2)) & -(boundary)) != 0)
#define ORDER2SIZE(order) ((vmem_size_t)1 << (order))
+#define SIZE2ORDER(size) ((int)ilog2(size))
-static int
-calc_order(vmem_size_t size)
-{
- vmem_size_t target;
- int i;
-
- KASSERT(size != 0);
-
- i = 0;
- target = size >> 1;
- while (ORDER2SIZE(i) <= target) {
- i++;
- }
-
- KASSERT(ORDER2SIZE(i) <= size);
- KASSERT(size < ORDER2SIZE(i + 1) || ORDER2SIZE(i + 1) < ORDER2SIZE(i));
-
- return i;
-}
+#if !defined(_KERNEL)
+#define xmalloc(sz, flags) malloc(sz)
+#define xfree(p) free(p)
+#define bt_alloc(vm, flags) malloc(sizeof(bt_t))
+#define bt_free(vm, bt) free(bt)
+#else /* !defined(_KERNEL) */
-#if defined(_KERNEL)
static MALLOC_DEFINE(M_VMEM, "vmem", "vmem");
-#endif /* defined(_KERNEL) */
-static void *
+static inline void *
xmalloc(size_t sz, vm_flag_t flags)
{
-
-#if defined(_KERNEL)
return malloc(sz, M_VMEM,
M_CANFAIL | ((flags & VM_SLEEP) ? M_WAITOK : M_NOWAIT));
-#else /* defined(_KERNEL) */
- return malloc(sz);
-#endif /* defined(_KERNEL) */
}
-static void
+static inline void
xfree(void *p)
{
-
-#if defined(_KERNEL)
return free(p, M_VMEM);
-#else /* defined(_KERNEL) */
- return free(p);
-#endif /* defined(_KERNEL) */
}
/* ---- boundary tag */
-#if defined(_KERNEL)
static struct pool_cache bt_cache;
-#endif /* defined(_KERNEL) */
-static bt_t *
+static inline bt_t *
bt_alloc(vmem_t *vm, vm_flag_t flags)
{
- bt_t *bt;
-
-#if defined(_KERNEL)
- bt = pool_cache_get(&bt_cache,
- (flags & VM_SLEEP) != 0 ? PR_WAITOK : PR_NOWAIT);
-#else /* defined(_KERNEL) */
- bt = malloc(sizeof *bt);
-#endif /* defined(_KERNEL) */
-
- return bt;
+ return pool_cache_get(&bt_cache,
+ (flags & VM_SLEEP) ? PR_WAITOK : PR_NOWAIT);
}
-static void
+static inline void
bt_free(vmem_t *vm, bt_t *bt)
{
-
-#if defined(_KERNEL)
pool_cache_put(&bt_cache, bt);
-#else /* defined(_KERNEL) */
- free(bt);
-#endif /* defined(_KERNEL) */
}
+#endif /* !defined(_KERNEL) */
+
/*
* freelist[0] ... [1, 1]
* freelist[1] ... [2, 3]
@@ -278,12 +243,10 @@ static struct vmem_freelist *
bt_freehead_tofree(vmem_t *vm, vmem_size_t size)
{
const vmem_size_t qsize = size >> vm->vm_quantum_shift;
- int idx;
+ const int idx = SIZE2ORDER(qsize);
+ KASSERT(size != 0 && qsize != 0);
KASSERT((size & vm->vm_quantum_mask) == 0);
- KASSERT(size != 0);
-
- idx = calc_order(qsize);
KASSERT(idx >= 0);
KASSERT(idx < VMEM_MAXORDER);
@@ -303,12 +266,11 @@ static struct vmem_freelist *
bt_freehead_toalloc(vmem_t *vm, vmem_size_t size, vm_flag_t strat)
{
const vmem_size_t qsize = size >> vm->vm_quantum_shift;
- int idx;
+ int idx = SIZE2ORDER(qsize);
+ KASSERT(size != 0 && qsize != 0);
KASSERT((size & vm->vm_quantum_mask) == 0);
- KASSERT(size != 0);
- idx = calc_order(qsize);
if (strat == VM_INSTANTFIT && ORDER2SIZE(idx) != qsize) {
idx++;
/* check too large request? */
@@ -794,6 +756,7 @@ vmem_create(const char *name, vmem_addr_
KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+ KASSERT(quantum > 0);
#if defined(_KERNEL)
if (RUN_ONCE(&control, vmem_init)) {
@@ -808,7 +771,7 @@ vmem_create(const char *name, vmem_addr_
VMEM_LOCK_INIT(vm, ipl);
vm->vm_name = name;
vm->vm_quantum_mask = quantum - 1;
- vm->vm_quantum_shift = calc_order(quantum);
+ vm->vm_quantum_shift = SIZE2ORDER(quantum);
KASSERT(ORDER2SIZE(vm->vm_quantum_shift) == quantum);
vm->vm_importfn = importfn;
vm->vm_releasefn = releasefn;