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

Reply via email to