Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_swapout.c
Show First 20 Lines • Show All 202 Lines • ▼ Show 20 Lines | for (object = first_object;; object = backing_object) { | ||||
/* | /* | ||||
* Scan the object's entire memory queue. | * Scan the object's entire memory queue. | ||||
*/ | */ | ||||
TAILQ_FOREACH(p, &object->memq, listq) { | TAILQ_FOREACH(p, &object->memq, listq) { | ||||
if (pmap_resident_count(pmap) <= desired) | if (pmap_resident_count(pmap) <= desired) | ||||
goto unlock_return; | goto unlock_return; | ||||
if (should_yield()) | if (should_yield()) | ||||
goto unlock_return; | goto unlock_return; | ||||
if (vm_page_busied(p)) | |||||
if (vm_page_busied(p) || vm_page_wired(p)) | |||||
continue; | continue; | ||||
VM_CNT_INC(v_pdpages); | VM_CNT_INC(v_pdpages); | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
if (vm_page_wired(p) || | if (!pmap_page_exists_quick(pmap, p)) { | ||||
!pmap_page_exists_quick(pmap, p)) { | |||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
continue; | continue; | ||||
} | } | ||||
act_delta = pmap_ts_referenced(p); | act_delta = pmap_ts_referenced(p); | ||||
if ((p->aflags & PGA_REFERENCED) != 0) { | if ((p->aflags & PGA_REFERENCED) != 0) { | ||||
if (act_delta == 0) | if (act_delta == 0) | ||||
act_delta = 1; | act_delta = 1; | ||||
vm_page_aflag_clear(p, PGA_REFERENCED); | vm_page_aflag_clear(p, PGA_REFERENCED); | ||||
} | } | ||||
if (!vm_page_active(p) && act_delta != 0) { | if (!vm_page_active(p) && act_delta != 0) { | ||||
vm_page_activate(p); | vm_page_activate(p); | ||||
p->act_count += act_delta; | p->act_count += act_delta; | ||||
} else if (vm_page_active(p)) { | } else if (vm_page_active(p)) { | ||||
if (act_delta == 0) { | if (act_delta == 0) { | ||||
p->act_count -= min(p->act_count, | p->act_count -= min(p->act_count, | ||||
ACT_DECLINE); | ACT_DECLINE); | ||||
if (!remove_mode && p->act_count == 0) { | if (!remove_mode && p->act_count == 0) { | ||||
pmap_remove_all(p); | if (vm_page_try_remove_all(p)) | ||||
vm_page_deactivate(p); | vm_page_deactivate(p); | ||||
} else | } else | ||||
vm_page_requeue(p); | vm_page_requeue(p); | ||||
} else { | } else { | ||||
vm_page_activate(p); | vm_page_activate(p); | ||||
if (p->act_count < ACT_MAX - | if (p->act_count < ACT_MAX - | ||||
ACT_ADVANCE) | ACT_ADVANCE) | ||||
p->act_count += ACT_ADVANCE; | p->act_count += ACT_ADVANCE; | ||||
vm_page_requeue(p); | vm_page_requeue(p); | ||||
} | } | ||||
} else if (vm_page_inactive(p)) | } else if (vm_page_inactive(p)) | ||||
pmap_remove_all(p); | (void)vm_page_try_remove_all(p); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
} | } | ||||
if ((backing_object = object->backing_object) == NULL) | if ((backing_object = object->backing_object) == NULL) | ||||
goto unlock_return; | goto unlock_return; | ||||
VM_OBJECT_RLOCK(backing_object); | VM_OBJECT_RLOCK(backing_object); | ||||
if (object != first_object) | if (object != first_object) | ||||
VM_OBJECT_RUNLOCK(object); | VM_OBJECT_RUNLOCK(object); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 709 Lines • Show Last 20 Lines |