From owner-svn-src-user@FreeBSD.ORG Tue Nov 17 00:49:42 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A9854106566C; Tue, 17 Nov 2009 00:49:42 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 990E48FC20; Tue, 17 Nov 2009 00:49:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nAH0ngIk086493; Tue, 17 Nov 2009 00:49:42 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAH0ngVZ086492; Tue, 17 Nov 2009 00:49:42 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200911170049.nAH0ngVZ086492@svn.freebsd.org> From: Kip Macy Date: Tue, 17 Nov 2009 00:49:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199340 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Nov 2009 00:49:42 -0000 Author: kmacy Date: Tue Nov 17 00:49:41 2009 New Revision: 199340 URL: http://svn.freebsd.org/changeset/base/199340 Log: - Only mark a buffer as newly valid on read and write completion - add comments to arc_gbincore_replace - don't treat cloned buffers as the newly valid mapping - this eliminates the need for arc_binval Modified: user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Modified: user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c ============================================================================== --- user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Mon Nov 16 22:52:52 2009 (r199339) +++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Tue Nov 17 00:49:41 2009 (r199340) @@ -1319,20 +1319,30 @@ arc_gbincore_replace(struct vnode *vp, o BO_UNLOCK(bo); return (bp); } + if (BUF_ISLOCKED(bp)) { + /* + * buffer is currently referenced in the ARC with older birth txg + * + */ + bp->b_flags |= B_INVAL; + bp->b_flags &= ~B_CACHE; BO_UNLOCK(bo); brelvp(bp); } else { BUF_LOCK(bp, LK_EXCLUSIVE | LK_INTERLOCK, BO_MTX(bo)); if (newbp != NULL) { + /* + * mapping exists but we wish to replace it with + * newbp + */ bp->b_flags |= B_INVAL; bp->b_flags &= ~B_CACHE; bremfree(bp); brelse(bp); } else { /* - * We don't have a new buffer for which we're - * replacing the mapping, use this buffer + * buffer is usable for this mapping */ if (bp->b_flags & B_INVAL) bp->b_flags &= ~B_CACHE; @@ -1404,21 +1414,15 @@ arc_getblk(arc_buf_t *buf) BUF_EMPTY(buf->b_hdr) || zfs_page_cache_disable) { newbp = geteblk(size, flags); - data = newbp->b_data; + data = newbp->b_data; + buf->b_hdr->b_flags &= ~ARC_BUF_CLONING; } else { newbp = arc_gbincore_replace(vp, blkno, size, flags, NULL); newbp->b_offset = buf->b_hdr->b_birth; - data = newbp->b_data; + data = newbp->b_data; } - if ((buf->b_hdr->b_flags & ARC_BUF_CLONING) && - (size >= PAGE_SIZE) && - (!BUF_EMPTY(buf->b_hdr)) && - !zfs_page_cache_disable) - arc_binval(buf, blkno, vp, size, flags, newbp); - buf->b_hdr->b_flags &= ~ARC_BUF_CLONING; - #ifdef LOGALL /* * not useful for tracking down collisions @@ -1456,42 +1460,6 @@ arc_brelse(arc_buf_t *buf, void *data, s brelse(bp); } -static void -arc_binval(arc_buf_t *buf, off_t blkno, struct vnode *vp, size_t size, - int flags, struct buf *newbp) -{ - arc_buf_t *tbuf; - int released = 0; - struct buf *bp = NULL; - uint64_t birth; - struct bufobj *bo; - - /* - * disassociate backing buffers from the vnode - * - */ - for (tbuf = buf; tbuf != NULL; tbuf = tbuf->b_next) { - if ((tbuf->b_bp != NULL) && (tbuf->b_bp->b_vp != NULL)) { - bp = tbuf->b_bp; - KASSERT((bp->b_xflags & (BX_VNCLEAN|BX_VNDIRTY)) == BX_VNCLEAN, ("brelvp() on buffer that is not in splay")); - - bp->b_flags |= B_INVAL; - bp->b_flags &= ~B_CACHE; - brelvp(bp); - released = 1; - } - } - bo = newbp->b_bufobj = &vp->v_bufobj; - newbp->b_lblkno = blkno; - newbp->b_blkno = blkno; - newbp->b_offset = buf->b_hdr->b_birth; - newbp->b_flags &= ~B_INVAL; - newbp->b_flags |= B_CACHE; - - if (!released) - arc_gbincore_replace(vp, blkno, size, flags, newbp); -} - /* * Free the arc data buffer. If it is an l2arc write in progress, * the buffer is placed on l2arc_free_on_write to be freed later. @@ -2739,11 +2707,6 @@ arc_read_done(zio_t *zio) arc_cksum_compute(buf, B_FALSE); - if (buf->b_bp != NULL) { - buf->b_bp->b_flags &= ~B_INVAL; - buf->b_bp->b_flags |= B_CACHE; - } - /* create copies of the data buffer for the callers */ abuf = buf; for (acb = callback_list; acb; acb = acb->acb_next) { @@ -2771,6 +2734,16 @@ arc_read_done(zio_t *zio) freeable = refcount_is_zero(&hdr->b_refcnt); } + if ((freeable == FALSE) && !zfs_page_cache_disable) { + off_t blkno = hdr->b_dva.dva_word[1] & ~(1UL<<63); + struct buf *bp = buf->b_bp; + + bp->b_flags |= B_CACHE; + bp->b_flags &= ~B_INVAL; + arc_gbincore_replace(spa_get_vnode(hdr->b_spa), + blkno, bp->b_bcount, 0, bp); + } + /* * Broadcast before we drop the hash_lock to avoid the possibility * that the hdr (and hence the cv) might be freed before we get to @@ -3483,12 +3456,13 @@ arc_write_done(zio_t *zio) arc_hdr_destroy(exists); exists = buf_hash_insert(hdr, &hash_lock); ASSERT3P(exists, ==, NULL); - } else if ((hdr->b_buf == buf) && - (bp != NULL) && + } else if ((bp != NULL) && (bp->b_bufobj == NULL) && (bp->b_bcount >= PAGE_SIZE) && !zfs_page_cache_disable) { - arc_binval(buf, blkno, vp, bp->b_bcount, 0, bp); + bp->b_flags |= B_CACHE; + bp->b_flags &= ~B_INVAL; + arc_gbincore_replace(vp, blkno, bp->b_bcount, 0, bp); } hdr->b_flags &= ~ARC_IO_IN_PROGRESS;