From owner-svn-src-all@freebsd.org Fri Aug 14 14:24:42 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 284BC9B8DFD; Fri, 14 Aug 2015 14:24:42 +0000 (UTC) (envelope-from avg@FreeBSD.org) Received: from citadel.icyb.net.ua (citadel.icyb.net.ua [212.40.38.140]) by mx1.freebsd.org (Postfix) with ESMTP id 69C3018DF; Fri, 14 Aug 2015 14:24:40 +0000 (UTC) (envelope-from avg@FreeBSD.org) Received: from porto.starpoint.kiev.ua (porto-e.starpoint.kiev.ua [212.40.38.100]) by citadel.icyb.net.ua (8.8.8p3/ICyb-2.3exp) with ESMTP id RAA16833; Fri, 14 Aug 2015 17:24:38 +0300 (EEST) (envelope-from avg@FreeBSD.org) Received: from localhost ([127.0.0.1]) by porto.starpoint.kiev.ua with esmtp (Exim 4.34 (FreeBSD)) id 1ZQFuQ-0002wC-1K; Fri, 14 Aug 2015 17:24:38 +0300 Subject: Re: svn commit: r277419 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs To: Alexander Motin , src-committers@FreeBSD.org, svn-src-all@FreeBSD.org, svn-src-head@FreeBSD.org References: <201501201309.t0KD9Cid002762@svn.freebsd.org> From: Andriy Gapon Message-ID: <55CDF9ED.4090908@FreeBSD.org> Date: Fri, 14 Aug 2015 17:23:41 +0300 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <201501201309.t0KD9Cid002762@svn.freebsd.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Aug 2015 14:24:42 -0000 On 20/01/2015 15:09, Alexander Motin wrote: > Author: mav > Date: Tue Jan 20 13:09:12 2015 > New Revision: 277419 > URL: https://svnweb.freebsd.org/changeset/base/277419 > > Log: > Allow skipping dmu_buf_will_dirty() call in dsl_dir_transfer_space(). > > dsl_dir_transfer_space() is mostly called after dsl_dir_diduse_space(), > which already calls dmu_buf_will_dirty() for the same dbuf and tx, so > its duplicate call in those cases will change nothing, only spend time. > > Skipping this call by four times reduces time spent in dbuf_write_done() > and descendants, updating dataset statistics with several congested lock > acquisitions. When rewriting 8K zvol blocks at 1GB/s rate, this reduces > CPU time spent inside dbuf_write_done(), according to profiling, from 45% > of 683K samples to 18% of 422K. It probably would make sense to discuss such a change with the upstream folks. Or, at the very least, let them know about it. > MFC after: 2 weeks > > Modified: > head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c > head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c > > Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c > ============================================================================== > --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Tue Jan 20 12:28:24 2015 (r277418) > +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Tue Jan 20 13:09:12 2015 (r277419) > @@ -136,7 +136,7 @@ dsl_dataset_block_born(dsl_dataset_t *ds > dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, delta, > compressed, uncompressed, tx); > dsl_dir_transfer_space(ds->ds_dir, used - delta, > - DD_USED_REFRSRV, DD_USED_HEAD, tx); > + DD_USED_REFRSRV, DD_USED_HEAD, NULL); > } > > int > @@ -179,7 +179,7 @@ dsl_dataset_block_kill(dsl_dataset_t *ds > dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, > delta, -compressed, -uncompressed, tx); > dsl_dir_transfer_space(ds->ds_dir, -used - delta, > - DD_USED_REFRSRV, DD_USED_HEAD, tx); > + DD_USED_REFRSRV, DD_USED_HEAD, NULL); > } else { > dprintf_bp(bp, "putting on dead list: %s", ""); > if (async) { > @@ -2837,7 +2837,7 @@ dsl_dataset_clone_swap_sync_impl(dsl_dat > origin_head->ds_dir->dd_origin_txg, UINT64_MAX, > &odl_used, &odl_comp, &odl_uncomp); > dsl_dir_transfer_space(origin_head->ds_dir, cdl_used - odl_used, > - DD_USED_HEAD, DD_USED_SNAP, tx); > + DD_USED_HEAD, DD_USED_SNAP, NULL); > } > > /* swap ds_*_bytes */ > > Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c > ============================================================================== > --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c Tue Jan 20 12:28:24 2015 (r277418) > +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c Tue Jan 20 13:09:12 2015 (r277419) > @@ -1389,7 +1389,7 @@ dsl_dir_diduse_space(dsl_dir_t *dd, dd_u > accounted_delta, compressed, uncompressed, tx); > dsl_dir_transfer_space(dd->dd_parent, > used - accounted_delta, > - DD_USED_CHILD_RSRV, DD_USED_CHILD, tx); > + DD_USED_CHILD_RSRV, DD_USED_CHILD, NULL); > } > } > > @@ -1397,7 +1397,7 @@ void > dsl_dir_transfer_space(dsl_dir_t *dd, int64_t delta, > dd_used_t oldtype, dd_used_t newtype, dmu_tx_t *tx) > { > - ASSERT(dmu_tx_is_syncing(tx)); > + ASSERT(tx == NULL || dmu_tx_is_syncing(tx)); > ASSERT(oldtype < DD_USED_NUM); > ASSERT(newtype < DD_USED_NUM); > > @@ -1405,7 +1405,8 @@ dsl_dir_transfer_space(dsl_dir_t *dd, in > !(dsl_dir_phys(dd)->dd_flags & DD_FLAG_USED_BREAKDOWN)) > return; > > - dmu_buf_will_dirty(dd->dd_dbuf, tx); > + if (tx != NULL) > + dmu_buf_will_dirty(dd->dd_dbuf, tx); > mutex_enter(&dd->dd_lock); > ASSERT(delta > 0 ? > dsl_dir_phys(dd)->dd_used_breakdown[oldtype] >= delta : > -- Andriy Gapon