Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_object.c
Show First 20 Lines • Show All 714 Lines • ▼ Show 20 Lines | TAILQ_FOREACH_SAFE(p, &object->memq, listq, p_next) { | ||||
vm_page_assert_unbusied(p); | vm_page_assert_unbusied(p); | ||||
if ((object->flags & OBJ_UNMANAGED) == 0) | if ((object->flags & OBJ_UNMANAGED) == 0) | ||||
/* | /* | ||||
* vm_page_free_prep() only needs the page | * vm_page_free_prep() only needs the page | ||||
* lock for managed pages. | * lock for managed pages. | ||||
*/ | */ | ||||
vm_page_change_lock(p, &mtx); | vm_page_change_lock(p, &mtx); | ||||
p->object = NULL; | p->object = NULL; | ||||
if (p->wire_count != 0) | if (vm_page_wired(p)) | ||||
continue; | continue; | ||||
VM_CNT_INC(v_pfree); | VM_CNT_INC(v_pfree); | ||||
vm_page_free(p); | vm_page_free(p); | ||||
} | } | ||||
if (mtx != NULL) | if (mtx != NULL) | ||||
mtx_unlock(mtx); | mtx_unlock(mtx); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 858 Lines • ▼ Show 20 Lines | if (p->pindex < backing_offset_index || | ||||
/* | /* | ||||
* Page is out of the parent object's range, we can | * Page is out of the parent object's range, we can | ||||
* simply destroy it. | * simply destroy it. | ||||
*/ | */ | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
KASSERT(!pmap_page_is_mapped(p), | KASSERT(!pmap_page_is_mapped(p), | ||||
("freeing mapped page %p", p)); | ("freeing mapped page %p", p)); | ||||
if (p->wire_count == 0) | if (!vm_page_wired(p)) | ||||
vm_page_free(p); | vm_page_free(p); | ||||
else | else | ||||
vm_page_remove(p); | vm_page_remove(p); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
continue; | continue; | ||||
} | } | ||||
pp = vm_page_lookup(object, new_pindex); | pp = vm_page_lookup(object, new_pindex); | ||||
Show All 27 Lines | if (pp != NULL || vm_pager_has_page(object, new_pindex, NULL, | ||||
* 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); | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
KASSERT(!pmap_page_is_mapped(p), | KASSERT(!pmap_page_is_mapped(p), | ||||
("freeing mapped page %p", p)); | ("freeing mapped page %p", p)); | ||||
if (p->wire_count == 0) | if (!vm_page_wired(p)) | ||||
vm_page_free(p); | vm_page_free(p); | ||||
else | else | ||||
vm_page_remove(p); | vm_page_remove(p); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
continue; | continue; | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 288 Lines • ▼ Show 20 Lines | for (; p != NULL && (p->pindex < end || end == 0); p = next) { | ||||
*/ | */ | ||||
vm_page_change_lock(p, &mtx); | vm_page_change_lock(p, &mtx); | ||||
if (vm_page_xbusied(p)) { | if (vm_page_xbusied(p)) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
vm_page_busy_sleep(p, "vmopax", true); | vm_page_busy_sleep(p, "vmopax", true); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
goto again; | goto again; | ||||
} | } | ||||
if (p->wire_count != 0) { | if (vm_page_wired(p)) { | ||||
if ((options & OBJPR_NOTMAPPED) == 0 && | if ((options & OBJPR_NOTMAPPED) == 0 && | ||||
object->ref_count != 0) | object->ref_count != 0) | ||||
pmap_remove_all(p); | pmap_remove_all(p); | ||||
if ((options & OBJPR_CLEANONLY) == 0) { | if ((options & OBJPR_CLEANONLY) == 0) { | ||||
p->valid = 0; | p->valid = 0; | ||||
vm_page_undirty(p); | vm_page_undirty(p); | ||||
} | } | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 736 Lines • Show Last 20 Lines |