Index: sys/kern/subr_pool.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_pool.c,v
retrieving revision 1.178
diff -u -r1.178 subr_pool.c
--- sys/kern/subr_pool.c	30 Dec 2009 18:57:17 -0000	1.178
+++ sys/kern/subr_pool.c	2 Jan 2010 15:10:53 -0000
@@ -234,16 +234,28 @@
 static inline void
 pr_log(struct pool *pp, void *v, int action, const char *file, long line)
 {
-	int n = pp->pr_curlogentry;
+	int n;
 	struct pool_log *pl;
 
 	if ((pp->pr_roflags & PR_LOGGING) == 0)
 		return;
 
+	if (pp->pr_log == NULL) {
+		if (kmem_map != NULL)
+			pp->pr_log = malloc(
+				pool_logsize * sizeof(struct pool_log),
+				M_TEMP, M_NOWAIT | M_ZERO);
+		if (pp->pr_log == NULL)
+			return;
+		pp->pr_curlogentry = 0;
+		pp->pr_logsize = pool_logsize;
+	}
+
 	/*
 	 * Fill in the current entry. Wrap around and overwrite
 	 * the oldest entry if necessary.
 	 */
+	n = pp->pr_curlogentry;
 	pl = &pp->pr_log[n];
 	pl->pl_file = file;
 	pl->pl_line = line;
@@ -261,7 +273,7 @@
 	int i = pp->pr_logsize;
 	int n = pp->pr_curlogentry;
 
-	if ((pp->pr_roflags & PR_LOGGING) == 0)
+	if (pp->pr_log == NULL)
 		return;
 
 	/*
@@ -593,6 +605,7 @@
 	struct pool_allocator *pa;
 
 	mutex_init(&pool_head_lock, MUTEX_DEFAULT, IPL_NONE);
+	mutex_init(&pool_allocator_lock, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&pool_busy, "poolbusy");
 
 	while ((pa = SLIST_FIRST(&pa_deferinitq)) != NULL) {
@@ -607,8 +620,6 @@
 
 	pool_init(&cache_cpu_pool, sizeof(pool_cache_cpu_t), coherency_unit,
 	    0, 0, "pcachecpu", &pool_allocator_nointr, IPL_NONE);
-
-	mutex_init(&pool_allocator_lock, MUTEX_DEFAULT, IPL_NONE);
 }
 
 /*
@@ -793,16 +804,7 @@
 	pp->pr_nidle = 0;
 	pp->pr_refcnt = 0;
 
-#ifdef POOL_DIAGNOSTIC
-	if (flags & PR_LOGGING) {
-		if (kmem_map == NULL ||
-		    (pp->pr_log = malloc(pool_logsize * sizeof(struct pool_log),
-		     M_TEMP, M_NOWAIT)) == NULL)
-			pp->pr_roflags &= ~PR_LOGGING;
-		pp->pr_curlogentry = 0;
-		pp->pr_logsize = pool_logsize;
-	}
-#endif
+	pp->pr_log = NULL;
 
 	pp->pr_entered_file = NULL;
 	pp->pr_entered_line = 0;
@@ -928,8 +930,10 @@
 	pr_pagelist_free(pp, &pq);
 
 #ifdef POOL_DIAGNOSTIC
-	if ((pp->pr_roflags & PR_LOGGING) != 0)
+	if (pp->pr_log != NULL) {
 		free(pp->pr_log, M_TEMP);
+		pp->pr_log = NULL;
+	}
 #endif
 
 	cv_destroy(&pp->pr_cv);
