Author: kib
Date: Tue Mar 19 14:36:28 2013
New Revision: 248512
URL: http://svnweb.freebsd.org/changeset/base/248512

Log:
  Pass unmapped buffers for page in requests if the filesystem indicated support
  for the unmapped i/o.
  
  Sponsored by: The FreeBSD Foundation
  Tested by:    pho

Modified:
  head/sys/vm/vnode_pager.c

Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c   Tue Mar 19 14:33:01 2013        (r248511)
+++ head/sys/vm/vnode_pager.c   Tue Mar 19 14:36:28 2013        (r248512)
@@ -698,6 +698,7 @@ vnode_pager_generic_getpages(vp, m, byte
        int runpg;
        int runend;
        struct buf *bp;
+       struct mount *mp;
        int count;
        int error;
 
@@ -903,9 +904,21 @@ vnode_pager_generic_getpages(vp, m, byte
        kva = (vm_offset_t)bp->b_data;
 
        /*
-        * and map the pages to be read into the kva
+        * and map the pages to be read into the kva, if the filesystem
+        * requires mapped buffers.
         */
-       pmap_qenter(kva, m, count);
+       mp = vp->v_mount;
+       if (mp != NULL && (mp->mnt_kern_flag & MNTK_UNMAPPED_BUFS) != 0 &&
+           unmapped_buf_allowed) {
+               bp->b_data = unmapped_buf;
+               bp->b_kvabase = unmapped_buf;
+               bp->b_offset = 0;
+               bp->b_flags |= B_UNMAPPED;
+               bp->b_npages = count;
+               for (i = 0; i < count; i++)
+                       bp->b_pages[i] = m[i];
+       } else
+               pmap_qenter(kva, m, count);
 
        /* build a minimal buffer header */
        bp->b_iocmd = BIO_READ;
@@ -934,11 +947,22 @@ vnode_pager_generic_getpages(vp, m, byte
        if ((bp->b_ioflags & BIO_ERROR) != 0)
                error = EIO;
 
-       if (!error) {
-               if (size != count * PAGE_SIZE)
-                       bzero((caddr_t) kva + size, PAGE_SIZE * count - size);
+       if (error != 0 && size != count * PAGE_SIZE) {
+               if ((bp->b_flags & B_UNMAPPED) != 0) {
+                       bp->b_flags &= ~B_UNMAPPED;
+                       pmap_qenter(kva, m, count);
+               }
+               bzero((caddr_t)kva + size, PAGE_SIZE * count - size);
+       }
+       if ((bp->b_flags & B_UNMAPPED) == 0)
+               pmap_qremove(kva, count);
+       if (mp != NULL && (mp->mnt_kern_flag & MNTK_UNMAPPED_BUFS) != 0) {
+               bp->b_data = (caddr_t)kva;
+               bp->b_kvabase = (caddr_t)kva;
+               bp->b_flags &= ~B_UNMAPPED;
+               for (i = 0; i < count; i++)
+                       bp->b_pages[i] = NULL;
        }
-       pmap_qremove(kva, count);
 
        /*
         * free the buffer header back to the swap buffer pool
_______________________________________________
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"

Reply via email to