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

Log:
  Add a helper function vfs_bio_bzero_buf() to zero the portion of the
  buffer, transparently handling mapped or unmapped buffers.  Its intent
  is to replace the use of bzero(bp->b_data) in cases where the buffer
  might be unmapped, to avoid unneeded upgrades.
  
  Sponsored by: The FreeBSD Foundation
  Tested by:    pho

Modified:
  head/sys/kern/vfs_bio.c
  head/sys/sys/buf.h

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c     Tue Mar 19 14:15:41 2013        (r248509)
+++ head/sys/kern/vfs_bio.c     Tue Mar 19 14:27:14 2013        (r248510)
@@ -4176,6 +4176,32 @@ unlock:
        bp->b_resid = 0;
 }
 
+void
+vfs_bio_bzero_buf(struct buf *bp, int base, int size)
+{
+       vm_page_t m;
+       int i, n;
+
+       if ((bp->b_flags & B_UNMAPPED) == 0) {
+               BUF_CHECK_MAPPED(bp);
+               bzero(bp->b_data + base, size);
+       } else {
+               BUF_CHECK_UNMAPPED(bp);
+               n = PAGE_SIZE - (base & PAGE_MASK);
+               VM_OBJECT_WLOCK(bp->b_bufobj->bo_object);
+               for (i = base / PAGE_SIZE; size > 0 && i < bp->b_npages; ++i) {
+                       m = bp->b_pages[i];
+                       if (n > size)
+                               n = size;
+                       pmap_zero_page_area(m, base & PAGE_MASK, n);
+                       base += n;
+                       size -= n;
+                       n = PAGE_SIZE;
+               }
+               VM_OBJECT_WUNLOCK(bp->b_bufobj->bo_object);
+       }
+}
+
 /*
  * vm_hold_load_pages and vm_hold_free_pages get pages into
  * a buffers address space.  The pages are anonymous and are

Modified: head/sys/sys/buf.h
==============================================================================
--- head/sys/sys/buf.h  Tue Mar 19 14:15:41 2013        (r248509)
+++ head/sys/sys/buf.h  Tue Mar 19 14:27:14 2013        (r248510)
@@ -519,6 +519,7 @@ int cluster_read(struct vnode *, u_quad_
            struct ucred *, long, int, int, struct buf **);
 int    cluster_wbuild(struct vnode *, long, daddr_t, int, int);
 void   cluster_write(struct vnode *, struct buf *, u_quad_t, int, int);
+void   vfs_bio_bzero_buf(struct buf *bp, int base, int size);
 void   vfs_bio_set_valid(struct buf *, int base, int size);
 void   vfs_bio_clrbuf(struct buf *);
 void   vfs_busy_pages(struct buf *, int clear_modify);
_______________________________________________
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