Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_pageout.c
Show First 20 Lines • Show All 378 Lines • ▼ Show 20 Lines | if (ib > pindex) { | ||||
ib = 0; | ib = 0; | ||||
break; | break; | ||||
} | } | ||||
if ((p = vm_page_prev(pb)) == NULL || vm_page_busied(p)) { | if ((p = vm_page_prev(pb)) == NULL || vm_page_busied(p)) { | ||||
ib = 0; | ib = 0; | ||||
break; | break; | ||||
} | } | ||||
vm_page_test_dirty(p); | vm_page_test_dirty(p); | ||||
if (p->dirty == 0 || !vm_page_in_laundry(p)) { | if (p->dirty == 0) { | ||||
ib = 0; | ib = 0; | ||||
break; | break; | ||||
} | } | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
if (vm_page_held(p)) { | if (vm_page_held(p) || !vm_page_in_laundry(p)) { | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
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; | ||||
/* | /* | ||||
* We are at an alignment boundary. Stop here, and switch | * We are at an alignment boundary. Stop here, and switch | ||||
* directions. Do not clear ib. | * directions. Do not clear ib. | ||||
*/ | */ | ||||
if ((pindex - (ib - 1)) % vm_pageout_page_count == 0) | if ((pindex - (ib - 1)) % vm_pageout_page_count == 0) | ||||
break; | break; | ||||
} | } | ||||
while (pageout_count < vm_pageout_page_count && | while (pageout_count < vm_pageout_page_count && | ||||
pindex + is < object->size) { | pindex + is < object->size) { | ||||
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 || !vm_page_in_laundry(p)) | if (p->dirty == 0) | ||||
break; | break; | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
if (vm_page_held(p)) { | if (vm_page_held(p) || !vm_page_in_laundry(p)) { | ||||
vm_page_unlock(p); | vm_page_unlock(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 697 Lines • ▼ Show 20 Lines | dolaundry: | ||||
} | } | ||||
} | } | ||||
static int | static int | ||||
vm_pageout_reinsert_inactive_page(struct scan_state *ss, vm_page_t m) | vm_pageout_reinsert_inactive_page(struct scan_state *ss, vm_page_t m) | ||||
{ | { | ||||
struct vm_domain *vmd; | struct vm_domain *vmd; | ||||
if (!vm_page_inactive(m) || (m->aflags & PGA_ENQUEUED) != 0) | if (m->queue != PQ_INACTIVE || (m->aflags & PGA_ENQUEUED) != 0) | ||||
return (0); | return (0); | ||||
vm_page_aflag_set(m, PGA_ENQUEUED); | vm_page_aflag_set(m, PGA_ENQUEUED); | ||||
if ((m->aflags & PGA_REQUEUE_HEAD) != 0) { | if ((m->aflags & PGA_REQUEUE_HEAD) != 0) { | ||||
vmd = vm_pagequeue_domain(m); | vmd = vm_pagequeue_domain(m); | ||||
TAILQ_INSERT_BEFORE(&vmd->vmd_inacthead, m, plinks.q); | TAILQ_INSERT_BEFORE(&vmd->vmd_inacthead, m, plinks.q); | ||||
vm_page_aflag_clear(m, PGA_REQUEUE | PGA_REQUEUE_HEAD); | vm_page_aflag_clear(m, PGA_REQUEUE | PGA_REQUEUE_HEAD); | ||||
} else if ((m->aflags & PGA_REQUEUE) != 0) { | } else if ((m->aflags & PGA_REQUEUE) != 0) { | ||||
TAILQ_INSERT_TAIL(&ss->pq->pq_pl, m, plinks.q); | TAILQ_INSERT_TAIL(&ss->pq->pq_pl, m, plinks.q); | ||||
▲ Show 20 Lines • Show All 948 Lines • Show Last 20 Lines |