Author: alc Date: Mon May 3 16:41:11 2010 New Revision: 207573 URL: http://svn.freebsd.org/changeset/base/207573
Log: Acquire the page lock around vm_page_unwire() and vm_page_wire(). Reviewed by: kib Modified: head/sys/fs/tmpfs/tmpfs_vnops.c head/sys/kern/vfs_bio.c Modified: head/sys/fs/tmpfs/tmpfs_vnops.c ============================================================================== --- head/sys/fs/tmpfs/tmpfs_vnops.c Mon May 3 16:08:24 2010 (r207572) +++ head/sys/fs/tmpfs/tmpfs_vnops.c Mon May 3 16:41:11 2010 (r207573) @@ -460,9 +460,11 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p error = uiomove_fromphys(&m, offset, tlen, uio); VM_OBJECT_LOCK(tobj); out: + vm_page_lock(m); vm_page_lock_queues(); vm_page_unwire(m, TRUE); vm_page_unlock_queues(); + vm_page_unlock(m); vm_page_wakeup(m); vm_object_pip_subtract(tobj, 1); VM_OBJECT_UNLOCK(tobj); @@ -691,6 +693,7 @@ nocache: out: if (vobj != NULL) VM_OBJECT_LOCK(vobj); + vm_page_lock(tpg); vm_page_lock_queues(); if (error == 0) { KASSERT(tpg->valid == VM_PAGE_BITS_ALL, @@ -699,6 +702,7 @@ out: } vm_page_unwire(tpg, TRUE); vm_page_unlock_queues(); + vm_page_unlock(tpg); vm_page_wakeup(tpg); if (vpg != NULL) vm_page_wakeup(vpg); Modified: head/sys/kern/vfs_bio.c ============================================================================== --- head/sys/kern/vfs_bio.c Mon May 3 16:08:24 2010 (r207572) +++ head/sys/kern/vfs_bio.c Mon May 3 16:41:11 2010 (r207573) @@ -2942,7 +2942,6 @@ allocbuf(struct buf *bp, int size) vm_page_t m; VM_OBJECT_LOCK(bp->b_bufobj->bo_object); - vm_page_lock_queues(); for (i = desiredpages; i < bp->b_npages; i++) { /* * the page is not freed here -- it @@ -2952,13 +2951,17 @@ allocbuf(struct buf *bp, int size) m = bp->b_pages[i]; KASSERT(m != bogus_page, ("allocbuf: bogus page found")); - while (vm_page_sleep_if_busy(m, TRUE, "biodep")) - vm_page_lock_queues(); + while (vm_page_sleep_if_busy(m, TRUE, + "biodep")) + continue; bp->b_pages[i] = NULL; + vm_page_lock(m); + vm_page_lock_queues(); vm_page_unwire(m, 0); + vm_page_unlock_queues(); + vm_page_unlock(m); } - vm_page_unlock_queues(); VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object); pmap_qremove((vm_offset_t) trunc_page((vm_offset_t)bp->b_data) + (desiredpages << PAGE_SHIFT), (bp->b_npages - desiredpages)); @@ -3039,9 +3042,11 @@ allocbuf(struct buf *bp, int size) /* * We have a good page. */ + vm_page_lock(m); vm_page_lock_queues(); vm_page_wire(m); vm_page_unlock_queues(); + vm_page_unlock(m); bp->b_pages[bp->b_npages] = m; ++bp->b_npages; } _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"