Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_pageout.c
Show First 20 Lines • Show All 369 Lines • ▼ Show 20 Lines | while (ib != 0 && pageout_count < vm_pageout_page_count) { | ||||
vm_page_test_dirty(p); | vm_page_test_dirty(p); | ||||
if (p->dirty == 0) { | if (p->dirty == 0) { | ||||
ib = 0; | ib = 0; | ||||
break; | break; | ||||
} | } | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
if (vm_page_wired(p) || !vm_page_in_laundry(p)) { | if (vm_page_wired(p) || !vm_page_in_laundry(p)) { | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
vm_page_xunbusy(p); | |||||
jeff: Merge bug for later diff. | |||||
ib = 0; | ib = 0; | ||||
break; | break; | ||||
} | } | ||||
pmap_remove_write(p); | pmap_remove_write(p); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
mc[--page_base] = pb = p; | mc[--page_base] = pb = p; | ||||
++pageout_count; | ++pageout_count; | ||||
++ib; | ++ib; | ||||
Show All 10 Lines | while (pageout_count < vm_pageout_page_count && | ||||
if ((p = vm_page_next(ps)) == NULL || vm_page_busied(p)) | if ((p = vm_page_next(ps)) == NULL || vm_page_busied(p)) | ||||
break; | break; | ||||
vm_page_test_dirty(p); | vm_page_test_dirty(p); | ||||
if (p->dirty == 0) | if (p->dirty == 0) | ||||
break; | break; | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
if (vm_page_wired(p) || !vm_page_in_laundry(p)) { | if (vm_page_wired(p) || !vm_page_in_laundry(p)) { | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
vm_page_xunbusy(p); | |||||
break; | break; | ||||
} | } | ||||
pmap_remove_write(p); | pmap_remove_write(p); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
mc[page_base + pageout_count] = ps = p; | mc[page_base + pageout_count] = ps = p; | ||||
++pageout_count; | ++pageout_count; | ||||
++is; | ++is; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | vm_pageout_clean(vm_page_t m, int *numpagedout) | ||||
* We can't wait forever for the vnode lock, we might | * We can't wait forever for the vnode lock, we might | ||||
* deadlock due to a vn_read() getting stuck in | * deadlock due to a vn_read() getting stuck in | ||||
* vm_wait while holding this vnode. We skip the | * vm_wait while holding this vnode. We skip the | ||||
* vnode if we can't get it in a reasonable amount | * vnode if we can't get it in a reasonable amount | ||||
* of time. | * of time. | ||||
*/ | */ | ||||
if (object->type == OBJT_VNODE) { | if (object->type == OBJT_VNODE) { | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
vm_page_xunbusy(m); | |||||
vp = object->handle; | vp = object->handle; | ||||
if (vp->v_type == VREG && | if (vp->v_type == VREG && | ||||
vn_start_write(vp, &mp, V_NOWAIT) != 0) { | vn_start_write(vp, &mp, V_NOWAIT) != 0) { | ||||
mp = NULL; | mp = NULL; | ||||
error = EDEADLK; | error = EDEADLK; | ||||
goto unlock_all; | goto unlock_all; | ||||
} | } | ||||
KASSERT(mp != NULL, | KASSERT(mp != NULL, | ||||
▲ Show 20 Lines • Show All 1,489 Lines • Show Last 20 Lines |
Merge bug for later diff.