svn commit: r209605 - head/sys/kern

Alan Cox alc at FreeBSD.org
Wed Jun 30 04:52:42 UTC 2010


Author: alc
Date: Wed Jun 30 04:52:42 2010
New Revision: 209605
URL: http://svn.freebsd.org/changeset/base/209605

Log:
  Improve bufdone_finish()'s handling of the bogus page.  Specifically, if
  one or more mappings to the bogus page must be replaced, call pmap_qenter()
  just once.  Previously, pmap_qenter() was called for each mapping to the
  bogus page.
  
  MFC after:	3 weeks

Modified:
  head/sys/kern/vfs_bio.c

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Wed Jun 30 01:40:25 2010	(r209604)
+++ head/sys/kern/vfs_bio.c	Wed Jun 30 04:52:42 2010	(r209605)
@@ -3336,7 +3336,7 @@ bufdone_finish(struct buf *bp)
 		vm_ooffset_t foff;
 		vm_page_t m;
 		vm_object_t obj;
-		int iosize;
+		int bogus, iosize;
 		struct vnode *vp = bp->b_vp;
 
 		obj = bp->b_bufobj->bo_object;
@@ -3374,6 +3374,7 @@ bufdone_finish(struct buf *bp)
 		    !(bp->b_ioflags & BIO_ERROR)) {
 			bp->b_flags |= B_CACHE;
 		}
+		bogus = 0;
 		for (i = 0; i < bp->b_npages; i++) {
 			int bogusflag = 0;
 			int resid;
@@ -3387,13 +3388,11 @@ bufdone_finish(struct buf *bp)
 			 */
 			m = bp->b_pages[i];
 			if (m == bogus_page) {
-				bogusflag = 1;
+				bogus = bogusflag = 1;
 				m = vm_page_lookup(obj, OFF_TO_IDX(foff));
 				if (m == NULL)
 					panic("biodone: page disappeared!");
 				bp->b_pages[i] = m;
-				pmap_qenter(trunc_page((vm_offset_t)bp->b_data),
-				    bp->b_pages, bp->b_npages);
 			}
 #if defined(VFS_BIO_DEBUG)
 			if (OFF_TO_IDX(foff) != m->pindex) {
@@ -3447,6 +3446,9 @@ bufdone_finish(struct buf *bp)
 		}
 		vm_object_pip_wakeupn(obj, 0);
 		VM_OBJECT_UNLOCK(obj);
+		if (bogus)
+			pmap_qenter(trunc_page((vm_offset_t)bp->b_data),
+			    bp->b_pages, bp->b_npages);
 	}
 
 	/*


More information about the svn-src-all mailing list