Hold the page queues lock when performing vm_page_flag_set().

This commit is contained in:
Alan Cox 2002-12-18 04:02:02 +00:00
parent c021e44776
commit b365ea9e30
2 changed files with 9 additions and 1 deletions

View File

@ -1107,6 +1107,7 @@ swap_pager_getpages(object, m, count, reqpage)
bp->b_bufsize = PAGE_SIZE * (j - i);
bp->b_pager.pg_reqpage = reqpage - i;
vm_page_lock_queues();
{
int k;
@ -1115,6 +1116,7 @@ swap_pager_getpages(object, m, count, reqpage)
vm_page_flag_set(m[k], PG_SWAPINPROG);
}
}
vm_page_unlock_queues();
bp->b_npages = j - i;
pbgetvp(swapdev_vp, bp);
@ -1149,10 +1151,11 @@ swap_pager_getpages(object, m, count, reqpage)
* is set in the meta-data.
*/
s = splvm();
vm_page_lock_queues();
while ((mreq->flags & PG_SWAPINPROG) != 0) {
vm_page_flag_set(mreq, PG_WANTED | PG_REFERENCED);
cnt.v_intrans++;
if (tsleep(mreq, PSWP, "swread", hz*20)) {
if (msleep(mreq, &vm_page_queue_mtx, PSWP, "swread", hz*20)) {
printf(
"swap_pager: indefinite wait buffer: device:"
" %s, blkno: %ld, size: %ld\n",
@ -1161,6 +1164,7 @@ swap_pager_getpages(object, m, count, reqpage)
);
}
}
vm_page_unlock_queues();
splx(s);
/*
@ -1358,7 +1362,9 @@ swap_pager_putpages(object, m, count, sync, rtvals)
vm_page_dirty(mreq);
rtvals[i+j] = VM_PAGER_OK;
vm_page_lock_queues();
vm_page_flag_set(mreq, PG_SWAPINPROG);
vm_page_unlock_queues();
bp->b_pages[j] = mreq;
}
bp->b_npages = n;

View File

@ -857,8 +857,10 @@ rescan0:
* before being freed. This significantly extends
* the thrash point for a heavily loaded machine.
*/
vm_page_lock_queues();
vm_page_flag_set(m, PG_WINATCFLS);
vm_pageq_requeue(m);
vm_page_unlock_queues();
} else if (maxlaunder > 0) {
/*
* We always want to try to flush some dirty pages if