Date: Sat, 2 Jan 2010 04:20:42 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r201376 - user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <201001020420.o024KgUq032069@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Sat Jan 2 04:20:41 2010 New Revision: 201376 URL: http://svn.freebsd.org/changeset/base/201376 Log: - don't allocate bufs for buffers less than 128k - they tend to not be for page aligned access - don't mark page as managed until immediately before freeing - mark buffer as valid at all places where we trust the data - mark buffer invalid before freeing so that vfs_bio will release the pages - move page to inactive queue immediately before freeing - fix overlap chacks - set bufobj for vmio / clear when pages are removed from the object 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 Sat Jan 2 01:12:10 2010 (r201375) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sat Jan 2 04:20:41 2010 (r201376) @@ -1531,7 +1531,7 @@ arc_evict(arc_state_t *state, spa_t *spa ASSERT(state == arc_mru || state == arc_mfu); evicted_state = (state == arc_mru) ? arc_mru_ghost : arc_mfu_ghost; - recycle = (bytes & PAGE_MASK) ? recycle : FALSE; + recycle = (bytes == 128*1024) ? FALSE : recycle; if (type == ARC_BUFC_METADATA) { offset = 0; 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 2 01:12:10 2010 (r201375) +++ user/kmacy/releng_8_fcs_buf_xen/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_bio.c Sat Jan 2 04:20:41 2010 (r201376) @@ -120,12 +120,17 @@ MALLOC_DEFINE(M_ZFS_BIO, "zfs_bio", "zfs #define B_DATA B_00001000 -#define ZB_EVICT_ALL 0x1 -#define ZB_EVICT_BUFFERED 0x2 - -#define ZB_COPYIN 0x2 -#define ZB_COPYOUT 0x3 +typedef enum { + ZB_EVICT_ALL = 0x1, + ZB_EVICT_BUFFERED = 0x2 +} zb_evict_type_t; + +enum { + ZB_COPYIN = 0x2, + ZB_COPYOUT = 0x3 +}; + #define NO_TXG 0x0 #define btos(nbytes) ((nbytes)>>DEV_BSHIFT) @@ -546,6 +551,10 @@ zio_buf_blkno_remove_locked(vm_object_t */ state->zss_resident_count--; state->zss_generation++; + +#ifdef INVARIANTS + bp->b_right = bp->b_left = NULL; +#endif } static void @@ -625,16 +634,8 @@ zio_buf_vm_object_evict(buf_t bp) vm_page_lock_queues(); for (i = 0; i < bp->b_npages; i++) { m = bp->b_pages[i]; - vm_pageq_remove(m); - } - /* - * remove pages from backing vm_object - */ - for (i = 0; i < bp->b_npages; i++) { - m = bp->b_pages[i]; vm_page_remove(m); m->valid = 0; - m->flags |= PG_UNMANAGED; } vm_page_unlock_queues(); } @@ -657,14 +658,7 @@ zio_buf_vm_object_insert(buf_t bp, struc if (valid) m->valid = VM_PAGE_BITS_ALL; vm_page_insert(m, object, start + i); - m->flags &= ~PG_UNMANAGED; - } - vm_page_lock_queues(); - for (i = 0; i < bp->b_npages; i++) { - m = bp->b_pages[i]; - vm_page_enqueue(PQ_INACTIVE, m); } - vm_page_unlock_queues(); } /* @@ -680,7 +674,7 @@ zio_buf_vm_object_insert(buf_t bp, struc */ static void zio_buf_evict_overlap(vm_object_t object, daddr_t blkno, int size, - zio_spa_state_t state, uint64_t txg, int evict_op) + zio_spa_state_t state, uint64_t txg, zb_evict_type_t evict_op) { buf_t root, tmpbp, bp_prev; daddr_t blkno_end, tmpblkno, tmpblkno_end; @@ -695,14 +689,21 @@ zio_buf_evict_overlap(vm_object_t object collisions = 0; blkno_end = blkno + btos(size); - root = zio_buf_blkno_splay(blkno, root); - if (blkno < root->b_blkno) - tmpbp = TAILQ_PREV(root, cluster_list_head, b_freelist); + if ((root = zio_buf_blkno_splay(blkno, root)) == NULL) + goto done; + if ((blkno >= root->b_blkno) || + (tmpbp = TAILQ_PREV(root, cluster_list_head, b_freelist)) == NULL || + (blkno >= tmpbp->b_blkno + btos(tmpbp->b_bcount))) + tmpbp = root; + if ((blkno_end <= tmpbp->b_blkno) || + (blkno >= root->b_blkno + btos(root->b_bcount))) + goto done; + /* * Find all existing buffers that overlap with this range */ - bp_prev = tmpbp = tmpbp != NULL ? tmpbp : root; + bp_prev = tmpbp; while (tmpbp != NULL && tmpbp->b_blkno < blkno_end) { tmpblkno = tmpbp->b_blkno; tmpblkno_end = tmpblkno + btos(tmpbp->b_bcount); @@ -721,16 +722,16 @@ zio_buf_evict_overlap(vm_object_t object tmpbp = TAILQ_FIRST(&clh); TAILQ_REMOVE(&clh, tmpbp, b_cluster.cluster_entry); zio_buf_vm_object_evict(tmpbp); - + tmpbp->b_bufobj = NULL; tmpbp->b_flags &= ~B_VMIO; - state->zss_blkno_root = tmpbp; + tmpbp->b_blkno = tmpbp->b_lblkno = 0; /* * move buffer to the unmanaged tree */ zio_buf_blkno_remove_locked(object, tmpbp); } done: - if (!(collisions == 1 && tmpbp->b_blkno == blkno && + if (!(collisions == 1 && tmpbp != NULL && 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); @@ -753,12 +754,11 @@ done: static void vm_object_reference_pages(vm_object_t object, buf_t bp) { - uint64_t blkno, size; vm_pindex_t start; vm_page_t m; int i; - start = OFF_TO_IDX(stob(blkno)); + start = OFF_TO_IDX(stob(bp->b_blkno)); vm_page_lock_queues(); for (i = 0; i < bp->b_npages; i++) { m = vm_page_lookup(object, start + i); @@ -853,12 +853,24 @@ void zio_relse(void *data, size_t size) { buf_t bp; + vm_page_t m; + int i; bp = zio_buf_va_remove(data, size); - if (bp->b_flags & B_VMIO) + if (bp->b_flags & B_VMIO) { + 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_unlock_queues(); zio_buf_blkno_remove(bp); - + } + if (bp->b_flags & B_MALLOC) { if (bp->b_flags & B_DATA) _zio_data_buf_free(bp->b_data, size); @@ -869,8 +881,8 @@ zio_relse(void *data, size_t size) CTR4(KTR_SPARE2, "arc_brelse() bp=%p flags %X" " size %ld blkno=%ld", bp, bp->b_flags, size, bp->b_blkno); - - bp->b_flags |= B_ZFS; + bp->b_flags |= (B_ZFS|B_INVAL); + bp->b_flags &= ~B_CACHE; brelse(bp); } } @@ -923,10 +935,15 @@ _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_bufobj = &vp->v_bufobj; bp->b_flags |= B_VMIO; bp->b_birth = txg; bp->b_state = state; zio_buf_blkno_insert(bp, state); + if (zio_op == ZIO_TYPE_WRITE) { + bp->b_flags |= B_CACHE; + bp->b_flags &= ~B_INVAL; + } zio_buf_vm_object_insert(bp, vp, object, zio_op == ZIO_TYPE_WRITE); VM_OBJECT_UNLOCK(object); } else { @@ -935,9 +952,11 @@ _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; + bp->b_bufobj = &vp->v_bufobj; + bp->b_flags |= (B_VMIO|B_CACHE); + bp->b_flags &= ~B_INVAL; bp->b_birth = txg; - bp->b_state = state; + bp->b_state = state; zio_buf_blkno_insert(bp, state); if (vm_pages_valid_locked(object, blkno, size)) { for (i = 0; i < bp->b_npages; i++) { @@ -966,8 +985,8 @@ _zio_cache_valid(void *data, uint64_t si if ((bp->b_flags & B_VMIO) == 0) return; for (i = 0; i < bp->b_npages; i++) { - KASSERT((bp->b_pages[i]->flags & PG_UNMANAGED) == 0, - ("validating unmanaged page")); + KASSERT(bp->b_pages[i]->object != NULL, + ("validating page not in object")); bp->b_pages[i]->valid = VM_PAGE_BITS_ALL; } bp->b_flags &= ~B_INVAL;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001020420.o024KgUq032069>