Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Dec 2009 04:50:18 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r200932 - in user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys
Message-ID:  <200912240450.nBO4oIVD019320@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kmacy
Date: Thu Dec 24 04:50:18 2009
New Revision: 200932
URL: http://svn.freebsd.org/changeset/base/200932

Log:
  - use VMIO to indicate assignment
  - remove gratuitous flags
  - allocate spa state structure at vdev vnode allocation time
  - pass object pointer to copyin / copyout

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/vdev.c
  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	Thu Dec 24 01:28:26 2009	(r200931)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_bio.h	Thu Dec 24 04:50:18 2009	(r200932)
@@ -46,8 +46,7 @@ zio_sync_cache(spa_t *spa, blkptr_t *bp,
 {
 	int io_bypass = 0;
 
-	if (!zfs_page_cache_disable &&
-	    ((vd != NULL) && (vd->vdev_vnode != NULL)) &&
+	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);
 
@@ -59,12 +58,13 @@ zio_cache_valid(void *data, uint64_t siz
 {
 
 	if ((vd != NULL) && (type == ZIO_TYPE_READ) &&
-	    (vd->vdev_vnode != NULL) && (size & PAGE_MASK) == 0)
+	    (size & PAGE_MASK) == 0)
 		_zio_cache_valid(data, size);
 }
 
 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);

Modified: user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Thu Dec 24 01:28:26 2009	(r200931)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Thu Dec 24 04:50:18 2009	(r200932)
@@ -40,6 +40,10 @@
 #include <sys/fs/zfs.h>
 #include <sys/arc.h>
 
+#ifdef _KERNEL
+#include <sys/zfs_bio.h>
+#endif
+
 SYSCTL_DECL(_vfs_zfs);
 SYSCTL_NODE(_vfs_zfs, OID_AUTO, vdev, CTLFLAG_RW, 0, "ZFS VDEV");
 
@@ -1077,6 +1081,7 @@ vdev_open(vdev_t *vd)
 		vp->v_type = VREG;
 		vnode_create_vobject(vp, 512, curthread);
 		vd->vdev_vnode = vp;
+		vp->v_data = zio_spa_state_alloc(vd->vdev_spa);
 		VOP_UNLOCK(vp, 0);
 		KASSERT(vp->v_object != NULL, ("vnode_create_vobject failed"));		
 		

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	Thu Dec 24 01:28:26 2009	(r200931)
+++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c	Thu Dec 24 04:50:18 2009	(r200932)
@@ -110,9 +110,7 @@ typedef	struct buf	*	buf_t;
 
 MALLOC_DEFINE(M_ZFS_BIO, "zfs_bio", "zfs buffer cache / vm");
 
-#define	B_EVICTED	B_00000800
 #define	B_DATA		B_00001000
-#define	B_ASSIGNED	B_00004000	
 
 #define	ZB_EVICT_ALL		0x1
 #define	ZB_EVICT_BUFFERED	0x2
@@ -182,16 +180,16 @@ static buf_hash_table_t buf_hash_table;
 static uint64_t
 buf_hash(caddr_t va, uint64_t size)
 {
-	uint8_t *vav = (uint8_t *)&va;
 	uint64_t crc = -1ULL;
+	uint8_t *vav = (uint8_t *)&va;
 	int i;
 
 	ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY);
 
-	for (i = i; i < sizeof (caddr_t); i++)
+	for (i = 0; i < sizeof (caddr_t); i++)
 		crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ vav[i]) & 0xFF];
 
-	crc ^= (size>>9);
+	crc ^= (size>>4);
 
 	return (crc);
 }
@@ -232,6 +230,21 @@ retry:
 		mtx_init(&(buf_hash_table.ht_locks[i].ht_lock),  buf_lock, NULL, MTX_DEF|MTX_DUPOK);
 }
 
