Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_kern.c
Context not available. | |||||
vm_offset_t | vm_offset_t | ||||
kmap_alloc_wait(vm_map_t map, vm_size_t size) | kmap_alloc_wait(vm_map_t map, vm_size_t size) | ||||
{ | { | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
size = round_page(size); | size = round_page(size); | ||||
if (!swap_reserve(size)) | if (!swap_reserve(size)) | ||||
return (0); | return (0); | ||||
for (;;) { | for (;;) { | ||||
/* | /* | ||||
* To make this work for more than one map, use the map's lock | * To make this work for more than one map, use the map's lock | ||||
* to lock out sleepers/wakers. | * to lock out sleepers/wakers. | ||||
*/ | */ | ||||
vm_map_lock(map); | vm_map_lock(map); | ||||
if (vm_map_findspace(map, vm_map_min(map), size, &addr) == 0) | addr = vm_map_findspace(map, vm_map_min(map), size); | ||||
if (addr + size <= vm_map_max(map)) | |||||
break; | break; | ||||
/* no space now; see if we can ever get space */ | /* no space now; see if we can ever get space */ | ||||
if (vm_map_max(map) - vm_map_min(map) < size) { | if (vm_map_max(map) - vm_map_min(map) < size) { | ||||
vm_map_unlock(map); | vm_map_unlock(map); | ||||
swap_release(size); | swap_release(size); | ||||
return (0); | return (0); | ||||
} | } | ||||
map->needs_wakeup = TRUE; | map->needs_wakeup = TRUE; | ||||
vm_map_unlock_and_wait(map, 0); | vm_map_unlock_and_wait(map, 0); | ||||
} | } | ||||
vm_map_insert(map, NULL, 0, addr, addr + size, VM_PROT_RW, VM_PROT_RW, | vm_map_insert(map, NULL, 0, addr, addr + size, VM_PROT_RW, VM_PROT_RW, | ||||
MAP_ACC_CHARGED); | MAP_ACC_CHARGED); | ||||
vm_map_unlock(map); | vm_map_unlock(map); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
Context not available. |