Module Name:    src
Committed By:   para
Date:           Sat Jan 28 18:02:56 UTC 2012

Modified Files:
        src/sys/kern: vfs_wapbl.c

Log Message:
replacing malloc(9) with kmem(9)
wapbl_entries get there own pool, they are freed from softint context

ok: rmind@


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/sys/kern/vfs_wapbl.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/vfs_wapbl.c
diff -u src/sys/kern/vfs_wapbl.c:1.50 src/sys/kern/vfs_wapbl.c:1.51
--- src/sys/kern/vfs_wapbl.c:1.50	Fri Jan 27 19:48:40 2012
+++ src/sys/kern/vfs_wapbl.c	Sat Jan 28 18:02:56 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_wapbl.c,v 1.50 2012/01/27 19:48:40 para Exp $	*/
+/*	$NetBSD: vfs_wapbl.c,v 1.51 2012/01/28 18:02:56 para Exp $	*/
 
 /*-
  * Copyright (c) 2003, 2008, 2009 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #define WAPBL_INTERNAL
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.50 2012/01/27 19:48:40 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.51 2012/01/28 18:02:56 para Exp $");
 
 #include <sys/param.h>
 #include <sys/bitops.h>
@@ -49,7 +49,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,
 #include <sys/uio.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
-#include <sys/malloc.h>
 #include <sys/module.h>
 #include <sys/resourcevar.h>
 #include <sys/conf.h>
@@ -63,16 +62,9 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,
 
 #include <miscfs/specfs/specdev.h>
 
-#if 0 /* notyet */
-#define	wapbl_malloc(s) kmem_intr_alloc((s), KM_SLEEP)
-#define	wapbl_free(a, s) kmem_intr_free((a), (s))
-#define	wapbl_calloc(n, s) kmem_intr_zalloc((n)*(s), KM_SLEEP)
-#else
-MALLOC_JUSTDEFINE(M_WAPBL, "wapbl", "write-ahead physical block logging");
-#define	wapbl_malloc(s) malloc((s), M_WAPBL, M_WAITOK)
-#define	wapbl_free(a, s) free((a), M_WAPBL)
-#define	wapbl_calloc(n, s) malloc((n)*(s), M_WAPBL, M_WAITOK | M_ZERO)
-#endif
+#define	wapbl_alloc(s) kmem_alloc((s), KM_SLEEP)
+#define	wapbl_free(a, s) kmem_free((a), (s))
+#define	wapbl_calloc(n, s) kmem_zalloc((n)*(s), KM_SLEEP)
 
 static struct sysctllog *wapbl_sysctl;
 static int wapbl_flush_disk_cache = 1;
@@ -92,7 +84,7 @@ static int wapbl_verbose_commit = 0;
 
 #define	KDASSERT(x) assert(x)
 #define	KASSERT(x) assert(x)
-#define	wapbl_malloc(s) malloc(s)
+#define	wapbl_alloc(s) malloc(s)
 #define	wapbl_free(a, s) free(a)
 #define	wapbl_calloc(n, s) calloc((n), (s))
 
