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>