Do vm_page_rename more conservatively in rcollapse and qcollapse, and
change list walk so that it doesn't get stuck in an infinite loop. Submitted by: John Dyson
This commit is contained in:
parent
7609ab12e4
commit
45cbbb298d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5203
@ -61,7 +61,7 @@
|
||||
* any improvements or extensions that they make and grant Carnegie the
|
||||
* rights to redistribute these changes.
|
||||
*
|
||||
* $Id: vm_object.c,v 1.11 1994/11/25 07:58:27 davidg Exp $
|
||||
* $Id: vm_object.c,v 1.12 1994/12/11 01:36:53 davidg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -1170,8 +1170,10 @@ vm_object_rcollapse(object, sobject)
|
||||
|
||||
backing_offset = object->shadow_offset;
|
||||
size = object->size;
|
||||
while (p = backing_object->memq.tqh_first) {
|
||||
p = backing_object->memq.tqh_first;
|
||||
while (p) {
|
||||
vm_page_t next;
|
||||
next = p->listq.tqe_next;
|
||||
|
||||
new_offset = (p->offset - backing_offset);
|
||||
if (p->offset < backing_offset ||
|
||||
@ -1193,9 +1195,11 @@ vm_object_rcollapse(object, sobject)
|
||||
vm_page_free(p);
|
||||
vm_page_unlock_queues();
|
||||
} else {
|
||||
vm_page_rename(p, object, new_offset);
|
||||
if (!backing_object->pager || !vm_pager_has_page(backing_object->pager, backing_object->paging_offset + p->offset))
|
||||
vm_page_rename(p, object, new_offset);
|
||||
}
|
||||
}
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1256,7 +1260,8 @@ vm_object_qcollapse(object)
|
||||
vm_page_free(p);
|
||||
vm_page_unlock_queues();
|
||||
} else {
|
||||
vm_page_rename(p, object, new_offset);
|
||||
if (!backing_object->pager || !vm_pager_has_page(backing_object->pager, backing_object->paging_offset + p->offset))
|
||||
vm_page_rename(p, object, new_offset);
|
||||
}
|
||||
}
|
||||
p = next;
|
||||
|
Loading…
Reference in New Issue
Block a user