summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_pool.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_pool.c')
-rw-r--r--sys/kern/subr_pool.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/sys/kern/subr_pool.c b/sys/kern/subr_pool.c
index 4837ba927fc..fbe077a5d61 100644
--- a/sys/kern/subr_pool.c
+++ b/sys/kern/subr_pool.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_pool.c,v 1.223 2018/06/08 15:38:15 guenther Exp $ */
+/* $OpenBSD: subr_pool.c,v 1.224 2019/02/10 20:02:37 tedu Exp $ */
/* $NetBSD: subr_pool.c,v 1.61 2001/09/26 07:14:56 chs Exp $ */
/*-
@@ -155,6 +155,7 @@ struct pool_page_header {
caddr_t ph_colored; /* page's colored address */
unsigned long ph_magic;
int ph_tick;
+ int ph_flags;
};
#define POOL_MAGICBIT (1 << 3) /* keep away from perturbed low bits */
#define POOL_PHPOISON(ph) ISSET((ph)->ph_magic, POOL_MAGICBIT)
@@ -225,13 +226,13 @@ void pool_get_done(struct pool *, void *, void *);
void pool_runqueue(struct pool *, int);
void *pool_allocator_alloc(struct pool *, int, int *);
-void pool_allocator_free(struct pool *, void *);
+void pool_allocator_free(struct pool *, int, void *);
/*
* The default pool allocator.
*/
void *pool_page_alloc(struct pool *, int, int *);
-void pool_page_free(struct pool *, void *);
+void pool_page_free(struct pool *, int, void *);
/*
* safe for interrupts; this is the default allocator
@@ -243,7 +244,7 @@ struct pool_allocator pool_allocator_single = {
};
void *pool_multi_alloc(struct pool *, int, int *);
-void pool_multi_free(struct pool *, void *);
+void pool_multi_free(struct pool *, int, void *);
struct pool_allocator pool_allocator_multi = {
pool_multi_alloc,
@@ -252,7 +253,7 @@ struct pool_allocator pool_allocator_multi = {
};
void *pool_multi_alloc_ni(struct pool *, int, int *);
-void pool_multi_free_ni(struct pool *, void *);
+void pool_multi_free_ni(struct pool *, int, void *);
struct pool_allocator pool_allocator_multi_ni = {
pool_multi_alloc_ni,
@@ -787,7 +788,6 @@ pool_do_get(struct pool *pp, int flags, int *slowdown)
void
pool_put(struct pool *pp, void *v)
{
- struct pool_page_header *ph, *freeph = NULL;
#ifdef DIAGNOSTIC
if (v == NULL)
@@ -808,19 +808,8 @@ pool_put(struct pool *pp, void *v)
pp->pr_nout--;
pp->pr_nput++;
- /* is it time to free a page? */
- if (pp->pr_nidle > pp->pr_maxpages &&
- (ph = TAILQ_FIRST(&pp->pr_emptypages)) != NULL &&
- (ticks - ph->ph_tick) > (hz * pool_wait_free)) {
- freeph = ph;
- pool_p_remove(pp, freeph);
- }
-
pl_leave(pp, &pp->pr_lock);
- if (freeph != NULL)
- pool_p_free(pp, freeph);
-
if (!TAILQ_EMPTY(&pp->pr_requests)) {
pl_enter(pp, &pp->pr_requests_lock);
pool_runqueue(pp, PR_NOWAIT);
@@ -933,10 +922,11 @@ pool_p_alloc(struct pool *pp, int flags, int *slowdown)
else {
ph = pool_get(&phpool, flags);
if (ph == NULL) {
- pool_allocator_free(pp, addr);
+ pool_allocator_free(pp, flags, addr);
return (NULL);
}
}
+ ph->ph_flags = flags;
XSIMPLEQ_INIT(&ph->ph_items);
ph->ph_page = addr;
@@ -1010,7 +1000,7 @@ pool_p_free(struct pool *pp, struct pool_page_header *ph)
#endif
}
- pool_allocator_free(pp, ph->ph_page);
+ pool_allocator_free(pp, ph->ph_flags, ph->ph_page);
if (!POOL_INPGHDR(pp))
pool_put(&phpool, ph);
@@ -1616,11 +1606,11 @@ pool_allocator_alloc(struct pool *pp, int flags, int *slowdown)
}
void
-pool_allocator_free(struct pool *pp, void *v)
+pool_allocator_free(struct pool *pp, int flags, void *v)
{
struct pool_allocator *pa = pp->pr_alloc;
- (*pa->pa_free)(pp, v);
+ (*pa->pa_free)(pp, flags, v);
}
void *
@@ -1635,7 +1625,7 @@ pool_page_alloc(struct pool *pp, int flags, int *slowdown)
}
void
-pool_page_free(struct pool *pp, void *v)
+pool_page_free(struct pool *pp, int flags, void *v)
{
km_free(v, pp->pr_pgsize, &kv_page, pp->pr_crange);
}
@@ -1662,7 +1652,7 @@ pool_multi_alloc(struct pool *pp, int flags, int *slowdown)
}
void
-pool_multi_free(struct pool *pp, void *v)
+pool_multi_free(struct pool *pp, int flags, void *v)
{
struct kmem_va_mode kv = kv_intrsafe;
int s;
@@ -1696,7 +1686,7 @@ pool_multi_alloc_ni(struct pool *pp, int flags, int *slowdown)
}
void
-pool_multi_free_ni(struct pool *pp, void *v)
+pool_multi_free_ni(struct pool *pp, int flags, void *v)
{
struct kmem_va_mode kv = kv_any;