svn commit: r191986 - head/sys/kern
Alan Cox
alc at FreeBSD.org
Mon May 11 05:16:59 UTC 2009
Author: alc
Date: Mon May 11 05:16:57 2009
New Revision: 191986
URL: http://svn.freebsd.org/changeset/base/191986
Log:
Revert CVS revision 1.94 (svn r16840). Current pmap implementations don't
suffer from the race condition that motivated revision 1.94. Consequently,
the work-around that was implemented by revision 1.94 is no longer needed.
Moreover, reverting this work-around eliminates the need for
vfs_busy_pages() to acquire the page queues lock when preparing a buffer
for read.
Reviewed by: tegge
Modified:
head/sys/kern/vfs_bio.c
Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c Mon May 11 04:57:40 2009 (r191985)
+++ head/sys/kern/vfs_bio.c Mon May 11 05:16:57 2009 (r191986)
@@ -3519,7 +3519,8 @@ retry:
goto retry;
}
bogus = 0;
- vm_page_lock_queues();
+ if (clear_modify)
+ vm_page_lock_queues();
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@@ -3542,17 +3543,18 @@ retry:
* It may not work properly with small-block devices.
* We need to find a better way.
*/
- pmap_remove_all(m);
- if (clear_modify)
+ if (clear_modify) {
+ pmap_remove_write(m);
vfs_page_set_valid(bp, foff, m);
- else if (m->valid == VM_PAGE_BITS_ALL &&
+ } else if (m->valid == VM_PAGE_BITS_ALL &&
(bp->b_flags & B_CACHE) == 0) {
bp->b_pages[i] = bogus_page;
bogus++;
}
foff = (foff + PAGE_SIZE) & ~(off_t)PAGE_MASK;
}
- vm_page_unlock_queues();
+ if (clear_modify)
+ vm_page_unlock_queues();
VM_OBJECT_UNLOCK(obj);
if (bogus)
pmap_qenter(trunc_page((vm_offset_t)bp->b_data),
More information about the svn-src-head
mailing list