Go to file
Matthew Ahrens d9eea113f8 It is not necessary to zero struct dbuf_hold_impl_data
Under a workload which makes heavy use of `dbuf_hold()`, I noticed that a
considerable amount of time was spent in `dbuf_hold_impl()`, due to its call to
`kmem_zalloc(sizeof (struct dbuf_hold_impl_data) * DBUF_HOLD_IMPL_MAX_DEPTH)`,
which is around 2KiB.  This structure is used as a stack, to limit the size of
the C stack as dbuf_hold() calls itself recursively.  We make a recursive call
to hold the parent's dbuf when the requested dbuf is not found.  The vast
majority of the time, the parent or grandparent indirect dbuf is cached, so the
number of recursive calls is very low.  However, we initialize this entire
array for every call to dbuf_hold().

To improve performance, this commit changes `dbuf_hold()` to use `kmem_alloc()`
instead of `kmem_zalloc()`.  __dbuf_hold_impl_init is changed to initialize all
members of the struct before they are used.  I observed ~5% performance
improvement on a workload which creates many files.

Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4974
2016-08-16 15:27:17 -07:00
cmd zdb: fencepost error at zdb_cb.zcb_embedded_histogram[][] 2016-08-16 14:53:09 -07:00
config Add support for AVX-512 family of instruction sets 2016-08-16 14:10:33 -07:00
contrib Set proper dependency for string replacement targets 2016-08-02 10:28:29 -07:00
etc Set proper dependency for string replacement targets 2016-08-02 10:28:29 -07:00
include Rework of fletcher_4 module 2016-08-16 14:11:55 -07:00
lib Rework of fletcher_4 module 2016-08-16 14:11:55 -07:00
man Fletcher4 implementation using avx512f instruction set 2016-08-16 14:11:14 -07:00
module It is not necessary to zero struct dbuf_hold_impl_data 2016-08-16 15:27:17 -07:00
rpm Add missing RPM BuildRequires 2016-05-23 10:33:42 -07:00
scripts zloop: print backtrace from core files 2016-07-25 11:47:21 -07:00
tests Enable history test cases 2016-07-27 13:38:46 -07:00
udev Set proper dependency for string replacement targets 2016-08-02 10:28:29 -07:00
.gitignore Illumos Crypto Port module added to enable native encryption in zfs 2016-07-20 10:43:30 -07:00
.gitmodules Add zimport.sh compatibility test script 2014-02-21 12:10:31 -08:00
AUTHORS Add a missing > to AUTHORS 2014-09-02 14:18:53 -07:00
autogen.sh build: do not call boilerplate ourself 2013-04-02 10:55:20 -07:00
configure.ac OpenZFS 5997 - FRU field not set during pool creation and never updated 2016-08-12 13:06:48 -07:00
copy-builtin Illumos Crypto Port module added to enable native encryption in zfs 2016-07-20 10:43:30 -07:00
COPYRIGHT Update ZED copyright boilerplate 2015-05-11 15:07:00 -07:00
DISCLAIMER Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
Makefile.am Add make lint target 2016-08-02 09:25:43 -07:00
META Tag zfs-0.6.5 2015-09-11 11:16:38 -07:00
OPENSOLARIS.LICENSE Add CDDL license file 2008-12-01 14:49:34 -08:00
README.markdown Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
TEST Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
zfs-script-config.sh.in Illumos Crypto Port module added to enable native encryption in zfs 2016-07-20 10:43:30 -07:00
zfs.release.in Move zfs.release generation to configure step 2012-07-12 12:22:51 -07:00

Native ZFS for Linux!

ZFS is an advanced file system and volume manager which was originally developed for Solaris and is now maintained by the Illumos community.

ZFS on Linux, which is also known as ZoL, is currently feature complete. It includes fully functional and stable SPA, DMU, ZVOL, and ZPL layers.

Full documentation for installing ZoL on your favorite Linux distribution can be found at: http://zfsonlinux.org