Module Name: src Committed By: thorpej Date: Sat Dec 2 21:02:13 UTC 2023
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 a vmem_xalloc_addr() function, which allocates a specific address from an arena. This is just a convenience wrapper around vmem_xalloc(), that's just a bit more obvious how to use and performs some additional sanity checks. To generate a diff of this commit: cvs rdiff -u -r1.2450 -r1.2451 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.467 -r1.468 src/share/man/man9/Makefile cvs rdiff -u -r1.21 -r1.22 src/share/man/man9/vmem.9 cvs rdiff -u -r1.110 -r1.111 src/sys/kern/subr_vmem.c cvs rdiff -u -r1.23 -r1.24 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.2450 src/distrib/sets/lists/comp/mi:1.2451 --- src/distrib/sets/lists/comp/mi:1.2450 Sun Oct 15 13:04:15 2023 +++ src/distrib/sets/lists/comp/mi Sat Dec 2 21:02:12 2023 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.2450 2023/10/15 13:04:15 riastradh Exp $ +# $NetBSD: mi,v 1.2451 2023/12/02 21:02:12 thorpej Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. ./etc/mtree/set.comp comp-sys-root @@ -13097,6 +13097,7 @@ ./usr/share/man/cat9/vmem_destroy.0 comp-sys-catman .cat ./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_xalloc_addr.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 @@ -21435,6 +21436,7 @@ ./usr/share/man/html9/vmem_destroy.html comp-sys-htmlman html ./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_xalloc_addr.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 @@ -30012,6 +30014,7 @@ ./usr/share/man/man9/vmem_destroy.9 comp-sys-man .man ./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_xalloc_addr.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 Index: src/share/man/man9/Makefile diff -u src/share/man/man9/Makefile:1.467 src/share/man/man9/Makefile:1.468 --- src/share/man/man9/Makefile:1.467 Sat Jul 8 16:14:11 2023 +++ src/share/man/man9/Makefile Sat Dec 2 21:02:12 2023 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.467 2023/07/08 16:14:11 christos Exp $ +# $NetBSD: Makefile,v 1.468 2023/12/02 21:02:12 thorpej Exp $ # Makefile for section 9 (kernel function and variable) manual pages. @@ -1071,6 +1071,7 @@ MLINKS+=vmem.9 vmem_alloc.9 \ vmem.9 vmem_destroy.9 \ vmem.9 vmem_free.9 \ vmem.9 vmem_xalloc.9 \ + vmem.9 vmem_xalloc_addr.9 \ vmem.9 vmem_xfree.9 \ vmem.9 vmem_xfreeall.9 MLINKS+=vnode.9 vref.9 \ Index: src/share/man/man9/vmem.9 diff -u src/share/man/man9/vmem.9:1.21 src/share/man/man9/vmem.9:1.22 --- src/share/man/man9/vmem.9:1.21 Sat Oct 15 14:54:21 2022 +++ src/share/man/man9/vmem.9 Sat Dec 2 21:02:12 2023 @@ -1,4 +1,4 @@ -.\" $NetBSD: vmem.9,v 1.21 2022/10/15 14:54:21 riastradh Exp $ +.\" $NetBSD: vmem.9,v 1.22 2023/12/02 21:02:12 thorpej Exp $ .\" .\" Copyright (c)2006 YAMAMOTO Takashi, .\" All rights reserved. @@ -25,7 +25,7 @@ .\" SUCH DAMAGE. .\" .\" ------------------------------------------------------------ -.Dd June 15, 2020 +.Dd December 2, 2023 .Dt VMEM 9 .Os .\" ------------------------------------------------------------ @@ -60,6 +60,10 @@ "vmem_size_t phase" "vmem_size_t nocross" "vmem_addr_t minaddr" \ "vmem_addr_t maxaddr" "vm_flag_t flags" "vmem_addr_t *addrp" .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +.Ft int +.Fn vmem_xalloc_addr \ +"vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size" "vm_flag_t flags" +.\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .Ft void .Fn vmem_xfree "vmem_t *vm" "vmem_addr_t addr" "vmem_size_t size" .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -387,9 +391,40 @@ overwrites it with the start address of .El .Pp .\" ------------------------------------------------------------ +.Fn vmem_xalloc_addr +allocates a specific address from the arena. +The requested address must be aligned with the arena's quantum. +.Bl -tag -offset indent -width flags +.It Fa vm +The arena which we allocate from. +.It Fa addr +The address to allocate. +.It Fa size +Specify the size of the allocation. +.It Fa flags +A sleep flag. +Because a specific address is being allocated, any specified allocation +strategy is ignored. +.Pp +The sleep flag must be one of: +.Bl -tag -width VM_NOSLEEP +.It Dv VM_SLEEP +If the allocation cannot be satisfied immediately, sleep until the +requested range can be allocated. +.It Dv VM_NOSLEEP +Don't sleep. +Immediately return +.Dv ENOMEM +if the requested range is not available. +.El +.El +.Pp +.\" ------------------------------------------------------------ .Fn vmem_xfree frees resource allocated by .Fn vmem_xalloc +or +.Fn vmem_xalloc_addr to the arena. .Bl -tag -offset indent -width addr .It Fa vm @@ -397,16 +432,20 @@ The arena which we free to. .It Fa addr The resource being freed. It must have been allocated via -.Fn vmem_xalloc . +.Fn vmem_xalloc +or +.Fn vmem_xalloc_addr . Notably, it must not have been allocated via -.Fn vmem_alloc . -Otherwise, the behaviour is undefined. +.Fn vmem_alloc , +otherwise, the behaviour is undefined. .It Fa size The size of the resource being freed. It must be the same as the .Fa size argument used for -.Fn vmem_xalloc . +.Fn vmem_xalloc +or +.Fn vmem_xalloc_addr . .El .Pp .\" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -479,8 +518,10 @@ The resource being freed. It must have been allocated via .Fn vmem_alloc . Notably, it must not have been allocated via -.Fn vmem_xalloc . -Otherwise, the behaviour is undefined. +.Fn vmem_xalloc +or +.Fn vmem_xalloc addr , +otherwise, the behaviour is undefined. .It Fa size The size of the resource being freed. It must be the same as the Index: src/sys/kern/subr_vmem.c diff -u src/sys/kern/subr_vmem.c:1.110 src/sys/kern/subr_vmem.c:1.111 --- src/sys/kern/subr_vmem.c:1.110 Sat Dec 2 19:06:17 2023 +++ src/sys/kern/subr_vmem.c Sat Dec 2 21:02:12 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_vmem.c,v 1.110 2023/12/02 19:06:17 thorpej Exp $ */ +/* $NetBSD: subr_vmem.c,v 1.111 2023/12/02 21:02:12 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.110 2023/12/02 19:06:17 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.111 2023/12/02 21:02:12 thorpej Exp $"); #if defined(_KERNEL) && defined(_KERNEL_OPT) #include "opt_ddb.h" @@ -1112,6 +1112,26 @@ vmem_alloc(vmem_t *vm, vmem_size_t size, } int +vmem_xalloc_addr(vmem_t *vm, const vmem_addr_t addr, const vmem_size_t size, + vm_flag_t flags) +{ + vmem_addr_t result; + int error; + + KASSERT((addr & vm->vm_quantum_mask) == 0); + KASSERT(size != 0); + + flags = (flags & ~VM_INSTANTFIT) | VM_BESTFIT; + + error = vmem_xalloc(vm, size, 0, 0, 0, addr, addr + size - 1, + flags, &result); + + KASSERT(error || result == addr); + KASSERT(error == 0 || (flags & VM_SLEEP) == 0); + return error; +} + +int vmem_xalloc(vmem_t *vm, const vmem_size_t size0, vmem_size_t align, const vmem_size_t phase, const vmem_size_t nocross, const vmem_addr_t minaddr, const vmem_addr_t maxaddr, const vm_flag_t flags, Index: src/sys/sys/vmem.h diff -u src/sys/sys/vmem.h:1.23 src/sys/sys/vmem.h:1.24 --- src/sys/sys/vmem.h:1.23 Sat Dec 2 19:11:52 2023 +++ src/sys/sys/vmem.h Sat Dec 2 21:02:12 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: vmem.h,v 1.23 2023/12/02 19:11:52 thorpej Exp $ */ +/* $NetBSD: vmem.h,v 1.24 2023/12/02 21:02:12 thorpej Exp $ */ /*- * Copyright (c)2006 YAMAMOTO Takashi, @@ -70,6 +70,7 @@ void vmem_free(vmem_t *, vmem_addr_t, v 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 *); +int vmem_xalloc_addr(vmem_t *, vmem_addr_t, vmem_size_t, vm_flag_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);