Go to file
Matthew Ahrens d4e04cc145 Missed wakeup when growing kmem cache
When growing the size of a (VMEM or KVMEM) kmem cache, spl_cache_grow()
always does taskq_dispatch(spl_cache_grow_work), and then waits for the
KMC_BIT_GROWING to be cleared by the taskq thread.

The taskq thread (spl_cache_grow_work()) does:
1. allocate new slab and add to list
2. wake_up_all(skc_waitq)
3. clear_bit(KMC_BIT_GROWING)

Therefore, the waiting thread can wake up before GROWING has been
cleared.  It will see that the growing has not yet completed, and go
back to sleep until it hits the 100ms timeout.

This can have an extreme performance impact on workloads that alloc/free
more than fits in the (statically-sized) magazines.  These workloads
allocate and free slabs with high frequency.

The problem can be observed with `funclatency spl_cache_grow`, which on
some workloads shows that 99.5% of the time it takes <64us to allocate
slabs, but we spend ~70% of our time in outliers, waiting for the 100ms
timeout.

The fix is to do `clear_bit(KMC_BIT_GROWING)` before
`wake_up_all(skc_waitq)`.

A future investigation should evaluate if we still actually need to
taskq_dispatch() at all, and if so on which kernel versions.

Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <gwilson@delphix.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #9989
2020-05-12 10:53:32 -07:00
.github Fix typos 2020-01-22 13:49:00 -08:00
cmd zdb: print block checksums with 6 d's of verbosity 2020-01-22 13:49:07 -08:00
config Remove zfs_vdev_elevator module option 2020-01-22 13:49:04 -08:00
contrib zfs-load-key.sh: ${ZFS} is not the zfs binary 2020-01-22 13:49:07 -08:00
etc Order zfs-import-*.service after multipathd 2020-05-12 10:53:32 -07:00
include Prevent unnecessary resilver restarts 2020-01-22 13:49:07 -08:00
lib Fix zfs-0.8.3 zfs_receive_raw test case 2020-01-22 13:49:07 -08:00
man zio_decompress_data always ASSERTs successful decompression 2020-01-22 13:49:05 -08:00
module Missed wakeup when growing kmem cache 2020-05-12 10:53:32 -07:00
rpm Canonicalize Python shebangs 2020-01-22 13:49:00 -08:00
scripts Fix typos 2020-01-22 13:49:00 -08:00
tests ZTS: Fixes for spurious failures of resilver_restart_001 test 2020-01-22 13:49:07 -08:00
udev Create symbolic links in /dev/disk/by-vdev for nvme disk devices 2020-01-22 13:49:05 -08:00
.gitignore Adapt gitignore for modules 2020-01-22 13:49:05 -08:00
.gitmodules Add zimport.sh compatibility test script 2014-02-21 12:10:31 -08:00
.travis.yml Add .travis.yml 2017-11-13 09:18:18 -08:00
AUTHORS Update build system and packaging 2018-05-29 16:00:33 -07:00
autogen.sh Cause autogen.sh to fail if autoreconf fails 2018-07-06 09:27:37 -07:00
CODE_OF_CONDUCT.md Add CODE_OF_CONDUCT.md 2019-04-30 10:58:45 -07:00
configure.ac Prevent unnecessary resilver restarts 2020-01-22 13:49:07 -08:00
copy-builtin Allow copy-builtin to work with modified sources 2018-10-17 12:06:05 -07:00
COPYRIGHT Update build system and packaging 2018-05-29 16:00:33 -07:00
LICENSE Update build system and packaging 2018-05-29 16:00:33 -07:00
Makefile.am Perform KABI checks in parallel 2020-01-22 13:49:01 -08:00
META Tag zfs-0.8.3 2020-01-22 13:51:17 -08:00
NEWS Add NEWS file 2018-09-18 12:03:47 -07:00
NOTICE Update build system and packaging 2018-05-29 16:00:33 -07:00
README.md Explicitly state supported Linux versions 2018-05-30 20:11:19 -07:00
TEST Update build system and packaging 2018-05-29 16:00:33 -07:00
zfs.release.in Move zfs.release generation to configure step 2012-07-12 12:22:51 -07:00

img

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

codecov coverity

Official Resources

Installation

Full documentation for installing ZoL on your favorite Linux distribution can be found at our site.

Contribute & Develop

We have a separate document with contribution guidelines.

Release

ZFS on Linux is released under a CDDL license.
For more details see the NOTICE, LICENSE and COPYRIGHT files; UCRL-CODE-235197

Supported Kernels

  • The META file contains the officially recognized supported kernel versions.