Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_object.c
Show First 20 Lines • Show All 1,478 Lines • ▼ Show 20 Lines | for (; m != NULL && (idx = m->pindex - offidxstart) < size; | ||||
/* | /* | ||||
* The page was left invalid. Likely placed there by | * The page was left invalid. Likely placed there by | ||||
* an incomplete fault. Just remove and ignore. | * an incomplete fault. Just remove and ignore. | ||||
*/ | */ | ||||
if (vm_page_none_valid(m)) { | if (vm_page_none_valid(m)) { | ||||
if (vm_page_remove(m)) | if (vm_page_remove(m)) | ||||
vm_page_free(m); | vm_page_free(m); | ||||
else | |||||
vm_page_xunbusy(m); | |||||
continue; | continue; | ||||
} | } | ||||
/* vm_page_rename() will dirty the page. */ | /* vm_page_rename() will dirty the page. */ | ||||
if (vm_page_rename(m, new_object, idx)) { | if (vm_page_rename(m, new_object, idx)) { | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
VM_OBJECT_WUNLOCK(new_object); | VM_OBJECT_WUNLOCK(new_object); | ||||
VM_OBJECT_WUNLOCK(orig_object); | VM_OBJECT_WUNLOCK(orig_object); | ||||
▲ Show 20 Lines • Show All 173 Lines • ▼ Show 20 Lines | if (p->pindex < backing_offset_index || | ||||
if (backing_object->type == OBJT_SWAP) | if (backing_object->type == OBJT_SWAP) | ||||
swap_pager_freespace(backing_object, p->pindex, | swap_pager_freespace(backing_object, p->pindex, | ||||
1); | 1); | ||||
KASSERT(!pmap_page_is_mapped(p), | KASSERT(!pmap_page_is_mapped(p), | ||||
("freeing mapped page %p", p)); | ("freeing mapped page %p", p)); | ||||
if (vm_page_remove(p)) | if (vm_page_remove(p)) | ||||
vm_page_free(p); | vm_page_free(p); | ||||
else | |||||
vm_page_xunbusy(p); | |||||
continue; | continue; | ||||
} | } | ||||
pp = vm_page_lookup(object, new_pindex); | pp = vm_page_lookup(object, new_pindex); | ||||
if (pp != NULL && vm_page_tryxbusy(pp) == 0) { | if (pp != NULL && vm_page_tryxbusy(pp) == 0) { | ||||
vm_page_xunbusy(p); | vm_page_xunbusy(p); | ||||
/* | /* | ||||
* The page in the parent is busy and possibly not | * The page in the parent is busy and possibly not | ||||
Show All 15 Lines | for (p = TAILQ_FIRST(&backing_object->memq); p != NULL; p = next) { | ||||
if (pp != NULL && vm_page_none_valid(pp)) { | if (pp != NULL && vm_page_none_valid(pp)) { | ||||
/* | /* | ||||
* The page was invalid in the parent. Likely placed | * The page was invalid in the parent. Likely placed | ||||
* there by an incomplete fault. Just remove and | * there by an incomplete fault. Just remove and | ||||
* ignore. p can replace it. | * ignore. p can replace it. | ||||
*/ | */ | ||||
if (vm_page_remove(pp)) | if (vm_page_remove(pp)) | ||||
vm_page_free(pp); | vm_page_free(pp); | ||||
else | |||||
vm_page_xunbusy(pp); | |||||
pp = NULL; | pp = NULL; | ||||
} | } | ||||
if (pp != NULL || vm_pager_has_page(object, new_pindex, NULL, | if (pp != NULL || vm_pager_has_page(object, new_pindex, NULL, | ||||
NULL)) { | NULL)) { | ||||
/* | /* | ||||
* The page already exists in the parent OR swap exists | * The page already exists in the parent OR swap exists | ||||
* for this location in the parent. Leave the parent's | * for this location in the parent. Leave the parent's | ||||
* page alone. Destroy the original page from the | * page alone. Destroy the original page from the | ||||
* backing object. | * backing object. | ||||
*/ | */ | ||||
if (backing_object->type == OBJT_SWAP) | if (backing_object->type == OBJT_SWAP) | ||||
swap_pager_freespace(backing_object, p->pindex, | swap_pager_freespace(backing_object, p->pindex, | ||||
1); | 1); | ||||
KASSERT(!pmap_page_is_mapped(p), | KASSERT(!pmap_page_is_mapped(p), | ||||
("freeing mapped page %p", p)); | ("freeing mapped page %p", p)); | ||||
if (vm_page_remove(p)) | if (vm_page_remove(p)) | ||||
vm_page_free(p); | vm_page_free(p); | ||||
else | |||||
vm_page_xunbusy(p); | |||||
if (pp != NULL) | if (pp != NULL) | ||||
vm_page_xunbusy(pp); | vm_page_xunbusy(pp); | ||||
continue; | continue; | ||||
} | } | ||||
/* | /* | ||||
* Page does not exist in parent, rename the page from the | * Page does not exist in parent, rename the page from the | ||||
* backing object to the main object. | * backing object to the main object. | ||||
▲ Show 20 Lines • Show All 1,031 Lines • Show Last 20 Lines |