Date: Sun, 13 Dec 2009 02:00:41 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r200461 - user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <200912130200.nBD20f2u070256@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Sun Dec 13 02:00:41 2009 New Revision: 200461 URL: http://svn.freebsd.org/changeset/base/200461 Log: simplify initial version and reduce ARC churn by assuming that the block address is never available at getblk time Modified: user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.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/arc.c ============================================================================== --- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sun Dec 13 01:20:32 2009 (r200460) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sun Dec 13 02:00:41 2009 (r200461) @@ -258,7 +258,6 @@ static arc_state_t ARC_mfu_ghost; static arc_state_t ARC_l2c_only; typedef struct arc_stats { - kstat_named_t arcstat_page_cache_hits; kstat_named_t arcstat_hits; kstat_named_t arcstat_misses; kstat_named_t arcstat_demand_data_hits; @@ -309,7 +308,6 @@ typedef struct arc_stats { static arc_stats_t arc_stats = { { "hits", KSTAT_DATA_UINT64 }, - { "page_cache_hits", KSTAT_DATA_UINT64 }, { "misses", KSTAT_DATA_UINT64 }, { "demand_data_hits", KSTAT_DATA_UINT64 }, { "demand_data_misses", KSTAT_DATA_UINT64 }, @@ -451,7 +449,6 @@ struct arc_write_callback { /* * Keep initial ordering in-sync with zbio_buf_hdr */ - struct arc_buf_hdr { /* protected by hash lock */ dva_t b_dva; @@ -646,6 +643,8 @@ typedef struct l2arc_data_free { list_node_t l2df_list_node; } l2arc_data_free_t; +extern int zfs_page_cache_disable; + static kmutex_t l2arc_feed_thr_lock; static kcondvar_t l2arc_feed_thr_cv; static uint8_t l2arc_thread_exit; @@ -1198,9 +1197,8 @@ arc_data_buf_free(void *buf, uint64_t si atomic_add_64(&arc_size, -size); } -static arc_buf_t * -_arc_buf_alloc(spa_t *spa, int size, void *tag, arc_buf_contents_t type, - blkptr_t *bp) +arc_buf_t * +arc_buf_alloc(spa_t *spa, int size, void *tag, arc_buf_contents_t type) { arc_buf_hdr_t *hdr; arc_buf_t *buf; @@ -1210,14 +1208,6 @@ _arc_buf_alloc(spa_t *spa, int size, voi ASSERT(BUF_EMPTY(hdr)); hdr->b_size = size; hdr->b_type = type; - if (bp != NULL) { - hdr->b_dva = *BP_IDENTITY(bp); - hdr->b_birth = bp->blk_birth; - } else { - hdr->b_dva.dva_word[0] = 0; - hdr->b_dva.dva_word[1] = 0; - hdr->b_birth = 0; - } hdr->b_spa = spa; hdr->b_state = arc_anon; hdr->b_arc_access = 0; @@ -1237,13 +1227,6 @@ _arc_buf_alloc(spa_t *spa, int size, voi return (buf); } -arc_buf_t * -arc_buf_alloc(spa_t *spa, int size, void *tag, arc_buf_contents_t type) -{ - - return (_arc_buf_alloc(spa, size, tag, type, NULL)); -} - static arc_buf_t * arc_buf_clone(arc_buf_t *from) { @@ -1564,7 +1547,7 @@ arc_evict(arc_state_t *state, spa_t *spa * don't recycle page cache bufs * */ - if (recycle && (bytes >= PAGE_SIZE)) + if (recycle && ((bytes & PAGE_MASK) != 0) && !zfs_page_cache_disable) recycle = FALSE; #endif if (type == ARC_BUFC_METADATA) { @@ -2339,7 +2322,7 @@ arc_get_data_buf(arc_buf_t *buf) zbio_data_getblk(buf); atomic_add_64(&arc_size, size); } - if (size < PAGE_SIZE) + if (size & PAGE_MASK) ARCSTAT_BUMP(arcstat_recycle_miss); } ASSERT(buf->b_data != NULL); @@ -2768,8 +2751,10 @@ top: /* this block is not in the cache */ arc_buf_hdr_t *exists; arc_buf_contents_t type = BP_GET_BUFC_TYPE(bp); - buf = _arc_buf_alloc(spa, size, private, type, bp); + buf = arc_buf_alloc(spa, size, private, type); hdr = buf->b_hdr; + hdr->b_dva = *BP_IDENTITY(bp); + hdr->b_birth = bp->blk_birth; hdr->b_cksum0 = bp->blk_cksum.zc_word[0]; exists = buf_hash_insert(hdr, &hash_lock); if (exists) { @@ -4021,6 +4006,7 @@ l2arc_do_free_on_write() for (df = list_tail(buflist); df; df = df_prev) { df_prev = list_prev(buflist, df); + ASSERT(df->l2df_buf != NULL); ASSERT(df->l2df_func != NULL); df->l2df_func(df->l2df_buf, df->l2df_size); list_remove(buflist, df); 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 Sun Dec 13 01:20:32 2009 (r200460) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c Sun Dec 13 02:00:41 2009 (r200461) @@ -105,7 +105,7 @@ __FBSDID("$FreeBSD$"); (buf)->b_birth == 0) SYSCTL_DECL(_vfs_zfs); -static int zfs_page_cache_disable = 1; +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 "); @@ -759,16 +759,6 @@ _zbio_getblk_malloc(zbio_buf_hdr_t *hdr, newbp->b_data = data; newbp->b_flags = (B_MALLOC|B_INVAL); newbp->b_bcount = size; - if (!BUF_EMPTY(hdr) && !(hdr->b_flags & ZBIO_BUF_CLONING)) { - blkno = hdr->b_dva.dva_word[1] & ~(1ULL<<63); - zbio_buf_evict_overlap(blkno, size, state, txg, ZB_EVICT_BUFFERED); - newbp->b_blkno = blkno; - /* - * Copy in from the page cache if found & valid - * and mark B_CACHE - */ - zbio_buf_vm_object_copyin(newbp); - } if (hdr->b_flags & ZBIO_BUF_CLONING) { newbp->b_flags |= B_CLONED; @@ -781,31 +771,13 @@ static buf_t * _zbio_getblk_vmio(zbio_buf_hdr_t *hdr, int flags) { buf_t *newbp; - daddr_t blkno; uint64_t size = hdr->b_size; spa_t *spa = hdr->b_spa; zbio_state_t *state = spa_get_bio_state(spa); - struct vnode *vp = spa_get_vnode(spa); - struct bufobj *bo = &vp->v_bufobj; - if (BUF_EMPTY(hdr)) { - newbp = geteblk(size, flags); - zbio_buf_va_insert(newbp, state); - } else { - blkno = hdr->b_dva.dva_word[1] & ~(1ULL<<63); - zbio_buf_evict_overlap(blkno, size, state, NO_TXG, ZB_EVICT_BUFFERED); - - while (newbp == NULL) - newbp = getblk(vp, blkno, size, 0, 0, flags | GB_LOCK_NOWAIT); - brelvp(newbp); - newbp->b_flags |= B_ASSIGNED; - zbio_buf_blkno_insert(newbp, state); - } - newbp->b_bufobj = bo; + newbp = geteblk(size, flags); + zbio_buf_va_insert(newbp, state); BUF_KERNPROC(newbp); - CTR4(KTR_SPARE2, "arc_getblk() bp=%p flags %X " - "blkno %ld npages %d", - newbp, newbp->b_flags, blkno, newbp->b_npages); return (newbp); } @@ -876,7 +848,8 @@ zbio_relse(arc_buf_t *buf, size_t size) } int -zbio_sync_cache(spa_t *spa, blkptr_t *blkp, uint64_t txg, void *data, uint64_t size, int bio_op) +zbio_sync_cache(spa_t *spa, blkptr_t *blkp, uint64_t txg, void *data, + uint64_t size, int bio_op) { buf_t *bp; zbio_state_t *state = spa_get_bio_state(spa); @@ -917,11 +890,13 @@ zbio_sync_cache(spa_t *spa, blkptr_t *bl zbio_buf_vm_object_copyout(bp); } } else { + zbio_buf_va_remove(bp); VM_OBJECT_LOCK(object); zbio_buf_evict_overlap_locked(blkno, size, state, NO_TXG, ZB_EVICT_ALL, object); bp->b_blkno = bp->b_lblkno = blkno; bp->b_flags |= (B_VMIO|B_ASSIGNED); + zbio_buf_blkno_insert(bp, state); zbio_buf_vm_object_insert_locked(bp, vp, object, bio_op == BIO_WRITE); VM_OBJECT_UNLOCK(object); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912130200.nBD20f2u070256>