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

Kip Macy kmacy at FreeBSD.org
Sat Jan 9 23:34:41 UTC 2010


Author: kmacy
Date: Sat Jan  9 23:34:40 2010
New Revision: 201956
URL: http://svn.freebsd.org/changeset/base/201956

Log:
  - fix buildworld
  - add check for overlaps in on insert
  - add additional cases to evict overlap
  - cache pages that are part of freed buffers

Modified:
  user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_bio.h
  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/sys/zfs_bio.h
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_bio.h	Sat Jan  9 23:24:49 2010	(r201955)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_bio.h	Sat Jan  9 23:34:40 2010	(r201956)
@@ -47,10 +47,11 @@ zio_sync_cache(spa_t *spa, blkptr_t *bp,
 {
 	int io_bypass = 0;
 
+#ifdef	_KERNEL
 	if (!zfs_page_cache_disable && (vd == NULL) &&
 	    ((type == ZIO_TYPE_WRITE) || (type == ZIO_TYPE_READ)))
 		io_bypass = _zio_sync_cache(spa, bp, txg, data, size, type);
-
+#endif
 	return (io_bypass);
 }
 
@@ -58,17 +59,21 @@ static __inline void
 zio_cache_valid(void *data, uint64_t size, zio_type_t type, vdev_t *vd) 
 {
 
+#ifdef	_KERNEL
 	if (((vd == NULL) || (vd->vdev_spa->spa_root_vdev == vd)) &&
 	    (type == ZIO_TYPE_READ) && (size & PAGE_MASK) == 0)
 		_zio_cache_valid(data, size);
+#endif	
 }
 
+
 void *zio_getblk(uint64_t size, int flags);
 void zio_relse(void *data, size_t size);
 void *zio_spa_state_alloc(spa_t *spa);
-
-#ifdef _KERNEL
 void zfs_bio_init(void);
 void zfs_bio_fini(void);
+
+#ifndef _KERNEL
+#define GB_NODUMP	0
 #endif
 #endif

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 Jan  9 23:24:49 2010	(r201955)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Sat Jan  9 23:34:40 2010	(r201956)
@@ -100,13 +100,13 @@ __FBSDID("$FreeBSD$");
 #include <sys/kstat.h>
 #include <sys/sdt.h>
 
-#include <sys/sf_buf.h>
 #include <sys/zfs_bio.h>
 
+int zfs_page_cache_disable = 1;
 #ifdef _KERNEL
+#include <sys/sf_buf.h>
 
 SYSCTL_DECL(_vfs_zfs);
-int zfs_page_cache_disable = 1;
 TUNABLE_INT("vfs.zfs.page_cache_disable", &zfs_page_cache_disable);
 SYSCTL_INT(_vfs_zfs, OID_AUTO, page_cache_disable, CTLFLAG_RDTUN,
     &zfs_page_cache_disable, 0, "Disable backing ARC with page cache ");
@@ -198,7 +198,6 @@ buf_hash(caddr_t va, uint64_t size)
 	int i;
 
 	ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY);
-
 	for (i = 0; i < sizeof (caddr_t); i++)
 		crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ vav[i]) & 0xFF];
 
@@ -208,8 +207,6 @@ buf_hash(caddr_t va, uint64_t size)
 }
 
 const char *buf_lock = "ht_lock";
