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);