Don't remove all mappings of a swapped out process if the vm map contained

wired entries.  vm_fault_unwire() depends on the mapping being intact.

Reviewed by:	dillon
This commit is contained in:
Tor Egge 2001-10-14 20:51:14 +00:00
parent e7673b8424
commit 30105b9ec4

View File

@ -544,6 +544,7 @@ vm_pageout_map_deactivate_pages(map, desired)
{ {
vm_map_entry_t tmpe; vm_map_entry_t tmpe;
vm_object_t obj, bigobj; vm_object_t obj, bigobj;
int nothingwired;
GIANT_REQUIRED; GIANT_REQUIRED;
if (lockmgr(&map->lock, LK_EXCLUSIVE | LK_NOWAIT, (void *)0, curthread)) { if (lockmgr(&map->lock, LK_EXCLUSIVE | LK_NOWAIT, (void *)0, curthread)) {
@ -551,6 +552,7 @@ vm_pageout_map_deactivate_pages(map, desired)
} }
bigobj = NULL; bigobj = NULL;
nothingwired = TRUE;
/* /*
* first, search out the biggest object, and try to free pages from * first, search out the biggest object, and try to free pages from
@ -566,6 +568,8 @@ vm_pageout_map_deactivate_pages(map, desired)
bigobj = obj; bigobj = obj;
} }
} }
if (tmpe->wired_count > 0)
nothingwired = FALSE;
tmpe = tmpe->next; tmpe = tmpe->next;
} }
@ -592,7 +596,7 @@ vm_pageout_map_deactivate_pages(map, desired)
* Remove all mappings if a process is swapped out, this will free page * Remove all mappings if a process is swapped out, this will free page
* table pages. * table pages.
*/ */
if (desired == 0) if (desired == 0 && nothingwired)
pmap_remove(vm_map_pmap(map), pmap_remove(vm_map_pmap(map),
VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS); VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS);
vm_map_unlock(map); vm_map_unlock(map);