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);
        }
 
        /*
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to