Module Name: src
Committed By: christos
Date: Tue Nov 14 15:02:06 UTC 2017
Modified Files:
src/sys/kern: subr_pool.c
Log Message:
- fix an assert; we can reach there if we are nowait or limitfail.
- when priming the pool and failing with ERESTART, don't decrement the number
of pages; this avoids the issue of returning an ERESTART when we get to 0,
and is more correct.
- simplify the pool_grow code, and don't wakeup things if we ENOMEM.
To generate a diff of this commit:
cvs rdiff -u -r1.215 -r1.216 src/sys/kern/subr_pool.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_pool.c
diff -u src/sys/kern/subr_pool.c:1.215 src/sys/kern/subr_pool.c:1.216
--- src/sys/kern/subr_pool.c:1.215 Thu Nov 9 17:52:26 2017
+++ src/sys/kern/subr_pool.c Tue Nov 14 10:02:06 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_pool.c,v 1.215 2017/11/09 22:52:26 christos Exp $ */
+/* $NetBSD: subr_pool.c,v 1.216 2017/11/14 15:02:06 christos Exp $ */
/*-
* Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.215 2017/11/09 22:52:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.216 2017/11/14 15:02:06 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -809,7 +809,7 @@ pool_get(struct pool *pp, int flags)
pp->pr_nfail++;
mutex_exit(&pp->pr_lock);
- KASSERT((flags & (PR_WAITOK|PR_NOWAIT)) == PR_NOWAIT);
+ KASSERT((flags & (PR_NOWAIT|PR_LIMITFAIL)) != 0);
return (NULL);
}
@@ -1062,10 +1062,6 @@ pool_put(struct pool *pp, void *v)
static int
pool_grow(struct pool *pp, int flags)
{
- struct pool_item_header *ph = NULL;
- char *cp;
- int error;
-
/*
* If there's a pool_grow in progress, wait for it to complete
* and try again from the top.
@@ -1083,34 +1079,32 @@ pool_grow(struct pool *pp, int flags)
pp->pr_flags |= PR_GROWING;
mutex_exit(&pp->pr_lock);
- cp = pool_allocator_alloc(pp, flags);
- if (__predict_true(cp != NULL)) {
- ph = pool_alloc_item_header(pp, cp, flags);
- }
- if (__predict_false(cp == NULL || ph == NULL)) {
- if (cp != NULL) {
- pool_allocator_free(pp, cp);
- }
- mutex_enter(&pp->pr_lock);
- error = ENOMEM;
+ char *cp = pool_allocator_alloc(pp, flags);
+ if (__predict_false(cp == NULL))
+ goto out;
+
+ struct pool_item_header *ph = pool_alloc_item_header(pp, cp, flags);
+ if (__predict_false(ph == NULL)) {
+ pool_allocator_free(pp, cp);
goto out;
}
mutex_enter(&pp->pr_lock);
pool_prime_page(pp, cp, ph);
pp->pr_npagealloc++;
- error = 0;
-
-out:
+ KASSERT(pp->pr_flags & PR_GROWING);
+ pp->pr_flags &= ~PR_GROWING;
/*
* If anyone was waiting for pool_grow, notify them that we
* may have just done it.
*/
+ cv_broadcast(&pp->pr_cv);
+ return 0;
+out:
KASSERT(pp->pr_flags & PR_GROWING);
pp->pr_flags &= ~PR_GROWING;
- cv_broadcast(&pp->pr_cv);
-
- return error;
+ mutex_enter(&pp->pr_lock);
+ return ENOMEM;
}
/*
@@ -1126,7 +1120,7 @@ pool_prime(struct pool *pp, int n)
newpages = roundup(n, pp->pr_itemsperpage) / pp->pr_itemsperpage;
- while (newpages-- > 0) {
+ while (newpages > 0) {
error = pool_grow(pp, PR_NOWAIT);
if (error) {
if (error == ERESTART)
@@ -1134,6 +1128,7 @@ pool_prime(struct pool *pp, int n)
break;
}
pp->pr_minpages++;
+ newpages--;
}
if (pp->pr_minpages >= pp->pr_maxpages)