Medium-sized overhaul of POOL_SUBPAGE support so that:

1: I can understand it, and
2: It works.
Notable externally-visible changes are that POOL_SUBPAGE now has to be a
compile-time constant, and that trying to initialise a pool whose objects are
larger than POOL_SUBPAGE automatically generates a pool that doesn't use
subpages.

NetBSD/acorn26 now boots multi-user again.
This commit is contained in:
bjh21 2006-02-24 11:46:20 +00:00
parent 8bd6f83897
commit 70c82cfa56
2 changed files with 40 additions and 33 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_pool.c,v 1.111 2006/01/26 15:07:25 christos Exp $ */
/* $NetBSD: subr_pool.c,v 1.112 2006/02/24 11:46:20 bjh21 Exp $ */
/*-
* Copyright (c) 1997, 1999, 2000 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.111 2006/01/26 15:07:25 christos Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.112 2006/02/24 11:46:20 bjh21 Exp $");
#include "opt_pool.h"
#include "opt_poollog.h"
@ -482,35 +482,19 @@ pool_init(struct pool *pp, size_t size, u_int align, u_int ioff, int flags,
flags |= PR_LOGGING;
#endif
#ifdef POOL_SUBPAGE
/*
* XXX We don't provide a real `nointr' back-end
* yet; all sub-pages come from a kmem back-end.
* maybe some day...
*/
if (palloc == NULL) {
extern struct pool_allocator pool_allocator_kmem_subpage;
palloc = &pool_allocator_kmem_subpage;
}
/*
* We'll assume any user-specified back-end allocator
* will deal with sub-pages, or simply don't care.
*/
#else
if (palloc == NULL)
palloc = &pool_allocator_kmem;
#ifdef POOL_SUBPAGE
if (size > palloc->pa_pagesz) {
if (palloc == &pool_allocator_kmem)
palloc = &pool_allocator_kmem_fullpage;
else if (palloc == &pool_allocator_nointr)
palloc = &pool_allocator_nointr_fullpage;
}
#endif /* POOL_SUBPAGE */
if ((palloc->pa_flags & PA_INITIALIZED) == 0) {
if (palloc->pa_pagesz == 0) {
#ifdef POOL_SUBPAGE
if (palloc == &pool_allocator_kmem)
palloc->pa_pagesz = PAGE_SIZE;
else
palloc->pa_pagesz = POOL_SUBPAGE;
#else
if (palloc->pa_pagesz == 0)
palloc->pa_pagesz = PAGE_SIZE;
#endif /* POOL_SUBPAGE */
}
TAILQ_INIT(&palloc->pa_list);
@ -2190,23 +2174,42 @@ pool_cache_reclaim(struct pool_cache *pc, struct pool_pagelist *pq,
void *pool_page_alloc(struct pool *, int);
void pool_page_free(struct pool *, void *);
#ifdef POOL_SUBPAGE
struct pool_allocator pool_allocator_kmem_fullpage = {
pool_page_alloc, pool_page_free, 0,
};
#else
struct pool_allocator pool_allocator_kmem = {
pool_page_alloc, pool_page_free, 0,
};
#endif
void *pool_page_alloc_nointr(struct pool *, int);
void pool_page_free_nointr(struct pool *, void *);
#ifdef POOL_SUBPAGE
struct pool_allocator pool_allocator_nointr_fullpage = {
pool_page_alloc_nointr, pool_page_free_nointr, 0,
};
#else
struct pool_allocator pool_allocator_nointr = {
pool_page_alloc_nointr, pool_page_free_nointr, 0,
};
#endif
#ifdef POOL_SUBPAGE
void *pool_subpage_alloc(struct pool *, int);
void pool_subpage_free(struct pool *, void *);
struct pool_allocator pool_allocator_kmem_subpage = {
pool_subpage_alloc, pool_subpage_free, 0,
struct pool_allocator pool_allocator_kmem = {
pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE,
};
void *pool_subpage_alloc_nointr(struct pool *, int);
void pool_subpage_free_nointr(struct pool *, void *);
struct pool_allocator pool_allocator_nointr = {
pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE,
};
#endif /* POOL_SUBPAGE */
@ -2382,19 +2385,19 @@ pool_subpage_free(struct pool *pp, void *v)
/* We don't provide a real nointr allocator. Maybe later. */
void *
pool_page_alloc_nointr(struct pool *pp, int flags)
pool_subpage_alloc_nointr(struct pool *pp, int flags)
{
return (pool_subpage_alloc(pp, flags));
}
void
pool_page_free_nointr(struct pool *pp, void *v)
pool_subpage_free_nointr(struct pool *pp, void *v)
{
pool_subpage_free(pp, v);
}
#else
#endif /* POOL_SUBPAGE */
void *
pool_page_alloc_nointr(struct pool *pp, int flags)
{
@ -2409,4 +2412,3 @@ pool_page_free_nointr(struct pool *pp, void *v)
uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v);
}
#endif /* POOL_SUBPAGE */

View File

@ -1,4 +1,4 @@
/* $NetBSD: pool.h,v 1.47 2005/12/01 13:21:05 yamt Exp $ */
/* $NetBSD: pool.h,v 1.48 2006/02/24 11:46:20 bjh21 Exp $ */
/*-
* Copyright (c) 1997, 1998, 1999, 2000 The NetBSD Foundation, Inc.
@ -217,6 +217,11 @@ struct pool {
*/
extern struct pool_allocator pool_allocator_kmem;
extern struct pool_allocator pool_allocator_nointr;
#ifdef POOL_SUBPAGE
/* The above are subpage allocators in this case. */
extern struct pool_allocator pool_allocator_kmem_fullpage;
extern struct pool_allocator pool_allocator_nointr_fullpage;
#endif
struct link_pool_init { /* same as args to pool_init() */
struct pool *pp;