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);