Page MenuHomeFreeBSD

D26223.id76357.diff
No OneTemporary

D26223.id76357.diff

Index: sys/vm/vm_object.c
===================================================================
--- sys/vm/vm_object.c
+++ sys/vm/vm_object.c
@@ -1497,7 +1497,7 @@
void
vm_object_split(vm_map_entry_t entry)
{
- vm_page_t m, m_next;
+ vm_page_t m, m_busy, m_next;
vm_object_t orig_object, new_object, backing_object;
vm_pindex_t idx, offidxstart;
vm_size_t size;
@@ -1554,8 +1554,14 @@
* that the object is in transition.
*/
vm_object_set_flag(orig_object, OBJ_SPLIT);
+ m_busy = NULL;
+#ifdef INVARIANTS
+ idx = offidxstart;
+#endif
retry:
m = vm_page_find_least(orig_object, offidxstart);
+ KASSERT(m == NULL || idx <= m->pindex - offidxstart,
+ ("%s: object %p was repopulated", __func__, orig_object));
for (; m != NULL && (idx = m->pindex - offidxstart) < size;
m = m_next) {
m_next = TAILQ_NEXT(m, listq);
@@ -1610,8 +1616,15 @@
*/
vm_reserv_rename(m, new_object, orig_object, offidxstart);
#endif
+
+ /*
+ * orig_object's type may change while sleeping, so keep track
+ * of the beginning of the busied range.
+ */
if (orig_object->type != OBJT_SWAP)
vm_page_xunbusy(m);
+ else if (m_busy == NULL)
+ m_busy = m;
}
if (orig_object->type == OBJT_SWAP) {
/*
@@ -1619,8 +1632,9 @@
* and new_object's locks are released and reacquired.
*/
swap_pager_copy(orig_object, new_object, offidxstart, 0);
- TAILQ_FOREACH(m, &new_object->memq, listq)
- vm_page_xunbusy(m);
+ if (m_busy != NULL)
+ TAILQ_FOREACH_FROM(m_busy, &new_object->memq, listq)
+ vm_page_xunbusy(m_busy);
}
vm_object_clear_flag(orig_object, OBJ_SPLIT);
VM_OBJECT_WUNLOCK(orig_object);

File Metadata

Mime Type
text/plain
Expires
Fri, May 15, 8:29 AM (8 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33077886
Default Alt Text
D26223.id76357.diff (1 KB)

Event Timeline