1.\" 2.\" Copyright (c) 2003 Bruce M Simpson <bms@spc.org> 3.\" All rights reserved. 4.\" 5.\" Redistribution and use in source and binary forms, with or without 6.\" modification, are permitted provided that the following conditions 7.\" are met: 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24.\" SUCH DAMAGE. 25.\" 26.\" $FreeBSD$ 27.\" 28.Dd September 12, 2013 29.Dt VM_MAP_FIND 9 30.Os 31.Sh NAME 32.Nm vm_map_find 33.Nd find a free region within a map, and optionally map a vm_object 34.Sh SYNOPSIS 35.In sys/param.h 36.In vm/vm.h 37.In vm/vm_map.h 38.Ft int 39.Fo vm_map_find 40.Fa "vm_map_t map" "vm_object_t object" "vm_ooffset_t offset" 41.Fa "vm_offset_t *addr" "vm_size_t length" "vm_offset_t max_addr" 42.Fa "int find_space" "vm_prot_t prot" "vm_prot_t max" "int cow" 43.Fc 44.Sh DESCRIPTION 45The 46.Fn vm_map_find 47function attempts to find a free region in the target 48.Fa map , 49with the given 50.Fa length. 51If a free region is found, 52.Fn vm_map_find 53creates a mapping of 54.Fa object 55via a call to 56.Xr vm_map_insert 9 . 57.Pp 58The arguments 59.Fa offset , 60.Fa prot , 61.Fa max , 62and 63.Fa cow 64are passed unchanged to 65.Xr vm_map_insert 9 66when creating the mapping, if and only if a free region is found. 67.Pp 68If 69.Fa object 70is 71.Pf non- Dv NULL , 72the reference count on the object must be incremented 73by the caller before calling this function to account for the new entry. 74.Pp 75If 76.Fa max_addr 77is non-zero, 78it specifies an upper bound on the mapping. 79The mapping will only succeed if a free region can be found that resides 80entirely below 81.Fa max_addr . 82.Pp 83The 84.Fa find_space 85argument specifies the strategy to use when searching for a free region of 86the requested length. 87For all values other than 88.Dv VMFS_NO_SPACE , 89.Xr vm_map_findspace 9 90is called to locate a free region of the requested length with a starting 91address at or above 92.Fa *addr . 93The following strategies are supported: 94.Bl -tag -width "Dv VMFS_ALIGNED_SPACE Ns" 95.It Dv VMFS_NO_SPACE 96The mapping will only succeed if there is a free region of the requested 97length at the given address 98.Fa *addr . 99.It Dv VMFS_ANY_SPACE 100The mapping will succeed as long as there is a free region. 101.It Dv VMFS_SUPER_SPACE 102The mapping will succeed as long as there is a free region that begins on 103a superpage boundary. 104If 105.Fa object 106is 107.Pf non- Dv NULL 108and is already backed by superpages, 109then the mapping will require a free region that aligns relative to the 110existing superpages rather than one beginning on a superpage boundary. 111.It Dv VMFS_OPTIMAL_SPACE 112The mapping will succeed as long as there is a free region. 113However, if 114.Fa object 115is 116.Pf non- Dv NULL 117and is already backed by superpages, 118this strategy will attempt to find a free region aligned relative to 119the existing superpages. 120.It Dv VMFS_ALIGNED_SPACE Ns Pq Fa n 121The mapping will succeed as long as there is a free region that aligns on 122a 123.Pf 2^ Fa n 124boundary. 125.El 126.Sh IMPLEMENTATION NOTES 127This function acquires a lock on 128.Fa map 129by calling 130.Xr vm_map_lock 9 , 131and holds it until the function returns. 132.Pp 133The search for a free region is defined to be first-fit, from the address 134.Fa addr 135onwards. 136.Sh RETURN VALUES 137The 138.Fn vm_map_find 139function returns 140.Dv KERN_SUCCESS 141if the mapping was successfully created. 142If space could not be found or 143.Fa find_space 144was 145.Dv VMFS_NO_SPACE 146and the given address, 147.Fa addr , 148was already mapped, 149.Dv KERN_NO_SPACE 150will be returned. 151If the discovered range turned out to be bogus, 152.Dv KERN_INVALID_ADDRESS 153will be returned. 154.Sh SEE ALSO 155.Xr vm_map 9 , 156.Xr vm_map_findspace 9 , 157.Xr vm_map_insert 9 , 158.Xr vm_map_lock 9 159.Sh AUTHORS 160This manual page was written by 161.An Bruce M Simpson Aq bms@spc.org . 162