svn commit: r207573 - in head/sys: fs/tmpfs kern
Alan Cox
alc at FreeBSD.org
Mon May 3 16:41:12 UTC 2010
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;
}
More information about the svn-src-all
mailing list