+void *
+zio_spa_state_alloc(spa_t *spa)
+{
+	struct zio_spa_state *zss;
+
+	zss = malloc(sizeof(struct zio_spa_state), M_ZFS_BIO, M_WAITOK|M_ZERO);
+
+	zss->zss_spa = spa;
+	mtx_init(&zss->zss_mtx, "zio_spa_state", NULL, MTX_DEF);
+	TAILQ_INIT(&zss->zss_blkno_memq);
+
+	return (zss);
+}
+
+
 /*
  *	zio_buf_insert:		[ internal use only ]
  *
@@ -244,13 +257,16 @@ INLINE void
 zio_buf_va_insert(buf_t bp)
 {
 	caddr_t va = bp->b_data;
-	uint64_t idx, size = bp->b_bcount;
+	long idx, size = bp->b_bcount;
 	struct mtx *lock;
 	buf_head_t bh;
 
 	idx = BUF_HASH_INDEX(va, size);
 	lock = BUF_HASH_LOCK(idx);
 	bh = &buf_hash_table.ht_table[idx];
+
+	CTR3(KTR_SPARE3, "va_insert(va=%p size=%ld) idx=%ld", va, size, idx);
+
 	mtx_lock(lock);
 	TAILQ_INSERT_HEAD(bh, bp, b_freelist);
 	mtx_unlock(lock);
@@ -297,7 +313,7 @@ zio_buf_va_lookup(caddr_t va, uint64_t s
 INLINE buf_t
 zio_buf_va_remove(caddr_t va, uint64_t size)
 {
-	uint64_t idx;
+	long idx;
 	struct mtx *lock;
 	buf_head_t bh;
 	buf_t bp;
@@ -305,6 +321,9 @@ zio_buf_va_remove(caddr_t va, uint64_t s
 	idx = BUF_HASH_INDEX(va, size);
 	lock = BUF_HASH_LOCK(idx);
 	bh = &buf_hash_table.ht_table[idx];
+
+
+	CTR3(KTR_SPARE3, "va_remove(va=%p size=%ld) idx=%ld", va, (long)size, idx);
 	mtx_lock(lock);
 	TAILQ_FOREACH(bp, bh, b_freelist)
 	    if (bp->b_data == va) {
@@ -489,9 +508,8 @@ zio_buf_blkno_remove(buf_t bp)
 }
 
 static __inline void
-zio_buf_vm_object_copy(buf_t bp, int direction)
+zio_buf_vm_object_copy(vm_object_t object, buf_t bp, int direction)
 {
-	vm_object_t object;
 	vm_pindex_t start, end;
 	vm_offset_t offset;
 	uint64_t byte_offset;
@@ -501,7 +519,6 @@ zio_buf_vm_object_copy(buf_t bp, int dir
 	vm_page_t m;
 	struct sf_buf *sf;
 
-	object = zio_buf_get_vm_object(bp);
 	byte_offset = stob(bp->b_blkno);
 	page_offset = byte_offset & PAGE_MASK;
 	start = OFF_TO_IDX(byte_offset);
@@ -542,17 +559,17 @@ done:
 }
 
 static void
-zio_buf_vm_object_copyout(buf_t bp)
+zio_buf_vm_object_copyout(vm_object_t object, buf_t bp)
 {
 	
-	zio_buf_vm_object_copy(bp, ZB_COPYOUT);
+	zio_buf_vm_object_copy(object, bp, ZB_COPYOUT);
 }
 
 static void
-zio_buf_vm_object_copyin(buf_t bp)
+zio_buf_vm_object_copyin(vm_object_t object, buf_t bp)
 {
 	
-	zio_buf_vm_object_copy(bp, ZB_COPYIN);
+	zio_buf_vm_object_copy(object, bp, ZB_COPYIN);
 }
 
 static void
@@ -660,9 +677,7 @@ zio_buf_evict_overlap(vm_object_t object
 		TAILQ_REMOVE(&clh, tmpbp, b_freelist);
 		zio_buf_vm_object_evict(tmpbp);
 
-		KASSERT(tmpbp->b_flags & B_EVICTED == 0,
-		    ("buffer has already been evicted"));
-		tmpbp->b_flags |= B_EVICTED;
+		tmpbp->b_flags &= ~B_VMIO;
 		state->zss_blkno_root = tmpbp;
 		/*
 		 * move buffer to the unmanaged tree
@@ -776,16 +791,18 @@ static buf_t 
 _zio_getblk_malloc(uint64_t size, int flags)
 {
 	buf_t 		newbp;
-	void 		*data;
 
-	if (flags & GB_NODUMP) 
-		data = _zio_data_buf_alloc(size);
-	else
-		data = _zio_buf_alloc(size);
 	newbp = malloc(sizeof(struct buf), M_ZFS_BIO, M_WAITOK|M_ZERO);
-	newbp->b_data = data;
 	newbp->b_flags = (B_MALLOC|B_INVAL);
 	newbp->b_bcount = size;
+
+	if (flags & GB_NODUMP) {
+		newbp->b_flags |= B_DATA;
+		newbp->b_data = _zio_data_buf_alloc(size);
+	} else
+		newbp->b_data = _zio_buf_alloc(size);
+
+	return (newbp);
 }
 
 static buf_t 
@@ -820,7 +837,7 @@ zio_relse(void *data, size_t size)
 
 	bp = zio_buf_va_remove(data, size);
 
-	if (bp->b_flags & B_ASSIGNED)
+	if (bp->b_flags & B_VMIO)
 		zio_buf_blkno_remove(bp);
 
 	if (bp->b_flags & B_MALLOC) {
@@ -855,9 +872,6 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 
 	bp = zio_buf_va_lookup(data, size);
 	
-	KASSERT(bp->b_flags & B_EVICTED == 0,
-	    ("doing I/O with cloned or evicted buffer 0x%x", bp->b_flags));
-
 	if (bp->b_flags & B_MALLOC) {
 		zio_buf_evict_overlap(object, blkno, size, state, txg, ZB_EVICT_BUFFERED);
 
@@ -866,13 +880,13 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 			 * if page resident - copy in
 			 * update zio pipeline
 			 */
-			zio_buf_vm_object_copyin(bp);
+			zio_buf_vm_object_copyin(object, bp);
 			if (bp->b_flags & B_CACHE) {
 				/* update zio pipeline */
 				io_bypass = TRUE;
 			}
 		} else {
-			zio_buf_vm_object_copyout(bp);
+			zio_buf_vm_object_copyout(object, bp);
 		}
 	} else if (bp->b_flags & B_VMIO) {
 		KASSERT(bp == zio_buf_blkno_lookup(state, blkno),
@@ -889,7 +903,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 		zio_buf_evict_overlap(object, blkno, size, state, NO_TXG,
 		    ZB_EVICT_ALL);
 		bp->b_blkno = bp->b_lblkno = blkno;
-		bp->b_flags |= (B_VMIO|B_ASSIGNED);
+		bp->b_flags |= B_VMIO;
 		bp->b_birth = txg;
 		zio_buf_blkno_insert(bp, state);
 		zio_buf_vm_object_insert(bp, vp, object, zio_op == ZIO_TYPE_WRITE);
@@ -899,7 +913,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl
 		zio_buf_evict_overlap(object, blkno, size, state, NO_TXG,
 		    ZB_EVICT_BUFFERED);
 		bp->b_blkno = bp->b_lblkno = blkno;
-		bp->b_flags |= (B_VMIO|B_ASSIGNED);
+		bp->b_flags |= B_VMIO;
 		bp->b_birth = txg;
 		zio_buf_blkno_insert(bp, state);
 		VM_OBJECT_LOCK(object);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912240450.nBO4oIVD019320>