Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -1496,7 +1496,7 @@ vm_size_t length, vm_offset_t max_addr, int find_space, vm_prot_t prot, vm_prot_t max, int cow) { - vm_offset_t alignment, initial_addr, start; + vm_offset_t alignment, initial_addr, prev_start, start; int result; KASSERT((cow & (MAP_STACK_GROWS_DOWN | MAP_STACK_GROWS_UP)) == 0 || @@ -1512,6 +1512,7 @@ alignment = 0; initial_addr = *addr; again: + result = KERN_SUCCESS; start = initial_addr; vm_map_lock(map); do { @@ -1543,6 +1544,8 @@ start = *addr; } + if (result != KERN_SUCCESS && prev_start == start) + break; if ((cow & (MAP_STACK_GROWS_DOWN | MAP_STACK_GROWS_UP)) != 0) { result = vm_map_stack_locked(map, start, length, sgrowsiz, prot, max, cow); @@ -1550,6 +1553,7 @@ result = vm_map_insert(map, object, offset, start, start + length, prot, max, cow); } + prev_start = start; } while (result == KERN_NO_SPACE && find_space != VMFS_NO_SPACE && find_space != VMFS_ANY_SPACE); vm_map_unlock(map);