Module Name: src Committed By: chs Date: Thu Jun 8 04:00:01 UTC 2017
Modified Files: src/sys/kern: subr_pool.c Log Message: add some pool_allocators for pool item sizes larger than PAGE_SIZE. needed by dtrace. To generate a diff of this commit: cvs rdiff -u -r1.207 -r1.208 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.207 src/sys/kern/subr_pool.c:1.208 --- src/sys/kern/subr_pool.c:1.207 Tue Mar 14 03:13:50 2017 +++ src/sys/kern/subr_pool.c Thu Jun 8 04:00:01 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.207 2017/03/14 03:13:50 riastradh Exp $ */ +/* $NetBSD: subr_pool.c,v 1.208 2017/06/08 04:00:01 chs 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.207 2017/03/14 03:13:50 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.208 2017/06/08 04:00:01 chs Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -106,6 +106,10 @@ struct pool_allocator pool_allocator_met .pa_pagesz = 0 }; +#define POOL_ALLOCATOR_BIG_BASE 13 +extern struct pool_allocator pool_allocator_big[]; +static int pool_bigidx(size_t); + /* # of seconds to retain page after last use */ int pool_inactive_time = 10; @@ -1700,8 +1704,14 @@ pool_cache_bootstrap(pool_cache_t pc, si struct pool *pp; pp = &pc->pc_pool; - if (palloc == NULL && ipl == IPL_NONE) - palloc = &pool_allocator_nointr; + if (palloc == NULL && ipl == IPL_NONE) { + if (size > PAGE_SIZE) { + int bigidx = pool_bigidx(size); + + palloc = &pool_allocator_big[bigidx]; + } else + palloc = &pool_allocator_nointr; + } pool_init(pp, size, align, align_offset, flags, wchan, palloc, ipl); mutex_init(&pc->pc_lock, MUTEX_DEFAULT, ipl); @@ -2498,6 +2508,61 @@ struct pool_allocator pool_allocator_noi }; #endif /* POOL_SUBPAGE */ +struct pool_allocator pool_allocator_big[] = { + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 0), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 1), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 2), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 3), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 4), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 5), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 6), + }, + { + .pa_alloc = pool_page_alloc, + .pa_free = pool_page_free, + .pa_pagesz = 1 << (POOL_ALLOCATOR_BIG_BASE + 7), + } +}; + +static int +pool_bigidx(size_t size) +{ + int i; + + for (i = 0; i < __arraycount(pool_allocator_big); i++) { + if (1 << (i + POOL_ALLOCATOR_BIG_BASE) >= size) + return i; + } + panic("pool item size %zu too large, use a custom allocator", size); +} + static void * pool_allocator_alloc(struct pool *pp, int flags) {