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:
parent
8bd6f83897
commit
70c82cfa56
|
@ -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)
|
||||
if (palloc->pa_pagesz == 0)
|
||||
palloc->pa_pagesz = PAGE_SIZE;
|
||||
else
|
||||
palloc->pa_pagesz = POOL_SUBPAGE;
|
||||
#else
|
||||
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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue