svn commit: r200430 - user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Kip Macy kmacy at FreeBSD.org
Sat Dec 12 04:50:05 UTC 2009


Author: kmacy
Date: Sat Dec 12 04:50:04 2009
New Revision: 200430
URL: http://svn.freebsd.org/changeset/base/200430

Log:
  functions for
  - synchronizing B_MALLOC buffers with the page cache
  - eviction of pages from the backing object

Modified:
  user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c

Modified: user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Sat Dec 12 04:34:22 2009	(r200429)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Sat Dec 12 04:50:04 2009	(r200430)
@@ -93,7 +93,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/kstat.h>
 #include <sys/sdt.h>
 
-#include <sys/bitstring.h>
+
+#include <sys/sf_buf.h>
 #include <vm/vm_pageout.h>
 
 #ifdef _KERNEL
@@ -122,6 +123,8 @@ MALLOC_DEFINE(M_ZFS_BIO, "zfs_bio", "zfs
 #define	B_ASSIGNED	B_00004000	
 
 #define	ZB_EVICT_ALL	0x1
+#define	ZB_COPYIN	0x2
+#define	ZB_COPYOUT	0x3
 
 #define btos(nbytes)	((nbytes)>>DEV_BSHIFT)
 #define stob(nsectors)	((nsectors)<<DEV_BSHIFT) 
@@ -143,9 +146,10 @@ struct zbio_state {
 #define ZBIO_STATE_LOCK(zs)	mtx_lock(&(zs)->mtx)
 #define	ZBIO_STATE_UNLOCK(zs)	mtx_unlock(&(zs)->mtx)
 
-#define	spa_get_bio_state(spa)	((zbio_state_t *)spa_get_vnode((spa))->v_data)
-#define	spa_get_vm_object(spa)	spa_get_vnode((spa))->v_object
-#define	zbio_buf_get_spa(bp)	(((zbio_buf_hdr_t *)((arc_buf_t *)(bp->b_arc_buf))->b_hdr)->b_spa)
+#define	spa_get_bio_state(spa)		((zbio_state_t *)spa_get_vnode((spa))->v_data)
+#define	spa_get_vm_object(spa)		spa_get_vnode((spa))->v_object
+#define	zbio_buf_get_spa(bp)		(((zbio_buf_hdr_t *)((arc_buf_t *)(bp->b_arc_buf))->b_hdr)->b_spa)
+#define	zbio_buf_get_vm_object(bp)	spa_get_vm_object(zbio_buf_get_spa((bp)))
 
 static void zbio_buf_blkno_remove(buf_t *bp);
 static void zbio_buf_va_insert(buf_t *bp, zbio_state_t *object);
@@ -481,29 +485,87 @@ zbio_buf_blkno_lookup(zbio_state_t *stat
 }
 
 static void
-zbio_buf_vm_object_copyin(buf_t *bp)
+zbio_buf_vm_object_copy(buf_t *bp, int direction)
 {
+	vm_object_t object;
+	vm_pindex_t start, end;
+	vm_offset_t offset;
+	uint64_t byte_offset;
+	vm_offset_t page_offset;
+	int i, size;	
+	caddr_t va;	
+	vm_page_t m;
+	struct sf_buf *sf;
 
+	object = zbio_buf_get_vm_object(bp);
+	byte_offset = stob(bp->b_blkno);
+	page_offset = byte_offset & PAGE_MASK;
+	start = OFF_TO_IDX(byte_offset);
+	end = OFF_TO_IDX(byte_offset + bp->b_bcount);
+
+	VM_OBJECT_LOCK(object);	
+	for (bp->b_npages = i = 0; start + i < end; i++) {
+		m = vm_page_lookup(object, start + i);
+
+		if ((m == NULL) || (m->valid != VM_PAGE_BITS_ALL))
+			goto done;
+
+		bp->b_pages[i] = m;		
+		bp->b_npages++;
+	}
+	for (i = 0; i < bp->b_npages; i++) {		
+		sf = sf_buf_alloc(bp->b_pages[i], 0);
+		va = (caddr_t)sf_buf_kva(sf);
+		size = PAGE_SIZE;		
+				
+		if (i == 0) 
+			va += page_offset;
+		if (i == bp->b_npages - 1)
+			size = PAGE_SIZE - page_offset;
+
+		if (direction == ZB_COPYIN)
+			memcpy(bp->b_data + PAGE_SIZE*i, va, size);
+		else
+			memcpy(va, bp->b_data + PAGE_SIZE*i, size);
+		sf_buf_free(sf);
+	}
 	
+done:
+	bp->b_npages = 0;
+	VM_OBJECT_UNLOCK(object);
 }
 
 static void
 zbio_buf_vm_object_copyout(buf_t *bp)
 {
+	
+	zbio_buf_vm_object_copy(bp, ZB_COPYOUT);
+}
 
+static void
+zbio_buf_vm_object_copyin(buf_t *bp)
+{
 	
+	zbio_buf_vm_object_copy(bp, ZB_COPYIN);
 }
 
 static void
 zbio_buf_vm_object_evict(buf_t *bp)
 {
 	int i;
+	vm_page_t m;
 
+	VM_OBJECT_LOCK_ASSERT(zbio_buf_get_vm_object(bp), MA_OWNED);
 	/*
 	 * remove pages from backing vm_object 
 	 */
-	for (i = 0; i < bp->b_npages; i++) 
-		vm_page_remove(bp->b_pages[i]);
+	for (i = 0; i < bp->b_npages; i++) {
+		m = bp->b_pages[i];
+		vm_pageq_remove(m);
+		vm_page_remove(m);
+		m->valid = 0;
+		m->flags |= PG_UNMANAGED;
+	}
 }
 
 static void
@@ -513,7 +575,7 @@ zbio_buf_vm_object_insert(buf_t *bp, int
 	vm_pindex_t start = OFF_TO_IDX(stob(bp->b_blkno));
 	spa_t *spa = zbio_buf_get_spa(bp);
 	struct vnode *vp = spa_get_vnode(spa);
-	struct vm_object *object = vp->v_object;
+	vm_object_t object = vp->v_object;
 	int i;
 
 	VM_OBJECT_LOCK(object);


More information about the svn-src-user mailing list