summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2008-05-10 18:55:35 +0000
committeralc <alc@FreeBSD.org>2008-05-10 18:55:35 +0000
commit5a23437099f2b97c9acda670eb588825ed1f44dd (patch)
treed385d237ca987c5a7b00e1291306c60aa868cdf7 /sys/vm/vm_map.c
parent840e3ca1b5be5d79f3f4ed5f4b66a01bed910f1e (diff)
downloadFreeBSD-src-5a23437099f2b97c9acda670eb588825ed1f44dd.zip
FreeBSD-src-5a23437099f2b97c9acda670eb588825ed1f44dd.tar.gz
Generalize vm_map_find(9)'s parameter "find_space". Specifically, add
support for VMFS_ALIGNED_SPACE, which requests the allocation of an address range best suited to superpages. The old options TRUE and FALSE are mapped to VMFS_ANY_SPACE and VMFS_NO_SPACE, so that there is no immediate need to update all of vm_map_find(9)'s callers. While I'm here, correct a misstatement about vm_map_find(9)'s return values in the man page.
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r--sys/vm/vm_map.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 5a98ce5..8873b98 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -1200,7 +1200,7 @@ vm_map_fixed(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
int
vm_map_find(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
vm_offset_t *addr, /* IN/OUT */
- vm_size_t length, boolean_t find_space, vm_prot_t prot,
+ vm_size_t length, int find_space, vm_prot_t prot,
vm_prot_t max, int cow)
{
vm_offset_t start;
@@ -1208,15 +1208,20 @@ vm_map_find(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
start = *addr;
vm_map_lock(map);
- if (find_space) {
- if (vm_map_findspace(map, start, length, addr)) {
- vm_map_unlock(map);
- return (KERN_NO_SPACE);
+ do {
+ if (find_space != VMFS_NO_SPACE) {
+ if (vm_map_findspace(map, start, length, addr)) {
+ vm_map_unlock(map);
+ return (KERN_NO_SPACE);
+ }
+ if (find_space == VMFS_ALIGNED_SPACE)
+ pmap_align_superpage(object, offset, addr,
+ length);
+ start = *addr;
}
- start = *addr;
- }
- result = vm_map_insert(map, object, offset,
- start, start + length, prot, max, cow);
+ result = vm_map_insert(map, object, offset, start, start +
+ length, prot, max, cow);
+ } while (result == KERN_NO_SPACE && find_space == VMFS_ALIGNED_SPACE);
vm_map_unlock(map);
return (result);
}
OpenPOWER on IntegriCloud