diff options
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r-- | sys/vm/swap_pager.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 2f43bc4..78d9849 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -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; |