Module Name: src Committed By: thorpej Date: Tue Jun 16 01:29:01 UTC 2020
Modified Files: src/distrib/sets/lists/comp: mi src/share/man/man9: Makefile vmem.9 src/sys/kern: subr_vmem.c src/sys/sys: vmem.h Log Message: Add vmem_xfreeall(), which frees all allocated regions in the specified arena. All outstanding allocations MUST have been performed with vmem_xalloc() or else the behavior is undefined. (This also implies that the arena must also not have a quantum cache; note this in the documentation.) To generate a diff of this commit: cvs rdiff -u -r1.2337 -r1.2338 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.450 -r1.451 src/share/man/man9/Makefile cvs rdiff -u -r1.19 -r1.20 src/share/man/man9/vmem.9 cvs rdiff -u -r1.103 -r1.104 src/sys/kern/subr_vmem.c cvs rdiff -u -r1.20 -r1.21 src/sys/sys/vmem.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.2337 src/distrib/sets/lists/comp/mi:1.2338 --- src/distrib/sets/lists/comp/mi:1.2337 Mon Jun 15 23:41:55 2020 +++ src/distrib/sets/lists/comp/mi Tue Jun 16 01:29:01 2020 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.2337 2020/06/15 23:41:55 christos Exp $ +# $NetBSD: mi,v 1.2338 2020/06/16 01:29:01 thorpej Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. ./etc/mtree/set.comp comp-sys-root @@ -12439,6 +12439,7 @@ ./usr/share/man/cat9/vmem_free.0 comp-sys-catman .cat ./usr/share/man/cat9/vmem_xalloc.0 comp-sys-catman .cat ./usr/share/man/cat9/vmem_xfree.0 comp-sys-catman .cat +./usr/share/man/cat9/vmem_xfreeall.0 comp-sys-catman .cat ./usr/share/man/cat9/vn_bwrite.0 comp-sys-catman .cat ./usr/share/man/cat9/vn_close.0 comp-sys-catman .cat ./usr/share/man/cat9/vn_closefile.0 comp-sys-catman .cat @@ -20543,6 +20544,7 @@ ./usr/share/man/html9/vmem_free.html comp-sys-htmlman html ./usr/share/man/html9/vmem_xalloc.html comp-sys-htmlman html ./usr/share/man/html9/vmem_xfree.html comp-sys-htmlman html +./usr/share/man/html9/vmem_xfreeall.html comp-sys-htmlman html ./usr/share/man/html9/vn_bwrite.html comp-sys-htmlman html ./usr/share/man/html9/vn_close.html comp-sys-htmlman html ./usr/share/man/html9/vn_closefile.html comp-sys-htmlman html @@ -28886,6 +28888,7 @@ ./usr/share/man/man9/vmem_free.9 comp-sys-man .man ./usr/share/man/man9/vmem_xalloc.9 comp-sys-man .man ./usr/share/man/man9/vmem_xfree.9 comp-sys-man .man +./usr/share/man/man9/vmem_xfreeall.9 comp-sys-man .man ./usr/share/man/man9/vn_bwrite.9 comp-sys-man .man ./usr/share/man/man9/vn_close.9 comp-sys-man .man ./usr/share/man/man9/vn_closefile.9 comp-sys-man .man Index: src/share/man/man9/Makefile diff -u src/share/man/man9/Makefile:1.450 src/share/man/man9/Makefile:1.451 --- src/share/man/man9/Makefile:1.450 Fri May 1 21:43:24 2020 +++ src/share/man/man9/Makefile Tue Jun 16 01:29:00 2020 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.450 2020/05/01 21:43:24 jdolecek Exp $ +# $NetBSD: Makefile,v 1.451 2020/06/16 01:29:00 thorpej Exp $ # Makefile for section 9 (kernel function and variable) manual pages. @@ -1030,7 +1030,8 @@ MLINKS+=vmem.9 vmem_alloc.9 \ vmem.9 vmem_destroy.9 \ vmem.9 vmem_free.9 \ vmem.9 vmem_xalloc.9 \ - vmem.9 vmem_xfree.9 + vmem.9 vmem_xfree.9 \ + vmem.9 vmem_xfreeall.9 MLINKS+=vnode.9 vref.9 \ vnode.9 vrele.9 \ vnode.9 vrele_async.9 \ Index: src/share/man/man9/vmem.9 diff -u src/share/man/man9/vmem.9:1.19 src/share/man/man9/vmem.9:1.20 --- src/share/man/man9/vmem.9:1.19 Wed Nov 6 11:55:18 2019 +++ src/share/man/man9/vmem.9 Tue Jun 16 01:29:00 2020 @@ -1,4 +1,4 @@ -.\" $NetBSD: vmem.9,v 1.19 2019/11/06 11:55:18 wiz Exp $ +.\" $NetBSD: vmem.9,v 1.20 2020/06/16 01:29:00 thorpej Exp $ .\" .\" Copyright (c)2006 YAMAMOTO Takashi, .\" All rights reserved. @@ -25,7 +25,7 @@ .\" SUCH DAMAGE. .\" .\" ------------------------------------------------------------ -.Dd November 5, 2019 +.Dd June 15, 2020 .Dt VMEM 9 .Os .\" ------------------------------------------------------------ @@ -63,6 +63,9 @@ .Ft void .Fn vmem_xfree "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size" .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +.Ft void +.Fn vmem_xfreeall "vmem_t *vm" +.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .Ft int .Fn vmem_alloc "vmem_t *vm" "vmem_size_t size" "vm_flag_t flags" "vmem_addr_t *addrp" .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -407,6 +410,24 @@ argument used for .El .Pp .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +.Fn vmem_xfreeall +frees all resources that have been allocated by +.Fn vmem_xalloc +to the arena. +.Bl -tag -offset indent -width addr +.It Fa vm +The arena which we free to. +Note that this function is may not be used on arenas +where resources have been allocated using +.Fn vmem_alloc +or arenas that have a quantum cache +.Po +i.e. were created with a non-zero +.Fa qcache_max +.Pc . +.El +.Pp +.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .Fn vmem_alloc allocates a resource from the arena. .Bl -tag -offset indent -width flags Index: src/sys/kern/subr_vmem.c diff -u src/sys/kern/subr_vmem.c:1.103 src/sys/kern/subr_vmem.c:1.104 --- src/sys/kern/subr_vmem.c:1.103 Tue Apr 21 17:50:19 2020 +++ src/sys/kern/subr_vmem.c Tue Jun 16 01:29:00 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_vmem.c,v 1.103 2020/04/21 17:50:19 ad Exp $ */ +/* $NetBSD: subr_vmem.c,v 1.104 2020/06/16 01:29:00 thorpej Exp $ */ /*- * Copyright (c)2006,2007,2008,2009 YAMAMOTO Takashi, @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.103 2020/04/21 17:50:19 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.104 2020/06/16 01:29:00 thorpej Exp $"); #if defined(_KERNEL) && defined(_KERNEL_OPT) #include "opt_ddb.h" @@ -194,6 +194,8 @@ static LIST_HEAD(, vmem_btag) vmem_btag_ static size_t vmem_btag_freelist_count = 0; static struct pool vmem_btag_pool; +static void vmem_xfree_bt(vmem_t *, bt_t *); + static void vmem_kick_pdaemon(void) { @@ -1313,7 +1315,6 @@ void vmem_xfree(vmem_t *vm, vmem_addr_t addr, vmem_size_t size) { bt_t *bt; - bt_t *t; KASSERT(size > 0); @@ -1324,6 +1325,42 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr, KASSERT(bt->bt_start == addr); KASSERT(bt->bt_size == vmem_roundup_size(vm, size) || bt->bt_size - vmem_roundup_size(vm, size) <= vm->vm_quantum_mask); + + /* vmem_xfree_bt() drops the lock. */ + vmem_xfree_bt(vm, bt); +} + +void +vmem_xfreeall(vmem_t *vm) +{ + bt_t *bt; + + /* This can't be used if the arena has a quantum cache. */ + KASSERT(vm->vm_qcache_max == 0); + + for (;;) { + VMEM_LOCK(vm); + TAILQ_FOREACH(bt, &vm->vm_seglist, bt_seglist) { + if (bt->bt_type == BT_TYPE_BUSY) + break; + } + if (bt != NULL) { + /* vmem_xfree_bt() drops the lock. */ + vmem_xfree_bt(vm, bt); + } else { + VMEM_UNLOCK(vm); + return; + } + } +} + +static void +vmem_xfree_bt(vmem_t *vm, bt_t *bt) +{ + bt_t *t; + + VMEM_ASSERT_LOCKED(vm); + KASSERT(bt->bt_type == BT_TYPE_BUSY); bt_rembusy(vm, bt); bt->bt_type = BT_TYPE_FREE; Index: src/sys/sys/vmem.h diff -u src/sys/sys/vmem.h:1.20 src/sys/sys/vmem.h:1.21 --- src/sys/sys/vmem.h:1.20 Tue Jan 29 21:26:24 2013 +++ src/sys/sys/vmem.h Tue Jun 16 01:29:00 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: vmem.h,v 1.20 2013/01/29 21:26:24 para Exp $ */ +/* $NetBSD: vmem.h,v 1.21 2020/06/16 01:29:00 thorpej Exp $ */ /*- * Copyright (c)2006 YAMAMOTO Takashi, @@ -72,6 +72,7 @@ void vmem_free(vmem_t *, vmem_addr_t, vm int vmem_xalloc(vmem_t *, vmem_size_t, vmem_size_t, vmem_size_t, vmem_size_t, vmem_addr_t, vmem_addr_t, vm_flag_t, vmem_addr_t *); void vmem_xfree(vmem_t *, vmem_addr_t, vmem_size_t); +void vmem_xfreeall(vmem_t *); int vmem_add(vmem_t *, vmem_addr_t, vmem_size_t, vm_flag_t); vmem_size_t vmem_roundup_size(vmem_t *, vmem_size_t); vmem_size_t vmem_size(vmem_t *, int typemask);