Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/sys Add vmem_xfreeall(), which frees all allocated regio...
details: https://anonhg.NetBSD.org/src/rev/2ccb0ba58908
branches: trunk
changeset: 1011059:2ccb0ba58908
user: thorpej <thorpej%NetBSD.org@localhost>
date: Tue Jun 16 01:29:00 2020 +0000
description:
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.)
diffstat:
distrib/sets/lists/comp/mi | 5 ++++-
share/man/man9/Makefile | 5 +++--
share/man/man9/vmem.9 | 25 +++++++++++++++++++++++--
sys/kern/subr_vmem.c | 43 ++++++++++++++++++++++++++++++++++++++++---
sys/sys/vmem.h | 3 ++-
5 files changed, 72 insertions(+), 9 deletions(-)
diffs (200 lines):
diff -r 10953298e722 -r 2ccb0ba58908 distrib/sets/lists/comp/mi
--- a/distrib/sets/lists/comp/mi Tue Jun 16 00:47:21 2020 +0000
+++ b/distrib/sets/lists/comp/mi Tue Jun 16 01:29:00 2020 +0000
@@ -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
diff -r 10953298e722 -r 2ccb0ba58908 share/man/man9/Makefile
--- a/share/man/man9/Makefile Tue Jun 16 00:47:21 2020 +0000
+++ b/share/man/man9/Makefile Tue Jun 16 01:29:00 2020 +0000
@@ -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 @@
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 \
diff -r 10953298e722 -r 2ccb0ba58908 share/man/man9/vmem.9
--- a/share/man/man9/vmem.9 Tue Jun 16 00:47:21 2020 +0000
+++ b/share/man/man9/vmem.9 Tue Jun 16 01:29:00 2020 +0000
@@ -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 @@
.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
diff -r 10953298e722 -r 2ccb0ba58908 sys/kern/subr_vmem.c
--- a/sys/kern/subr_vmem.c Tue Jun 16 00:47:21 2020 +0000
+++ b/sys/kern/subr_vmem.c Tue Jun 16 01:29:00 2020 +0000
@@ -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 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 @@
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 @@
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;
diff -r 10953298e722 -r 2ccb0ba58908 sys/sys/vmem.h
--- a/sys/sys/vmem.h Tue Jun 16 00:47:21 2020 +0000
+++ b/sys/sys/vmem.h Tue Jun 16 01:29:00 2020 +0000
@@ -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 @@
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);
Home |
Main Index |
Thread Index |
Old Index