From owner-svn-src-user@FreeBSD.ORG Thu Dec 24 23:26:03 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 3D5E4106566C; Thu, 24 Dec 2009 23:26:03 +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 2C7F68FC16; Thu, 24 Dec 2009 23:26:03 +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 nBONQ3ia044078; Thu, 24 Dec 2009 23:26:03 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nBONQ3c6044076; Thu, 24 Dec 2009 23:26:03 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200912242326.nBONQ3c6044076@svn.freebsd.org> From: Kip Macy Date: Thu, 24 Dec 2009 23:26:03 +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: r200970 - user/kmacy/releng_8_fcs_buf_xen/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: Thu, 24 Dec 2009 23:26:03 -0000 Author: kmacy Date: Thu Dec 24 23:26:02 2009 New Revision: 200970 URL: http://svn.freebsd.org/changeset/base/200970 Log: - replace page validation with vm_pages_valid_locked - move vm_pages_valid up before first use - remove stale comment Modified: 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/zfs_bio.c ============================================================================== --- user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c Thu Dec 24 21:54:44 2009 (r200969) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c Thu Dec 24 23:26:02 2009 (r200970) @@ -244,6 +244,35 @@ zio_spa_state_alloc(spa_t *spa) return (zss); } +/* + * scan blkno + size range in object to verify that all the pages are + * resident and valid + */ +static int +vm_pages_valid_locked(vm_object_t object, uint64_t blkno, uint64_t size) +{ + vm_page_t m; + uint64_t i; + + for (i = stob(blkno); i < stob(blkno) + size; i += PAGE_SIZE) + if ((m = vm_page_lookup(object, OFF_TO_IDX(i))) == NULL || + (m->valid != VM_PAGE_BITS_ALL)) + return (0); + return (1); +} + +static int +vm_pages_valid(vm_object_t object, uint64_t blkno, uint64_t size) +{ + int valid; + + VM_OBJECT_LOCK(object); + valid = vm_pages_valid_locked(object, blkno, size); + VM_OBJECT_UNLOCK(object); + + return (valid); +} + /* * zio_buf_insert: [ internal use only ] @@ -322,7 +351,6 @@ zio_buf_va_remove(caddr_t va, uint64_t s 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) @@ -525,15 +553,9 @@ zio_buf_vm_object_copy(vm_object_t objec end = OFF_TO_IDX(byte_offset + bp->b_bcount); VM_OBJECT_LOCK(object); - for (bp->b_npages = i = 0; start + i < end; i++) { - m = vm_page_lookup(object, start + i); - - if ((m == NULL) || (m->valid != VM_PAGE_BITS_ALL)) - goto done; + if (vm_pages_valid_locked(object, bp->b_blkno, bp->b_bcount) == 0) + goto done; - bp->b_pages[i] = m; - bp->b_npages++; - } for (i = 0; i < bp->b_npages; i++) { sf = sf_buf_alloc(bp->b_pages[i], 0); va = (caddr_t)sf_buf_kva(sf); @@ -685,8 +707,8 @@ zio_buf_evict_overlap(vm_object_t object zio_buf_blkno_remove(tmpbp); } done: - if (!(collisions == 1 && tmpbp->b_blkno == blkno && tmpbp->b_bcount == size) - && (evict_op == ZB_EVICT_ALL)) { + if (!(collisions == 1 && tmpbp->b_blkno == blkno && + tmpbp->b_bcount == size) && (evict_op == ZB_EVICT_ALL)) { start = OFF_TO_IDX(stob(blkno)); end = start + OFF_TO_IDX(size); VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); @@ -702,37 +724,6 @@ done: } /* - * scan blkno + size range in object to verify that all the pages are - * resident and valid - */ -static int -vm_pages_valid_locked(vm_object_t object, uint64_t blkno, uint64_t size) -{ - vm_pindex_t start; - vm_page_t m; - int i; - - start = OFF_TO_IDX(stob(blkno)); - for (i = 0; i < OFF_TO_IDX(size); i++) - if ((m = vm_page_lookup(object, start + i)) == NULL || - (m->valid != VM_PAGE_BITS_ALL)) - return (0); - return (1); -} - -static int -vm_pages_valid(vm_object_t object, uint64_t blkno, uint64_t size) -{ - int valid; - - VM_OBJECT_LOCK(object); - valid = vm_pages_valid_locked(object, blkno, size); - VM_OBJECT_UNLOCK(object); - - return (valid); -} - -/* * insert pages from object in to bp's b_pages * and wire */ @@ -894,11 +885,6 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl if (zio_op == ZIO_TYPE_READ && (bp->b_flags & (B_CACHE|B_INVAL)) == B_CACHE) io_bypass = TRUE; } else if ((zio_op == ZIO_TYPE_WRITE) || !vm_pages_valid(object, blkno, size)) { - /* - * XXX still need to handle the case where the pages in the page cache are valid - * and we are doing a read - */ - VM_OBJECT_LOCK(object); zio_buf_evict_overlap(object, blkno, size, state, NO_TXG, ZB_EVICT_ALL);