@@ -220,6 +212,8 @@ static inline size_t wapbl_space_used(si
 
 #ifdef _KERNEL
 
+static struct pool wapbl_entry_pool;
+
 #define	WAPBL_INODETRK_SIZE 83
 static int wapbl_ino_pool_refcount;
 static struct pool wapbl_ino_pool;
@@ -310,7 +304,10 @@ wapbl_sysctl_init(void)
 static void
 wapbl_init(void)
 {
-	//malloc_type_attach(M_WAPBL);
+
+	pool_init(&wapbl_entry_pool, sizeof(struct wapbl_entry), 0, 0, 0,
+	    "wapblentrypl", &pool_allocator_kmem, IPL_VM);
+
 	wapbl_sysctl_init();
 }
 
@@ -318,8 +315,12 @@ wapbl_init(void)
 static int
 wapbl_fini(bool interface)
 {
+
 	if (aio_sysctl != NULL)
 		 sysctl_teardown(&aio_sysctl);
+
+	pool_destroy(&wapbl_entry_pool);
+
 	return 0;
 }
 #endif
@@ -483,9 +484,9 @@ wapbl_start(struct wapbl ** wlp, struct 
 	/* XXX tie this into resource estimation */
 	wl->wl_dealloclim = wl->wl_bufbytes_max / mp->mnt_stat.f_bsize / 2;
 	
-	wl->wl_deallocblks = wapbl_malloc(sizeof(*wl->wl_deallocblks) *
+	wl->wl_deallocblks = wapbl_alloc(sizeof(*wl->wl_deallocblks) *
 	    wl->wl_dealloclim);
-	wl->wl_dealloclens = wapbl_malloc(sizeof(*wl->wl_dealloclens) *
+	wl->wl_dealloclens = wapbl_alloc(sizeof(*wl->wl_dealloclens) *
 	    wl->wl_dealloclim);
 
 	wapbl_inodetrk_init(wl, WAPBL_INODETRK_SIZE);
@@ -503,7 +504,7 @@ wapbl_start(struct wapbl ** wlp, struct 
 		wc->wc_log_dev_bshift = wl->wl_log_dev_bshift;
 		wc->wc_fs_dev_bshift = wl->wl_fs_dev_bshift;
 		wl->wl_wc_header = wc;
-		wl->wl_wc_scratch = wapbl_malloc(len);
+		wl->wl_wc_scratch = wapbl_alloc(len);
 	}
 
 	/*
@@ -657,7 +658,7 @@ wapbl_discard(struct wapbl *wl)
 #ifdef WAPBL_DEBUG_BUFBYTES
 			KASSERT(we->we_unsynced_bufbytes == 0);
 #endif
-			wapbl_free(we, sizeof(*we));
+			pool_put(&wapbl_entry_pool, we);
 		}
 	}
 
@@ -1239,7 +1240,7 @@ wapbl_biodone(struct buf *bp)
 #ifdef WAPBL_DEBUG_BUFBYTES
 			KASSERT(we->we_unsynced_bufbytes == 0);
 #endif
-			wapbl_free(we, sizeof(*we));
+			pool_put(&wapbl_entry_pool, we);
 		}
 
 		brelse(bp, 0);
@@ -1331,7 +1332,7 @@ wapbl_biodone(struct buf *bp)
 			if (we->we_error)
 				errcnt++;
 			SIMPLEQ_REMOVE_HEAD(&wl->wl_entries, we_entries);
-			wapbl_free(we, sizeof(*we));
+			pool_put(&wapbl_entry_pool, we);
 		}
 
 		if (delta) {
@@ -1472,7 +1473,7 @@ wapbl_flush(struct wapbl *wl, int waitfo
 	if (error)
 		goto out2;
 
-	we = wapbl_calloc(1, sizeof(*we));
+	we = pool_get(&wapbl_entry_pool, PR_WAITOK);
 
 #ifdef WAPBL_DEBUG_BUFBYTES
 	WAPBL_PRINTF(WAPBL_PRINT_FLUSH,
@@ -2093,7 +2094,7 @@ wapbl_write_blocks(struct wapbl *wl, off
 		if (padding) {
 			void *zero;
 			
-			zero = wapbl_malloc(padding);
+			zero = wapbl_alloc(padding);
 			memset(zero, 0, padding);
 			error = wapbl_circ_write(wl, zero, padding, &off);
 			wapbl_free(zero, padding);
@@ -2220,7 +2221,7 @@ wapbl_blkhash_init(struct wapbl_replay *
 		unsigned long i, hashsize;
 		for (hashsize = 1; hashsize < size; hashsize <<= 1)
 			continue;
-		wr->wr_blkhash = wapbl_malloc(hashsize * sizeof(*wr->wr_blkhash));
+		wr->wr_blkhash = wapbl_alloc(hashsize * sizeof(*wr->wr_blkhash));
 		for (i = 0; i < hashsize; i++)
 			LIST_INIT(&wr->wr_blkhash[i]);
 		wr->wr_blkhashmask = hashsize - 1;
@@ -2263,7 +2264,7 @@ wapbl_blkhash_ins(struct wapbl_replay *w
 		KASSERT(wb->wb_blk == blk);
 		wb->wb_off = off;
 	} else {
-		wb = wapbl_malloc(sizeof(*wb));
+		wb = wapbl_alloc(sizeof(*wb));
 		wb->wb_blk = blk;
 		wb->wb_off = off;
 		wbh = &wr->wr_blkhash[blk & wr->wr_blkhashmask];
@@ -2411,7 +2412,7 @@ wapbl_replay_start(struct wapbl_replay *
 	logpbn = off;
 #endif /* ! _KERNEL */
 
-	scratch = wapbl_malloc(MAXBSIZE);
+	scratch = wapbl_alloc(MAXBSIZE);
 
 	pbn = logpbn;
 #ifdef _KERNEL
@@ -2577,7 +2578,7 @@ wapbl_replay_process_inodes(struct wapbl
 	if (wc->wc_inocnt == 0)
 		return;
 
-	new_inodes = wapbl_malloc((wr->wr_inodescnt + wc->wc_inocnt) *
+	new_inodes = wapbl_alloc((wr->wr_inodescnt + wc->wc_inocnt) *
 	    sizeof(wr->wr_inodes[0]));
 	if (wr->wr_inodes != NULL) {
 		memcpy(new_inodes, wr->wr_inodes, oldsize);
@@ -2648,8 +2649,8 @@ wapbl_replay_verify(struct wapbl_replay 
 	int mismatchcnt = 0;
 	int logblklen = 1 << wr->wr_log_dev_bshift;
 	int fsblklen = 1 << wr->wr_fs_dev_bshift;
-	void *scratch1 = wapbl_malloc(MAXBSIZE);
-	void *scratch2 = wapbl_malloc(MAXBSIZE);
+	void *scratch1 = wapbl_alloc(MAXBSIZE);
+	void *scratch2 = wapbl_alloc(MAXBSIZE);
 	int error = 0;
 
 	KDASSERT(wapbl_replay_isopen(wr));
@@ -2772,7 +2773,7 @@ wapbl_replay_write(struct wapbl_replay *
 
 	KDASSERT(wapbl_replay_isopen(wr));
 
-	scratch = wapbl_malloc(MAXBSIZE);
+	scratch = wapbl_alloc(MAXBSIZE);
 
 	for (i = 0; i <= wr->wr_blkhashmask; ++i) {
 		LIST_FOREACH(wb, &wr->wr_blkhash[i], wb_hash) {

Reply via email to