From owner-svn-src-user@FreeBSD.ORG Sat Jan 9 23:34:41 2010 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 293991065762; Sat, 9 Jan 2010 23:34:41 +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 16A198FC19; Sat, 9 Jan 2010 23:34:41 +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 o09NYeRq049264; Sat, 9 Jan 2010 23:34:40 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o09NYeWT049261; Sat, 9 Jan 2010 23:34:40 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <201001092334.o09NYeWT049261@svn.freebsd.org> From: Kip Macy Date: Sat, 9 Jan 2010 23:34:40 +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: r201956 - in user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys 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: Sat, 09 Jan 2010 23:34:41 -0000 Author: kmacy Date: Sat Jan 9 23:34:40 2010 New Revision: 201956 URL: http://svn.freebsd.org/changeset/base/201956 Log: - fix buildworld - add check for overlaps in on insert - add additional cases to evict overlap - cache pages that are part of freed buffers 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/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 Sat Jan 9 23:24:49 2010 (r201955) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_bio.h Sat Jan 9 23:34:40 2010 (r201956) @@ -47,10 +47,11 @@ zio_sync_cache(spa_t *spa, blkptr_t *bp, { int io_bypass = 0; +#ifdef _KERNEL 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); - +#endif return (io_bypass); } @@ -58,17 +59,21 @@ static __inline void zio_cache_valid(void *data, uint64_t size, zio_type_t type, vdev_t *vd) { +#ifdef _KERNEL if (((vd == NULL) || (vd->vdev_spa->spa_root_vdev == vd)) && (type == ZIO_TYPE_READ) && (size & PAGE_MASK) == 0) _zio_cache_valid(data, size); +#endif } + 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); void zfs_bio_fini(void); + +#ifndef _KERNEL +#define GB_NODUMP 0 #endif #endif 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 Sat Jan 9 23:24:49 2010 (r201955) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c Sat Jan 9 23:34:40 2010 (r201956) @@ -100,13 +100,13 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include +int zfs_page_cache_disable = 1; #ifdef _KERNEL +#include SYSCTL_DECL(_vfs_zfs); -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 "); @@ -198,7 +198,6 @@ buf_hash(caddr_t va, uint64_t size) int i; ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY); - for (i = 0; i < sizeof (caddr_t); i++) crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ vav[i]) & 0xFF]; @@ -208,8 +207,6 @@ buf_hash(caddr_t va, uint64_t size) } const char *buf_lock = "ht_lock"; - - void buf_init(void) { @@ -376,6 +373,27 @@ zio_buf_va_remove(caddr_t va, uint64_t s return (bp); } +static void +zio_buf_find_duplicates(zio_spa_state_t object) +{ + buf_t bp0, bp1; + + + TAILQ_FOREACH(bp0, &object->zss_blkno_memq, b_freelist) { + TAILQ_FOREACH(bp1, &object->zss_blkno_memq, b_freelist) { + if (bp0 == bp1) + continue; + if (((bp0->b_blkno >= bp1->b_blkno) && + (bp0->b_blkno < bp1->b_blkno + btos(bp1->b_bcount))) || + ((bp0->b_blkno + btos(bp0->b_bcount) > bp1->b_blkno) && + (bp0->b_blkno + btos(bp0->b_bcount) <= + bp1->b_blkno + btos(bp1->b_bcount)))) + panic("duplicate blkno mappings at %lld", + bp0->b_blkno); + } + } +} + /* * zio_buf_blkno_splay: [ internal use only ] * @@ -483,6 +501,7 @@ zio_buf_blkno_insert(buf_t bp, zio_spa_s * show that the object has one more resident buffer. */ object->zss_resident_count++; + zio_buf_find_duplicates(object); } /* @@ -687,11 +706,25 @@ zio_buf_evict_overlap(vm_object_t object if ((root = state->zss_blkno_root) == NULL) goto done; + if (blkno >= root->b_blkno && + blkno_end <= root->b_blkno + btos(root->b_bcount)) { + tmpbp = root; + collisions = 1; + goto evict; + } + collisions = 0; blkno_end = blkno + btos(size); if ((root = zio_buf_blkno_splay(blkno, root)) == NULL) goto done; + if (blkno >= root->b_blkno && + blkno_end <= root->b_blkno + btos(root->b_bcount)) { + tmpbp = root; + collisions = 1; + goto evict; + } + if ((blkno >= root->b_blkno) || (tmpbp = TAILQ_PREV(root, cluster_list_head, b_freelist)) == NULL || (blkno >= tmpbp->b_blkno + btos(tmpbp->b_bcount))) @@ -721,6 +754,7 @@ zio_buf_evict_overlap(vm_object_t object while (!TAILQ_EMPTY(&clh)) { tmpbp = TAILQ_FIRST(&clh); TAILQ_REMOVE(&clh, tmpbp, b_cluster.cluster_entry); + evict: zio_buf_vm_object_evict(tmpbp); tmpbp->b_bufobj = NULL; tmpbp->b_flags &= ~B_VMIO; @@ -762,6 +796,8 @@ vm_object_reference_pages(vm_object_t ob vm_page_lock_queues(); for (i = 0; i < bp->b_npages; i++) { m = vm_page_lookup(object, start + i); + vm_pageq_remove(m); + m->flags |= PG_UNMANAGED; vm_page_wire(m); bp->b_pages[i] = m; } @@ -859,15 +895,20 @@ zio_relse(void *data, size_t size) bp = zio_buf_va_remove(data, size); if (bp->b_flags & B_VMIO) { + VM_OBJECT_LOCK(zio_buf_get_vm_object(bp)); vm_page_lock_queues(); for (i = 0; i < bp->b_npages; i++) { m = bp->b_pages[i]; m->wire_count--; m->flags &= ~PG_UNMANAGED; - vm_page_deactivate(m); - m->wire_count++; /* brelse assumes wire_count is set */ + vm_page_cache(m); + bp->b_pages[i] = 0; } vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(zio_buf_get_vm_object(bp)); + atomic_subtract_int(&cnt.v_wire_count, bp->b_npages); + pmap_qremove((vm_offset_t)bp->b_saveaddr, bp->b_npages); + bp->b_npages = 0; zio_buf_blkno_remove(bp); } @@ -882,7 +923,7 @@ zio_relse(void *data, size_t size) " size %ld blkno=%ld", bp, bp->b_flags, size, bp->b_blkno); bp->b_flags |= (B_ZFS|B_INVAL); - bp->b_flags &= ~B_CACHE; + bp->b_flags &= ~(B_CACHE|B_VMIO); brelse(bp); } } @@ -964,8 +1005,7 @@ _zio_sync_cache(spa_t *spa, blkptr_t *bl m->wire_count--; vm_page_free(m); } - - + atomic_subtract_int(&cnt.v_wire_count, bp->b_npages); vm_object_reference_pages(object, bp); } else zio_buf_vm_object_insert(bp, vp, object, FALSE); @@ -1055,13 +1095,13 @@ zfs_bio_fini(void) #else /* !_KERNEL */ void * -zio_getblk(uint64_t size) +zio_getblk(uint64_t size, int flags) { return (zio_buf_alloc(size)); } -void -zio_data_getblk(uint64_t size) +void * +zio_data_getblk(uint64_t size, int flags) { return (zio_data_buf_alloc(size)); @@ -1075,9 +1115,14 @@ zio_relse(void *data, size_t size) } void -zio_sync_cache(spa_t *spa, blkptr_t *bp, uint64_t txg, uint64_t size) +zfs_bio_init(void) +{ +} + +void +zfs_bio_fini(void) { - ; } + #endif