zfs/module/os/linux/spl
Matthew Ahrens b3212d2fa6
Improve performance of zio_taskq_member
__zio_execute() calls zio_taskq_member() to determine if we are running
in a zio interrupt taskq, in which case we may need to switch to
processing this zio in a zio issue taskq.  The call to
zio_taskq_member() can become a performance bottleneck when we are
processing a high rate of zio's.

zio_taskq_member() calls taskq_member() on each of the zio interrupt
taskqs, of which there are 21.  This is slow because each call to
taskq_member() does tsd_get(taskq_tsd), which on Linux is relatively
slow.

This commit improves the performance of zio_taskq_member() by having it
cache the value of tsd_get(taskq_tsd), reducing the number of those
calls to 1/21th of the current behavior.

In a test case running `zfs send -c >/dev/null` of a filesystem with
small blocks (average 2.5KB/block), zio_taskq_member() was using 6.7% of
one CPU, and with this change it is reduced to 1.3%.  Overall time to
perform the `zfs send` reduced by 10% (~150,000 block/sec to ~165,000
blocks/sec).

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Serapheim Dimitropoulos <serapheim@delphix.com>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #10070
2020-03-03 10:29:38 -08:00
..
Makefile.in Add zfs_file_* interface, remove vnodes 2019-11-21 09:32:57 -08:00
README.md Change http://zfsonlinux.org links to https://zfsonlinux.org 2020-01-13 16:43:59 -08:00
THIRDPARTYLICENSE.gplv2 OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
THIRDPARTYLICENSE.gplv2.descrip OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
spl-atomic.c OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
spl-condvar.c OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
spl-cred.c Linux compat: Minimum kernel version 3.10 2019-11-12 08:59:06 -08:00
spl-err.c OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
spl-generic.c Replace static per-cpu with dynamic per-cpu data 2020-02-06 09:26:13 -08:00
spl-kmem-cache.c Missed wakeup when growing kmem cache 2020-02-13 11:23:02 -08:00
spl-kmem.c cppcheck: (error) Uninitialized variable 2019-12-18 17:24:29 -08:00
spl-kstat.c Linux 5.6 compat: struct proc_ops 2020-02-07 11:03:53 -08:00
spl-proc.c Linux 5.6 compat: struct proc_ops 2020-02-07 11:03:53 -08:00
spl-procfs-list.c Linux 5.6 compat: struct proc_ops 2020-02-07 11:03:53 -08:00
spl-taskq.c Improve performance of zio_taskq_member 2020-03-03 10:29:38 -08:00
spl-thread.c Linux 4.14, 4.19, 5.0+ compat: SIMD save/restore 2019-10-24 10:17:33 -07:00
spl-trace.c Add tracepoints for taskq entry lifetime events 2019-11-01 13:14:54 -07:00
spl-tsd.c cppcheck: (error) Uninitialized variable 2019-12-18 17:24:29 -08:00
spl-vmem.c cppcheck: (error) Uninitialized variable 2019-12-18 17:24:29 -08:00
spl-xdr.c OpenZFS restructuring - move platform specific sources 2019-09-06 11:26:26 -07:00
spl-zlib.c Add kmem_cache flag for forcing kvmalloc 2019-11-13 10:05:23 -08:00

README.md

The Solaris Porting Layer, SPL, is a Linux kernel module which provides a compatibility layer used by the ZFS on Linux project.

Installation

The latest version of the SPL is maintained as part of this repository. Only when building ZFS version 0.7.x or earlier must an external SPL release be used. These releases can be found at:

Release

The SPL is released under a GPLv2 license.
For more details see the NOTICE and THIRDPARTYLICENSE files; UCRL-CODE-235197