Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_fault.c
Show First 20 Lines • Show All 284 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
return (result); | return (result); | ||||
} | } | ||||
int | int | ||||
vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, | vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, | ||||
int fault_flags, vm_page_t *m_hold) | int fault_flags, vm_page_t *m_hold) | ||||
{ | { | ||||
vm_prot_t prot; | |||||
vm_object_t next_object; | |||||
struct faultstate fs; | struct faultstate fs; | ||||
struct vnode *vp; | struct vnode *vp; | ||||
vm_object_t next_object, retry_object; | |||||
vm_offset_t e_end, e_start; | vm_offset_t e_end, e_start; | ||||
vm_page_t m; | vm_page_t m; | ||||
vm_pindex_t retry_pindex; | |||||
vm_prot_t prot, retry_prot; | |||||
int ahead, alloc_req, behind, cluster_offset, error, era, faultcount; | int ahead, alloc_req, behind, cluster_offset, error, era, faultcount; | ||||
int locked, map_generation, nera, result, rv; | int locked, map_generation, nera, result, rv; | ||||
u_char behavior; | u_char behavior; | ||||
boolean_t wired; /* Passed by reference. */ | boolean_t wired; /* Passed by reference. */ | ||||
bool dead, growstack, hardfault, is_first_object_locked; | bool dead, growstack, hardfault, is_first_object_locked; | ||||
PCPU_INC(cnt.v_vm_faults); | PCPU_INC(cnt.v_vm_faults); | ||||
fs.vp = NULL; | fs.vp = NULL; | ||||
▲ Show 20 Lines • Show All 634 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* We must verify that the maps have not changed since our last | * We must verify that the maps have not changed since our last | ||||
* lookup. | * lookup. | ||||
*/ | */ | ||||
if (!fs.lookup_still_valid) { | if (!fs.lookup_still_valid) { | ||||
vm_object_t retry_object; | |||||
vm_pindex_t retry_pindex; | |||||
vm_prot_t retry_prot; | |||||
if (!vm_map_trylock_read(fs.map)) { | if (!vm_map_trylock_read(fs.map)) { | ||||
release_page(&fs); | release_page(&fs); | ||||
unlock_and_deallocate(&fs); | unlock_and_deallocate(&fs); | ||||
goto RetryFault; | goto RetryFault; | ||||
} | } | ||||
fs.lookup_still_valid = true; | fs.lookup_still_valid = true; | ||||
if (fs.map->timestamp != map_generation) { | if (fs.map->timestamp != map_generation) { | ||||
result = vm_map_lookup_locked(&fs.map, vaddr, fault_type, | result = vm_map_lookup_locked(&fs.map, vaddr, fault_type, | ||||
▲ Show 20 Lines • Show All 565 Lines • Show Last 20 Lines |