-
-
 void
 buf_init(void)
 {
@@ -376,6 +373,27 @@ zio_buf_va_remove(caddr_t va, uint64_t s
 	return (bp);
 }
 
+static void
+zio_buf_find_duplicates(zio_spa_state_t object)
+{
+	buf_t bp0, bp1;
+	
+	
+	TAILQ_FOREACH(bp0, &object->zss_blkno_memq, b_freelist) {		
+		TAILQ_FOREACH(bp1, &object->zss_blkno_memq, b_freelist) {
+			if (bp0 == bp1)
+				continue;
+			if (((bp0->b_blkno >= bp1->b_blkno) &&
+			    (bp0->b_blkno < bp1->b_blkno + btos(bp1->b_bcount))) ||
+			    ((bp0->b_blkno + btos(bp0->b_bcount) > bp1->b_blkno) &&
+				(bp0->b_blkno + btos(bp0->b_bcount) <=
+				    bp1->b_blkno + btos(bp1->b_bcount))))
+				panic("duplicate blkno mappings at %lld",
+				    bp0->b_blkno);
+		}
+	}
+}
+
 /*
  *	zio_buf_blkno_splay:		[ internal use only ]
  *
@@ -483,6 +501,7 @@ zio_buf_blkno_insert(buf_t bp, zio_spa_s
 	 * show that the object has one more resident buffer.
 	 */
 	object->zss_resident_count++;
+	zio_buf_find_duplicates(object);
 }
 
 /*
@@ -687,11 +706,25 @@ zio_buf_evict_overlap(vm_object_t object
 	if ((root = state->zss_blkno_root) == NULL)
 		goto done;
 
+	if (blkno >= root->b_blkno &&
+	    blkno_end <= root->b_blkno + btos(root->b_bcount)) {
+		tmpbp = root;
+		collisions = 1;
+		goto evict;
+	}
+	
 	collisions = 0;
 	blkno_end = blkno + btos(size);
 	if ((root = zio_buf_blkno_splay(blkno, root)) == NULL)
 		goto done;
 
+	if (blkno >= root->b_blkno &&
+	    blkno_end <= root->b_blkno + btos(root->b_bcount)) {
+		tmpbp = root;
+		collisions = 1;
+		goto evict;
+	}
+
 	if ((blkno >= root->b_blkno) ||
 	    (tmpbp = TAILQ_PREV(root, cluster_list_head, b_freelist)) == NULL ||
 	    (blkno >= tmpbp->b_blkno + btos(tmpbp->b_bcount)))
@@ -721,6 +754,7 @@ zio_buf_evict_overlap(vm_object_t object
 	while (!TAILQ_EMPTY(&clh)) {
 		tmpbp = TAILQ_FIRST(&clh);
 		TAILQ_REMOVE(&clh, tmpbp, b_cluster.cluster_entry);
+	evict:
 		zio_buf_vm_object_evict(tmpbp);
 		tmpbp->b_bufobj = NULL;
 		tmpbp->b_flags &= ~B_VMIO;
@@ -762,6 +796,8 @@ vm_object_reference_pages(vm_object_t ob
 	vm_page_lock_queues();
 	for (i = 0; i < bp->b_npages; i++) {
 		m = vm_page_lookup(object, start + i);
+		vm_pageq_remove(m);
+		m->flags |= PG_UNMANAGED;
 		vm_page_wire(m);
 		bp->b_pages[i] = m;
 	}
@@ -859,15 +895,20 @@ zio_relse(void *data, size_t size)
 	bp = zio_buf_va_remove(data, size);
 
 	if (bp->b_flags & B_VMIO) {
+		VM_OBJECT_LOCK(zio_buf_get_vm_object(bp));
 		vm_page_lock_queues();
 		for (i = 0; i < bp->b_npages; i++) {
 			m = bp->b_pages[i];
 			m->wire_count--;
 			m->flags &= ~PG_UNMANAGED;
-			vm_page_deactivate(m);
-			m->wire_count++; /* brelse assumes wire_count is set */
+			vm_page_cache(m);
+			bp->b_pages[i] = 0;
 		}
 		vm_page_unlock_queues();
+		VM_OBJECT_UNLOCK(zio_buf_get_vm_object(bp));
+		atomic_subtract_int(&cnt.v_wire_count, bp->b_npages);
+		pmap_qremove((vm_offset_t)bp->b_saveaddr, bp->b_npages);
+		bp->b_npages = 0;
 		zio_buf_blkno_remove(bp);
 	}
 	
@@ -882,7 +923,7 @@ zio_relse(void *data, size_t size)
 		    " size %ld blkno=%ld",
 		    bp, bp->b_flags, size, bp->b_blkno);
 		bp->b_flags |= (B_ZFS|B_INVAL);
-		bp->b_flags &= ~B_CACHE;
+		bp->b_flags &= ~(B_CACHE|B_VMIO);
 		brelse(bp);
 	}
 }
@@ -964,8 +1005,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 				m->wire_count--;
 				vm_page_free(m);
 			}
-
-		
+			atomic_subtract_int(&cnt.v_wire_count, bp->b_npages);
 			vm_object_reference_pages(object, bp);
 		} else
 			zio_buf_vm_object_insert(bp, vp, object, FALSE);
@@ -1055,13 +1095,13 @@ zfs_bio_fini(void)
 #else /* !_KERNEL */
 
 void *
-zio_getblk(uint64_t size)
+zio_getblk(uint64_t size, int flags)
 {
 	return (zio_buf_alloc(size));
 }
 
-void
-zio_data_getblk(uint64_t size)
+void *
+zio_data_getblk(uint64_t size, int flags)
 {
 
 	return (zio_data_buf_alloc(size));
@@ -1075,9 +1115,14 @@ zio_relse(void *data, size_t size)
 }
 
 void
-zio_sync_cache(spa_t *spa, blkptr_t *bp, uint64_t txg, uint64_t size)
+zfs_bio_init(void)
+{
+}
+
+void
+zfs_bio_fini(void)
 {
-	;
 }
+
 #endif
 


More information about the svn-src-user mailing list